找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 563|回复: 3

[求助] [求助]:Trans函数使用中的问题

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2005-1-11 22:12:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
CAD带的帮助:
[PHP]将一个点(或位移量)从一个坐标系转换成另一个坐标系
(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 作为三维位移而不是三维点看待。

如果 from 或 to 参数是图元名,它必须是由 entnext、entlast、entsel、nentsel 和 ssname 等函数返回的图元名。这样就可以将某个特定对象的对象坐标系 (OCS) 中的点来回进行转换(对于某些对象,OCS 等价于 WCS,对这些对象,OCS 和 WCS 之间的转换是空操作)。使用三维拉伸矢量(三个实数组成的一个表)是来回转换对象 OCS 的另一种方法。但是,对于 OCS 等价于 WCS 的那些对象,这种转换也不做任何操作。

返回值

由参数 to 指定的坐标系表示的一个三维点(或位移)。

样例

在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:

命令:(trans '(1.0 2.0 3.0) 0 1)

(2.0 -1.0 3.0)

命令:(trans '(1.0 2.0 3.0) 1 0)

(-2.0 1.0 3.0)

关于坐标系的详细信息,请参见 Visual LISP 开发人员手册中的坐标系转换。
例如,要在不使用对象捕捉的情况下,从一行文本的插入点画一条直线,需要将文本对象的插入点从文本对象的 OCS 转换到 UCS:

(trans text-insert-point text-ename 1)

然后就可以将结果传给“起点:”提示。
相反地,将点值送到 entmod 函数中去之前,必须将该点(或位移)值转换成用该对象的 OCS 表示。例如,如果要将圆相对 UCS 偏移 (1,2,3)(不使用 MOVE 命令),就需要将该偏移量从 UCS 转换成圆的 OCS:

(trans '(1 2 3) 1 circle-ename)

然后就可以将结果偏移量加到圆的圆心上去。
例如,如果用户输入了一个点,且想要找出一条直线的哪一个端点看起来离该点更近,就先得将用户输入的点从 UCS 转换到 DCS:

(trans user-point 1 2)

然后再将直线的每一个端点从 OCS 转换到 DCS:

(trans endpoint line-ename 2)

这样就可以计算出用户输入的点与直线每一个端点间的距离(忽略 Z 坐标),从而确定哪一个端点看起来距用户输入的点更近。
trans 函数也可以转换二维点,这需要通过给 Z 坐标赋一个适当的值来实现。所使用的 Z 分量取决于所指定的 from 坐标系,以及该值是作为一个点还是作为一个位移。如果是作为一个位移,那么其 Z 值总是为 0.0;如果是作为一个点,那么其 Z 值由下表确定。

转换二维点时的 Z 坐标值

From        填入的 Z 坐标值
WCS        0.0
UCS        当前标高
OCS        0.0
DCS        投影到当前构造平面(UCS XY 平面 + 当前标高)
PSDCS        投影到当前构造平面(UCS XY 平面 + 当前标高)
[/PHP]
可是其中(trans text-insert-point text-ename 1)中的text-ename 如何引用呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-1-12 08:26:19 | 显示全部楼层

  1. ;;試試就會了解
  2. (entmake '((0 . "TEXT")
  3.            (100 . "AcDbEntity")
  4.            (67 . 0)
  5.            (410 . "Model")
  6.            (8 . "TEXT")
  7.            (100 . "AcDbText")
  8.            (10 66.9366 167.013 0.0) ;插入點
  9.            (40 . 16.5338)
  10.            (1 . "degdrt")
  11.            (50 . 0.0)
  12.            (41 . 1.0)
  13.            (51 . 0.0)
  14.            (7 . "Standard")
  15.            (71 . 0)
  16.            (72 . 0)
  17.            (11 0.0 0.0 0.0)
  18.            (210 0.0 0.0 1.0)
  19.            (100 . "AcDbText")
  20.            (73 . 0)
  21.           )
  22. )
  23. (command "_.ucs" "");先轉回世界座標(為方便了解)
  24. (command "_.ucs" "z" 90);z軸轉90度
  25. (setq ENT (entlast))
  26. (trans (cdr (assoc 10 (entget ENT))) ENT 1);將文本物件的插入點從文本物件的 OCS 轉換到 UCS
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2005-1-12 09:22:13 | 显示全部楼层
请教:ocs什么时候不等于wcs呢?
将(trans (cdr (assoc 10 (entget ENT))) ENT 1)改为(trans (cdr (assoc 10 (entget ENT))) 0 1)
结果一样
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-1-16 00:42:33 | 显示全部楼层
text-ename 就是实体名,cad会自动找它的ucs的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 19:24 , Processed in 0.291993 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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