QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 5154|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
  o- T: p  U( q5 c1 P
3 R6 ^7 @  ?$ H& W+ Y4 A7 w请教下斑竹,trans到底是怎么理解的?7 D0 r: h$ k% Y
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
* W, [! a9 U% u  w
  1. (defun c:gcx(/)8 ]8 u( [; ^9 |0 {- G5 t
  2. (setq l1_en (entget (car (entsel))))5 F/ p- C6 e! s+ W$ c
  3. (setq l2_en (entget (car (entsel))))0 ]% J% r% M1 Y( g- U9 }
  4. (setq pt11 (cdr (assoc 10 l1_en)))* v% O9 C9 \+ h) L1 N; \1 A6 {
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    & q  v: G! Z' V4 p$ e0 A- ~9 ?
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    ; S+ ], o* H7 ?+ P  m  F
  7. (setq pt22 (cdr (assoc 11 l2_en)))
    ! c4 E- j1 B2 {, X. }
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11)); y% _% h; x8 n9 Q  B
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))$ d8 ?8 P* z+ L/ ?+ y. L6 M- _
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    - |2 b$ W9 y" ~$ v
  11. (command "ucs" "3" pt21 pt22 pt)
    ' E) k4 I  Q7 y  s3 N/ q; o  J
  12. (setq pt110 (trans pt11 0 1))9 g' y4 |0 c, P  R9 W+ P' h9 C
  13. (setq h (nth 2 pt110))
    / j  z  a7 |% `; j1 C0 I
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0)), K+ W4 C" H" |4 d, A6 ~
  15. (setq pt120 (trans pt12 0 1))
    8 A2 ]; U1 i3 R' Q  Z! \
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    : J/ C6 P9 V4 n- A; o
  17. (setq pt210 (trans pt21 0 1))4 K' _& t& G. A  N+ L" x# _
  18. (setq pt220 (trans pt22 0 1))
    4 C0 {$ g+ j; a4 i/ V& L$ y
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))0 s  j8 q& q3 X  z! Z: J/ {- Y7 d
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))' A1 S! B7 E# O, P; U% D
  21. (command "line" pt1 pt2 "" )
复制代码
4 {* d" m( \& @6 T
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
4 K7 n% H9 \' `" J$ E另外,我在明经看到trans的解释:) J6 z/ k1 g% q3 k. F
将一个点(或位移量)从一个坐标系转换成另一个坐标系. i) L8 x: X5 c8 t% w5 |" F
(trans pt from to [disp])   参数
( s9 b, j0 D% Q- ?: k4 ?# q" Kpt
3 i$ G" @( j7 M: d三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
8 c. J. G. F! {$ ffrom5 y- O# X2 r" j5 R2 K0 D3 f) z/ h
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:) {; e. ^4 \3 f0 y# W! p
0  世界坐标系(WCS)6 P) h4 Y' I5 ]! S+ D, R( _
1  用户坐标系(当前 UCS)
; x! v9 k4 E0 R0 a/ }2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。8 q9 l' N6 G5 l
3  图纸空间 DCS(仅用于代码 2): }) D) ^/ e# a" H, S9 S2 s! G# @, o
4 A' A" g/ F' A2 F* N/ G
后面的解释就不贴了,此外还有一个例子:0 `+ E4 B# Q' |5 V5 k1 J
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
; e9 H% O/ _# {6 r: p$ C命令: (trans '(1.0 2.03.0) 0 1)
, @) r' I; e% c(2.0 -1.0 3.0)! v8 J/ t6 Y$ d5 F7 j5 S6 V& l
7 k# u& ?- Z9 f
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
$ i. f) g( d# [5 d最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
& F- w9 @' ?+ X) T5 k0 r
9 |" S" g4 o( L# _我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
0 n( K+ J% r+ m6 V9 b6 h4 g: c+ \(trans pt from to [disp])
1 g! t) _$ ?0 O2 c0 q4 s这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
0 E( T& D$ b) J除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。* u1 n! @4 W* t/ p* C

: C) ]( ]' B* z我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
2 i$ U9 g4 N, ~* |6 l(trans pt from to [disp])
8 O# m/ }8 {5 b+ j2 o这个很明白了,转化点从哪到哪的意思 ..." S, h" d. U6 `- A% j3 F1 M
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
$ c# n* K  Q' P

5 k' [1 O0 g9 k4 X! o是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)7 A6 ~0 a2 b7 @' H* x/ h0 o
  2.   (command "ucs" "w")4 r) }" }* K$ G
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线' y6 r7 q3 v; k. E9 a% p' |1 Y
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线3 X* F$ y; G+ t8 Q; m* H- o
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)  `, E) ^6 [# z
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)/ k3 O( X* k! N0 x$ X' _( K. M
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS); l2 @" |$ m  E, k: p
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)% |$ w" p  Q6 ], }
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))& b1 y: H3 \- Y4 I' c  d
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    ! S2 n' U% a$ T! e" ?9 @
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))+ C" e" e, Y" y/ g
  12.            )0 B5 h3 Y) z! T' W! c7 J
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    9 |- I. I) H: I8 _
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点) Q5 \4 ^- ]2 R' Z% M  P. H7 B2 y
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    0 ]2 T7 n7 }  D4 k2 p/ s3 F
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    / \4 a8 M9 e7 b& C5 y; F
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    . `+ S6 u" ~% S% @. W
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    8 `/ ]. J8 L" F' G2 U
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    & I) u0 y/ W6 x
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标& O" P) w9 Q6 X+ B
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    : Q% \2 V; g. p# G3 E% `
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    # B7 e$ `" O  Q! q  k
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    * f* x, l/ ^" m# I5 L7 @% V
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    8 o5 E1 R4 l& r: }  Z6 v
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标( r1 k4 ^& U1 e, p$ l
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    5 S+ U" s  `0 ~, X* O! ]" }
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    - @/ Q+ u* n  q+ J2 R+ I
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    2 Z1 Z$ k, Z4 I7 X$ c4 Q
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点2 Y# b" k- _9 p- O5 K
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线( P$ F6 T* M) U& m/ b
  31.   (princ)
    ' _( r! @  q0 @/ F+ j
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标7 p! J2 [: n5 @$ u9 z
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia 3 S2 X0 t' x! d, i
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!9 ]5 O- e; o5 _) ~/ ?
看了你的解释,有种醍醐灌顶的感觉,呵呵. o+ F4 I4 r5 H8 g: G7 O3 r% C% ~
0 y& _# ]5 \' P% O8 B5 O( o1 `0 Q
1.
# B# U7 O  U% h" U$ W* S/ `( x (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))& _# v  E6 \; J- |3 Z
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
) t- v8 }  I* p( h                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
; n% w7 ]8 f: K& H  [/ j  M6 w% [           )/ q, S) O  f! a; [4 f
  ) ;求辅助点,用于下一步新建三点UCS                                        . I* O( Q0 r9 ]
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点: a7 S8 X$ Q) x" t
& W* S1 _4 `2 l% V/ a
- \3 i2 h( g7 j
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
: m; ^- C; w$ d. \. `0 L- {) ]0 ^
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
6 y& A) X2 t* j最开始看到的trans解释:
2 n" l! ]% }- K; ^在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
) K8 c4 U" b6 A命令: (trans '(1.0 2.03.0) 0 1), W( t" M* K9 i  ^
(2.0 -1.0 3.0)+ ~3 S8 Q. X2 G- S3 r3 {
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!8 @( e$ ]5 v# _4 F; `

' x* u+ @' m% W4 }+ \/ i- o
! }" E! q' t, l我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
: E3 k- A  E) G* m& f6 m: [" V, ttataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

4 M0 j: l% g, B* S不对.
  \6 _+ L# _) _% Q) Q' d2 R# Z下面举例说明:
2 u& ^: J4 i! w" k在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
+ N  D( S& r( _现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
5 P8 p$ Z) e) N0 r0 E) v, o5 T下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.& U& ?( \1 I0 P  o" 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).
/ w# [8 D) A* ^. G. u, h我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧." M" ~" i4 M: m1 I4 w1 d# S
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.8 o" u. Q5 Y; E; n. V

" h' b" n  }7 e- A( G: O+ j另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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