QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑   e4 ~0 N9 U9 U1 U7 s  B$ ]+ ~9 L
) i/ I8 U! u, v! K( [4 h% _
请教下斑竹,trans到底是怎么理解的?
0 R- `* P; [6 J问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:% D, Y9 t; G+ ^% E: @8 h; S& @3 j5 {
  1. (defun c:gcx(/)
    8 j  x1 z( x8 r- N  ]* f. W* u
  2. (setq l1_en (entget (car (entsel))))8 r' a& W( G# s5 F  L+ _8 N
  3. (setq l2_en (entget (car (entsel))))
    $ o; z+ w/ ^7 n- Y' R* d0 q# d4 A
  4. (setq pt11 (cdr (assoc 10 l1_en)))! |# f. Q2 y) N& |1 H' d
  5. (setq pt12 (cdr (assoc 11 l1_en)))6 M. [- N7 `. g) E
  6. (setq pt21 (cdr (assoc 10 l2_en)))
      n) `4 y; c3 l
  7. (setq pt22 (cdr (assoc 11 l2_en)))' z" N6 r# f  j! e
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))$ {$ {4 C) ?8 |, y2 k- c
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11)). r; H' J  H# }6 w$ ?: f2 E' Y' t
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    # ?5 b8 }2 E: c/ t
  11. (command "ucs" "3" pt21 pt22 pt)
    ' H2 J7 U+ [6 G7 {4 I, z- Z& ^) X
  12. (setq pt110 (trans pt11 0 1))
    ( K# Y. l$ m* g, `
  13. (setq h (nth 2 pt110))
    " q/ V3 i, H$ x% T5 F: }" @
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))! {9 P  c! @6 t2 _  D) I% p. F
  15. (setq pt120 (trans pt12 0 1))2 P9 \" Z" h9 }- D& {
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))/ C0 M5 \+ O5 ]. a, y
  17. (setq pt210 (trans pt21 0 1))6 s% z6 a2 J3 c8 d$ _4 y
  18. (setq pt220 (trans pt22 0 1))6 Y1 E- {4 x4 q6 \( F, {" M
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))* {7 a+ j# r. J
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    7 W# k- ^" G* y4 t3 C6 Q! K
  21. (command "line" pt1 pt2 "" )
复制代码
7 l3 A; c0 {. A; f  ]3 z  Y7 R
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?4 \6 \1 E2 o& r0 ?" x
另外,我在明经看到trans的解释:* U3 ?6 z- w, P! D3 S5 f
将一个点(或位移量)从一个坐标系转换成另一个坐标系6 `5 {$ }9 O0 K6 t& P* M: J
(trans pt from to [disp])   参数2 o3 X3 _6 g; q" l
pt: S7 i4 {: R8 ^& v; M
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。1 ^8 |# v; ?( N2 ^+ B: l3 Y/ {" F
from
2 R8 h) J* _6 B. F2 t& p4 B整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
4 K7 D2 V  l- T8 f0  世界坐标系(WCS)9 u* v! x. J) i) U' O/ p
1  用户坐标系(当前 UCS)
+ x* D" c: }- d- L* p2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。. [! l: a* z) t: v7 f9 C2 @8 [
3  图纸空间 DCS(仅用于代码 2), q  Q1 D5 {3 o/ [
5 H$ B. S" ]) [
后面的解释就不贴了,此外还有一个例子:
* P' f9 Y, g/ w* ?$ T" x* x4 n在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
; Q4 X" s+ k& ^  E# [" b命令: (trans '(1.0 2.03.0) 0 1)3 }6 x) @% c1 E# R
(2.0 -1.0 3.0)! {. X; P' d3 {7 u

, v  q/ [; p; N这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
- ?8 n6 c( D" Y$ p' c. a7 B$ @最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。+ k/ r) O, m/ v3 b  p

! A3 y* o: }+ g$ J, L% U! Y我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
! p) U, g! G% C0 U7 E(trans pt from to [disp])* q* F' {2 z: O
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
9 c7 J  a- N7 p# l8 @除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。* Y; x6 o8 O/ l: g8 }" T& X

( e% F$ u" k9 |' l/ ~2 u+ f我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
# c8 {; Q+ ]0 X, {" z$ v3 d4 e(trans pt from to [disp])
4 z4 D  ~# N* q/ Q8 V: [! h4 A这个很明白了,转化点从哪到哪的意思 ...: j( a: ~9 B8 o  `
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

) }- {% `" n0 `" {$ e$ O
. I( m9 f* R$ I* j是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    # H9 b" H3 h( T$ J" l
  2.   (command "ucs" "w")
    # P; a: o) s1 {1 t
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线/ S! M5 e+ l& r9 D* g8 _4 {9 V7 [9 k
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    % q7 `1 O; d' K) x6 a; M0 j8 L
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)& X! [6 h& [* m8 D' a5 O! I
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    ' @4 I+ Q6 B9 U# [1 v& z
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)% d+ F5 m. b8 k
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)7 o* h$ e! ^+ l9 G. l
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))" e  X; k+ L& @+ k2 Y' k; O. C
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    . y5 ]/ W4 S0 U  I" Y! {! f4 }2 a* C
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    ( w" z. s0 a% E$ A% K0 I8 @  i- o
  12.            )
    8 S! E- [* T& z* n) n# J
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
      Q1 `! L6 A/ {6 `6 t& F
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    7 z7 p1 i* r( ]! S
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向. R; \2 v/ x$ I  g
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面5 ?  n6 G9 z  [/ Q" B4 R
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值5 b) W! U, D: r3 E% v
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度, y, A% v! G' \) Q/ p; {& p4 X0 D. @
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))- N9 P1 S, Q5 s6 I
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标  C  h; R: q7 B
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    2 Y  \6 z; z" o# t/ c/ W# d9 t' L
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    ' k' j, P3 E8 n1 h: i+ Q
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    $ Y! N( `6 `  d7 ?4 `5 r5 K
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点0 G7 Z4 t6 o2 m0 J. h1 Y
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标" U2 |8 J1 l2 q9 h: h: i+ v
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))8 c1 f, P, E/ a* U6 M: Y7 W
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点7 s9 X% K$ p1 x* Y
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    . s0 _+ y3 r& I$ s& E! w( p
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    ' A+ r3 V5 ]! R0 F3 H- S" H; \. f. t
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    0 i, D4 M/ h* i$ r0 c, ]& O
  31.   (princ)  J. K$ T7 Y$ e9 f: Y$ O0 O+ b: v
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
) p+ w' _; v) j  ^. B  b. r本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia * Y/ J8 J2 }' A3 C3 g
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!" h. D) Z2 ]/ C3 m
看了你的解释,有种醍醐灌顶的感觉,呵呵, F* k- `$ R3 Z; J- W
7 ~3 r/ |9 e9 G
1.
& _6 u0 `4 k" F7 I (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))- ?$ k( W* J6 P$ a
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))5 _4 y- g4 D$ B5 R; j2 M" s
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
& z  U; I: o0 Y- ^           )" M) l! [9 |, }  h3 M8 O
  ) ;求辅助点,用于下一步新建三点UCS                                       
/ M& b$ K3 j! O! |;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点: T. ]/ ~( Y, F' {( a

# L. D& ~8 y& E( g1 g$ o+ P& l4 P  I% @& h
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!  @% N. g8 T* m7 y! O- l3 S
4 T& z$ L- o% \& f$ \( S
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。3 i& p9 T0 G' l: p8 W. M
最开始看到的trans解释:2 R( U( ^4 ^, U9 O* F$ x
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:* A* d' z- y1 R" Q5 J, ?' R$ |$ }  G
命令: (trans '(1.0 2.03.0) 0 1)
. f- x6 N6 u" `" N/ ?6 h(2.0 -1.0 3.0); z- e5 l% w) g, R# c' L
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
/ j4 O  K; T7 H% }( m1 _: x  A" m8 I1 ~5 U
7 q. \8 Y- m( Y2 t
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
% p( Z5 t& H7 utataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
8 I  N9 r* ~3 h! M' j4 @+ N
不对.
6 U5 |9 R& Q) {- K& M0 h下面举例说明:
# K+ r* T  m  ^$ f) {在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.* ?6 J  b. I$ n4 S: e2 z
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.3 f5 m1 m- `$ A( |3 b
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.7 r+ Q: }' z6 b- E
我们再在命令行键入(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).0 Q8 G! b2 U2 W) Z  z
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
  G6 c" R$ [3 W# x结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
, |: s7 @7 c! j. H& y, K/ A" w/ Q
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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