用户坐标系下,图形偏位的问题
前几天,写了一个画坡度线的小插件,最近使用的时候,出现了一个问题,就是当cad处于用户坐标系的时候,画的线整个会跑到一个很远的地方。似乎getpoint获得点坐标是按世界坐标系来的,就算处于用户坐标下,也是如此。然后绘图的时候,它又按用户坐标系来绘制,由此产生了偏差。请教各位大神,这个问题,大家都是怎么解决的?(defun c:xxx(/ p1 p11 p2 l1 n1 x1 y1 x2 y2 x11 y11)
(setq n1 (getreal "请输入坡比 1:n<2.0>"))
(if (= n1 nil)
(setq n1 2.0)
)
(setq p1 (getpoint "\n输入第一个点"))
(setq p11 (getpoint p1 "\n输入第二个点"))
(setq l1 (distance p1 p11))
(setq x1 (car p1))
(setq y1 (cadr p1))
(setq x11 (car p11))
(setq y11 (cadr p11))
;;计算坡线第二点坐标
(if (<= x1 x11)
(setq x2 (+ x1 (abs (* n1 (- y11 y1)))))
(setq x2 (- x1 (abs (* n1 (- y11 y1)))))
)
(setq y2 y11)
(setq p2 (list x2 y2))
(entmake (list '(0 . "LINE") (cons 10 p1) (cons 11 p2)))
(princ)
)
(setq p1 (getpoint "\n输入第一个点") P1(TRANS P1 0 1))
(setq p11 (getpoint p1 "\n输入第二个点")P11(TRANS P11 0 1))
明经通道 AutoLISP 函数
明经通道 AutoLISP 函数
trans
将一个点(或位移量)从一个坐标系转换成另一个坐标系
(trans pt from to )
参数
pt
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
from
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
0 世界坐标系(WCS)
1 用户坐标系(当前 UCS)
2 与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
3 图纸空间 DCS(仅用于代码 2)
to
整数代码、图元名或三维拉伸矢量,指定返回点的坐标系。有效的整数代码取值请参见 from 参数。
disp
如果存在且不为 nil,则将 pt 作为三维位移而不是三维点看待。
liuhe 发表于 2023-8-24 12:06
(setq p1 (getpoint "\n输入第一个点") P1(TRANS P1 0 1))
(setq p11 (getpoint p1 "\n输入第二个点")P ...
谢谢,之前看了这个函数,没看懂怎么用。现在看到例子,大概知道了,(trans pt from to ) ,pt是点;from是点的原坐标系;to是点的目标坐标系。所以(setq p1 (trans p1 0 1)),就是把p1点坐标从世界坐标系转为当前坐标系,然后在重新赋予p1。
之前的理解有误,getpoint获得的点坐标是当前坐标系的,entmake生成图形的坐标是按世界坐标系的。由此产生了偏差,需要将获得点的当前坐标系转换为世界坐标系,才能避免错误。现在已经修改完成。
再次谢谢liuhe大神的指导。
(defun c:xxx(/ p1 p11 p2 l1 n1 x1 y1 x2 y2 x11 y11)
(setq n1 (getreal "请输入坡比 1:n<2.0>"))
(if (= n1 nil)
(setq n1 2.0)
)
(setq p1 (getpoint "\n输入第一个点"))
(setq p11 (getpoint p1 "\n输入第二个点"))
(setq p1 (trans p1 1 0)
p11 (trans p11 1 0))
(setq l1 (distance p1 p11))
(setq x1 (car p1))
(setq y1 (cadr p1))
(setq x11 (car p11))
(setq y11 (cadr p11))
;;计算坡线第二点坐标
(if (<= x1 x11)
(setq x2 (+ x1 (abs (* n1 (- y11 y1)))))
(setq x2 (- x1 (abs (* n1 (- y11 y1)))))
)
(setq y2 y11)
(setq p2 (list x2 y2))
(entmake (list '(0 . "LINE") (cons 10 p1) (cons 11 p2)))
(princ)
) getpoint 得到的是 UCS 坐标,entmake 用的是WCS 和 OCS 坐标,转换一下就行了。 vormittag 发表于 2023-8-24 13:25
getpoint 得到的是 UCS 坐标,entmake 用的是WCS 和 OCS 坐标,转换一下就行了。
好的,谢谢您。我学习下坐标系的名称。
我以前用cad,只知道UCS,这是个命令。原来它指的是用户坐标系,我查查资料,学习下。谢谢。 马克。。。。。。。。。。。。。。。。 (entmake (list '(0 . "LINE") (cons 10 (trans p1 1 0)) (cons 11 (trans p2 1 0)))) xyp1964 发表于 2023-8-24 22:07
(entmake (list '(0 . "LINE") (cons 10 (trans p1 1 0)) (cons 11 (trans p2 1 0))))
谢谢院长,茅塞顿开,这样写是最优的。因为entmake只认WCS,所以只在这一步修改,其他的都不动。谢谢谢谢。 感谢分享感谢分享感谢分享
页:
[1]
2