QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
5 \: Z0 B0 j, M+ _, U. |# I+ k' L$ B! ^: g
请教下斑竹,trans到底是怎么理解的?7 x. I: o/ L+ f0 Q0 x* G
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
" |, J* m; @" L7 {' X3 s
  1. (defun c:gcx(/)
    ' Y! M8 Z+ y- D# k& i
  2. (setq l1_en (entget (car (entsel))))
    # ^+ K$ f& g% S8 g( x
  3. (setq l2_en (entget (car (entsel))))' \& |" r0 S. W2 x9 _/ T$ y3 z8 d7 X
  4. (setq pt11 (cdr (assoc 10 l1_en))); p8 _  c5 ?& @/ X9 L
  5. (setq pt12 (cdr (assoc 11 l1_en)))
      O0 u' P6 o) m3 ]+ U
  6. (setq pt21 (cdr (assoc 10 l2_en)))# ]3 t3 E3 }+ [- O: Z/ @4 N
  7. (setq pt22 (cdr (assoc 11 l2_en)))
      m; Q+ F3 ~; o
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    % P: @8 p1 B9 l0 i
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11)), s3 q# @6 O( i
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11)))): W+ k. e  B# e' A* {  W/ o
  11. (command "ucs" "3" pt21 pt22 pt); N' K: V8 D1 [
  12. (setq pt110 (trans pt11 0 1)), l4 H. z# |0 g9 A1 Q& b$ i
  13. (setq h (nth 2 pt110))
    3 M' m5 e! d; `0 i3 W7 q
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0)), Z& ~) R. I+ F& H
  15. (setq pt120 (trans pt12 0 1))
    # B) k. _+ C. [1 C& \% _
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    : J: Y7 S7 h# a* ?8 S% I& u- e
  17. (setq pt210 (trans pt21 0 1))
    7 `, A7 e4 @) r/ q7 W' ^7 \
  18. (setq pt220 (trans pt22 0 1))& e7 E& c% K5 d% g) k) V- a+ w" y
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))- o2 y* [4 L  I
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))" Q: j2 P0 I( P0 _% K0 i( F
  21. (command "line" pt1 pt2 "" )
复制代码

; \; n% C) O: `. h3 A: M9 \: V6 }6 M前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?* [# O6 m9 X5 W) c2 c# _) ]6 m
另外,我在明经看到trans的解释:
+ i' |3 `/ G+ ~/ h1 m3 S& u3 R6 m将一个点(或位移量)从一个坐标系转换成另一个坐标系0 P4 I6 V$ j5 j( x1 q
(trans pt from to [disp])   参数
+ s! s% b$ a8 j: P- Y7 Q: U6 {) Npt' f7 m) D' H- e3 F, P
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
& Q5 h2 ^6 ]. }* Y4 x  T$ `: [from% D. F* T2 f% H( ~) k7 S/ y' s
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:2 O: |- ~2 ~$ ]6 G2 z1 d
0  世界坐标系(WCS)
! O3 F2 x) n7 h' b1  用户坐标系(当前 UCS)
7 x# S2 k% u: i' b; Z' s$ C/ T2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
. B) V( s* }& n6 p3  图纸空间 DCS(仅用于代码 2). e6 N. E# H' _' R0 O3 n

2 c4 |- X$ x0 Q" L3 m, y( r" K后面的解释就不贴了,此外还有一个例子:! t- u# u# }( t4 t; t# c/ v
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
+ U; l7 v1 r# N$ C# Z  C$ M命令: (trans '(1.0 2.03.0) 0 1)
* G+ e2 R, A/ a(2.0 -1.0 3.0)
& }; @# _. e6 q! V4 G% m- c* L% \+ k4 \- u) A5 _! t
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
7 E, z8 {- V) @5 z( }$ |8 K$ O最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。4 w. b9 E5 w# P7 B3 `3 o

5 N% z9 S* B, i4 ~. g我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。& w( K/ ~6 o1 i
(trans pt from to [disp])4 A- ]1 `, w* n( X: f2 Z
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
5 a+ W/ s# b( y# R+ n+ S, J: {6 x除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
$ Q( E) T* t3 d- m& s  E$ y  y; c2 N2 V- t, h' R% w' ]/ O" b: m
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。  ]/ n3 w, k( y! t
(trans pt from to [disp]). u) b+ }# O) R% N- i+ G3 o! F3 Z
这个很明白了,转化点从哪到哪的意思 ...' `9 R& d9 y- @/ V: P! R
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
" `2 H: O$ t" o( |' k: z  l
) G7 m- A" _& m9 o5 A
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)+ A/ g6 W+ W6 g  Y6 ]0 o. [
  2.   (command "ucs" "w")! h! |: }: f" L7 V0 w
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线. @' M, ?% U; s
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    * `' p0 ]% Y3 W( C# m" E
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    $ o2 f! A& A: c7 A" j
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    . {$ v2 z5 ?% V) [" M/ {
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    / H3 s* h+ ?: I( `
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
      l- G5 @- i. s( W$ c3 Z9 N
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11)): b8 O  |3 [7 h: i
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    * Q+ x7 Y. V1 A, p% R: `! ^7 r3 [
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    & g0 X* {* \! X5 e& p  a
  12.            )4 c, d; N' [% u# B5 d
  13.   )                                        ;求辅助点,用于下一步新建三点UCS: o) z, I% Y9 K) ~# m5 z! _3 M- o
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点5 l: f) I3 o; P' ~; h% D2 C
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向" L& b) ~! Z# `( F* W$ c5 Z
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面/ K4 D" R2 \& D, E& d/ N
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值+ K# i1 G" i/ p
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度6 L. Y2 L" h6 ]
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))! B6 Q" @' F! w- L7 p
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标' U7 _- u& T# q$ ~8 l
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    ! }* x  J- X" o2 z2 D/ D
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))4 X4 n4 w2 c( N$ \$ w
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    " Y) k- I. k( G6 L9 n/ Z
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    / n+ B2 b2 F: W+ U# S+ D; `
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    . B+ d; B# _5 `9 }7 v6 ?! ?/ k
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))! Q) C$ k2 m) |% s  L+ p
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    * ]2 A. E  p% w  u
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))5 q* h% U8 d8 \; I4 K4 e2 |
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点/ _9 l. O- ?7 S
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
      v& D! k2 S' A/ u0 Z: a" x
  31.   (princ)
    0 G/ A4 w% S! K7 l8 Y8 a
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标  b- R9 f+ C$ `, I
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia % X$ s# P7 o# O, C
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!$ m4 |( m9 Q# t, A: Q( G( J
看了你的解释,有种醍醐灌顶的感觉,呵呵
. I/ v( J: T; s5 S
5 ]9 [5 l- i$ o% I1.0 \. U4 h$ ^+ f5 n2 q
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
3 m# Q, i+ z- g- y: }                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))* P! F. L, b1 C6 {1 \. ~0 C
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))# w+ b. V1 g! a% @3 e' e
           )1 c3 z, a  K8 I* B, Q
  ) ;求辅助点,用于下一步新建三点UCS                                        ! D2 K' f& s! p/ I7 a
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点* o4 N( J& j* o

& D& C- R" ?4 a9 Z- V
( R$ b1 l6 I7 |4 B) ^8 ^* D8 g最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!/ z2 K+ R, F1 P! M

4 i* Q4 t9 Z' b. B+ u7 F2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。- J! q5 d/ D5 I) A3 b( z
最开始看到的trans解释:
$ ]: G; z- X( ^) X在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:* n. Z7 M; n$ q* Y2 P8 Y
命令: (trans '(1.0 2.03.0) 0 1)0 `1 N0 R2 e: n7 _$ s* A9 w3 V
(2.0 -1.0 3.0)
4 R! F4 y) ~9 Y  z! n- Y  E我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
8 N' e  D3 ^) e$ D% t# J0 Y/ a: s5 p3 v& q: {0 G

7 r$ F' i& J, r1 ?4 u我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。9 D8 d" [- V2 X  F8 K
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

  \6 u4 b% ]# z( Z不对.
3 B# S' j) e: g* N7 c$ b下面举例说明:% a- A) F. B9 n5 b# O
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
3 i2 ]# R& i% D3 ?4 i, n+ K现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
: n* d' y9 [# V* I6 |. s3 l" A5 B下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.3 ]* L% o0 K# L, ~5 `
我们再在命令行键入(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).
4 P% X& W6 f, h8 S# g3 U我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧." _' H0 p  i. W
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
$ [6 L3 V5 X; q/ j' [: H
) A  p0 M  M( m4 y另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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