QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
8天前
查看: 5044|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
/ i7 m/ A; S6 M5 n2 v# z2 Q7 z
5 h1 K: b" Y+ W6 v请教下斑竹,trans到底是怎么理解的?. @6 L$ a) L. U* }* {/ Y1 u
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
1 i1 h$ K8 q; s
  1. (defun c:gcx(/)
    1 z7 {" q& h7 ^0 r7 ?
  2. (setq l1_en (entget (car (entsel))))' z6 C) t% y! P: `  q
  3. (setq l2_en (entget (car (entsel))))
    7 J! J/ Z+ i4 v# p' B4 m
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    2 U3 w- `% O) w4 ?
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    . L/ M2 N5 s8 @" u- }: T
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    ; h' b' o; G0 Y0 g' G+ H
  7. (setq pt22 (cdr (assoc 11 l2_en))). B. s$ d) `* S% L9 q) u
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    / Q3 C  w# B6 p" y) K% y
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))  A! H( O3 X' k/ V
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))& i' n0 o$ `0 R1 N
  11. (command "ucs" "3" pt21 pt22 pt), W8 j! I1 u7 |9 ]( u; @! ~. _) Y
  12. (setq pt110 (trans pt11 0 1))1 N. s: ?+ u/ C7 W8 m
  13. (setq h (nth 2 pt110))9 S, }3 _* E8 ^" u
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0)): U8 l/ c" U  \. J: i: r
  15. (setq pt120 (trans pt12 0 1))3 @# r: \$ L6 {' U3 \: b7 w+ h3 ^- M
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))# y- u' b) H) _; C7 J" f  n
  17. (setq pt210 (trans pt21 0 1))0 [5 p0 d. H# o" [6 x
  18. (setq pt220 (trans pt22 0 1))2 |/ `2 u. h5 m) n
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))$ G( }1 u, c  ^5 X/ W" F, Q
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    " a3 w% Y2 ?( T% {
  21. (command "line" pt1 pt2 "" )
复制代码
7 p3 i0 z6 f/ g5 M' e- q$ u
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?& Z( x+ J4 j5 [! O( r2 v
另外,我在明经看到trans的解释:
- Y7 w3 S" a1 \( R2 B% d+ I) ^7 f: x# S将一个点(或位移量)从一个坐标系转换成另一个坐标系
0 c$ O( ^* G! U: N' c/ E(trans pt from to [disp])   参数
* i! \- U0 q8 b2 x; V% `pt& P9 l9 v/ x, F* U
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。5 L1 Q+ m- y: h+ L' `3 ?9 S6 K( Z% o
from! \6 Y- I# ^& \0 |. A( @
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
% _$ }9 g" ]8 |# G% z- D  E* R" A! H0  世界坐标系(WCS)1 z8 F! S0 c, ]
1  用户坐标系(当前 UCS)
7 @/ s! z. I. O0 V8 [0 r2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
1 v1 S, e/ Z7 D' y' e3  图纸空间 DCS(仅用于代码 2)# O3 ?9 d! y9 ]; Q: U
% d$ I9 r! l4 |3 K+ }) D9 {
后面的解释就不贴了,此外还有一个例子:" L& X& k+ Z6 @& U! {
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
( f# [+ F* C( C) A7 Q命令: (trans '(1.0 2.03.0) 0 1)! n$ w0 j; y* z. o, A$ B
(2.0 -1.0 3.0)
& k/ P: K' |- _5 E6 n4 @5 |* s- [
2 W% E" P1 Q/ y  p这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
, F0 S5 ?1 \2 C! F最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
2 k3 j$ N) m" s7 k' ~- Y
- H1 t9 N0 l2 @2 O) p* [我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
1 P) C$ B$ n  Q. ]4 v' d6 K2 |& V, ](trans pt from to [disp])' ^0 p$ t5 ^2 R) X  J9 i$ H+ b
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
- w- U" {; P7 y. q# `# a! n7 R& b除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
  B+ c) X; i( m4 M* K
$ E* ^' s, p5 O7 z. m! d我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
4 P6 H! P" r% T. B7 _& {; V(trans pt from to [disp])
$ l! I9 K! o6 ~# P( M- x  @6 k9 X+ q这个很明白了,转化点从哪到哪的意思 ...
; _, p' ?1 l# R. E2 K9 ywww1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

* h1 T2 A. P$ d% K  D4 O
# O1 L6 d" g( q; j( q. m- ?是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/): l* f# D" x% @' z3 y. `% H
  2.   (command "ucs" "w")
    ! Q7 C" X( {6 `
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线/ @) H7 n+ e3 p0 d- v6 m
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线4 K0 d5 w3 Y) q1 }4 p
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    ( V1 w& P5 B6 A
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    1 q( r( c& _5 n$ _1 I
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    ! T  [, |% _. @/ ~/ X
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)- G0 P! s' c& A3 u1 K3 a/ q( w
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))& U2 ]; V: r' a) F: c
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    : ^( C) Z8 P: M% P4 \% ^
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    & A4 \" Q4 O% w$ R4 d& ]
  12.            )
    ' M+ G3 |; e: \1 l6 m
  13.   )                                        ;求辅助点,用于下一步新建三点UCS+ s7 h9 D8 f; m/ E. R+ G3 o4 N, J
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    & ?" e: O; b! `. R, l* x
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    : X9 _# N( u  l3 v0 x. m+ T& ?7 G- w
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    ! ~5 F/ h. m/ B8 S5 a
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    ; b! T: L" @# y$ ], i- l6 B
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    9 e: s% I" d2 @
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
      K. V( K& a1 n3 z1 k
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标% ~8 F) ^$ p1 f/ i5 [( C0 K! P
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    3 K& \. A4 _7 ?. I3 d+ b, l
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))) F, B, h4 w" t2 B" ~3 o' z
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    $ C( n' j, u+ F- r- C
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    ) Y3 }2 u, I: d* w5 D1 X
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    ! ~9 }) {( u  W8 y, B/ X& g
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    ) n. Q' f6 B8 V; x: O) G
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    2 K# e; t) B* e) U. w
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    - f' y5 h9 y3 I; I1 k+ A; V+ T
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    ! }, A: g  o  ~4 r
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线0 }3 ~" A( c" }2 U6 I- a7 @
  31.   (princ)1 n' L1 F; U* y  Q
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
, o9 J  a! O: {, p: \本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
& a# X) [- v' m; g* W" K# r# E7 M谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!# N* O+ n4 e2 L9 h2 M! m5 ~! Q
看了你的解释,有种醍醐灌顶的感觉,呵呵: U* W5 u1 D7 ]

8 t1 ~! L* c- P; X' ^/ E1 x& b0 y. P1.& }2 {1 A  H8 _/ v  F) z
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11)). k0 R1 D2 b: E. A  ^
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11)). ?' m7 c! T% u  J/ K# [; w
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))& N) c% E. @1 ?7 ^8 ~
           )
5 q# x- v7 O' i  O% f( _  ) ;求辅助点,用于下一步新建三点UCS                                       
2 z0 K. T# K+ `& t, ?( r: `" M3 U;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点% Y; |% l7 w0 ?0 k

4 k& x, J: q; D; ]) Z; v
: V' L& m  f! q- j. Z) {( t4 e3 m$ A- W最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
, o! G9 ]; K9 W, t0 U- ]# b/ s6 h% U9 m9 d* I
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。( a3 X1 `3 R- \9 a, L0 `" ~- @
最开始看到的trans解释:
1 q0 J  k  y& a" X3 q在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
! r$ S8 H4 i- l6 i" h命令: (trans '(1.0 2.03.0) 0 1)! z$ }- {$ M% W8 O8 L: o- e
(2.0 -1.0 3.0)8 D5 p! L. g' m2 P- X7 V
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
) {$ G- v! B# `, F5 J# g' @4 n9 f0 w. ]$ `8 G
* o8 {% r, j9 X( c3 a
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
8 Q" g' Z( f# p( A4 H2 utataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

( M7 r; }! v0 p6 c! k不对.
) S6 S2 j+ j$ g下面举例说明:0 R  J$ E# V' W
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
2 R% }6 l* l& F. h6 l; o# i现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
" v: v- t# G  h3 D$ |8 }' H9 M- e下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
0 ^- v2 |5 H/ V' m+ X( g我们再在命令行键入(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).$ c* ~' X. Z: h: [& Z. T0 M( l3 s7 e. {
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
8 Z6 |; X+ x, T, A结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
, Z$ d1 n4 r' V- }: H5 o3 o. a0 t( x* ~, p  O
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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