- UID
- 14
- 积分
- 8264
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-4
- 最后登录
- 1970-1-1
|
发表于 2004-1-28 19:26:43
|
显示全部楼层
最初由 HillMan 发布
[B]谢谢楼上二位,已经做了一个矩阵,硬给转换过来了!!
呵呵!!! [/B]
语法
(trans pt from to [disp])
功能及参数
此函数可以将一个点的坐标值 (或一个位移量) 从某一坐标系统转换
到另一个坐标系统。pt参数个含有三个实型数的串列, 可以解释成一个 3D
的点或一个 3D 的位移 (向量)。from 这个参数是一个代码 (Code), 代表
pt 所在的坐标系统, 而 to 这个参数也是一个代码, 代表 pt 所想要转换
到的坐标系统 。disp 参数是可有可无的, 假如此参数存在而且其值并非
nil, 则 pt 所代表的就是一个 3D 的位移而不是一个点。下列所述的任何
一个代码均可为 from 和 to 的参数。
● 下表所列出的是坐标系统整型数码:
码 坐标系统
0 通用坐标系统 (WCS)
1 用户坐标系统 (UCS)
2 显示:目前视区的 DCS (当使用码0或码1时)。目前模型空间视区的
DCS(当使用码3时)
3 图纸空间 DCS (只能在使用码2时使用)
● 一些函数, 例如: entnext、entlast、entsel、nentsel和 ssname
函数所返回的图元名。如果您是使用这一方式, 则可让您将一点转换到一个特
殊图元的图元坐标系统(Entity Coordinate System, ESC)上, 或是从 ESC 转
换到另一种坐标系统(对某些图元而言, ECS 和 WCS 是一样的, 所以对这些图
元作 ECS 和 WCS 之间的转换并没有意义)上。
● 一个 3D 的凸出向量(Extrusion Vector), 它是个含有三个实型数值
的表。这是某一坐标系统和一个图元的 ECS之间互相转换的另一种方法。然而,
对 ECS 和 WCS 相同的图元来说, 这种转换并没有作用。trans 将会返回 to
参数所在坐标系统的 3D 点(或位移) 坐标值。
例如, 已知 UCS 是绕着 WCS 的 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)
下列所述是 trans 所适用的坐标系统, 在此我们同时说明如何使用这些
坐标系统:
WCS:通用坐标系统。这是一个参考 (reference) 坐标系统。其他所有
的坐标系统全都是相对于此一坐标系统来定义的。WCS 也是惟一不改变的坐
标系统。它的主要用途是在相对于 WCS 所测量得到的值都可以很正确的转换
到其他的坐标系统上。
UCS:用户坐标系统是一个工作 (working) 坐标系统, 它是由用户自行
设定的坐标系统, 以便使绘图编辑的工作更容易。所有输入的点(包括
AutoLISP表达式所返回的点, 但不包括前面有*记号的点), 全都视为相对于
这一坐标系统。所以, 如果您想要在 AutoCAD 命令中使用 WCS、ECS 或
DCS 的坐标值您就必须先使用 trans, 将它们转换成 UCS 的坐标值。
ECS:图元坐标系统。由 entget 函数所返回的点坐标值即是相对于这
一坐标系统所测量得到的, 这样的点几乎没有什么用处, 除非将这些点转换
到适当的坐标系统上。
DCS:显示坐标系统 (Display Coordinate System)。此系统即为图片
在显示前所转换的坐标系统, 此坐标系统的原点为标的(TARGET) 点, 而Z
轴为观测方向。所以, 在 DCS 上永远是平面视图。也就是说, 在视区上,
DCS 的 Y 轴向上, 而 X 轴向右。它可以用来决定这些图元在屏幕上给用
户看起来是什么样子。当整型数代码 from 和to为 2 和 3 时, 2 表示目
前模型空间的视区将使用DCS, 而3表示图纸空间使用DCS(请引用下面 PSDCS)。
当代码 2 与其他任何运算元一起使用时, 则不管它是模型空间或图纸空间,
都会假定为目前空间的 DCS, 同时另一点也在目前空间中。
PSDCS:图纸空间显示坐标系统 (Paper Space Display Coor dinate System)。
这只能用来在图纸空间 DCS 和活动的模型空间视区的 DCS 之间进行点的转换。
基本上这是一种 2D 的转换, 其中 X 和 Y 坐标总是按比例来决定的, 同时如果
disp 参数没有指定或值为nil 时没有差距。但是 Z 坐标都是以比例来决定的,
并没有经过平移, 因此您可以用来决定两个显示坐标系统之间的比例因数 。除
了两个 DCS 之间的转换之外, 将不会在两个空间之间进行转换。
例如, 假设您想要画一条线, 它的起始点正是一串文字的插入点, 那么在
不使用 Osnap 的情况下, 您可以将此文字图素的插入点从文字图元的 ECS 转
换到 UCS, 如下所示:
(trans text-insert-point text-ename 1)
然后将结果输入到 From point:"的提示语句后。相反的, 在输入点坐标
值到 entmod 时, 您必须先将点 (或位移)坐标值转换成所想要的 ECS 坐标值。
例如, 您想要在UCS 上移动一个圆, 而所要移动的位移量是 1、2、3, 那么在
不使用 MOVE 命令的情况下, 您必须将此位移的 UCS 转换到此圆的 ECS, 如下
所示:
(trans '(1 2 3) 1 circle-ename)
然后, 您再将结果的位移量加到此圆的中心点上即可。
例如, 假设某个用户输入一点, 他想要知道现在屏幕上某一条线的两个端
点到底是哪一个端点看起来比较靠近用户输入的那一点, 那么首先请您将用户
输入的那一点从 UCS 转换到 DCS 上:
(trans user-point 1 2)
然后, 将那条线的两个端点从 UCS 转换到 DCS 上:
(trans endpoint line-ename 2)
从上述所得到的答案, 您就可以分别计算从用户输入的点到两个端点间的距离
(Z 坐标值可忽略), 如此您就可决定哪一个端点看起来比较靠近了。trans 也
可以转换 2D 点。为了达到这个目的, AutoLISP会将 Z 坐标填上一个适当的
值。这个填入的 Z 坐标值是由 from 的坐标系统以及您是将此输入的 2D 点
当做是一个点还是一个位移来转换, 两者共同决定的。这个填入的 Z坐标值,
如下表所示:
从 点 位移
WCS 0.0 0.0
UCS 目前高度 0.0
ECS 0.0 0.0
DCS 投影到目前的 0.0
绘图平面(UCS
XY 平面+目前高度)
PSDCS 投影到目前的绘图 0.0
平面(UCS XY 平面
+目前高度)
Ucs 下 Pline 的组码10 转换到当前UCS,正确的方法应该是:
(trans (cdr (assoc 10 (entget pline))) pline 1)
- (vlax-safearray->list
- (vlax-variant-value
- (vla-TranslateCoordinates
- (vla-get-Utility
- (vla-get-activedocument (vlax-get-acad-object))
- )
- (vlax-3d-point (cdr (assoc 10 (entget (car (entsel))))));;多义线
- acocs
- acucs
- :vlax-False
- (vlax-3d-point (cdr (assoc 210 (entget (car (entsel))))));;多义线
- )
- )
- )
复制代码 |
|