QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
. ?, s) @8 V- W5 P$ o( G6 r
" a% B: c5 ?. K/ `: i7 T请教下斑竹,trans到底是怎么理解的?: k' S/ j( b! x9 ]
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
- C& ]8 I" z% n* K0 m
  1. (defun c:gcx(/)! m& g& e& ]8 Z' ]3 ?* `
  2. (setq l1_en (entget (car (entsel))))
    , }. Z) r" M' D: j' A% M
  3. (setq l2_en (entget (car (entsel))))
    , W: D4 L0 {; f, w
  4. (setq pt11 (cdr (assoc 10 l1_en)))& O9 U4 {0 M. [% h2 g7 t  d
  5. (setq pt12 (cdr (assoc 11 l1_en))): p" c' N9 f: h/ Q1 }
  6. (setq pt21 (cdr (assoc 10 l2_en)))  F7 }6 `+ ^3 x' g
  7. (setq pt22 (cdr (assoc 11 l2_en)))* q: f( f+ B5 x5 ]% E4 d
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))# o; M) A8 {' K; R
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    $ L" n6 G4 U! F( Z: o2 W
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))$ O* E- B  J3 K, s% y
  11. (command "ucs" "3" pt21 pt22 pt)2 e8 M9 F- C7 D! b3 q# k) s
  12. (setq pt110 (trans pt11 0 1)). R5 b; R3 P1 s
  13. (setq h (nth 2 pt110))1 s2 l9 b2 W; O+ P( L
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))# B- b6 B. E% O$ H7 u8 r1 ]
  15. (setq pt120 (trans pt12 0 1))0 h, ~; x. J8 s; N, Y
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    , p2 m4 M4 o/ x8 s+ o
  17. (setq pt210 (trans pt21 0 1))
    . f, }1 I8 i8 O+ l; ]6 y
  18. (setq pt220 (trans pt22 0 1))- Z/ A4 c* M! D, X8 _4 w
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    : \4 w7 h" x6 D
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    $ a6 u" ?6 ^  e; z* o! M# c
  21. (command "line" pt1 pt2 "" )
复制代码

  {9 Z0 m& ?/ _* F- u; |% A# |前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
2 |7 t8 `' T( i' a7 M7 k7 j- `# U另外,我在明经看到trans的解释:
# y7 P! e4 p( _, d. w将一个点(或位移量)从一个坐标系转换成另一个坐标系
8 _0 n8 _% a5 j. t9 l, f2 C6 ~$ T(trans pt from to [disp])   参数8 i9 ?% G: S! ]. l- m$ ^+ w, A
pt& s8 [7 ^! h7 }  I( D( c
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
- E4 w2 R% h6 c  ]' f0 g* afrom6 Y# }! ~- \: D- y
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
8 X$ g) N0 J/ E) ]" M0  世界坐标系(WCS)
$ a" k% Z, c1 N8 k9 u2 _, y1  用户坐标系(当前 UCS)) G0 V+ N9 X5 I
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。+ k7 C  ?" J' L! M) H* R# x) A
3  图纸空间 DCS(仅用于代码 2)
, r4 M* X4 f0 f* n2 g" Z( X2 H, r4 {
后面的解释就不贴了,此外还有一个例子:
% @9 O/ Y, |8 z7 W在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:! t- J6 Y3 j7 B1 I/ }
命令: (trans '(1.0 2.03.0) 0 1)
( `" o! g, p6 L& T9 d(2.0 -1.0 3.0)
! f; ?: t4 }* K2 D
, ~( G) {; N) A0 C( N这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?4 e  H" {! i3 n3 r& d% A: z- t) N1 ^, k
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。& W3 |$ v2 t1 R4 _( g% m' f; h/ c2 N

6 a! O% i. }$ E, H. w- t0 K* `8 y我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
) M# W. }" w7 e5 S9 ]- [5 I(trans pt from to [disp])
% C6 r+ ?: J9 |. O2 Q( e1 m( w% Y; ~: T这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?: ^9 g$ j: u# C2 `$ d, W" p; z
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
* i5 y, D4 z0 U% o2 @( g* z
* \' t& \  i+ c. L# i$ `我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
: \0 B7 V, o4 }( v# S5 L(trans pt from to [disp])% v/ g" k( Y6 N3 }2 M+ q; W
这个很明白了,转化点从哪到哪的意思 ...* Z0 x( Q8 Z6 t7 o' m
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
9 m6 [+ ~  j6 J0 f$ _. q
  K: C3 w( j# }0 s' k. e/ i
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/); `% o. S7 u. b( r
  2.   (command "ucs" "w")
    $ S7 {# l( ?3 X
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线
    9 v. f% ]2 Y+ j, Q
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线6 n0 q( C" C5 U
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)( X: s$ e8 T$ t  p( k) M% {5 {
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    5 [5 X- k, f7 |& b, S7 b- C! Z
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)6 ]5 D% @( |/ U- a+ ?# ?( T( F
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)5 e# i  U! f* q1 P* I" P
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    $ Q3 h& A2 Q% `% }
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))+ C, O" y- S, O2 U" V' M9 Y' U
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))( T  N/ c( E/ H4 v# D
  12.            )
    ' {: O8 q7 d$ |' E( l
  13.   )                                        ;求辅助点,用于下一步新建三点UCS  ]8 Z# u2 I: ~8 r
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    % q: k, Y6 N. `6 a5 u* T; _' O7 s
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    0 M- q8 B; Q+ _- j9 r& L* j
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    + X! l# D3 C% a3 z
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    ' X. L& F) p& u' K5 a
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度8 x& _$ X! T& G5 i9 g7 Q1 @
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))$ C" k& f$ t2 u/ g1 W5 {0 H- {
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    : k5 z. Q, u' K" c2 P0 K
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值7 q& R& B: I5 \. q, V2 T
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    . n$ l% o1 h/ u8 v
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标1 m% \/ ^, w" r
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点* Q+ k! \5 t; W( `% e9 M
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标/ t8 v% P% d7 a  `" M! s$ I
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))1 a& \$ S! A3 F' o% _
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点2 J% R/ `& i, F. O, I" \
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    + h# ^5 p' D9 G1 o
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点" @4 I- a2 y. w
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线7 ?/ G  J. ^9 U5 E
  31.   (princ)
    2 G7 n+ k- ]( u* t0 G
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标" e! [4 P) D( i- T' q
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
# E! {+ l' g. E& C; y6 h8 L5 N- G谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
7 N5 U' `1 ]" x$ J6 U0 ]7 u# E看了你的解释,有种醍醐灌顶的感觉,呵呵
; }, W6 Z  u+ ^+ J" R6 F$ h$ {- b
- V2 |. \/ E2 _. f: t: c; z4 U1.5 k$ ]5 n* b5 {% `) Y8 v1 v
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))3 D, t/ W# y& F- N. P
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))- b9 S8 o0 y$ s/ f
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))! v- F' ?. _9 e9 O7 U
           )
4 @; }% S  E6 H( M  N. v  ) ;求辅助点,用于下一步新建三点UCS                                        % r0 v! z/ H7 D6 f0 ^
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点6 B5 x6 J3 `* `* }1 P9 ?

- y. g+ V( B' z' C; d7 \* n$ F  e& ^' f. u" i% i  z2 e# y6 ^
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!2 ~* y9 t4 a( [
5 Y3 a9 f4 Q3 y, o9 i- \
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
6 l0 {7 {( I8 I9 t; g, H0 l3 M最开始看到的trans解释:$ @8 Y& K5 K4 |& ^0 Y) ]! h
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
  a0 h  x; C. t5 l8 v/ v命令: (trans '(1.0 2.03.0) 0 1)2 K9 e' V4 Q0 v
(2.0 -1.0 3.0)# e5 x- a0 w6 n
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
4 Y, j# y  O6 f0 p5 K2 g7 ?9 Z5 n
) Q  g6 _' T( [3 `7 A3 m( P% Y0 C9 M0 P- @& U
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。" L: d% n7 Q. I2 p
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
! Y* a$ E, i5 o" }& Q* M# }, @
不对.
6 ^; w" `7 Z* ?$ E& \. ^下面举例说明:/ M# D! ^; x) R% I% i; j: Z) b
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
! S' E8 a7 d& f现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.8 `* P8 \  H' n8 I' b8 m8 c
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
# s9 o: W4 p, }* z我们再在命令行键入(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).
# w+ S. z( B1 \# Q* c; }% N我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.8 w, p8 a: i  ~, H5 r" G, r
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
+ c+ D4 K0 Z) c3 Y/ Y
" F+ P+ B- p, k' f另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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