QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
2天前
查看: 5203|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 / [' n4 E# Y0 n* H5 p+ O( C

9 i! F& J4 O+ u( s请教下斑竹,trans到底是怎么理解的?
$ R& a* \8 f0 ~3 J3 [/ H4 R问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
" B% e+ J. b6 u9 W2 v& @
  1. (defun c:gcx(/)" j: o  B6 I: z! K" ?& J1 h
  2. (setq l1_en (entget (car (entsel))))9 O6 E) i/ h- T' V# |3 Y( A7 y
  3. (setq l2_en (entget (car (entsel))))* e, h' g7 m( y  d; @: W
  4. (setq pt11 (cdr (assoc 10 l1_en)))7 D6 z  J3 B, n( F3 c
  5. (setq pt12 (cdr (assoc 11 l1_en)))$ [$ n) @$ E# l9 v) d9 S6 J% @
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    2 b1 G$ U0 m. L$ ]: d, e. ^
  7. (setq pt22 (cdr (assoc 11 l2_en)))8 a0 w0 E3 _( o' z
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))9 P+ v% p/ p4 W; w6 k1 c
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))5 D! h, d9 M  d! H; U
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))" n: L: n- L/ x: J$ E
  11. (command "ucs" "3" pt21 pt22 pt)# d& z# B5 d: {) l* N: z9 i# C
  12. (setq pt110 (trans pt11 0 1))
    ! j6 f6 q/ C" |. S3 J2 f
  13. (setq h (nth 2 pt110)): Q6 L! |3 A. W0 u' T+ P+ s: d
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))/ X  m' P& S& Y/ D' e
  15. (setq pt120 (trans pt12 0 1))
    ( a, p4 Q& Q. k' R6 G
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))- [6 w0 K7 n& }, n' a* }
  17. (setq pt210 (trans pt21 0 1))
    : S: f" c" y% @- ?: n9 t( X
  18. (setq pt220 (trans pt22 0 1))4 ~* h/ y2 ]6 n! \; q/ y9 ]' O
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))- C, H+ g% w* E% u* v; ?
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    . E  [0 k- b) _/ u
  21. (command "line" pt1 pt2 "" )
复制代码

. J; w& {( L! F+ {: m5 G前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?6 @- G. ~% \5 E: f0 r2 N9 J. q/ A9 s
另外,我在明经看到trans的解释:7 D; S4 D9 k7 G( P' Z- |
将一个点(或位移量)从一个坐标系转换成另一个坐标系1 K! _( _6 o; b$ N2 \2 {
(trans pt from to [disp])   参数
9 _& P% d$ ^0 [1 ?  n; spt1 l- V1 \1 `! t# ]: c: u/ T
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
  O1 O# J: r2 L7 a7 F; X: I/ Yfrom
) f) g: o0 E! Q% i整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:7 D+ Z8 x2 K3 J  H' L: t/ V
0  世界坐标系(WCS)) m8 R# ]0 K7 n8 k1 `
1  用户坐标系(当前 UCS)# C# R* i5 Y3 w- G7 a, ]
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
- s0 I+ L6 u' s; Z3  图纸空间 DCS(仅用于代码 2)
/ p! H8 ~& m2 \- ]& [6 W  H( w4 v3 j& z. _8 Y
后面的解释就不贴了,此外还有一个例子:$ O; @* ^+ K! t& x; n; `  c
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:. n  `9 }9 ~" q  @7 D8 k+ A
命令: (trans '(1.0 2.03.0) 0 1)6 Q) s9 l' U( N7 P* g
(2.0 -1.0 3.0)
! P8 u/ V, a7 z2 E: `" M; W8 z! z  \4 u9 Q4 {& o! u( n6 y
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
: y+ e  T' D/ |* `6 _最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
! R3 w# m( n( q7 x
/ d5 I: {- o2 i/ N& ]我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
5 ~" F; f0 z# H: R+ I(trans pt from to [disp])
2 }; F) T9 a/ p& ^5 A! N这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
. O/ u& q1 e6 D* G: r/ N除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。  c# Q, d2 Z. M+ p6 o5 W1 @% U

" I- g! h  I2 m  z0 `我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
3 a3 L/ Q8 t- H/ L(trans pt from to [disp])
% t/ G9 T& x0 b7 N4 y  W% B这个很明白了,转化点从哪到哪的意思 ...
1 f. A+ |* `5 `www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
- z2 |1 V# P& V
' H, x4 b5 N1 s) c# b
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)) C  \7 O4 b$ X
  2.   (command "ucs" "w")
    6 ]* j3 k7 m' r: r! j5 N6 Z. i
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线2 i4 y% @% a2 _6 @. }% r3 p, [1 O' G7 W
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    ! S$ r' A' |; S/ E0 W
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    % c3 K3 G0 d1 k+ J1 P2 \4 |, g
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS): [% ?+ f5 r! i. _
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    / d1 l" z% o$ p* G/ W
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    ; r7 N: {' e! V7 v! U" _4 ]) r
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    ' j* |7 b8 y' G& M+ S9 {* P' y) C
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    ) n) Z# n* u# ?/ y  Y( f
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))7 E. }6 w$ ~6 S' h3 f
  12.            )
    9 t" E) t% _9 e# e0 v
  13.   )                                        ;求辅助点,用于下一步新建三点UCS2 {, E% j& L/ A6 D. t
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点& U2 a' t7 X( ~  i8 k
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向% }3 d6 F3 l  k+ n
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面6 F6 ^* ?4 q8 w2 ^/ h% U- a# L
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    ' F( P) ^; z$ A$ W2 F1 Y
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度2 }  K8 c0 V) T* ]1 S
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    + t# C, U. o, s0 p6 x
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    5 ]2 k" B' k( y4 a8 `
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    % R8 D6 O3 k0 d5 L% e6 A: Q
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))5 \& ~# `! l: ~, f
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标3 L6 o- \/ Y6 K* T- ]
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点0 A. l/ ~8 e+ d% G" q5 n
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标6 E/ q' _8 _% H& w5 [
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))* v$ @7 S1 _: j# g5 E) p. G; w
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    1 ^1 J3 e7 W, f; C- x
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))9 ^: W. S4 K" I3 t7 J
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点; A, P8 e( o( M4 i
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    - Y9 b, H7 Z! r, I! b; d
  31.   (princ)
    . @# ^7 y8 u' u) N5 S2 n8 h3 o$ _
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标1 L& j( O: p! x1 J, A7 J; u; A
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
' e) l0 y2 p& l" t- n' r6 y谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
% r* F* r! V. ?0 @& |看了你的解释,有种醍醐灌顶的感觉,呵呵
6 ^( b) \' a* ^& |5 m7 S- X) [, E( l: R  @( e: n; u
1.: d. Z6 C6 I7 C2 R
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))+ z* O3 o) S! Q1 W6 u; w3 T& C
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
- |4 c* Q2 ]/ Q$ b7 [& d/ G                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))( l  {& ?9 w% O2 i- {- @
           ); C& d4 W$ g/ v8 c1 N$ G: @& e% I
  ) ;求辅助点,用于下一步新建三点UCS                                        ( y5 z: |5 w$ a5 e4 X, c
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点. m" v! l$ R: i4 s. d

* |, X8 F) ^8 x* k( _9 k* W5 y. Y$ t5 N; U
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
# }) [6 G! f1 f! q- j' o
% Z) w. `  J0 l/ l- M2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。9 l4 n) q2 u5 ~! ], I* \' B
最开始看到的trans解释:* ]* k" y; i, V/ ?9 s
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:7 Y4 s- Z. V: `( U- W+ e
命令: (trans '(1.0 2.03.0) 0 1)  D7 S2 o" M& P5 g
(2.0 -1.0 3.0)
: a% p8 x- n2 s- m我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!" o# ]5 ?$ @; U3 Y
* w3 Q7 f4 G' ^" K6 z, d6 `% U

. ]# r, [; ?# W- }我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。( @( U# A: p- W5 F9 u0 J6 G# z( |
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
/ ]7 I7 b, Y1 H
不对.& r3 y# K3 H) L3 t* m
下面举例说明:
! R( a  u( o" C) ^3 k* b在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
) `* r6 f$ B- x4 _4 I现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
. O1 W( ^5 {# s" g下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
" {" a( {! W& e' x2 U我们再在命令行键入(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/ _( H/ G$ l$ z2 ?; v' }我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.8 M# c$ u5 x9 Q
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
. f# A4 d! U* i& V2 ^) ]+ Y! w: w1 J
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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