QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
- m: B3 W9 i' j! G& M8 ^' \
  v1 ~9 [, f3 a/ D! Z8 x请教下斑竹,trans到底是怎么理解的?
! [$ f# Q+ {+ b问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
* B4 G/ n! G* }. Q. @1 _
  1. (defun c:gcx(/)- F) J) |, L2 F  W# u" [% x, @& x
  2. (setq l1_en (entget (car (entsel))))& }) b8 u: W$ a& D. N: W
  3. (setq l2_en (entget (car (entsel))))8 w2 W7 F0 h3 e, \* N0 r2 U( t7 l
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    # T' {! Z4 f/ S7 u: Y7 V
  5. (setq pt12 (cdr (assoc 11 l1_en)))0 h) u, A) P% \1 U( b
  6. (setq pt21 (cdr (assoc 10 l2_en)))8 u1 O  n, U. o/ v$ [% ?/ c% j
  7. (setq pt22 (cdr (assoc 11 l2_en)))" @9 c# b7 T# i8 p/ T- l- n6 ^# e7 E$ H
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    $ I7 _* m- a% M5 s
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    4 G& L2 W1 B) e
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11)))). \; R. ?. K6 g. Z0 }
  11. (command "ucs" "3" pt21 pt22 pt)
    ' C9 t5 W) c% `+ ~9 y* o" ^
  12. (setq pt110 (trans pt11 0 1))3 ~: y& U9 ]) F  h4 _& K# q3 r
  13. (setq h (nth 2 pt110))7 o7 ?& v3 ?! m: y8 Q  [
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))+ A/ g( T2 z7 h( y  b7 e
  15. (setq pt120 (trans pt12 0 1))
    - f% {' n4 q, v
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    * A$ _: I. B3 y/ k! g+ [
  17. (setq pt210 (trans pt21 0 1))& p( t2 T# z; _; ?: T
  18. (setq pt220 (trans pt22 0 1))' C$ V" s8 d* }9 b1 C3 l
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))# R# ~# i$ }& g% s# j
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    2 |; D8 H2 u  t, O# L0 O
  21. (command "line" pt1 pt2 "" )
复制代码

' P) Z% X; m7 {( Z1 Y5 O2 T前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
% j: M; p! P: y. j' m* P) p另外,我在明经看到trans的解释:
( {# l. O+ @4 E$ G( `将一个点(或位移量)从一个坐标系转换成另一个坐标系* k0 Y0 y  i- e" p$ h. d
(trans pt from to [disp])   参数/ K" j4 T8 m% C3 V
pt
9 d$ k, o$ O' Y0 |" _% l( J0 _" D) a三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。: i# z; E" h1 t/ A- ^6 G& |/ `
from% [" ~. G% Z: W9 n0 Q. N
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:4 Q# L! D$ o+ k( F) @+ A
0  世界坐标系(WCS)
2 k$ b, E9 n' G9 @. d1  用户坐标系(当前 UCS)' B7 K$ ^6 n' ]( Q  n
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。; ^& w$ [. V& u. a; C
3  图纸空间 DCS(仅用于代码 2)2 x+ b. S6 H7 B' `# {
8 Y3 i4 [5 I1 e# L
后面的解释就不贴了,此外还有一个例子:& V# H+ ~; m0 T2 W
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:' y+ N+ |4 s( ~
命令: (trans '(1.0 2.03.0) 0 1)4 Y! i# q! {; q# v9 O4 G, z
(2.0 -1.0 3.0)
* }/ p) J. s1 G# u# T5 B
& s, A3 e+ {2 d# u这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
; V# q5 q1 [+ L; ]; n最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。) d  R+ T/ y) N& P: M( t
& Y' f( {. q# c) L
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
. O8 z& N4 ]4 }) n(trans pt from to [disp])
) j! X4 r2 {6 V0 f: ]6 D, m& y& K; L% B: n这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
; E1 t% H0 I' x. n除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。' `/ c- m0 q! v4 S
% v. D1 y5 P  v
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。- P' O4 U: P' w0 C: s0 `# N& }: n
(trans pt from to [disp])* ^1 d' K" D& w
这个很明白了,转化点从哪到哪的意思 ...' ]0 w9 R3 o7 R. }. X' F+ l
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

5 l8 X. i" D3 H, u( ]% H9 Y' Q5 ]9 m! J9 l, R, Y
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    , v' D3 n5 U0 `- E- T  C
  2.   (command "ucs" "w")
    1 A+ V! G) H  }
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线
      U& s0 [& }2 x) q
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线( I0 l! m/ S, Q& B& n' f# U1 P+ S
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)5 U+ h0 s) b0 E) m  U0 m  ~
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)' M& S! R0 P! }4 ?
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    " x, ~. g: V2 r' s: K( }* C
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    / l* C8 j! a! W2 W2 D- l
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    9 b) m; N3 q* S! S2 d0 e
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    * I5 ~& O( D0 u& j
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11)). P0 L- F/ o: I' i8 G, h
  12.            )
    & C; l+ h  Q) N
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    - v* u0 D" p( @' c
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点, V1 l6 y! G7 n) q# h9 D
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向, _3 r; f4 X* Q
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面% T; O4 }! x0 K% \" l# {3 z7 }
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    " w1 y- g0 T( o" r& h6 b+ M
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度8 Z- Z; P1 w/ G- t  j
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    5 I7 [8 {2 |1 h7 {
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    , h- P/ d( o% j
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值: D, y( c6 a6 ]7 h1 p: J4 y
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    8 ^3 N2 T: n& O  Q
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标7 }2 g5 h0 f: Y. E! I' C
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    * j  e1 a0 p6 ~( }, ]
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标2 A6 l4 h, _, e
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))1 e, _3 S0 o3 \- l! B8 ^6 [
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    ! B0 K7 C0 j# T6 J% ^4 E4 Q
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    8 v/ J7 e+ C1 z/ N+ G
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点  \, ], E9 `$ b- L6 W
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线6 k( a- O% {; E4 s
  31.   (princ). p' M' I; X4 N0 z7 x1 j. F+ Y
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
+ C! o: T$ O  P$ j本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia ! k: S5 t$ F0 _# a  H$ l
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!; G! s8 P2 T) Q3 N) ~
看了你的解释,有种醍醐灌顶的感觉,呵呵- p& G4 M' G; M- v9 y. T

7 y: |( V; z' ~; a1.
+ z( N1 b6 _/ Z (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
, y& N* C/ K) J- y                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
7 w  V* B1 l) Q9 d                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
3 ~/ e+ p/ f0 I7 t- Z           )
5 b* o- P, M7 T( t+ u( i- g9 d- t2 E" x  ) ;求辅助点,用于下一步新建三点UCS                                       
: _1 F9 Z% M# e2 x% q5 |;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
( p* i7 a; n, f+ w0 l: ^0 o1 R, w

/ T' ?8 n/ O# r, N最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
, ~' S9 \; c1 G) c3 V. `
2 N, c8 w! l3 K6 I2 |5 H2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。" q3 d  n5 S6 p8 L3 O7 ?
最开始看到的trans解释:
9 _- D8 t7 Y0 N8 E0 p' m2 |2 [5 D在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:. J- w7 T" @% k: n/ a  L0 _
命令: (trans '(1.0 2.03.0) 0 1); s2 z  {$ H8 V. M% Y$ r8 k
(2.0 -1.0 3.0)
. t6 E' X$ i- x" b我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!* ?5 M: M8 ~8 B* |3 l
- p3 y) R" G5 I" S6 n
- y- t& S. X. h5 ~" z1 c/ r/ B  P
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。/ q' p: z( D0 F4 D7 P  h7 m- `! N
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

5 o- p+ I" b! T- R不对.
2 `/ j/ \3 _5 G- S* R: U  ^( C下面举例说明:. j9 ^) _+ |0 x
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.( h! B7 I, {2 k) D! J/ N
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
; T9 s% H' L2 l, X" A下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.4 v* l+ k/ r" c- C
我们再在命令行键入(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).
9 {: H7 m2 T2 m# _+ A我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
8 f) n' d5 F# a9 A! t/ a7 S结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.$ R) c: }; P2 j4 }$ }' n! [% @8 g1 l

5 ?' _* j- \' a另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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