QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
# o' H- H5 N3 Z1 h* \9 P  U" `7 A7 r. G6 Z" J4 C
请教下斑竹,trans到底是怎么理解的?0 x' k. n6 e* M) ]7 r% S
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:/ X3 `6 o. ?( y/ W2 R2 b5 M' @* x- m
  1. (defun c:gcx(/)
    " Z1 V/ u0 H3 ~5 x
  2. (setq l1_en (entget (car (entsel)))): [* c2 n9 z6 ^1 s- p; O/ y
  3. (setq l2_en (entget (car (entsel))))
    % c& U: _* R. i
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    ' o# s6 {0 P1 w# ]8 S. u
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    / e$ t% P0 w& N& c
  6. (setq pt21 (cdr (assoc 10 l2_en)))' s+ T5 Y5 r/ G: F7 b& K  e' V/ ?- |
  7. (setq pt22 (cdr (assoc 11 l2_en)))5 h1 x, j3 q( ]- x8 @( L/ H
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))' Z! h0 t! v" v' K
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))5 G% G6 H. p" w. i7 _: Z
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    0 q$ L+ l/ R8 b7 Z. k4 }
  11. (command "ucs" "3" pt21 pt22 pt): F- ?+ E( M& x8 {8 G( U" j* H$ f9 d
  12. (setq pt110 (trans pt11 0 1))
    6 W) P0 e7 f1 e  D2 @
  13. (setq h (nth 2 pt110))
    3 [! S' Z2 v' x) b* G# x
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    : K/ h/ y# M( s1 f
  15. (setq pt120 (trans pt12 0 1))+ h2 {' X% ~3 D* n$ h- r: j
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    ; s! |. S0 q$ B% }6 \
  17. (setq pt210 (trans pt21 0 1))
    ' b/ b; d% l. q
  18. (setq pt220 (trans pt22 0 1))/ y5 v% `3 Z. y
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))) _4 v* f) X* Y* B
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))0 a3 S8 ?2 i) c, ]) B- e
  21. (command "line" pt1 pt2 "" )
复制代码
8 I' V% l% [+ t4 n* i
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?" @4 Z1 }' a' A' `
另外,我在明经看到trans的解释:7 V1 z' H/ E3 {0 Q
将一个点(或位移量)从一个坐标系转换成另一个坐标系5 s' S& k$ L4 T7 z$ j) }  y
(trans pt from to [disp])   参数) ?3 l0 Y: B/ K7 O* F/ _* S: j
pt
4 z, w) s1 H4 e+ P+ u( f6 X1 F三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
  |- B7 ?2 b3 D% b4 pfrom; E3 M/ n# Y* j+ S  Y, o  R
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:0 x. h" C; p& L% _* N+ F' }
0  世界坐标系(WCS)
% j" Z  `! t( G! T$ }* S1  用户坐标系(当前 UCS)
% f4 u; g# U$ j- e* d# {2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
5 B  P# h. ?1 Y4 Q: F3 @7 h- M1 Q3  图纸空间 DCS(仅用于代码 2)! @9 H4 h. A6 b9 e
4 Y. j8 D. U$ O6 \
后面的解释就不贴了,此外还有一个例子:
. Z9 n( |% T8 P在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
6 {6 f0 a3 i" e1 E命令: (trans '(1.0 2.03.0) 0 1)( j$ ]/ z# |" T! o. X; r' O
(2.0 -1.0 3.0)% c* C: r) E7 c5 v+ L

* A, v4 W7 Y( [+ G- D6 a! n这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?: h! m- s. ]* s8 u7 I% x
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。# V. h; c% Z( }9 o) D& F4 I. S

0 C! a) I/ B+ m. U我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
5 u' ^  V! w8 [0 o4 i(trans pt from to [disp])/ j) Q  b/ ~, h
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?  h* k, q( X# t) P; y1 F1 G
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。6 z1 m" L+ x4 G; x% Q$ n6 o

. T0 D" v* L8 g! ?6 q我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。$ j8 b& R5 [; q1 ]7 w7 R$ F) T& [) r
(trans pt from to [disp]), X9 {; P" f9 S- p9 a' D* i4 o2 O
这个很明白了,转化点从哪到哪的意思 ...+ R0 T- E, N8 S7 S+ o" R
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

/ U0 L5 P# s4 ^4 _5 z
9 _* l! U) ]9 \是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
      |" C/ E: y0 I* }
  2.   (command "ucs" "w")
    / f: P/ _# S2 l
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线! d  w' s# c) J0 _* }4 m
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线6 J( s9 o  K! N7 ?
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    , v5 v# c: w5 r0 `
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)% N3 n/ }5 C9 x, ^  t1 Y
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)6 `0 e9 W- d- p6 Q
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    * o9 C5 m" X+ t! N. W
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    ; ~9 K$ D/ G8 e3 k
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))3 r. R& ?! C/ h( }+ L1 V
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    ' J9 H/ V* Z2 o' {, |1 `- [
  12.            )( J. ?! G5 P& f7 k$ Y
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    + ]' a2 P0 ]4 ^  t
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点4 W; ^( O% q/ R! X8 E- Y$ p, t
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    & x* R' X, c* _# E% B2 p) J
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    9 t4 Z; M% S( w- `$ z9 l
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    - v, {4 s4 L& q4 c2 j& o
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    ; i/ m7 `: ^+ w  I1 k9 I3 Z; L/ J
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    : o' f$ g. Z2 @/ X0 G
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    ) G7 K0 |# w& e! [( P5 \& ]: y
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值6 I3 m# u. s2 N! @7 O
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))3 g7 ]- @6 A" j4 Q# Y3 {* _
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    6 _% m1 y% p: R! F. W; f1 r
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点  B$ U& ]/ K: n$ a5 k% q
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标5 C! @4 h; N7 K: t+ [/ ~9 f, w
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))8 L  J5 D8 z9 w! `3 i2 A3 {
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点* [( i& L- T6 C4 G6 k- Z; H0 T2 {
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    , x: J9 c% ?9 H5 P3 K* A2 w
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    . i6 d6 o0 ]$ z2 l3 |" B5 C) O
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    3 Z, \$ ^4 {3 x+ f  g# b
  31.   (princ)( q* @0 R# y& [9 g2 p2 K/ I/ K7 K
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标) {& R, d: ~3 M0 @: J
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia 0 b( i  g9 ?" }
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!5 I9 g9 ^" J" o# W' ?$ [
看了你的解释,有种醍醐灌顶的感觉,呵呵
7 D! Q; m( n* o+ Y9 z3 D& o4 P3 y# \5 X
1.+ m$ {- h( u/ i* B
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
8 T6 H6 c& L1 F$ w% Q                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
. j5 O, e, M( P2 s% _- [                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
+ v5 n3 \; \8 A- G5 L! l           )
" l% `; Z, J. ]1 x+ J# X  ) ;求辅助点,用于下一步新建三点UCS                                        * ]; }% _9 G8 I/ f9 p; }9 x! i
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
" q, d0 M6 s, g9 o+ \1 r% V- b( X

4 J8 `" o+ x( v" |" T+ P最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
; d# U- a: @4 f. K2 J- Y6 N1 N9 y, V/ e& K( D
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
2 t& p) v- x5 m5 U! ]9 \最开始看到的trans解释:
  J, y6 d: R: q4 e. Q1 c$ b0 V在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:$ \( N# q/ M# w7 L1 S+ Y, n
命令: (trans '(1.0 2.03.0) 0 1). t4 G/ S) v7 Q4 l
(2.0 -1.0 3.0)" M4 }- @4 M9 S8 s. J
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!, K$ }8 n2 a8 b  N9 Z+ Q% ?' @) b

8 [" s% w; i: m1 j$ O7 a' X0 l* J, Z1 e5 L5 L( d" v, m
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。7 U4 y( o' J& L0 G7 k
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
- b) C2 \5 M9 y; d9 c& _: F
不对.
6 z+ l# J3 k& [+ s  A/ B2 `/ e7 k; N下面举例说明:; C. b$ [, `7 t0 `7 _& B
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
1 t( m$ f( H7 _4 g% `) `) K1 d现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.$ q# t! c: r! Q3 k% H  x* C
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.$ G  E. i" X& \# \8 |& q
我们再在命令行键入(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)., c0 Y/ K0 T4 A+ l' Q) }3 @  M- s
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧./ v2 P* l7 B) g5 n3 Q5 q$ y
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.2 |' B. x8 ~- p3 }
8 E5 P  ]6 i: m2 g# X8 R7 ?/ r
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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