两点画矩形并偏移,怎样控制偏移方向?
(defun c:11 (/ p1 p2 )(setq p1 (getpoint "矩形第一点:"))
(setq p2 (getcorner p1 "矩形对角点:"))
(command "rectang" p1 p2)
(vla-offset (vlax-ename->vla-object (entlast)) 30)
(princ))
这个简单,就是确定两点画出一个矩形,然后再偏移30MM,
当左上往右下拖或右下往左上拖,偏移后的矩形在原矩形内;
当左下往右上拖或右上往左下拖,偏移后的矩形在原矩形外;
问题来了,能不能修改代码,不管往哪个方向拖,偏移后的矩形都在原矩形内。
;;绘制双线矩形
;;主程序开始
(defun c:tt (/ p1 p2)
(ngc_s);;备份参数
(setvar "OSMODE" 0)
(setq p1 (getpoint "\n指定矩形第一点:"))
(setq p2 (getcorner p1 "\n指定矩形对角点:"))
(command "rectang" p1 p2)
(setq p_mid (MJ:Mid p1 p2))
(command "OFFSET" "30" (entlast) p_mid "")
(ngc_e);;恢复参数
)
;;以下为功能函数
(defun MJ:Mid (P1 P2);;43.1 [功能] 两点中点
(mapcar '(lambda (X Y) (* (+ X Y) 0.5)) P1 P2)
)
(defun ngc_s ()
(defun *MYERR* (MSG);;;错误恢复捕捉
(setvar "CMDECHO" CMD_OLD)
(setvar "OSMODE" OS_OLD)
(setq *ERROR* *OLDERR*)
(if (= MSG "完美退出。谢谢使用。")
(princ (strcat "\\n>>>" MSG))
(princ "\\n>>>虽然中途退出了,对象捕捉已经被恢复。")
)
(princ)
)
(setq *OLDERR* *ERROR*
*ERROR* *MYERR*
OS_OLD (getvar "OSMODE")
CMD_OLD (getvar "CMDECHO")
)
(setvar "cmdecho" 0) ;_关闭命令提示
(command "._undo" "_begin")
(setq osmode_bak (getvar "osmode")) ;_记录捕捉
(setq clayer_bak (getvar "clayer")) ;_记录当前图层
)
(defun ngc_e ()
(setvar "osmode" osmode_bak) ;_还原捕捉
(setvar "clayer" clayer_bak) ;_还原图层
(command "._undo" "_end")
(setvar "cmdecho" 1) ;_打开命令提示
(princ) ;_关闭程序返回值
)
本帖最后由 qazxswk 于 2022-5-15 05:08 编辑
我自己找到解决的办法了。打扰大家了。
怎样关闭悬赏贴子呀?:L
加个顺时针 逆时针判决即可 估计选取点定偏移方向还比你现在的操作效率 start4444 发表于 2022-5-15 11:01
估计选取点定偏移方向还比你现在的操作效率
确定两点画矩形后,后面再拾取一点确定偏离方向,感觉不太顺手,能用代码省掉步骤,就用代码。
目前偏移我换为用command,牺牲了一点点速度吧,vla速度还是快一些 guosheyang 发表于 2022-5-15 08:27
加个顺时针 逆时针判决即可
我也发现在了这个规律,可没有想到代码怎么写 内偏移
取p1p2中点即可
为啥要算逆时顺时? (defun c:tt (/ p1 p2 p3)
(setq p1 (getpoint "\n矩形第一点:"))
(setq p2 (getcorner p1 "\n矩形对角点:"))
(command "rectang" p1 p2)
;xy坐标同时大或者小时为外偏
(if (or
(and (< (car p1) (car p2)) (< (cadr p1) (cadr p2)))
(and (> (car p1) (car p2)) (> (cadr p1) (cadr p2)))
)
(vla-offset (vlax-ename->vla-object (entlast)) -30)
(vla-offset (vlax-ename->vla-object (entlast)) 30)
)
(princ)
) 确实不用判断顺时针还是逆时针这样好像也可以
(defun tt(/ P1 P2)
(setq p1 (getpoint "\n矩形第一点:"))
(setq p2 (getcorner p1 "\n矩形对角点:"))
(command "rectang" "non" p1 "non" p2)
(if(or(<(angle p1 p2)(* pi 0.5))(<(angle p2 p1)(* pi 0.5)))
(vla-offset (vlax-ename->vla-object (entlast)) -30)
(vla-offset (vlax-ename->vla-object (entlast)) 30)
)
(princ)
)
页:
[1]
2