QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 5156|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
# K! V3 D' x2 {& D( P1 d) A* m5 ]+ S0 E: `  n& l5 `5 X% p
请教下斑竹,trans到底是怎么理解的?
+ I7 {/ z, c6 N9 {问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
6 I) C$ n+ C( E
  1. (defun c:gcx(/)
    ( K6 y' R( [5 H2 }3 P$ [& i
  2. (setq l1_en (entget (car (entsel))))
      k4 a$ o8 j- s! F0 [2 `
  3. (setq l2_en (entget (car (entsel))))
    + g& u' a* V8 m& u7 t) I
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    ' ~) K& u5 ?1 Y* t
  5. (setq pt12 (cdr (assoc 11 l1_en))); D/ N" M& q5 G" B( ^6 x  _' \
  6. (setq pt21 (cdr (assoc 10 l2_en)))* H- |0 b5 d- ]2 R, ?) y4 u
  7. (setq pt22 (cdr (assoc 11 l2_en))). M; d8 ^% h7 U/ k7 ]" B
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    : w5 ?, R( l( `; I9 Q9 @0 N7 e
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))+ |- G3 \; j' i  |( j8 d) y
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    ! c1 I# B2 Z& u. \) g/ r9 s0 v
  11. (command "ucs" "3" pt21 pt22 pt)2 i6 j6 {. L* Q- C! l+ \
  12. (setq pt110 (trans pt11 0 1))
    $ X* I. R0 h" `. ~5 L
  13. (setq h (nth 2 pt110)); F( Z+ H  Y" v6 P- v$ F: H
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))+ D+ c3 G3 [7 z  Q: h( |) w
  15. (setq pt120 (trans pt12 0 1))5 h5 I/ m* u- T8 Z9 f
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0)), j4 V$ X- ^2 g  r3 P8 s; y# H
  17. (setq pt210 (trans pt21 0 1))5 @" x$ K) s8 l0 _5 H: H* h
  18. (setq pt220 (trans pt22 0 1))
    + }9 W2 p: D1 `; a* l
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))% K/ J3 W- |7 K+ W
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))( l1 c1 S- q3 p7 M" ~2 L
  21. (command "line" pt1 pt2 "" )
复制代码
6 c; ?3 x; K) W; \/ K
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
% U3 w7 m  p1 h- w另外,我在明经看到trans的解释:
2 j; S! r+ J. v% E" W5 A+ I将一个点(或位移量)从一个坐标系转换成另一个坐标系
' i; r0 y5 w' z* g(trans pt from to [disp])   参数0 O: _% u9 E6 v" S
pt
2 e  I) c5 e2 ?( y: n三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
7 ?3 P- o/ w7 ?$ K3 P6 P2 @' B- ofrom& R* l: U5 D3 m# m% h& J. X' ?
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
. ?5 t2 x* s% R0  世界坐标系(WCS)& S5 W& y- N9 D/ K
1  用户坐标系(当前 UCS)0 j5 f+ x7 T) p2 V$ }) H# e' U
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。9 R  f0 o$ C  _0 ^* a1 G2 q- [  }
3  图纸空间 DCS(仅用于代码 2)
8 L4 w& c  k' g: O7 o7 j7 H+ ]
; i2 j2 d% h  Y' R, a7 {) G& i( d* h后面的解释就不贴了,此外还有一个例子:
! K3 P6 p( @% d3 e" o  Z( m: i在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:- C; B; ~+ z* \% r$ ]$ K
命令: (trans '(1.0 2.03.0) 0 1)' M8 K9 w0 g/ j4 Q3 J' ^
(2.0 -1.0 3.0)
2 R1 J1 W) |' f8 J$ Y2 b3 r3 w" h) \! i9 _$ p$ K
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
3 E5 |  g+ H- `6 W0 _( x最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。7 K2 Z: P3 D( F

" w% I5 u4 Q1 |# f我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
6 Z7 U7 L+ c/ o7 e: f' ~0 f(trans pt from to [disp])/ ?+ O9 s4 e3 P" m& C  T
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?2 U0 G! v6 X2 b) I, b- t
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
5 c) Q" T! z8 ~  q. i: q# H1 v7 @* x* M4 q( y, }9 q
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。5 Q8 n7 t" d1 {; v6 H' v. S
(trans pt from to [disp])/ ]( Z8 m% |6 F' G7 H
这个很明白了,转化点从哪到哪的意思 ...
9 o+ {7 S: ]: R* L5 e$ Mwww1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
, H! [, \* O' d) I5 F9 \( d

3 D7 H! q% }$ `' ^1 Z0 I# n是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    # Z1 Y# l) g2 w/ |5 i+ l; o/ x
  2.   (command "ucs" "w")* |  Y& J# p# k% |4 m7 ?
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线3 |5 y3 f9 r8 x5 L8 ~) f
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    4 ^3 l& ]( O/ z% \& r+ a6 L" D& r
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)  ?  ^  }) W. n7 p- {# A, L
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    ! y, K; M9 w, x( C5 [$ n
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)* O5 G  B. Y3 r4 z: x# h
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    5 ~! C1 x" k2 a5 q
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    0 i/ C: I# X. v2 P2 ^. T( Q) M5 ^
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))7 D8 ^1 K3 n- O3 r
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    5 ~1 m8 |4 ?  l: X3 T4 V% Y
  12.            )
    6 R. C+ f- a& A
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    - S6 o4 [, V: H+ J. D3 Z
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点4 \" a1 z. d, T' o, D( I. J
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向* c, @( x' c; @# y3 ~9 a' H1 O6 ]
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    ' H% j1 R  h- `4 a
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    0 ~5 z3 ?" l0 g$ O( B
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    * ~+ z4 T$ |# |
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))$ J: l5 t, Y. c0 I5 u& P: p
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标0 e' c1 c  d: b! i; ^* ]0 L3 }
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值: ^( K/ y5 I: @) W# M( z) Q5 _2 k
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))( j3 _* [: N; f& Q& }1 [
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    5 `0 O) h) s. \, F% R
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点. r$ f+ Z& ^2 m0 L5 L3 Y7 o
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标* r9 P2 O, P% y
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    7 E  r; n/ N0 T- o: s: i" r
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点" D3 j% |3 c- \+ G
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))3 }3 e3 ]- U' o8 c. G
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点9 y2 {9 H# Z; I$ L
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    + u& w. l2 I  I' U- q& A
  31.   (princ)
    & G9 g+ X3 C+ u
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
0 l/ o3 ~3 F5 U0 d8 }; x本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
! I- U, B4 A# @谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!5 _5 ~! g: X+ }! B" G7 v% J
看了你的解释,有种醍醐灌顶的感觉,呵呵
( C/ d9 f% r. |$ i' h+ F) d, f( `" f
1.! U; K9 O9 a% T
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))+ |9 X0 {$ }2 O% A
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
' ?* A5 n% ]0 `" ~                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))" ], R1 M, Y: l0 }( n4 b/ o
           )3 [  T; d( {6 r7 B6 ~) _7 e
  ) ;求辅助点,用于下一步新建三点UCS                                       
7 a! I4 g, H/ W;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
& u7 ~  z: F% g0 S; p8 z( k; E& O/ }% x' I

! k+ m5 a6 \9 F最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
- \$ j# G& G2 o3 h" Z
" I" B4 R! K. i. Q3 w9 X5 F' ?1 u9 U2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
2 N( Z) P: L6 }% P" T3 v最开始看到的trans解释:) X4 b! t3 B5 U( ?0 _3 O
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
4 w$ z; A6 P7 `, {9 P+ w命令: (trans '(1.0 2.03.0) 0 1)
+ G/ Q6 J8 |  P7 U(2.0 -1.0 3.0)6 t! y% F( H6 ]- K
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!, _5 W. t+ Y; u8 K

: d: g7 h- D2 H4 n3 ]
1 r' f4 P/ ]. C1 Q, u; D我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。0 y& K- [# Y8 k; Q% t6 K' f2 m
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

8 j5 c! o' G. a: R* ]& F, g不对.+ \: o' t- ?7 j8 v
下面举例说明:3 ]& c* w. E) b0 i: j
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.% b/ c$ ]( B4 Q' Q
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.8 x2 @9 }6 u9 X+ i( q6 c$ w3 ?3 L
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.0 x, t3 Y+ Q0 J0 D: Y- J9 {
我们再在命令行键入(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).: F6 U& p' d6 X. {: d7 j
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.2 s* R8 g  }- g5 j  H
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.) R9 ~) u2 A" j$ L% L2 d' \
8 k7 h6 s+ _5 [' S+ w" |/ J
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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