QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 5183|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
3 P6 d' ^9 \6 @/ ^( ^5 n7 x. U6 o7 p: @( k4 ~* ?, ?& u
请教下斑竹,trans到底是怎么理解的?
+ P4 o8 o9 A& R2 |5 P5 w问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:* w. \2 N# c9 O7 t/ i
  1. (defun c:gcx(/)
    9 S0 p$ C4 i4 x* a; ~) z7 X. U! Q
  2. (setq l1_en (entget (car (entsel))))0 D' T9 P/ W0 n+ {, `
  3. (setq l2_en (entget (car (entsel)))); t9 a7 D. k& z( l1 `- G6 w7 p
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    . E. R$ p) Y% a1 E
  5. (setq pt12 (cdr (assoc 11 l1_en)))) S/ {, b/ J3 T0 L  A7 q% I
  6. (setq pt21 (cdr (assoc 10 l2_en)))3 J" G% T* m3 i6 ^5 W6 [  w
  7. (setq pt22 (cdr (assoc 11 l2_en)))8 B' F. Q" e) R* Z; ]
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    0 _* t5 |: V% x+ c2 z
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))2 R+ s. y3 N9 Z3 r
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))4 @8 I6 A2 P$ ?* y- P- z2 }* x
  11. (command "ucs" "3" pt21 pt22 pt)6 z2 ~% S. o& d% R. d0 i
  12. (setq pt110 (trans pt11 0 1))- U$ B" m: e2 T0 B# c) v
  13. (setq h (nth 2 pt110)); `6 x' w9 z) \  t" d& g5 A! ^+ |) U
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    % W7 d. p4 q- x8 @$ \9 p( L( x
  15. (setq pt120 (trans pt12 0 1))2 f3 C2 L) g+ c" ?
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    , _5 k7 `4 B; h& [7 r
  17. (setq pt210 (trans pt21 0 1))9 R) I; P: K3 J. H- v; L. V7 t
  18. (setq pt220 (trans pt22 0 1))& M( i6 P" i( P& d( d
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    6 J  C' d) v* U' T; b  w
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))( X4 O) b! `: M9 W. V
  21. (command "line" pt1 pt2 "" )
复制代码
. W7 D" _: u1 l2 t! A( v
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
8 O2 n& n6 F# Q% D7 a5 H另外,我在明经看到trans的解释:
7 g0 F& ?- C' S. q1 D+ D1 R将一个点(或位移量)从一个坐标系转换成另一个坐标系
. s' @  M" U- H4 T(trans pt from to [disp])   参数
, `1 {3 Y2 R( S8 C: n8 {pt
9 @6 ?/ I) T# Z9 x三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。& K; \6 m; ^, L4 A: E8 o# M+ a5 p
from
3 p8 l4 \+ u# p) O整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:( @0 t" u- m  t
0  世界坐标系(WCS)4 p* S  x" [  h& U
1  用户坐标系(当前 UCS)5 M& A) F$ n6 t% o( [( Y% F$ Q
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。  G4 d3 y) S  f0 r3 H4 u
3  图纸空间 DCS(仅用于代码 2)! }- n. K, [7 F" o6 u
3 u- k7 ~2 q6 K% n, K9 b% V4 J
后面的解释就不贴了,此外还有一个例子:
  w+ f" e9 Z8 k$ _在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:: K& i$ B/ a4 N# E4 `
命令: (trans '(1.0 2.03.0) 0 1)
' O0 i. E* D5 T/ z4 b9 E(2.0 -1.0 3.0)% J! z2 N' ^$ {$ X
) f5 M$ j# B# Z# \; d$ p: ]! D! |
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?5 X2 K7 n+ Q! T0 g* ?
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
+ h0 j1 }9 i" w4 `8 l6 G7 L; V& [2 U
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。& K3 ~4 [3 d- ]( P) R! }
(trans pt from to [disp])
& c0 L. `% e$ U8 A9 W6 J5 n这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
! u* t2 S3 B# a* R除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
4 M- x5 N3 K2 i# p6 S" v; E! x, P( X) F& O1 o9 n7 b
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
1 }# `* Y/ w7 \8 q1 H- l(trans pt from to [disp])7 r$ l( I# W* l4 H
这个很明白了,转化点从哪到哪的意思 ...
! W6 ]6 P" f; S- |. m9 W" o3 g7 Bwww1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

+ m- v; K  [  Z9 h: Y9 \& z9 u% |' t  x/ ^1 e" \
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    2 c/ D* K& d& N2 g' P$ ?- O
  2.   (command "ucs" "w")
    3 _( J# n3 J3 f2 [: F: F7 i; w
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线) h2 I, I  B4 S+ `% c
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    " k4 _% X/ S1 I; [7 _' t2 L/ i
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)8 C0 ^" G( y6 B. ~
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)# c# Y; z- M! r: F1 A
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    ; N, y0 x3 N  a$ V
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)! O7 E! X* ], w8 ?
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))4 P" Y/ m3 x- Z) P0 c
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))8 n6 c0 `- \, L$ |0 N( |
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))) O- ^" C: `' o2 j
  12.            )
    / q; A* E% `' S
  13.   )                                        ;求辅助点,用于下一步新建三点UCS  i7 q$ J- B9 F, G# ]0 z+ s! l
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点- a% M" B: ?( p+ @8 @  J: c+ {. i
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向8 d% w% {, ]7 ~) f+ X
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    " ?$ i- M1 @# D0 r
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    ' Z4 U% ]( Y  G/ ~2 e' \1 p
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    5 f9 K1 H# l: S9 J, _) C
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0)): {! Y; e5 j: B* w, r2 ^# `& m+ m
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    8 _6 }$ J; a7 r  L' w- k/ N
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    " W$ L% T* L0 R6 g& r
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    9 e7 `8 K# `' v( ]
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标" R) c* P8 C9 _& h' r, w6 l
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    1 k; W/ R/ c! ?  B& O
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    , _/ }+ _5 ?+ U- a0 I
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))7 X( C7 A9 C0 O" e$ K3 `; M
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点3 G4 v& P1 L- R2 [5 ^3 K( b: ]2 c
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    3 @# k' }5 W, _& K& T
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点( \0 |5 ~  |, `. Q: Q) z. o
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    ' q/ Y, ?$ q5 @/ P6 r6 U8 k
  31.   (princ)6 l: J- _7 }* E0 U$ C$ W- O
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标9 ]4 D* S/ E0 \3 x% K
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
( ~8 b. a# d! U谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
* Z) V' ~0 F. F; O看了你的解释,有种醍醐灌顶的感觉,呵呵6 B) }  y5 V. I* Z& d: k5 ?

1 F: y+ S0 g: W9 ]( G: l1 l# j1.
9 N+ N. `4 `8 A/ ]: O6 R (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
8 C* }$ v" ]/ _                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
3 D3 x: b4 H$ @, }1 D                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))! ?7 m$ h# W- _( ?3 ^+ C# c5 t; l
           )
$ g1 X. [. e8 `/ x  ) ;求辅助点,用于下一步新建三点UCS                                       
/ k6 I. i- D, S" {- ~;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
: U# B( d* m8 }+ h" Q, T5 P% b2 X: k$ J
. i/ a- `* J$ z/ p( |, U. v) U6 x
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!9 A+ \( M9 H& l8 g9 m9 e) l( o2 |
( X* h1 _/ a1 p! ^3 ?% v
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
5 u- T$ o; s* m, X, ]9 `4 w0 W% ~最开始看到的trans解释:
9 i) I  Z  N  z1 q; i- t8 H在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:1 n& g. K+ J2 G; n5 T9 w& E6 X& f
命令: (trans '(1.0 2.03.0) 0 1)
- F+ ?3 ?4 r) o5 O6 ?(2.0 -1.0 3.0)
! V" A/ G0 s, E' k% t3 Y我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
0 m" w* M+ v) t, O3 S2 X+ s( E7 g/ S: \* D$ `3 t

* _" l. F1 M2 h* c7 l我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。5 X: f, M/ W) ]8 {% W2 ]9 Z
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
1 k" d8 e+ E) X) Q( I- K& C
不对., b7 }. g) C0 V8 D
下面举例说明:
: y2 h. [9 ~. a0 T在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
9 f, h0 A6 V0 k$ b现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
4 m- R. H6 b- k2 S! I/ d4 g/ o- n下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.% P" K5 a1 w: ~: Y$ ]& [1 f
我们再在命令行键入(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).* g" j# F" `( v2 T5 Y1 k
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
2 G: z: m  s2 ]9 k结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.2 N: c5 ?8 r9 ]# p- V6 @  x$ @
1 k+ y( q$ p% x" _3 J1 M+ p
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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