QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 ; ~3 e9 [) c: r

$ L' }- I' `# g, o; m. N1 \请教下斑竹,trans到底是怎么理解的?. p2 `  u: u) ?4 I8 F- T
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
/ P, T: B' }; Y! M& R
  1. (defun c:gcx(/)
    3 N2 f$ `6 D1 {; q1 \1 T1 c
  2. (setq l1_en (entget (car (entsel))))9 g) x) O3 P8 S) `
  3. (setq l2_en (entget (car (entsel))))0 L% j0 y- F( v2 ?
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    & x! j" T. u4 P; |; z7 b: q4 x6 [' \
  5. (setq pt12 (cdr (assoc 11 l1_en)))' R% `4 c9 K: P3 H4 X# h. d. R
  6. (setq pt21 (cdr (assoc 10 l2_en)))! v" \9 t# q$ Q+ T
  7. (setq pt22 (cdr (assoc 11 l2_en)))5 {  O2 A: _% ~% N  y4 K: u
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    ( z2 _" s4 o9 L0 y- {
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    % X+ }7 c; ~; Y. G3 X* H$ {$ n: C
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))5 ~9 [: _9 k  D% o; G
  11. (command "ucs" "3" pt21 pt22 pt)  @* \7 i& x& d& ]2 m: u
  12. (setq pt110 (trans pt11 0 1))
    9 q7 `9 t: _- q# h+ A$ A
  13. (setq h (nth 2 pt110))0 x7 _1 v1 \0 W$ F0 q% f
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    9 V! L+ a2 M- c3 W' g  J
  15. (setq pt120 (trans pt12 0 1))( m9 }. M7 e8 |' D/ v8 C3 |; @
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    & X4 a  o. G/ o& H- Z% H( v* Z: Y
  17. (setq pt210 (trans pt21 0 1))
    $ G. s5 E0 g2 u, f% d% v
  18. (setq pt220 (trans pt22 0 1))
    # ]( H6 g/ m' r1 S
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil)); h+ e; s) [2 o! K+ o6 \
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))& M8 c( z5 V' G. y( V
  21. (command "line" pt1 pt2 "" )
复制代码
6 `5 j( l$ G0 Y, |' N7 e" T9 K" X) e- l
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?6 o5 g1 m( ?2 g/ z5 }6 P
另外,我在明经看到trans的解释:
' `9 _. k. p4 Y! ]+ r0 A+ M将一个点(或位移量)从一个坐标系转换成另一个坐标系  ?, L& V. a  e% I% t
(trans pt from to [disp])   参数
) B; R5 T& |$ w8 O6 g8 _pt7 u: S* W' M# `- \4 O6 s' y
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。& q- D( b7 b/ r$ c; \" c, z) h
from- U/ J6 Y6 B" k0 _
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:- {  f3 E0 j( @
0  世界坐标系(WCS)' j5 }: X  j: B* p  N2 T
1  用户坐标系(当前 UCS)
3 G, {% D7 Y, o, `2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。8 _* S+ g( W# i( [/ {; d& A+ d+ a
3  图纸空间 DCS(仅用于代码 2)3 K5 @5 O' C4 x$ f/ l6 q$ h" v/ Y
8 r9 {' V- ~( ^8 O
后面的解释就不贴了,此外还有一个例子:
9 D7 W8 E3 p' @9 z' `" W/ ~在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
- t2 T" q2 |, b( t7 F命令: (trans '(1.0 2.03.0) 0 1)
& Z8 t4 J. T; T4 x(2.0 -1.0 3.0)- t$ y2 b% ?6 x* ]
5 i! ]$ O" ]6 X9 t0 k
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
2 J8 U+ e( R, m' e# i# _2 r最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
2 z5 [( H, y* F6 P; _3 Y9 {0 t5 [1 w
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
/ e' {' ~) S$ L1 z7 J( }1 [(trans pt from to [disp])
( f0 V; ^% S& A& x/ e这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
6 |$ F7 O2 P9 t. ]5 C5 {除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。" ~! M! z4 P/ Q* v# e7 L( X

; Y! J8 N, P! g" o) x; F1 P我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。2 e" z7 b5 E+ Q( H
(trans pt from to [disp])3 j2 T  Y# w5 z3 @; `
这个很明白了,转化点从哪到哪的意思 ...
( v5 n4 t0 l( h3 q% g, V! ?www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

8 r" V( h, C' V3 T6 n$ B6 y, p* q+ t' l  `! e
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)5 i9 x: T5 k4 O
  2.   (command "ucs" "w")& v3 ?9 K* z& x; V4 Z
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线4 J7 t* V: y' {
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    8 Y# q3 h2 X$ f2 O, }
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)0 q% e2 R& l( e$ \, l
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    - U: D2 b& ]6 A; P
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)4 B0 y; D# [# R) V9 u6 k' G
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)# [0 l: q& ?+ ]0 `5 X3 n
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))/ r3 W0 P2 l# Q. V& \" V+ h3 ^
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))4 |/ t: O6 s# v; v5 x) A: C: v
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    + z8 H& j$ q% j, U6 S$ j
  12.            )4 ~# |0 `0 W; N6 @( I
  13.   )                                        ;求辅助点,用于下一步新建三点UCS) R7 K. T+ @" V8 }8 @. G& s
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点* b! d0 `/ x/ B* {* S$ z. |
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向7 H5 _4 p$ W8 |; T
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    6 M) j/ @# i1 ]* P- R' M5 N* J( G
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值: ]! W& D, q1 N3 @/ |! I  T
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度& U- {* B7 |$ R7 F
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
      y: h. t  k) l  @
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    3 G2 Z7 M$ ]1 U+ h" C8 {1 b
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值: a4 ^9 }. ^4 b! T) G5 K
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    " \- k* b4 y% V2 k5 s4 ^' O
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    0 L+ x/ _9 _+ w2 f; u% n3 w! v
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    & @. u3 f2 C( V. o  i3 [
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    + q/ n3 F- {5 v( I) ~
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    ( Y& \* C( a. F2 l0 f" W
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点" ^( U/ G9 r( f+ i
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))+ U2 s) B) I, U/ A: }( I- \
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    3 \* L$ q1 f0 F
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线  ~- b6 d1 e7 X, P
  31.   (princ)# D3 k8 E2 {8 z3 L& g' U
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
2 u+ i7 J6 F1 c本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
* ?2 J3 {6 r* M- X: V谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
1 {9 {. k  B) m" G6 t0 M看了你的解释,有种醍醐灌顶的感觉,呵呵  M% J5 y7 s, m2 |, Y" n, s9 J

# ]6 x5 B2 q, F& O9 }1.
' r- j/ d3 Q5 e% b2 e3 c (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11)): P- }$ g( d: e/ g: k- X* _& m
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
+ S/ ?; R+ {2 D# c                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))2 ~  }& [' B4 }: B% B3 B  O
           )
3 w! D  {' y6 H0 B- A  ) ;求辅助点,用于下一步新建三点UCS                                       
& [: t7 s% R  H5 T;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点" U# z# ]5 `0 s4 [+ @* C' H
* I9 j5 Y. y9 z2 A/ h/ o2 z/ [! L: ~# z
/ k" O" |2 M# w, m0 z
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!; ^, r9 b  o" ?& @5 X, {+ L$ X
0 @5 F' a; G) |% ]) C& Z
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。, ]3 R3 Z  ]+ q' c& F0 c( `
最开始看到的trans解释:; H4 d5 p$ V6 a4 m( J
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
; O# u" g& ]- L' y+ b( |命令: (trans '(1.0 2.03.0) 0 1)
2 Z, R5 n& u3 A! F(2.0 -1.0 3.0)! D3 k. Z6 L, A; d
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!+ u2 {( P# O" r; y5 D* R1 V) h
/ D0 A9 i6 d/ N
+ O9 {; X7 V* k
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。, j! s2 o7 v& F* b$ n
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

$ l! y: `; _- e不对.0 u0 E& E/ S9 I& x
下面举例说明:$ k* `! t& u9 x+ L! `& W, e! Q) A
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
7 ?& q# ~; C7 [1 \, l' d( k现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
; ^. [3 B- r/ o$ p$ x下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
6 v$ ]; F0 o. s我们再在命令行键入(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).
, e) g' L( O2 o* t. i6 k我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
+ {0 T' o. q$ x% y结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.- G& t) \& O( u1 \

3 p, K3 T1 b* T5 p  E: V4 N* Y另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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