QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
1天前
查看: 5195|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 2 m- d/ S% q0 l( N* N+ ~" e2 f; O

% L9 R' z4 b4 D+ m请教下斑竹,trans到底是怎么理解的?! p9 X7 w& S" @' s# L/ |4 C
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
+ L+ f4 D  `& `8 F7 E! q4 }
  1. (defun c:gcx(/)/ e3 E- m8 p  R9 a/ Z+ u
  2. (setq l1_en (entget (car (entsel))))
    " t3 H" Y% D3 \8 x
  3. (setq l2_en (entget (car (entsel))))7 W5 a! `; r4 R. h, r* n
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    0 S; z1 F" Y8 X9 V- {/ F
  5. (setq pt12 (cdr (assoc 11 l1_en))). W- D8 V# m6 i
  6. (setq pt21 (cdr (assoc 10 l2_en)))) `- A. d4 T, l" `# Q# s3 l5 ^
  7. (setq pt22 (cdr (assoc 11 l2_en)))# e0 P0 t/ f9 y. T' j% l
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))# Y& ~* X; ?7 u5 n, u
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    ) \0 _' `  W/ o4 ~1 L, n$ S
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    5 K& }2 v% g: l6 t9 D2 L2 }5 s: M
  11. (command "ucs" "3" pt21 pt22 pt)% [) F8 A0 J2 v% k' K* k# W5 @
  12. (setq pt110 (trans pt11 0 1))
    6 p2 A; M  V$ X! c. t
  13. (setq h (nth 2 pt110))
    7 z# z+ V. Q5 j+ b% R  P
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    9 A5 `, h4 F' n) q. ^
  15. (setq pt120 (trans pt12 0 1)). j1 e* ~( l8 N
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    $ }( F, j7 j4 t. q0 E" t* _
  17. (setq pt210 (trans pt21 0 1))
    - c' J; G+ Y- c* N6 T
  18. (setq pt220 (trans pt22 0 1))
    2 w3 W4 D# r6 F: M: ?$ x5 W
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))0 u. F( Y$ f" s0 G7 M. x
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))# U- O# J( ^$ ~  \
  21. (command "line" pt1 pt2 "" )
复制代码
" @, e; e8 N8 U
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
* f  z: ^7 O* y另外,我在明经看到trans的解释:
% r7 i% [6 |; h( \2 n将一个点(或位移量)从一个坐标系转换成另一个坐标系7 K  ^5 ^( Q$ p3 w2 Q
(trans pt from to [disp])   参数8 a6 e$ ^1 U5 c9 v& f
pt
( U( D: x0 s* ^- v三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
) e, I4 H5 }: g2 qfrom! r0 \. F' m- f4 \& V
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:6 }" m* P  L. M3 w/ `4 l: F* d5 g) G4 _
0  世界坐标系(WCS)
" W3 P6 n8 E, T4 ^/ S8 `$ @1  用户坐标系(当前 UCS)% D5 z; F3 g, V. [9 J" u
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。  q7 a- P2 e8 v5 [; ~  |
3  图纸空间 DCS(仅用于代码 2)
5 z( V6 X$ F) l* J& [2 X9 v  `7 _3 J) {% U3 V. j. ]$ d( S" S
后面的解释就不贴了,此外还有一个例子:9 Q& W+ D( s/ B4 V3 w: `) U
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:3 _: T+ |- B: B# E& r/ E3 b
命令: (trans '(1.0 2.03.0) 0 1)
5 j4 P$ k2 y8 H& Y4 t3 W9 V0 ^8 g(2.0 -1.0 3.0)
8 i( K% z, a. _, A$ l' b4 n8 ^' G! S" d
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?% N4 ?  d! l( }* N: }# w5 e2 @/ y( g
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。. l/ K( j' X; V
' Y; b# ~  U6 b# k
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。2 L% v. X2 J  J5 q- K$ ?4 c* w
(trans pt from to [disp])& m1 F0 d9 q' y  A
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?# M. @. F! _! D) K& v
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
! V: |, {5 W! i* L( t
# _% s2 P. a, V  Y1 B. ^我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
3 J" Y! L8 Z  U5 Z(trans pt from to [disp])
/ I1 X3 a3 Z1 m1 ^$ [3 O这个很明白了,转化点从哪到哪的意思 ...( L2 ~5 v/ p6 c) J
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
, V: @( b5 e9 C" T2 X- a+ \9 k! l
* S' t' I3 l8 q. ]3 Y% ?3 A7 I) P  l
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)8 L$ ~$ F$ t/ k5 z
  2.   (command "ucs" "w")
    5 M$ O' D5 c# E) R) \; x( @
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线
    2 a0 B! K4 i. h  E! I
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    $ X  g% a2 ^% I# {
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)) v) R+ [3 A5 m5 z6 s4 `
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)' m' o! M/ q+ W' `  P$ u
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)9 n8 w" o1 ]5 s/ z, ?+ b
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    1 S, j7 G- J5 R* U  W) c
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    ; H( Q$ b8 ?6 m
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    * t+ I2 d8 \! o5 }1 P: a( ]' V
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    ' P, T7 m& B$ K1 h/ M8 l  _, s
  12.            )( i. _: p- y" `
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    7 ^8 j3 e( p' I& d
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点: z0 k8 [2 h% ~8 J8 j
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向" G9 T, a8 m& V/ K
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    $ ]: y* T) w, d; ^
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值, f2 V0 u6 a; o4 s8 Q8 i
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    $ ?. G: w% x  g# ~4 l
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))" p' p7 r! M4 b, z0 r
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标, d  v7 Z' j4 H( A, I* l8 b
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值: [' Q4 o0 M7 H8 a7 i3 D6 d
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))1 Q5 d0 u  G; k1 q! U" p0 z5 j
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标5 F( f0 ?9 L0 J) v1 }0 o
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    4 T) j8 E  x+ E0 u- r
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    , z# u, `2 [# |  P# e" v
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    . Q" V. i  q$ _( n( V' j" p
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    0 G& N  j! D+ ?
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    4 ?8 ^4 h7 Q* o- E$ e
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    1 H9 |2 v- `" T* R2 M" c; ?, N
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线! s* }. ~0 i# u; g3 m" u. ?$ f
  31.   (princ)
    - ]" E% J% d$ a5 z! G# e5 o
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
" b* y7 `$ U' G9 q( x本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia 7 A% h) y# w8 J7 X# n- [
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
+ A( a' `$ C& s7 R看了你的解释,有种醍醐灌顶的感觉,呵呵
  t2 G& z1 P* E3 l, d: m3 ?0 o% g3 T- H
1.6 x+ [/ l* o% Y' E  }
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))& w! O# o5 n, x; U4 V! }
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))) W5 ^# ?  ?! Q3 j& T
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
% \7 \# k5 d% o* c1 P  c           )
, Y; m; r* y9 E  ^! R. C  ) ;求辅助点,用于下一步新建三点UCS                                        ) a4 [* F/ A- `
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点) e0 r2 A7 C& O" S

. m+ ^3 i3 b* R! y# i4 c! z9 A4 `) F2 b( W8 V. {- L
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!* h+ E; u$ }. u/ W! h) I! O
+ o- Z+ M' M! x8 _% u* P" |' W. X
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。- \. ^, z  k$ z% N3 A6 ?# e
最开始看到的trans解释:
8 ?/ `3 a9 ~, h: D5 u# V2 f在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:- ]& l0 g5 M/ s/ E+ B. }$ z/ ~
命令: (trans '(1.0 2.03.0) 0 1)
7 ^, _% S! E7 F) k(2.0 -1.0 3.0)
: b- T. B# V: C$ `, H+ Q% q我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!1 l& G% `' r% P

; U, b% u0 s$ x0 W6 c$ L: t# {- ]( K& ~6 ~
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
+ C0 J7 t) Z9 Ftataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

& P$ V0 ]  w. l* X4 M, b4 M不对.
0 J$ {5 ~0 f7 m7 U! Y下面举例说明:
$ [* {/ U. O& ?8 ^! F: h/ \4 \' K在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.5 S+ V4 m0 h, Y: D: S! Z1 B
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
5 ]* {! c: D7 X下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.2 h/ g4 j) o6 X
我们再在命令行键入(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).
, b% D- q- E' }( F# z8 k9 F我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
- |% D  _' v# W/ P- |. t6 ]结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
7 Q% z/ n( h( ^3 M  r9 s  }. l9 n( J
$ d8 f0 ^$ @- L6 m) \8 G另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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