明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 621|回复: 10

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

[复制链接]
发表于 2023-8-24 11:38 | 显示全部楼层 |阅读模式
    前几天,写了一个画坡度线的小插件,最近使用的时候,出现了一个问题,就是当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)       
)

发表于 2023-8-24 12:06 | 显示全部楼层
(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 [disp])   
参数

pt

三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。

from

整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:

0 世界坐标系(WCS)

1 用户坐标系(当前 UCS)

2 与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。

3 图纸空间 DCS(仅用于代码 2)

to

整数代码、图元名或三维拉伸矢量,指定返回点的坐标系。有效的整数代码取值请参见 from 参数。

disp

如果存在且不为 nil,则将 pt 作为三维位移而不是三维点看待。



 楼主| 发表于 2023-8-24 12:34 | 显示全部楼层
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 [disp]) ,pt是点;from是点的原坐标系;to是点的目标坐标系。所以(setq p1 (trans p1 0 1)),就是把p1点坐标从世界坐标系转为当前坐标系,然后在重新赋予p1。
 楼主| 发表于 2023-8-24 13:01 | 显示全部楼层
之前的理解有误,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)       
)
发表于 2023-8-24 13:25 | 显示全部楼层
getpoint 得到的是 UCS 坐标,entmake 用的是WCS 和 OCS 坐标,转换一下就行了。
 楼主| 发表于 2023-8-24 14:44 | 显示全部楼层
vormittag 发表于 2023-8-24 13:25
getpoint 得到的是 UCS 坐标,entmake 用的是WCS 和 OCS 坐标,转换一下就行了。

好的,谢谢您。我学习下坐标系的名称。
我以前用cad,只知道UCS,这是个命令。原来它指的是用户坐标系,我查查资料,学习下。谢谢。
发表于 2023-8-24 22:07 | 显示全部楼层
(entmake (list '(0 . "LINE") (cons 10 (trans p1 1 0)) (cons 11 (trans p2 1 0))))
 楼主| 发表于 2023-8-24 23:00 来自手机 | 显示全部楼层
xyp1964 发表于 2023-8-24 22:07
(entmake (list '(0 . "LINE") (cons 10 (trans p1 1 0)) (cons 11 (trans p2 1 0))))

谢谢院长,茅塞顿开,这样写是最优的。因为entmake只认WCS,所以只在这一步修改,其他的都不动。谢谢谢谢。
发表于 2024-3-21 10:35 | 显示全部楼层
感谢分享感谢分享感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 13:12 , Processed in 0.531779 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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