qazxswk 发表于 2022-5-15 03:46:59

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

(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,
当左上往右下拖或右下往左上拖,偏移后的矩形在原矩形内;
当左下往右上拖或右上往左下拖,偏移后的矩形在原矩形外;

问题来了,能不能修改代码,不管往哪个方向拖,偏移后的矩形都在原矩形内。

hhh454 发表于 2022-5-15 03:47:00


;;绘制双线矩形
;;主程序开始
(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 04:50:43

本帖最后由 qazxswk 于 2022-5-15 05:08 编辑

我自己找到解决的办法了。打扰大家了。
怎样关闭悬赏贴子呀?:L

guosheyang 发表于 2022-5-15 08:27:13

加个顺时针 逆时针判决即可

start4444 发表于 2022-5-15 11:01:15

估计选取点定偏移方向还比你现在的操作效率

qazxswk 发表于 2022-5-15 14:16:07

start4444 发表于 2022-5-15 11:01
估计选取点定偏移方向还比你现在的操作效率

确定两点画矩形后,后面再拾取一点确定偏离方向,感觉不太顺手,能用代码省掉步骤,就用代码。
目前偏移我换为用command,牺牲了一点点速度吧,vla速度还是快一些

qazxswk 发表于 2022-5-15 14:18:00

guosheyang 发表于 2022-5-15 08:27
加个顺时针 逆时针判决即可

我也发现在了这个规律,可没有想到代码怎么写

masterlong 发表于 2022-5-15 16:48:35

内偏移
取p1p2中点即可
为啥要算逆时顺时?

Bao_lai 发表于 2022-5-15 16:49:50

(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)
)

guosheyang 发表于 2022-5-15 20:23:43

确实不用判断顺时针还是逆时针这样好像也可以
(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
查看完整版本: 两点画矩形并偏移,怎样控制偏移方向?