QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 5157|回复: 5
收起左侧

[已答复] lisp里面trans命令到底该怎么理解?

[复制链接]
发表于 2012-5-31 16:51:12 | 显示全部楼层 |阅读模式 来自: 中国广东珠海

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 9 I0 F3 J0 |! u6 k
/ [* `8 ]4 e1 A9 P+ r
请教下斑竹,trans到底是怎么理解的?% X* M* b" t3 ~  N+ @8 E0 X+ s
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
  f7 w& @9 P0 F# l5 U6 Y3 a& a
  1. (defun c:gcx(/)* J% ~4 K3 u% I, l, H2 W
  2. (setq l1_en (entget (car (entsel))))
    # K/ R+ k' i' L0 a3 T
  3. (setq l2_en (entget (car (entsel))))
    3 ^& r& W( ]% m& Z% D
  4. (setq pt11 (cdr (assoc 10 l1_en)))! ^. a' P& {% k) C
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    ' \) q0 G* ^: I1 }4 s. W# T
  6. (setq pt21 (cdr (assoc 10 l2_en))); _! R- a/ {: P8 Q+ T* u4 [+ H$ F
  7. (setq pt22 (cdr (assoc 11 l2_en))), b) c8 {/ N" \
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))4 C. ?* b; g/ U) @
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))9 z8 C9 B: @' k% ^; P7 D
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    , L1 i0 s5 c+ P3 @6 k7 x, }
  11. (command "ucs" "3" pt21 pt22 pt)& t# |+ V' i# |6 M% s0 J1 ~
  12. (setq pt110 (trans pt11 0 1))
    3 k9 @* p& M/ V' r  `" g, ^/ t
  13. (setq h (nth 2 pt110))$ W' ]' i4 x9 K
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    1 n  N4 g; s6 O
  15. (setq pt120 (trans pt12 0 1))
    ' [: |1 e, e2 Q# |
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    ) ]2 l8 a' O: e+ \3 @2 J4 P
  17. (setq pt210 (trans pt21 0 1)): j9 |% y5 \+ P( c
  18. (setq pt220 (trans pt22 0 1))
    0 |2 M" @( W2 N4 N! g
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))# d+ D$ K0 ^: E$ M& @& k+ K9 l# j) q
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    ' L* a. P" v; k: `" o; T
  21. (command "line" pt1 pt2 "" )
复制代码
7 S7 Q. N+ R) @4 S; _3 {
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
! h4 i* y5 W  _7 Z9 d另外,我在明经看到trans的解释:
3 L7 O2 E0 f4 U! @) s将一个点(或位移量)从一个坐标系转换成另一个坐标系
/ c/ T( }. @* P4 s( i2 ~1 c3 V% O: i(trans pt from to [disp])   参数
4 t3 [( y" B5 C/ R- }% Hpt
1 _5 |6 \* @* [) [0 P3 d- ~三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
! B2 O5 E  C3 F' [+ qfrom) J. V; c: g* Q  `# F" \8 I
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:, G) Z0 T. A- y# {# ]* D
0  世界坐标系(WCS)
' W0 j  M/ `5 N2 u% d, D: q1  用户坐标系(当前 UCS)
9 W1 J1 E- J) t( |$ t$ [* ]2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。! Y; K: m- }% h1 u
3  图纸空间 DCS(仅用于代码 2)
1 S$ L. `8 E# N% e! ~3 c8 \# J7 i+ n8 E8 o0 X. M' h! c
后面的解释就不贴了,此外还有一个例子:4 r  z. O$ N( j0 C/ N
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
4 i( I  V9 Z2 O) H, \  N' Q命令: (trans '(1.0 2.03.0) 0 1)' R2 o: }2 h/ i  h* X  n
(2.0 -1.0 3.0)
  ^% z8 b% L0 {0 k
' j- s2 B' e# N# Q9 o2 ]( l这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?! S: Y' h% [1 m6 G
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。# j# b/ e. _2 V. v/ t0 `; b+ i
* X6 E3 f) q8 r/ ]
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
# c. q- H* F+ ^. t(trans pt from to [disp])/ A& L/ z' R7 c2 x8 P
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
9 a. o  X% O% b2 Y5 J$ E" }1 F除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。, R( B9 R8 u, `! K
* w# k$ E& _5 Q" f5 R- u9 v, A) P( u
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。" J+ Q4 `# k6 n( K# ?# _
(trans pt from to [disp])
7 O7 l7 S; J: \$ H! s2 X这个很明白了,转化点从哪到哪的意思 ...2 s4 h; E2 V8 f1 ]
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
7 v# m* M7 t. D+ m7 t4 y7 ^# @
+ E0 a- b8 p0 ~* P  K
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)& r( K4 R' W8 e$ }" O$ X  I6 z
  2.   (command "ucs" "w")/ u/ N0 ~/ M! Q) r4 J- D6 F1 R
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线8 Q3 z- U. `- z: J7 z  ^
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    4 g! @6 [& V. C  i" x0 q! y, W
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    - [: O+ }0 t, l" K
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    ! [' R! v7 J$ j7 K- K' }
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    3 g3 A2 }9 y1 T1 J$ ]. A
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    1 @4 Y3 J4 m  C1 g
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    4 i- ]1 s7 n7 [  Z5 g/ c
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    ( A2 j8 P' [- ~+ G; \8 n( J6 O5 G
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11)). k: ]; L3 n' r8 F
  12.            )
    * Q' [# a- W+ s& ^& m
  13.   )                                        ;求辅助点,用于下一步新建三点UCS8 r4 a& q5 {2 J! M, i7 T' `
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点# k. N, y% j8 a( l! ^. m+ ^9 H
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    2 E/ L% l1 Q) m8 g. D; P: H
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    4 n- G- E* N# r9 I8 K
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值7 u1 f' j0 u* g* g
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度4 O* l9 M( @7 }! I! _# P& O( Y( H
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0)): M- A% X- E% J9 g
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标  ~/ |' S* P  }; z% A. q* N
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值1 o; m& t3 {. B3 f, z
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    , B9 l) J+ @7 U6 Y2 n: d1 }
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标) S, i' Q6 O! }7 A
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点- U' w' J4 K& k0 F
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标1 x) S: {/ K3 `$ \& s
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    0 x8 F5 Q! a$ D( s
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    0 O( x# [  T7 h
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    / K/ o: f5 O4 ]8 V! G
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    2 X$ V; b2 a# y8 ~
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    ' F/ l# o2 q3 Y# |# J
  31.   (princ); t, C5 }+ K( g% l
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
) H% |' E, s4 [, K# t) T6 u5 Q( |% ]9 K本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
4 {5 H; l% g9 Q* C, V谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!4 ^6 H9 Y2 s& d$ I
看了你的解释,有种醍醐灌顶的感觉,呵呵
; u$ o" ]! k4 o  i0 m- v3 ~1 ]2 _
, j8 x" M2 M9 `5 b1 @1.
* y% B, g" c6 u- t2 P( m (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))- L, r* F4 \6 k2 F; s4 M: f! [8 @2 Z
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))7 m  S) g8 m1 H' r7 \8 o  j* T
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))7 g/ w6 O. W8 r% m/ j
           )
* Q( }0 F8 o2 z9 C" a* B7 ?' ?' e  ) ;求辅助点,用于下一步新建三点UCS                                        6 _* \3 g1 o( ~6 z& m3 v1 T4 V+ r9 g  h
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点7 K: N: ~4 J) I1 b# d
) l7 B2 u9 A5 q& m: o9 A
( l2 u, `7 A% o) f, o# _4 _
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
* m/ M# f# ^* U8 ^
. W- D; ?7 T$ }6 O2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。. U# [- b, I: j: ~5 V
最开始看到的trans解释:( J. l$ _7 s% c
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:  |3 S2 x$ s# \* d, I+ V, A
命令: (trans '(1.0 2.03.0) 0 1)
. j2 P6 n7 J8 O: q7 n(2.0 -1.0 3.0)/ F- D8 \2 O! K5 R( g3 [
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
5 b. j2 @5 d& C7 n4 z
  [- F1 g  N( g- O4 i# k5 C
( V! T: d( T! V9 U+ o0 F2 J7 I我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
- Z. z% {" B2 Q4 stataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

: E5 Z, j7 D7 o. Y- y/ x1 O+ _2 P不对.
3 S; @0 \" _! U$ V3 }9 Y: J& S* |# n+ ~下面举例说明:3 E9 b0 [& H; D6 W" e8 c# F4 |1 m! x
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.( F( n7 E. _/ c9 w7 x' |5 ?  C
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
4 V3 Q6 m1 _' l9 U% C  R/ f下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
/ [( R+ _) m0 x4 L我们再在命令行键入(trans '(0 0 0) 1 0)回车,命令行返回的是(10.0 10.0 0.0)--这次我们键入的是该直线在UCS中的起点坐标,并且后面两个参数与前面不同,先是1,后是0,这是在告诉电脑我们给它的是UCS坐标(0,0,0),要它告诉我们该点在WCS中的坐标值,于是它告诉我们是(10.0 10.0 0.0).$ ~* ]' V- T" M  ^7 d# y
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧./ S2 F; B: H2 C5 j, b
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
% [9 ~% ?) e3 N- L7 M! k) J
' R# s0 }7 b& N2 g' [! u另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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