QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
& Y1 Y, |. R5 q2 C, m' ]4 F$ T& r& v+ `
请教下斑竹,trans到底是怎么理解的?& P: l( M2 Y+ Y# E
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
  [- X- N+ I4 G* C8 _1 q2 \
  1. (defun c:gcx(/)
    : G7 m; f2 F6 S: l. K! }
  2. (setq l1_en (entget (car (entsel))))
    & |) C; Z( f  d* ~3 q
  3. (setq l2_en (entget (car (entsel))))% g+ ?, G  p' o" R0 }2 z1 i# }
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    0 y3 c/ y) i/ h: ?" U# ^
  5. (setq pt12 (cdr (assoc 11 l1_en)))9 `( b5 x. v/ |% s
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    8 B1 f$ U  {7 A# d0 u8 c& ^3 G
  7. (setq pt22 (cdr (assoc 11 l2_en)))0 l1 l  m5 [, @' M! s# e
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))9 ?; i& h/ b. V2 b) l5 w; ]5 B
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))' E3 O; l1 D8 l3 A) q+ M* Q9 D  Z
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    # c0 G3 U3 [1 o) s
  11. (command "ucs" "3" pt21 pt22 pt)
    ! {. T* N7 U8 W" p0 P
  12. (setq pt110 (trans pt11 0 1))1 G; v1 {9 }% M( D( o
  13. (setq h (nth 2 pt110))" L' O- n2 L  I& d
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    7 |& O3 m. C# m& q
  15. (setq pt120 (trans pt12 0 1))! P! s& `4 G9 r2 u, B
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0)), n9 N! E5 l( Q* U
  17. (setq pt210 (trans pt21 0 1))/ T1 J2 N9 u4 s- }3 M8 q
  18. (setq pt220 (trans pt22 0 1))
    9 r( y+ B6 d- w$ r/ i5 [$ G
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))( L( Z9 D+ E) H4 [/ s) S( ~/ Q
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    ( @1 W9 f- s* S1 G+ y: W
  21. (command "line" pt1 pt2 "" )
复制代码
2 q. Q& P. @) e2 i' b2 \
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
" j2 ]# Z9 n2 p另外,我在明经看到trans的解释:
) u3 @4 b5 B# D4 R将一个点(或位移量)从一个坐标系转换成另一个坐标系* @: n$ @: c% a2 H% c0 r
(trans pt from to [disp])   参数  s+ y- Y- h0 x' h* z7 O2 {
pt
3 a1 K" P: t5 _' m5 I; B/ p. b) ^三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。% L; \9 _' n: [4 H8 ~% d" `: g5 a
from! e) @: @5 d" O& t/ a
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
$ h* F  [- f- H9 @0 m0  世界坐标系(WCS)
* k+ v" z$ e; v) T1  用户坐标系(当前 UCS)
) H& `/ t8 }3 U- m2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。3 M5 T7 [" j3 m6 W; a$ [$ h: P
3  图纸空间 DCS(仅用于代码 2)! u/ ]$ H" Z! a- n$ A5 G

: }9 |) l1 \6 v6 C3 d+ ^后面的解释就不贴了,此外还有一个例子:! @0 t6 Q, d, T: L" M6 X; ^
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
( q0 ~& k& g* q* d, K. u( c. W3 R命令: (trans '(1.0 2.03.0) 0 1)" N; I" F4 ]9 f. {- q
(2.0 -1.0 3.0)* e+ S, M% o7 s9 f( I

+ p2 [8 }9 D* _3 v! `/ C这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?( r" _0 ]1 q. V2 X
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。# s- q" Q6 c! U

4 y. b+ D/ U! _( |我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
( d, W. K( y, r5 L+ l(trans pt from to [disp])
6 k# a0 G8 |! g1 F; u这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?, M8 X# O' h6 _7 F. F9 d
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。& W% j' z+ A2 o1 U% B3 Y( t

2 d/ a0 q8 C4 ~/ t" E. a; e我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。$ p: }5 h0 T/ ]" N) `
(trans pt from to [disp]); S, W7 \+ g, b
这个很明白了,转化点从哪到哪的意思 ...9 v8 E( E# Z0 z4 H. [/ ^
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
# e: T1 S, N1 `0 |2 Q! K
9 }4 R6 Y0 a- D7 q
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/); L/ C7 W, y5 z
  2.   (command "ucs" "w")3 o; m6 Y8 B  N: y; C
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线3 @2 r$ l$ o! R  t* l
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    ) [) V6 \4 ~. j; {  K, i% x
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS): l6 @- J; i+ M  v7 ~) b/ V
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)* t% k4 L" H4 Z8 W
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    / `& U" w* D" p( R2 I
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)3 l6 G* @# D: d4 y9 N
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    5 T" N, Y# d, K
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))$ @2 f) e: b3 P) a3 }& t# V! ~4 T
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))5 a/ f  M1 G! s
  12.            )
      f; ?: W, Z" h1 r8 Y$ k" R6 x( H& {
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    4 [5 J* L0 T" O  @6 r: {
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    * N3 O; \8 {" N$ O+ n! B, r! @
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
      z& A. r3 _8 H% ]! F
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    % B  Q1 ~3 g/ R0 Z$ M8 q
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值  e- ^3 i+ ^( |( V" ]3 ~
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    % e7 R" M/ T: n! b3 {6 _& s6 t; C
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    - t, ~% J/ c" t* Q
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标% w4 @2 p3 v2 c7 `
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    $ B* z$ Y2 n7 C- R' O
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    / H6 s, C2 i' x) f9 v7 p, F8 }
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    / h3 N4 o! ?+ h+ n, C0 A/ C" k
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    $ T; g5 x# }* V- v1 d- Q/ [% m
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标4 V" a, ]( f* x. `/ ^
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))" ?# G6 p5 c# `" q
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    $ A1 h: t6 a' j( N: \( k
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    ' e5 v2 t. J7 Q0 I$ ~6 Y. |
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点" c5 f& L. k5 H  T3 j9 u
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线7 t& s8 v. S- t6 o2 f
  31.   (princ)
    - \0 h" Y* {, U
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
! f% D! ^8 F4 k' g4 b2 J本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia 2 R# z  k% T* ?- X
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!: I4 y, w' D' K: C7 z6 _: U
看了你的解释,有种醍醐灌顶的感觉,呵呵* C4 k" [* X) N% ]- _
) q2 T$ p+ `6 T
1.
$ z8 X. h9 s6 K1 M& R* Z4 u (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
1 _! q% `( v: A) R) h                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))* y, B$ p# j9 o8 V
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))0 I. X# Z0 f7 i1 U7 y
           )) q* R0 ^) H/ z- T. d/ [0 Q$ q& K
  ) ;求辅助点,用于下一步新建三点UCS                                        4 A" O* v# I1 U
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
/ ?' T2 z  @8 B; _4 u' O; Y9 y; z! H6 X* G1 {5 a: W+ e/ @# u+ E
. \0 @1 w8 K1 {4 N& q( b) {# c9 w
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
! C1 S. I7 R7 @, Z6 \" D/ [8 i6 G0 Q3 a* h- `
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
+ x% Y- {$ M0 T+ D- f+ T& d; ]% p- L最开始看到的trans解释:+ y4 W8 z6 P& B* d1 ~5 g2 K
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:4 c# @0 ^' c% U3 ]" j3 P1 `' y
命令: (trans '(1.0 2.03.0) 0 1)
4 G6 W. V0 I3 a(2.0 -1.0 3.0)/ t. \+ ~  M2 {' a( l; ]# P8 A# j
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
! A/ C0 B: ?# }7 @+ `
# i& O7 F" h9 J# _& g3 G
# Q: P+ F; _7 _- j0 O我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
/ s, m1 G, }# S2 Ktataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
  b8 a" m& Q: F/ N/ S; d1 X$ P
不对.
$ R$ b6 G+ {% R4 _6 K, }下面举例说明:
  u2 }, ~) G0 x: r2 S在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.+ I1 h# Q) f3 ^5 o0 x$ |
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
. z- M  H3 R* Q: ]7 R4 q下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
, K0 b& Z. J6 \2 q* `- ~我们再在命令行键入(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).
7 N1 n/ z# e. ~- Z我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
# T! T2 v+ Y9 j0 T) Y结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
1 z+ E( G. g; i7 _/ M" ~
& F  {1 N, I! h3 s6 k3 {另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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