QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
5 b1 T" }3 F, w; \* G, N4 ?8 L/ u3 F$ D4 @# O) O
请教下斑竹,trans到底是怎么理解的?
! C! M% X8 y- u* B- s, _问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:! k- [* \* P8 O# B, E% Q
  1. (defun c:gcx(/)( f* Z" U* p1 X2 A* t' D  j1 T
  2. (setq l1_en (entget (car (entsel))))/ s8 n. R2 H3 ]
  3. (setq l2_en (entget (car (entsel))))2 F) p3 ^% a* ^, Q3 F3 g+ c6 {
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    3 Z* o& Z3 V8 u
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    , ^$ Y1 H1 O1 O  ?- J7 N8 `
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    / Y. v$ ^+ Q% p! Y) L& h
  7. (setq pt22 (cdr (assoc 11 l2_en)))& B4 s+ k2 w$ e7 U0 Z1 F( f
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    ; I" S% b7 Q0 G9 _
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    + Z* o' J) n2 i: @8 |
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))+ v0 N' Z: T1 [3 F
  11. (command "ucs" "3" pt21 pt22 pt)
    * C2 h  _; ?8 C* a; R
  12. (setq pt110 (trans pt11 0 1)): G0 O% e& h  H* f1 P
  13. (setq h (nth 2 pt110))
    1 t& {& _8 j9 F* }9 f
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    ' i( k; H8 h  ~0 z7 }8 ?
  15. (setq pt120 (trans pt12 0 1))( o9 K0 Z. o8 R& U& Q
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))$ V! c7 c2 u( ^) _6 a: ?1 N
  17. (setq pt210 (trans pt21 0 1))
    $ S) r4 m0 k+ t9 E2 [' o
  18. (setq pt220 (trans pt22 0 1))+ `8 R; {: N3 H# @- q
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    8 E" y1 Y  G& k- s1 r  B* o
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))" l7 K# ?5 b- Z2 Q9 T& v& q* Q. z
  21. (command "line" pt1 pt2 "" )
复制代码
( z- D) l4 o1 o0 m, u. A
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
; G! j- W% O$ ^5 {另外,我在明经看到trans的解释:/ t2 w2 o( S" T0 Z
将一个点(或位移量)从一个坐标系转换成另一个坐标系
$ c/ D. S" y6 L/ Z; |( k- _) g(trans pt from to [disp])   参数/ X0 I7 f# z0 P
pt
6 j# z! f" x# s9 u" M) @三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
/ @8 S2 @4 ^6 ~7 v) v& @7 t" ~& ]from
/ v) u9 W& `! z; U整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:/ Q& h1 x' Y) Y/ w3 |$ @2 x: P
0  世界坐标系(WCS)8 _( D6 v# ?$ O
1  用户坐标系(当前 UCS)
) s$ [# G, B2 I/ T) `' {( w2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
+ v- k6 U* B/ l# j4 @; I2 ?/ O3  图纸空间 DCS(仅用于代码 2)  B$ S5 c& W. O

- J5 H7 m. Z5 [1 K后面的解释就不贴了,此外还有一个例子:
7 q4 i% b. m: g在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:% I! B* u; O$ ?3 J) ]
命令: (trans '(1.0 2.03.0) 0 1)1 N$ c! b6 N/ A5 f$ ?6 }% J" |. A
(2.0 -1.0 3.0)8 N3 o1 _/ m4 M+ W7 O' H# d  Y+ J# U4 j
# ^% H1 p$ B7 ~2 u, Q
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?* Q, K0 n/ c5 s6 Q7 d
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。3 A- b7 c: a* S2 r1 l1 ~- c% F

" r, [' S0 g* f" o. ^; O我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
" l9 O0 i3 \* p! {" Q(trans pt from to [disp])
! o* U( I7 V+ [1 H这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?8 I* K. m. R+ ?6 Z; K0 `
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。1 f% Z+ a- Z) s; w  d
6 f' S, U! E7 C" m% o' o7 p
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。: G) O4 [0 Y0 i, }
(trans pt from to [disp])* [% T! D, p" y3 p& \/ g. K+ J
这个很明白了,转化点从哪到哪的意思 ...) z& {7 P: z  q) d; f! U- ]
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

3 w- t8 {  D8 }4 i# \7 D2 G- y# G
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    0 Y3 Y" }. p) P9 b6 O* a, o" I4 H
  2.   (command "ucs" "w")
    $ Z7 R" x" G: t) d/ b$ @
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线, G& S0 P2 ~) J. s
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线9 F* a  f: o2 F4 G  z
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    1 h  z: n) {2 m- z8 T
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS), b% C) h! T# X8 b9 ]% ], ~
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)+ _+ N: n1 v# f: V) @
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    9 w: d% N# z$ M6 \
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    / Y9 ?, C) R: \) w7 I
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    0 q' }* W+ N4 z" t5 N4 {
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    - g. u3 V" G2 o  R" Z
  12.            ). I/ j2 Q  `# A- K# M) [
  13.   )                                        ;求辅助点,用于下一步新建三点UCS  c/ O1 t) Y  }
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    , t5 h/ J5 C0 e6 P- C. `
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    , i5 l% O# l$ n& J
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面+ k# e/ ~7 n$ X0 H& m" z% T
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    9 ]: V! C' k9 R
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
      s4 S) {4 Y8 m# m; u" _: ?
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    " \' g( D6 V/ A( x( c9 ?
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标  |+ j/ l# z6 Y' O5 [  k5 x
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    4 D% D- k5 Z: }7 ^5 @
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    6 \: M& D: y, }" u3 o  f# w
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标+ V0 r0 [3 b6 x* A  p
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点* P* I& c+ y/ F
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    2 W( v  I" _, V; R# \8 M$ m
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))- k- Y, p5 `% o. G! u; \: X9 K
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    5 [  A5 d' |# U
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    % p8 W1 B( x9 e* L$ ~
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点2 _- Q( t6 P5 m# s2 s* f
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线4 u  z! s3 R% P9 s/ m- h% v) }( r
  31.   (princ)
    " `5 o, \; M( S& e7 L+ S
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标: v% n- f( p7 T  Y
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
, ]6 H% C* h4 [( H0 P; C. \3 ?谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
3 F2 d& k. Y' H看了你的解释,有种醍醐灌顶的感觉,呵呵
6 n) L% V' Z4 e* o; s
" s& Q2 F3 V" @+ Q' V! x1.9 N4 k/ g/ b* J1 _2 |/ I8 m
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))4 I: E2 v9 w" @( h% W
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
  ^* T( n) |* h, _                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
# h# V3 A0 L/ X' _           )
" Q4 n$ k( w3 w# v/ c8 l  ) ;求辅助点,用于下一步新建三点UCS                                       
$ d5 p9 O5 g  G; p, D2 n;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
7 d2 x7 z$ a, Q: F# p+ Z% \1 U7 w
7 j5 ~3 y4 e. w5 e4 ?' U# ~8 Q3 w
* m# b0 o. R, E2 m1 A% K% e' b$ k: |最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!2 m! o/ F8 c: g$ g( d2 l& v0 g$ b
/ K6 e/ R, `% O& V/ c2 i, U
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。3 G  Z# i6 V( j, j, G
最开始看到的trans解释:
; G+ M1 J8 B8 F% @0 c) V9 z, U. F在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:2 B: u) k) z* K- F
命令: (trans '(1.0 2.03.0) 0 1), [" v9 ?8 a/ V+ u
(2.0 -1.0 3.0)# ]) j8 ]# K  |$ r
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
4 j' t) ^. r8 o! F/ j0 i% G* |' E% [0 Q
5 @- f! [: @0 s/ ]
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。5 I; Y5 U4 n: C1 K/ \
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
/ Q* D! }% J  y/ s  z# n2 i
不对.- ~3 K8 c3 F$ y6 N
下面举例说明:
8 p* u: d+ F" r# s/ j+ c在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
; ]* y, a9 N  X* i- _" }, H7 L现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.# \6 f7 L+ V8 O; u4 d
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
- f2 B6 a3 `3 T% U0 Q. t我们再在命令行键入(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).# c( W) {6 m2 J  J
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
( V- A$ c- Y* x9 J9 v2 w结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
" Y3 Q. ^7 v2 c
! t) w3 \5 O0 K+ N! q, R4 f) ]另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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