QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
3天前
查看: 5205|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
9 e9 W9 k1 ]0 q$ [. i  C
+ I4 U- G; d$ _请教下斑竹,trans到底是怎么理解的?( F! `' y' P' ^% D! R+ J
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:! C' }: B' t* o  E
  1. (defun c:gcx(/)/ A0 w+ D) a# I; G6 V1 g
  2. (setq l1_en (entget (car (entsel))))
    ( F/ o7 b: |- t) w# P: i$ g
  3. (setq l2_en (entget (car (entsel))))/ `: p" Q  ^9 r; ]
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    ) P' |4 Y; K+ ?
  5. (setq pt12 (cdr (assoc 11 l1_en)))% P) x' s. e- O% k3 b% A' Y/ j: S) ]
  6. (setq pt21 (cdr (assoc 10 l2_en)))/ k5 q4 n: a: j$ k) p
  7. (setq pt22 (cdr (assoc 11 l2_en)))* M# I2 \+ f! J. v4 V
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))0 G0 ?. f  p- `' Y6 y
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    3 t$ s5 k* H8 S) `6 z2 W
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    ; _) J  M/ \) @  y1 A5 ~5 H
  11. (command "ucs" "3" pt21 pt22 pt)
    " |% B5 h9 |7 ?1 p
  12. (setq pt110 (trans pt11 0 1))
    ! ?% k5 v8 r0 F
  13. (setq h (nth 2 pt110))7 h+ U% b- Z/ A& {
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    ! G0 x% ]) d+ L. E" x
  15. (setq pt120 (trans pt12 0 1)): I% `" C4 L/ \, P! K* s4 x7 Y
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    8 K8 r, O% i" B/ D
  17. (setq pt210 (trans pt21 0 1))% A1 M4 ?5 j3 U  b: H
  18. (setq pt220 (trans pt22 0 1))
    & |& {- k# c* R) _7 r- \# @
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))' G% w& d/ ]+ \6 A3 R
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    ; |( |% `' l6 i8 F0 t- b* M# @
  21. (command "line" pt1 pt2 "" )
复制代码
* Z  y. V6 G6 x5 y! |1 Q
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
: T$ A6 I0 A, H0 w$ O另外,我在明经看到trans的解释:) U& e: V9 L& J; y, B
将一个点(或位移量)从一个坐标系转换成另一个坐标系
6 u! g6 z7 k9 u# N& L9 x  ~(trans pt from to [disp])   参数/ C4 Q: E0 f. C
pt
- g7 j7 g2 L8 L- o: t+ D& h三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。  ?. f2 |) V1 o, X
from6 m! d+ z! l2 W/ g3 X+ Z
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:- @' O: K0 [; ~2 \, v
0  世界坐标系(WCS), J& |; q$ [  a0 m# s
1  用户坐标系(当前 UCS)
3 z! j8 i! Q! ?2 v+ K2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。& T  g3 z* P7 E% ^' U
3  图纸空间 DCS(仅用于代码 2)
7 w6 J+ S) m6 d, ?3 c
# Y9 ~  \" E/ X6 h0 v后面的解释就不贴了,此外还有一个例子:
- [: Y2 \; Z5 q' c在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
! C2 p5 l  o% t. j: }8 d$ f命令: (trans '(1.0 2.03.0) 0 1)& w" p8 `# g! @1 D+ E
(2.0 -1.0 3.0)( O# H- s) h( u5 M: @

+ Y2 ~3 N7 f6 f* H& Q# u这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
. u+ `/ W6 R. l最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。+ p% |7 ]. i& ]. P" f' [0 e/ D

4 Z% D) z; v; B* H! v5 n" h我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
8 o4 m0 W3 y" P6 }5 ?6 h(trans pt from to [disp])
, H- M# U; o4 J* t% y  I这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
4 c; Q7 b0 h. r& l  Y" d除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
  \* Y6 c5 N7 N6 i$ w5 G9 r1 ~! c* R
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。2 C; m! F. _" n1 P3 J, J/ b( e
(trans pt from to [disp])
( b, h+ a! u9 Q这个很明白了,转化点从哪到哪的意思 .../ ~- V, C+ ?/ V8 A
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

& t% M/ Y$ ?; t+ o  s. v
7 o. D$ G( J- |7 o8 Y- {& G是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    6 @. [) y3 c9 h% Y5 e* x7 @9 K+ e
  2.   (command "ucs" "w")' ~( A! U3 W- `0 f4 `0 P
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线  L& B0 `+ i$ a( a, |% n
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线  e: z7 }3 ^/ m5 V
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)6 A. _4 ^0 W: H6 J2 |2 H: h
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    ' ^; E& n) E0 X! f( D1 v, g
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    ! A  F; W# ~" @8 ~- F5 ?
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)! P% l0 H% k1 O
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    4 O# s9 v# ?) R6 l
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))) A7 }6 ]1 {8 o% _9 Z$ y
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    1 G/ h" k6 c$ W. K+ ]3 d/ f. e0 I
  12.            )/ ~! m# w0 Z/ V
  13.   )                                        ;求辅助点,用于下一步新建三点UCS) q  Q/ C( S' J6 i
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点" g2 v( H- \5 r+ d+ e
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    & l$ N' d& r& h  o
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面. s: }$ b& K, r$ A) b
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值# t% j: @7 j9 M8 p- {% t
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度& i2 B0 T& G+ _
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))" d' R) i, _! M  i# N
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    1 D9 _' K- L2 _9 m! L7 w4 o$ ^
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    2 ]' M0 ]$ Q3 L" B
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))  w$ ~+ W/ Y8 @/ N" |0 j
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标9 m$ }; u/ ], I/ q, s& F
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    5 ^% Q9 @& h8 m$ }- ^& q
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    ; Q# x+ @3 U% O- c4 L" Q2 D+ i' w6 x
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    7 r1 ^4 U. P9 t7 c0 v6 ?
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    9 I/ Y, L. \/ S# O1 m) E
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    , i( @+ M7 e0 v/ l0 c" ?
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    2 V: k6 {: T/ F+ f+ [
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    1 I3 C, X2 U8 T
  31.   (princ)
    ( a% M6 g2 e/ Y8 `8 o# p' k
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标/ F! g, n7 S. G% q& L" k4 B
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
# |+ i8 B* y: N0 h" }3 |8 Z谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!3 M4 F6 R* ?) O' L1 o
看了你的解释,有种醍醐灌顶的感觉,呵呵) j' w1 l# u5 y% S# N
, f: F+ P; V8 o. r3 G
1.) n: k- M3 {. Q! E
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
* I& ^9 }- Q0 Y, z. {6 D                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))" M4 W4 p8 P3 j; q
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11)), [( \6 c- ?9 v- ]  P
           )' O% w. o" N* M, O# Y
  ) ;求辅助点,用于下一步新建三点UCS                                       
/ g. z, m/ X3 Y) W' s# |( T;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点( [" W6 }& V1 l: Q

8 S/ V3 e) z1 S+ X+ h: q4 v, o
& d9 R# Z- B7 v' k# l最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!  [# J3 ^' \0 ~  q6 y: Q: P

4 T5 h9 a" o" p; p8 S2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。  F4 A3 {" v4 \3 j
最开始看到的trans解释:
( }' i$ }9 t$ G0 w7 h6 [在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
3 \' `) ?8 P& o4 ?# u9 \1 }/ u命令: (trans '(1.0 2.03.0) 0 1)- t5 x" {* f, S9 Y" p( W
(2.0 -1.0 3.0)
, e( m) r7 g' g" G我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!7 o, j5 I; w  h' ~* Z) G3 r7 ?

5 G* u5 ?. J8 T1 {& f9 [6 d5 e% N9 `! e* z7 m0 n
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
6 j7 E; T: Q# }tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

0 Y% m4 [# h8 X/ @" H& W+ i/ B不对.
9 N$ ]! |% F) W下面举例说明:
+ S. K, h& ~" t4 i在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
& ]: |& `; p. Y. M# W现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.' K4 x5 ?# q( o" C) P
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
3 ~* d  o; c( |; T6 Z2 e. d我们再在命令行键入(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).* z& U% S8 G6 h. {2 i" R+ K9 A
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
6 `- f4 `. N1 z. h7 g结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
: P1 u5 s. M: I  e' _+ I4 V& ]* \: D
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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