QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
+ s0 j" ^8 L* ?$ M  s) h/ B, l$ N, A0 a! d- E1 O9 g5 r$ F5 a& o
请教下斑竹,trans到底是怎么理解的?9 ^) ]1 d) J0 t; q7 |
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
+ D( W& r4 d% n6 G! y& @. A' r% }
  1. (defun c:gcx(/)
    ) T, l# [3 c! L, v2 s: b
  2. (setq l1_en (entget (car (entsel))))1 W( R0 V- ^8 G. Z  I- I( v( l* K
  3. (setq l2_en (entget (car (entsel))))# Q7 |1 _, j4 l, y" v
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    8 c5 m+ D; x5 \$ M' A
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    / O: k" r5 m2 _: @0 V" T( T
  6. (setq pt21 (cdr (assoc 10 l2_en)))- X8 c/ F2 `" L' v
  7. (setq pt22 (cdr (assoc 11 l2_en)))2 M4 A( Z: i& b9 }+ {
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))1 |* D$ d/ c1 L* N
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    ; `* L6 P4 H+ B# i) K3 B
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    3 H# Y5 _0 z4 J; L. @: ?
  11. (command "ucs" "3" pt21 pt22 pt)
    ' ?( j) N6 y- f" ~1 F- B+ i- q
  12. (setq pt110 (trans pt11 0 1))7 y* S/ d, u# C! x0 ^" Y
  13. (setq h (nth 2 pt110))
    " k$ j( `- V' X. a0 u; Y
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    + r6 y' o* E' E. x, b$ w
  15. (setq pt120 (trans pt12 0 1))
    % X: Z0 u0 Q" L2 K* _8 Y1 E
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))6 C! U( c1 r/ X3 y3 q" x
  17. (setq pt210 (trans pt21 0 1))
    1 }8 \  X) V/ i
  18. (setq pt220 (trans pt22 0 1))" ~# E% g" f# _
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))0 b7 P, w1 U8 o
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    ! W  R3 v7 ^! n$ {: m( G4 e" i
  21. (command "line" pt1 pt2 "" )
复制代码

+ U" O. U: {: Z6 }5 V' I1 V前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?) z# K- ~- s. v
另外,我在明经看到trans的解释:+ A+ o1 i/ V- |. K5 k  Y& M
将一个点(或位移量)从一个坐标系转换成另一个坐标系$ F. E% W/ l! }6 v; v/ f) x% `6 m
(trans pt from to [disp])   参数
: `) r8 f) N8 T  t/ {* k2 ~pt
; _5 I' \4 f8 t% @+ [( n% r5 m三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
8 {9 _+ `6 i0 D% K! _from) }5 V1 \9 a% a4 B. N( ]* c
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:4 ^/ a' |( r; i1 L3 F( h7 N. {' v
0  世界坐标系(WCS)7 X: J) O2 Q! g
1  用户坐标系(当前 UCS)
& F9 i( {& ^) K2 P) @0 s* d2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
3 }" m8 N8 o! m6 H% I$ H7 T* K3  图纸空间 DCS(仅用于代码 2)
' a" B0 a. E$ d0 V7 a7 |
7 r. Y3 G' {  J* V" v: L+ X! s3 k后面的解释就不贴了,此外还有一个例子:
. `! q: C% Q. E- x) q+ r在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:+ g% D$ Q  u! ~' M
命令: (trans '(1.0 2.03.0) 0 1). f2 q* R( z7 Z$ V
(2.0 -1.0 3.0)
9 w8 I& k" _& t/ t. x& ?& H
5 K0 l, \1 }( |$ `这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
) B- @) a- _& x) }- f; ?0 Y最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
; G3 f5 H. ]- G  V! o( P& h( B! r6 a8 K7 `
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
9 ], w4 z, h2 [! J(trans pt from to [disp])5 e* \' J& P  L& a: }
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?7 O) [& t9 Z* w% P8 ~; }0 e
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。! }  T2 s( I: y8 N

% ]( ]- v, b: i  N; |& T1 X我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。! G# B& b" j8 }+ h4 S. \* M# Y
(trans pt from to [disp])/ x! [- A6 V* u4 T8 g+ W
这个很明白了,转化点从哪到哪的意思 ...
6 U0 g( \. p8 ~- O) @7 n1 O4 {www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

; B1 P7 Q5 I+ i7 w; ^: k
1 ?5 J  |6 w+ J% F# e% w* J是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
      A# j% Q7 T  Y/ x
  2.   (command "ucs" "w")( S+ Y% k) @5 B# E
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线( l3 r. G- y8 O. o2 j
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线; s7 D1 Q7 m* a6 @# ~8 @- N2 F) F
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    6 P4 E- S- J' Q8 S4 o
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    7 g3 p; C, g, e' i
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)# I3 b9 |6 {! v9 A+ c
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    / q  G5 S4 j, J- p4 {& {  e
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    : W5 f8 S, e! D9 D" z9 Q! x7 _$ M
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))7 ]8 \, P7 b0 p/ B$ Z
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    + F, C7 {, F! C. y4 a
  12.            )
    " E# N$ F4 V, O2 W6 ]6 K' G
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    # [& {6 T: F* A" f! e
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    ( C+ r& N. s- u- X4 |* z1 {
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向) i, H6 a; f  S0 h& _. i: \
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    % X; g% _+ a- V% V0 x; ?. o  X: ]/ C
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
      _$ A# L. Y  A  ?# e4 a: M, T/ W
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    9 l5 {+ o: c; F2 e7 v. Q7 n  o
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    1 P' D. H3 ~7 J1 }0 u
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标0 g2 Z- _$ m( I6 {4 B; M( `
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值, D5 j4 f6 }+ z$ O
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    8 t: Y/ p  i% z" s' k
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标6 B% V+ t- G7 U6 X$ `# H
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点9 D2 m! z% O. e  a& h1 S
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标1 S; Y3 f2 E# z& {/ q" e4 W
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))6 G& v" j; ^( \4 Q: L- I
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点3 Z; d4 O+ _0 h4 \& L
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    8 O+ d- b- E: g
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点! [# [+ V5 T9 k/ j+ {& ~8 F
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线' z" X' G4 [8 \  t) m& l2 [
  31.   (princ)
    8 n  y: i! f' ?9 ]- e* @
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标" ]8 {/ J: W& N0 s
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
, P% l+ L/ B  J9 Y# Z谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!6 U: a8 t5 W  l) }  N
看了你的解释,有种醍醐灌顶的感觉,呵呵2 _& V4 n% o2 W7 U8 t

# [/ L" \# y/ `1., `, v$ d. y# ]3 e4 g
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
& P/ W$ ~: ]6 r) q+ {4 q1 i                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))- G  ^& x& l  W% p: c
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
& ]4 ]) y' ]! C& g1 L) }2 f           )
9 |, }$ F: K2 g6 Z2 s! l. P  ) ;求辅助点,用于下一步新建三点UCS                                        8 E6 |) o& u+ w$ r; s, F
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点8 m: Q+ U# l( _6 E

5 d* |7 ?. ^; D. u% P( u0 H3 I% j" m/ F/ L+ ^
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!! e6 K2 Z) T4 H# f/ t
& p* S1 F2 }, o! y
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
9 J  z% b# |/ ?) t  E: J, k. P, D最开始看到的trans解释:. @  f  n3 _7 s, S
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:5 n; v4 I7 b# l
命令: (trans '(1.0 2.03.0) 0 1)
5 ~" \' H5 b! l+ F(2.0 -1.0 3.0)9 _6 G6 A  ^9 \. Y' H' `. y6 M
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!4 L9 v) c3 p# r8 ]$ u, K$ e

4 B% Z: Y6 G) E6 K! u9 _# [, @$ o! z. x2 W5 ^4 Z
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。2 Q* M0 W3 P0 W) Y, Y; R7 N
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

4 R2 W( x6 D6 J; H不对.8 P( e. f1 b1 j6 [& D# f2 }7 R
下面举例说明:, N7 d6 t  |" [- ]4 g
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.$ M8 B3 q& y# F* q4 x/ ?
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标., a9 [3 u' p) _# ~" p: Y+ {
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
  g5 l) v3 q. h' O8 l3 y我们再在命令行键入(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).1 \4 d+ h/ f/ u/ \# f) G
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.+ L  M  w0 H2 x; i+ w/ `( [
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
+ x& x: r% ^' H7 ?7 B* v: q
, M* Y! _& W+ U. B/ H另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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