hubeiwdlue 发表于 2023-8-24 11:38:06

用户坐标系下,图形偏位的问题

    前几天,写了一个画坡度线的小插件,最近使用的时候,出现了一个问题,就是当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)       
)

liuhe 发表于 2023-8-24 12:06:10

(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 作为三维位移而不是三维点看待。



hubeiwdlue 发表于 2023-8-24 12:34:26

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。

hubeiwdlue 发表于 2023-8-24 13:01:57

之前的理解有误,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)       
)

vormittag 发表于 2023-8-24 13:25:40

getpoint 得到的是 UCS 坐标,entmake 用的是WCS 和 OCS 坐标,转换一下就行了。

hubeiwdlue 发表于 2023-8-24 14:44:27

vormittag 发表于 2023-8-24 13:25
getpoint 得到的是 UCS 坐标,entmake 用的是WCS 和 OCS 坐标,转换一下就行了。

好的,谢谢您。我学习下坐标系的名称。
我以前用cad,只知道UCS,这是个命令。原来它指的是用户坐标系,我查查资料,学习下。谢谢。

chenhuixo 发表于 2023-8-24 20:21:17

马克。。。。。。。。。。。。。。。。

xyp1964 发表于 2023-8-24 22:07:01

(entmake (list '(0 . "LINE") (cons 10 (trans p1 1 0)) (cons 11 (trans p2 1 0))))

hubeiwdlue 发表于 2023-8-24 23:00:19

xyp1964 发表于 2023-8-24 22:07
(entmake (list '(0 . "LINE") (cons 10 (trans p1 1 0)) (cons 11 (trans p2 1 0))))

谢谢院长,茅塞顿开,这样写是最优的。因为entmake只认WCS,所以只在这一步修改,其他的都不动。谢谢谢谢。

yefei812678 发表于 2024-3-21 10:35:02

感谢分享感谢分享感谢分享
页: [1] 2
查看完整版本: 用户坐标系下,图形偏位的问题