QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 5051|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
: A$ m0 x: _4 y, L
$ T7 t, x5 M: Q- {( G+ z2 z/ m' j请教下斑竹,trans到底是怎么理解的?9 u; Q* v1 I6 z
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:! q* R! y; [5 t' R3 A* O# _' q
  1. (defun c:gcx(/)$ x' f  F) I2 I% z# C
  2. (setq l1_en (entget (car (entsel))))
    % n3 h- h" E) R; T+ M" ?
  3. (setq l2_en (entget (car (entsel))))
    4 }3 C& h, p% E% ]. ]3 J" X0 b
  4. (setq pt11 (cdr (assoc 10 l1_en)))+ R' Z! i- h" c. @3 Z9 y
  5. (setq pt12 (cdr (assoc 11 l1_en)))# P9 s; m% g! w' ?! B4 i
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    0 _: C+ Y, S" R4 O, P
  7. (setq pt22 (cdr (assoc 11 l2_en)))* Z7 y' I# P9 r+ i  t
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    # b% m; U4 P( V0 M' L
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))3 Y  D" l, L) ]8 j; G0 o7 E1 K" R
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))3 Q3 e; \$ x# m; P
  11. (command "ucs" "3" pt21 pt22 pt)
    - J" \' w- ]! g' v: a
  12. (setq pt110 (trans pt11 0 1))+ y$ q# r2 H' H: S
  13. (setq h (nth 2 pt110))
    4 S3 H5 u5 q$ ~+ [9 B; n8 }$ t) r
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))5 r: I6 s. s) _4 n/ t) w! H  F
  15. (setq pt120 (trans pt12 0 1))
    5 X1 B1 N: P9 `, z6 b
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    & v6 H: \) i) c+ q) A9 g
  17. (setq pt210 (trans pt21 0 1)): a8 g3 H. \* I1 W6 Q, s5 V) h
  18. (setq pt220 (trans pt22 0 1)), h4 B' |* {) F6 s7 q
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))8 |3 n7 ^' b: }7 n
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    . l& S5 A0 c4 Q# G* S& `
  21. (command "line" pt1 pt2 "" )
复制代码
8 H: p8 I* n4 J
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?3 [" W* w- R9 S# }
另外,我在明经看到trans的解释:/ \9 i: F' l  [9 {1 h8 r7 n
将一个点(或位移量)从一个坐标系转换成另一个坐标系5 |2 H( ~' i* B* ^! L. L
(trans pt from to [disp])   参数
1 Z: e. J- M" _2 Z& X  Xpt" Q1 W$ e  n& B# ^  }
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。, W1 p4 M. j, H' S" F
from
+ K3 Y2 C/ b  T整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
4 d5 n3 ?0 ]- @0  世界坐标系(WCS)2 u$ z) y  B- S/ s
1  用户坐标系(当前 UCS)) M( O: }. t* }  `/ r$ X  C7 d% ^' w" Z
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
9 l1 }, r% `( Y7 [7 {3  图纸空间 DCS(仅用于代码 2)
% y5 N6 e9 S/ k' ^  H; c: X* m( n5 m( Y5 W6 C- h' H. Z, I2 x5 Q
后面的解释就不贴了,此外还有一个例子:, F8 T1 ~0 E* L* B
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
8 i/ }4 E6 u3 |+ v: X命令: (trans '(1.0 2.03.0) 0 1)5 I, M; ?  L9 X
(2.0 -1.0 3.0)
$ n3 r: ^, \: t! }
" j+ W" ~3 s2 [这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?% e) C) \* ]6 E' ?
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。) [% \0 K2 r, V2 c

  x, W. b+ o" K: P' y  J我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
+ f2 C  I5 C3 ~; L) u5 q(trans pt from to [disp])
7 Q+ l9 }% w0 u- G1 P3 t/ ]这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
1 l% h& b6 t) g! [) O9 ~* Q* s除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
& g: \6 O  a+ u7 V) ~1 w' v  ]6 }8 _3 L" z) e# N& _) r
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
5 u6 d' Y8 g# r! n7 s" j: |# A(trans pt from to [disp])
5 K- {: {8 B" N! Y2 {1 b这个很明白了,转化点从哪到哪的意思 ...3 f& N1 ]0 \+ g/ N
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

/ Z/ M6 l% L: m& U8 N2 E0 r' w6 E) Q
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    * [- Q, s3 {$ l: Q0 n+ _1 I  @5 W9 ~
  2.   (command "ucs" "w")" I; p" A: E8 l/ o! B' A
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线, L! Z: y( D; e* P6 x* w
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    . N$ B7 d- o1 a! B; u+ `. D
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)6 P1 {2 e3 `5 k7 j* j
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)" t- N* O$ [2 A' v
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    & W: a% f( ^' E' C* v( P. p# H
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    9 z7 G, M- R3 |, T
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    8 ?; S! u# {. m) A0 l) l
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    9 y9 j, j; j& r; p$ b/ Z
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))( [, Z% G" r  c
  12.            )6 [  g% |" z! y" Z
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    ' G& c$ R9 T+ A; L9 r2 u
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    ! G4 N# d* a# H3 ~# Z, y
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    % c& m" L2 {; B, q0 E7 X9 H
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面# @4 ~/ U0 s$ M) s
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值% O9 R3 ?4 i3 F& I/ Z. [4 l) h
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度5 d8 |6 D, B  X  c
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    $ p1 N! B9 }; g' O  U
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标" C4 Z6 f0 h4 [& M6 k% d% \5 v
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值7 l8 g3 ^$ j  K
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    : p5 J% o7 E# G9 A5 S) [
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标6 T8 X. X, p  A. ]" W; `$ g! v8 {
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    : `5 x% @* q$ H. W$ k- z+ m" p* P) u
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    ; |6 N7 e+ s3 a4 [, ^
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))+ p% E& }/ R7 [# Q) N) s
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点0 {3 u" f9 J0 |3 h9 F/ L  _% b
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    & f( r  e7 z% w
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    / i8 D7 s( Z/ E" e  }, [. J
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    ) d  ^* E2 P+ k4 k5 R$ W
  31.   (princ)
    ) X4 R& e) ]( F! e
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标  F3 z) E! h2 ~" m0 I5 J
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
, N4 G$ x& @0 ]0 u谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
0 M+ ^$ D: o1 D4 N1 ^2 {看了你的解释,有种醍醐灌顶的感觉,呵呵
- _0 H" D' _; K3 e
7 B2 I! O; B% j3 n: m& |1 Y& N1.; k7 B) X! ^+ `( a' L- U4 G$ r
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
5 J# R" E8 h' x% z                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))% [" W: F# v; {$ @0 }
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
7 M" p7 Z8 \7 U+ K# i& p           )2 I9 R' D. c' o
  ) ;求辅助点,用于下一步新建三点UCS                                        1 }/ ^0 h7 L+ q6 o: n! ^# k
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
" A7 X# p. {) m7 q: Y
- Y/ d2 Q! w3 _. n* R9 d1 d; _! W# x7 N& n8 }3 F- D) ?! R
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
, B4 v2 O6 A6 P. s0 I
, k/ X7 e; X: O5 C5 H1 l4 V2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
3 G' ?9 x1 |8 ?& X1 Z  o最开始看到的trans解释:
5 J2 Q% Y8 v: \& @3 G: F在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:9 e" l. z7 |  b0 P6 B
命令: (trans '(1.0 2.03.0) 0 1)* o- `: R5 _# c" l/ `
(2.0 -1.0 3.0)6 N* H2 O: \6 P" E) ?8 s5 Q# ^
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!) ~+ @1 ^* f: g, S
7 W7 d7 k7 \( I  q3 m/ D) I3 n& u

9 M9 d' }0 y+ c; @我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。% n/ M8 z7 l& ~3 Z3 o
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
& e- T9 l+ U, y! e( j9 ?  j! q: k
不对.
+ p7 E( {( M4 y8 k- K下面举例说明:2 k4 \+ E/ ]( |: ~
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.; G" k$ b1 L/ m1 b* r
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
1 d/ ~0 K! M9 E) x" c/ t9 [下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.) l$ @1 g! W2 h7 c( @# {
我们再在命令行键入(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).
3 @! q3 d# \/ s0 T; W( ^我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
8 X( B: a  N& u, K结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.# ?5 t# s$ _7 ~) A, @; \
$ B1 t$ Y, O  Z6 x1 G- ]
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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