QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
2天前
查看: 5201|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 & h# C7 B, D- @9 O2 v& s
$ I7 `! w: C6 k
请教下斑竹,trans到底是怎么理解的?
+ y  H$ D1 Q0 J问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
/ _/ W/ _" q4 V- `" e! J/ k
  1. (defun c:gcx(/)8 w8 h# A  R- Z$ r4 O
  2. (setq l1_en (entget (car (entsel))))
    * h, ]) p9 Z2 l1 s5 |1 m4 ?% N
  3. (setq l2_en (entget (car (entsel))))
    ! v7 |8 N' ~# N+ ]
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    ' s' L, [! Z+ f# C- w7 G1 k
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    2 }3 X0 s, Z. U; M
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    , |( A3 m$ f) I. l! |& \5 G  T
  7. (setq pt22 (cdr (assoc 11 l2_en)))
    7 c; d0 ]( O2 U1 e& {7 u
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    4 h( D$ F6 F$ p
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    " ^1 c1 l0 W8 ^* b( |
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))! c9 C; E% }( b5 y1 f9 p" s
  11. (command "ucs" "3" pt21 pt22 pt)' {+ K+ X3 H2 ?# }1 u
  12. (setq pt110 (trans pt11 0 1))
    ; y, d" b$ `4 ^2 J/ R3 U, l
  13. (setq h (nth 2 pt110))) i, a; c7 t: h0 e
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    4 i& c3 Y* y! y/ x: {5 k4 |% f2 T1 E
  15. (setq pt120 (trans pt12 0 1))
    7 ?" u; f( k+ K( F
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))" w+ a) x9 x7 I: {* E* R3 o+ f$ l
  17. (setq pt210 (trans pt21 0 1))5 E( D% _' s5 F( k
  18. (setq pt220 (trans pt22 0 1))" N  D( r8 T: C! m: x0 l) T
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))( g0 @, r( h& F5 d4 |+ x' J" B
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    + B! R! t: X  d- I
  21. (command "line" pt1 pt2 "" )
复制代码

1 W/ r! x& `4 {( v前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?  ^3 }+ N4 c1 [' @) Z7 N" m' Q& T! B
另外,我在明经看到trans的解释:
( [+ Q, e# o  l8 ?将一个点(或位移量)从一个坐标系转换成另一个坐标系, N; ]! N$ t# T
(trans pt from to [disp])   参数1 m5 j9 E, t6 U% X+ q1 ~
pt
8 ~! b+ w. S) Z* P7 J: B: L三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
+ b; @3 O: }" P. Jfrom" {$ n% d6 G# p) T
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
$ z7 u8 ?1 R, E+ Y0 z0  世界坐标系(WCS)
! J% L  V8 ?3 R8 H1  用户坐标系(当前 UCS)
+ b+ ~% z' A; n4 W2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
( j, k8 l$ w5 f. m& K) s3  图纸空间 DCS(仅用于代码 2)
) X7 X: k9 x) k1 e0 p8 {" [! I$ x: f: q1 O5 h
后面的解释就不贴了,此外还有一个例子:
2 I1 T! A8 ~; C9 S: F$ M( l在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:8 r3 V/ l* x1 c# t8 |: N
命令: (trans '(1.0 2.03.0) 0 1)$ a' Y/ R3 b" I9 y2 m  n$ A& v/ j
(2.0 -1.0 3.0), {$ }1 j* T; X

; H, C- A( ]6 P* y这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?" u' }  d4 j" @2 X8 A* H
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。3 V: n3 I$ V! ^$ B2 q
& V$ E! C8 }$ t
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。1 h  P/ i! j% p9 H0 l
(trans pt from to [disp])
7 i* o6 B4 p5 ?" p2 }% J" l+ Q, [, B这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
) J% [  o$ H! k; |) n  U) N除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。4 n- H( @& V, @

, E- I$ l- R" y. I1 S- d我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。( a1 v9 f5 o7 `' o
(trans pt from to [disp]); o" S# b; z; r' q6 C8 `$ E
这个很明白了,转化点从哪到哪的意思 ...1 O7 l1 ~2 S" Q! W4 `+ Y
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
6 \. o: C2 J7 l, Q: b

- I- E1 \9 g# b) O# Z; b' k是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)3 I1 q  I0 R+ V' c. R4 J
  2.   (command "ucs" "w")
    ( V) P8 ^, v6 r: W1 x+ F
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线$ t$ B3 {! I1 Q' f) }4 J9 `" ?
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线9 r- p# z  k, @/ M" |
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)& N" U0 ~5 g- a; z# j6 B3 r
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    1 G( s0 z# w. u2 ]* r
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    2 @* }' b2 T' s; I9 r# K
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    1 G; Z1 l" F( a' s
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))) P6 V6 j7 j. d' T3 M  S! p
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    % o% @9 g6 R2 i7 t/ V
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))- p) g- |% X; c. g# T
  12.            )
    . q& N, N$ O. T5 ^0 e% `
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    5 n- D% f3 t1 s2 S9 `% G8 e6 V
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    % v) Z* u5 [) ~" N" T9 |% f% h
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    . o' L  }! V% K$ p6 i8 v) u
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面" s! m% O7 K' k; ~. I2 H; z
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    : @- _5 y8 {" w1 Z
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度0 F" g( p# T, z' ]4 K6 @" [' H% n/ z
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0)). m6 D" M5 C" x; u
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标- w4 [$ T2 K3 v; b1 I4 w/ a
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    8 l8 J5 Q- R5 b( A
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    3 G. a8 ?. m: i, ^! n
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    ; l! V7 O0 F0 m. c2 ^2 i
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点8 t) g& \6 B6 R, }, z0 c- l  T
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标; U$ @5 s& x/ A9 |, Z  b; \, \% T
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    9 z6 J3 V; Y* }& u/ I2 k
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    9 V0 T* f  _0 }7 m
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))1 _0 L( H" L9 s3 ?
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    9 O! B; U# d% S0 d! D1 l
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线1 s9 o7 A" `3 X# K/ m
  31.   (princ)
    , S- `6 s: S5 |6 g$ |5 ]. }
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
3 i8 u( M, I/ X- a! @% A/ F本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia 5 x1 a3 c3 i# b5 }. d' ?6 C
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!# F) R% k: |6 Z. P: i3 S( ?
看了你的解释,有种醍醐灌顶的感觉,呵呵
( h+ I/ n. p2 R0 F5 H9 ]1 s
& H! L. X# }0 w1 C/ a+ `0 C# B1.7 x" M% f: s! V2 C$ J9 W! P
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))2 Y3 j* a1 X0 A2 N2 _: L6 ~
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
! k$ M" _8 R3 M. O, S; e- k                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))- P$ R# G/ f0 J* J$ R0 R8 J/ {9 `
           )
7 Z* h$ k$ ?+ p/ h  s$ I  ) ;求辅助点,用于下一步新建三点UCS                                       
  ?+ S! z( T* B7 w1 K/ B, Q- }% D;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点: o4 g' I# x1 s8 d. Z0 p
. M$ G5 e" K0 _* t0 z! C0 ^

1 X  Z! P! q! p, Y4 ]) k最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!( N& U; _. B6 [" L4 e/ j! x  `# H" Y

5 {3 ?% b. g" X, s* X- d2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
$ s, C' }! _# e, |最开始看到的trans解释:: w0 V$ G1 Q3 a# _
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
% w2 W5 x  i+ T. P! r命令: (trans '(1.0 2.03.0) 0 1)
& W8 c# L8 z+ N" {(2.0 -1.0 3.0)0 D4 F  A8 [& g$ M7 a# X( L+ v( x: k
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!) }7 e$ r8 W) j% A
) t. R; F4 B8 V: s1 y0 y# |
9 |+ U% C2 e) h1 s
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
7 I+ |! L- c7 Y3 @/ Htataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

  h6 T7 U# ]) t6 f% M不对.+ Z5 w% b' p! s8 k1 D
下面举例说明:0 U& X( X6 _3 y3 Z6 {7 Z% G& X- [& b
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.0 E8 C0 I9 X4 r. ~
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
: j$ u. t, b* ?8 K3 s0 c下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
" z! j8 V+ M* R% @6 [% w1 v我们再在命令行键入(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).
; g7 ^3 R6 g# d. x; B) N我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.: ~$ }* _" L, g& n* J; w
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样., z/ A6 A4 L9 V* S9 `' R9 N
1 [( I9 h6 ^, E  J
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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