QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 ( C. a& _' H" p  E- Q
3 d. f, d1 B5 b2 P" j; R; \+ L
请教下斑竹,trans到底是怎么理解的?
+ H6 W5 m0 I& n& H* A问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
* I. M- ?! v: L# _/ h& u. a
  1. (defun c:gcx(/). a  {' n$ t, k, W% j% y
  2. (setq l1_en (entget (car (entsel))))* ^) n. K4 d/ Q2 @9 h  E8 R+ r; }
  3. (setq l2_en (entget (car (entsel))))$ ?' G2 Z3 V) u  M
  4. (setq pt11 (cdr (assoc 10 l1_en)))6 E+ O9 G' z9 H7 P
  5. (setq pt12 (cdr (assoc 11 l1_en)))1 ^' ?) [' k/ E- S+ e
  6. (setq pt21 (cdr (assoc 10 l2_en)))
      q/ H& w8 v% S, Y3 l9 W- X
  7. (setq pt22 (cdr (assoc 11 l2_en)))1 n( \$ t/ ~9 d; I7 v2 `
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))3 O# N  T2 m; ?# Z% G
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    * }9 D( ^1 [$ t/ `5 H" g. N
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))9 D! M4 e( o3 T5 z- E5 r0 ?2 Y
  11. (command "ucs" "3" pt21 pt22 pt)
    " i4 }+ E9 j, Z2 _  ^* v7 l
  12. (setq pt110 (trans pt11 0 1))4 t: I, f0 y; _. i- k* r) j9 i
  13. (setq h (nth 2 pt110))
    " y, z3 l' H9 e2 Q" a: Z
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))% E9 R: r3 u2 x$ Z2 Z  S1 j
  15. (setq pt120 (trans pt12 0 1))
    ) X8 ?3 e6 P% H
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))) n5 I3 r; T3 e4 }$ W
  17. (setq pt210 (trans pt21 0 1))9 j0 q  b- d( e* P
  18. (setq pt220 (trans pt22 0 1)). V$ ^* }# s6 p
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))* J8 g( G3 _8 p
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))) l/ K. E$ ?2 V
  21. (command "line" pt1 pt2 "" )
复制代码
* Q# ]+ m/ x! o3 Z- `) Y
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?" I" ^( i! E6 d$ I3 B
另外,我在明经看到trans的解释:2 d# W- Y- u: ]) o1 x
将一个点(或位移量)从一个坐标系转换成另一个坐标系2 M% v3 P) Q# H
(trans pt from to [disp])   参数" g* e  ?: B  \. h
pt, z' p5 Q- `( C/ g
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
/ h) R) v  h' Q: H, B* H, kfrom
) Z1 ~; B3 N" a' i5 H$ D+ O整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:  ?$ z/ V. h7 E( w. w* |, B/ e2 e- i
0  世界坐标系(WCS)
9 L3 F% B9 S( d1 h9 c2 {9 O1  用户坐标系(当前 UCS)
! ^4 G9 Q8 q; E& t6 B4 O2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
! g/ E. P, ~0 _% b, z. P8 \3  图纸空间 DCS(仅用于代码 2)
3 y8 x' V  D) `
# N  \0 {5 ]4 v: \1 r) V后面的解释就不贴了,此外还有一个例子:
, q" w9 w- e/ N  [9 I在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
4 }# o0 }$ b# \! p& a$ b; V  s命令: (trans '(1.0 2.03.0) 0 1)
% S4 r8 r7 R" @(2.0 -1.0 3.0)
" v) J( d: b4 p: [3 ]8 o5 ^$ a% m
& v0 q' [5 g: u3 @# K这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?" U/ ]+ B. f7 d3 k% [4 ]
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。+ Z7 P. D6 N! i
9 F0 G) m9 {0 K" f$ ^6 k
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。  G& H& x# ~9 s0 u  S0 A
(trans pt from to [disp])
- u% m1 Q9 b5 j这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?# O; U6 e# P7 n1 n
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
4 X- Z3 W' a( e9 y7 A' q6 Q0 v' u/ ^1 e- X& k2 c' @
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
" t2 k- W/ n8 _% Q) a, u(trans pt from to [disp])/ C! t# V; a4 e9 v: u
这个很明白了,转化点从哪到哪的意思 ...
; l" P) P$ I$ L2 }, Twww1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
2 C8 K- ]1 T$ l% w

' Q3 w2 n$ K5 O是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    ) M8 G8 b0 v9 E, u
  2.   (command "ucs" "w")( V: B! |, [; C
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线) s* a! [9 x$ u) q
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线  R9 r7 y6 ~. t
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    ( S, {: E; |. E! O% B  o* @  P3 V3 y
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    ( ]5 d, S- `' O9 H
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)9 x' E2 b. x( X* d7 Z
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    * E% g) H3 y( y* K& h3 y7 X) H- }
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))  _# v5 }  I- D! w# w) ^0 e
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))7 N- Z) n; `/ F5 a$ T
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))* ?  N. U/ \- o% F
  12.            )
    - w, x1 @8 T7 y  }
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    : ?8 w  a# y; [+ ?. q- ~, R
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    5 n! o3 A5 d2 b1 h
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    6 Y7 d: ]& c9 B+ C: n* }5 V
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面6 ?3 F# g, K0 F$ m
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    . q4 r7 L3 m1 W* J
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度  e$ v1 m3 s+ C: L  F* F
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))2 I( f3 L- ~$ t- b3 d
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标2 N; \- E1 g3 G
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值) H9 N: n8 V7 ]+ G1 H* Z7 x- X
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))! B5 _4 ^" d" z6 I1 N
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标7 u+ P/ k2 e1 c1 x0 N
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点6 W) e* N5 o% i8 {
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    & k+ F8 {6 U; _' b2 G8 ~: G
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    ' o. X4 D6 K* C9 H
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点% ]1 U" r/ A$ U7 [7 J& d0 X1 ^
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    ; H+ J% B% s) G5 B. i
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点6 E0 u: o/ l+ L+ ~' M5 M0 ~. e% W
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线0 j- g/ c5 Z5 Y- B0 }
  31.   (princ)
      c# u0 I' ?% q# O# A0 t1 e
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标. w/ m& p( L# q1 O
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
$ b2 d! ~9 E$ N, ]- s6 C谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
' s+ m, k' z- o( H8 o& H( W看了你的解释,有种醍醐灌顶的感觉,呵呵, [/ X; Z: g. D1 k) ^) p+ ~

! P1 Z( U/ \" N  E8 H1." i% T2 o( D7 D2 C0 E+ q9 S! L! Z
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))) |2 r. V( p- R3 ~" r* b) ?4 s
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))/ x) B5 D, W1 \+ T$ H# k
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
6 R- I. x* ?# `* l. O) o. g( `# |           )4 X+ c0 x* C2 l
  ) ;求辅助点,用于下一步新建三点UCS                                        % V) l7 C* }- F
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
# @% u% ^+ \3 N
$ @3 v, D8 b3 u- d3 F& Q7 c' a  J1 v; H/ r* x! I4 `
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!) a- e0 y) P4 d7 J

* c8 Z2 h+ U3 \, m0 w5 c& {, e2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
; a3 g$ D3 ]9 w+ T最开始看到的trans解释:
5 U0 f/ ?0 H. O7 A3 y; T在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:) [- U, R, E7 T5 t' l/ l) O6 t- y7 Y$ U
命令: (trans '(1.0 2.03.0) 0 1)4 P  S& d% h1 S/ s1 O
(2.0 -1.0 3.0)
  E1 C# v7 A2 A" k: ^' G我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
% M; V" b6 d. ]  ]6 k0 O% u8 @* E7 v. r  B6 {
' u  C7 ~7 c: G- |2 {( c' A( `
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
' e& \, E- q  n. h) ztataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

) k9 l. T. m5 g  Z& N不对.8 ~- X0 h, Q1 K. h: o' a9 K% R$ q7 @
下面举例说明:7 v5 \6 ]+ d; K' a2 W
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.8 t% c, X3 h" ]& W/ Q# K
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
; l2 x$ `1 \2 f# v' r8 y  S下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标./ Z" y/ x  d0 a& [6 o4 p
我们再在命令行键入(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).
+ N& f, C( x$ {8 p我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.* }' C+ @/ C5 V' g2 @1 m
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
  B6 i2 i3 V' R% q: i# {6 V0 ~( t& Z3 r3 E- m# u1 @
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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