明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: qazxswk

[讨论] 两点画矩形并偏移,怎样控制偏移方向?

[复制链接]
 楼主| 发表于 2022-5-15 21:00 | 显示全部楼层
本帖最后由 qazxswk 于 2022-5-15 21:57 编辑

试了Bao_lai   guosheyang两位大神的代码,使用command画矩形,正常。但是,如果那个矩形用下面的方式得到的,后面用vla-offset 偏移,还有有点问题。因为这个是我一个插件的一部分,所以pt2  pt4不能忽略。
(defun c:13(/  pt1  pt2 pt3 pt4  ag0 ag len)
(setq pt1 (getpoint "拾取起点:"))
(setq ag0 (getangle pt1 "\n输入角度<或>直接取一个点以获取角度:"))
(setq pt3 (getcorner pt1 "\n拾取对角点:"))
(setq len (distance pt1 pt3) ag  (angle pt1 pt3) )
(setq pt2 (polar pt1 ag0 (* len (cos (- ag ag0)))))
(setq pt4 (polar pt1 (+ (/ pi 2.) ag0) (* len (sin (- ag ag0)))))

(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")
(cons 10 pt1) (cons 10 pt2)(cons 10 pt3)(cons 10 pt4)'(70 . 1) ))
;;;(command "rectang" "non" pt1 "non" pt3)
(if(or(<(angle pt1 pt3)(* pi 0.5))(<(angle pt3 pt1)(* pi 0.5)))
     (vla-offset (vlax-ename->vla-object (entlast)) -30)
     (vla-offset (vlax-ename->vla-object (entlast)) 30)  )
  (princ))        

我现在是使用entmake创建矩形,然后用(command "offset" 30(entlast)(mapcar' *(mapcar' + pt1 pt3)'(0.5 0.5 0.5))"")这句得到偏移的对象。
回复

使用道具 举报

发表于 2022-5-15 22:01 | 显示全部楼层
qazxswk 发表于 2022-5-15 21:00
试了Bao_lai   guosheyang两位大神的代码,使用command画矩形,正常。但是,如果那个矩形用下面的方式得到 ...

仅针对你的 两点画矩形的情况    编标entmake  情况显然不一样   
回复

使用道具 举报

发表于 2022-5-16 08:43 | 显示全部楼层
把矩形双向偏移后得到2个面积,比较2面积大小  大的外偏 小的内偏 删除不需要的
(defun enpy ( ename pyl value / e1 e2 )
(vla-offset (vlax-ename->vla-object ename )(* pyl -1))
                 (setq e1 (entlast))                               
                 (vla-offset (vlax-ename->vla-object ename ) pyl )
                 (setq e2(entlast))       
(if (= value 1)
                 (if (> (vla-get-Area (vlax-ename->vla-object e1))
                                                 (vla-get-Area (vlax-ename->vla-object e2)))                               
                            (vl-cmdf "ERASE" e1  "")       
                            (vl-cmdf "ERASE" e2  "")               
                 )
)               
(if (= value 2)
                 (if (< (vla-get-Area (vlax-ename->vla-object e1))
                                                 (vla-get-Area (vlax-ename->vla-object e2)))                               
                            (vl-cmdf "ERASE" e1  "")       
                            (vl-cmdf "ERASE" e2  "")               
                 )
)                       
(setq ent (entlast))       
)
回复

使用道具 举报

发表于 2022-5-17 08:28 | 显示全部楼层
(defun c:11 (/ p1 p2)
        (setq p1 (getpoint "矩形第一点:"))
        (setq p2 (getcorner p1 "矩形对角点:"))
        (command "rectang" p1 p2)
        (command "offset" 30 (entlast) (polar p1 (angle p1 p2) (* 0.5 (distance p1 p2))) "")
        (princ)
)

评分

参与人数 1明经币 +1 收起 理由
qazxswk + 1

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2022-5-17 08:56 | 显示全部楼层
hhh454 发表于 2022-5-16 23:28
;;绘制双线矩形
;;主程序开始
(defun c:tt (/ p1 p2)

看你写了这么多,只看到你核心的一句: (mapcar '(lambda (X Y) (* (+ X Y) 0.5)) P1 P2)   跟我的差不多。说明我们的想法是一样的。
回复

使用道具 举报

 楼主| 发表于 2022-5-17 08:57 | 显示全部楼层
隽轩2013 发表于 2022-5-17 08:28
(defun c:11 (/ p1 p2)
        (setq p1 (getpoint "矩形第一点:"))
        (setq p2 (getcorner p1 "矩形对角点:"))
...

你这句也是一样,(polar p1 (angle p1 p2) (* 0.5 (distance p1 p2)))   获取偏移后的中心,不同的表达,不错
回复

使用道具 举报

发表于 2022-5-17 15:20 | 显示全部楼层
qazxswk 发表于 2022-5-17 08:56
看你写了这么多,只看到你核心的一句: (mapcar '(lambda (X Y) (* (+ X Y) 0.5)) P1 P2)   跟我的差不多 ...

是的,就是取中点就行了,特定条件的代码还是好写一点,距离30也可以采用DCL来取值,便于改变,程序开头和结尾还是要有的,要不然有时会有错误,,我这也是学习猫老师的写法
回复

使用道具 举报

发表于 2022-7-7 11:31 | 显示全部楼层
都是高手啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-3 04:55 , Processed in 0.957049 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表