QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
1天前
查看: 5193|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 2 R  r+ ^  z1 r; }1 Z
! H5 M  k" }# J8 G2 [+ P' Y, Y
请教下斑竹,trans到底是怎么理解的?" O3 |- X" }9 J& P! J) n9 w% X
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:$ d  G( V8 F3 W$ U" j5 R$ o
  1. (defun c:gcx(/)
    " X0 m- L; a; ^4 x# r5 W; G0 e& X
  2. (setq l1_en (entget (car (entsel))))
      h: C* N/ P$ e- G+ |
  3. (setq l2_en (entget (car (entsel))))
    + Z/ p. `$ s+ @0 L' j2 a
  4. (setq pt11 (cdr (assoc 10 l1_en)))5 |. Z% i/ H+ [( ]- V
  5. (setq pt12 (cdr (assoc 11 l1_en)))3 Q3 m/ y0 m) m9 u
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    2 A- d/ N# ~3 s$ Z1 W, _
  7. (setq pt22 (cdr (assoc 11 l2_en)))
    / y9 R# e3 ?( i% ?0 W% S% {- \" m
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))) c  B# e! |8 U9 M$ t+ O
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    4 [+ p( r- p( |2 z$ w% s
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11)))); `% T; Z9 g4 ]$ t! K
  11. (command "ucs" "3" pt21 pt22 pt)0 c9 W9 t/ l# p: t+ Y
  12. (setq pt110 (trans pt11 0 1))5 C/ E) _0 _3 E3 }. F# @
  13. (setq h (nth 2 pt110)): @5 K- b1 A9 C6 R/ M4 O$ o( |
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    $ k" U) V: F. q* G4 a
  15. (setq pt120 (trans pt12 0 1))* {/ v3 i4 h7 I0 l9 a7 t, ~+ t
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))1 M  ~1 ]& X: @, h  h
  17. (setq pt210 (trans pt21 0 1))
    8 V" C0 B/ }! K( q( q, @
  18. (setq pt220 (trans pt22 0 1))
    7 X, e+ i2 W! u- x0 k. g# Q, [
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    5 k! i" @9 P, t  q0 g1 h+ N
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    $ q9 _6 I+ R1 I' z8 f
  21. (command "line" pt1 pt2 "" )
复制代码
# o/ J$ ~, s! F% p) H
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?& D2 E7 j- z. d# M' T" v
另外,我在明经看到trans的解释:
7 ^6 A4 @& b8 ]: o& d将一个点(或位移量)从一个坐标系转换成另一个坐标系2 x3 q8 w2 A* W
(trans pt from to [disp])   参数6 Y% |- [/ Q5 Q7 X1 r( U4 M. ^
pt7 B1 f- k1 |% x9 A5 O: ^
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。4 C2 N8 o( Q1 Y8 y+ U/ F* O
from
' |0 Z+ U& M6 B8 D' O整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
- }" a! @! o2 [/ o0  世界坐标系(WCS)
' _  n  k/ R" X! n1  用户坐标系(当前 UCS)7 X) |6 I! _5 E2 m! U6 w- f
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。* n$ O5 N, F- x6 N+ v5 w
3  图纸空间 DCS(仅用于代码 2)
0 r, U# x- }# [) U# z0 a; ?
8 o# f, n- n/ G后面的解释就不贴了,此外还有一个例子:
* q$ n. d, e3 k5 B( {4 Y/ O2 e在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:7 i' u* z2 D% t# s1 y. O) y
命令: (trans '(1.0 2.03.0) 0 1)7 W% ]0 h2 o0 H$ B/ `! R  u6 }
(2.0 -1.0 3.0)) M- t: D( Q; g9 c
- y5 ~7 z- l) Z- b. c# a
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
0 P# O; Y. e) U: ^最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。7 o) n+ ~9 y+ L

4 G2 V( M  t1 c6 s6 G2 X( i我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
1 c& B8 P" j- [; U5 K$ Z(trans pt from to [disp])
+ T8 f5 o- ?1 i  Y. I. ?# ^这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
- H8 j$ K) X) ]+ M, A+ w/ y除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。0 u/ L$ [$ y; Z+ q. z

5 l0 s1 l" L# p/ e: Q! x, ^我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
  F' j2 g% `5 }' t4 |# ](trans pt from to [disp])' y$ e& g$ p* a8 Q
这个很明白了,转化点从哪到哪的意思 ...9 U! T3 O- L, t( h! H
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
) U2 m' h) ]/ D+ ^1 {% F

- R# h; p& p3 r是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)0 b& x& ?* l% E: N, X
  2.   (command "ucs" "w")
    % w# S  ~8 {" ]: j1 L, q
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线; ]+ X9 G: J0 L# }! o4 J$ ^4 o( ]
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线* S( p7 s& @9 _: a: H3 s  q
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    ' X( e0 A. ]$ w5 q' {+ r
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    , y) ^  j) t: d0 R% v4 f
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    ; t2 t1 D9 ]! h0 i5 N; e
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)# a. u, x  k% L( x4 \' B9 ^
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    ; T9 z/ F# f5 X1 @1 o9 ]
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))9 C! s5 N, N' J; G' P4 i" Z* K  U  R% a
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))$ [: J; r5 B# f) z4 i! Q4 B
  12.            )7 u* F+ |- }3 I' m; d$ ~6 N
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    * P" \4 `1 h& C2 S0 M
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    " q7 I  g8 d5 {; r. ]
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向  f) [4 W1 f( n
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面/ U, T) a* L# R' G5 [' T' L4 `
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值" v9 ?0 a- z$ w4 a" d) }
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度+ c' U, B# Y$ [9 n5 V. F& D) U7 f
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    3 K8 K4 ^3 _+ \+ K# n+ O
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标8 q! O" [  X- t$ v& B+ g7 ]
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    5 \+ N' A: d& @9 F: }# S0 P* Y3 O5 O
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    4 u8 S; N5 Z, G, b
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标; _! O. U; i8 z9 u0 i9 F/ m- h5 |. ]
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点. s. Y5 I3 B8 e( P# ~5 F4 z
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    ! w7 a, ~- e' m0 T; b
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))0 \( Y: ~' `0 G
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点: x) T3 J8 h2 v
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    8 s2 W8 w" k' O3 w) r. {
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    % x- m9 g; P- K- y
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线7 j. b4 a3 a  c- U% q' K2 o
  31.   (princ). K% z4 M! D% d
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标6 k; `8 {' D8 z5 i% z
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
9 o( I7 C2 L% n" ]: \1 A$ `谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!0 ~# _; p. L4 B$ ~! E# r2 q
看了你的解释,有种醍醐灌顶的感觉,呵呵/ f& }7 d: Z  }, R7 _- M1 e

. |6 n1 G: H7 ]& b: f! C* p) I1.
' D6 D% [  A( K: E/ T2 o (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
' B- T/ y' |- M" o                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11)): {" I$ V2 A: u( Y
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))0 y% ~1 T0 j# Y; c  |
           )
7 ]* J0 b7 ?- S8 Q  ) ;求辅助点,用于下一步新建三点UCS                                        % T5 q3 O2 t2 n( u3 t9 g  t+ B7 M2 ?5 w
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
5 {# S7 |) L( I/ H% ^" z9 b& x# c8 F3 ^7 h$ E2 t

/ Z) w+ R1 d) u  X9 J1 }7 j7 B最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
! l% V/ R% o8 R, e$ R
" D/ J' B% s% z$ @  S  p2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。5 F) R* _& V7 B4 n
最开始看到的trans解释:; O5 j; ~8 y6 [
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:4 g7 t% t) k# {- r3 U: n
命令: (trans '(1.0 2.03.0) 0 1)
3 c2 ]$ |0 N" N3 L! l" T/ h(2.0 -1.0 3.0)
0 c5 I, a! i5 G4 y/ O! E2 g我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
$ S. ?5 W& _% a; t& Y9 `: |- T; ^; L& e& p

+ F8 v- Z( C: J6 i4 D我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
$ V# _# @' S& D; A$ W2 ftataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
$ ^5 o$ k/ l( ]) I: i/ [! T
不对.
3 t4 y! c  r  H9 f/ b下面举例说明:: @4 N" P5 ]! y! O5 L# P1 ^
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.8 y5 Y! r& c! N8 q* y5 {7 i
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标., a5 r) O2 b+ G+ X' a
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
' T. s0 H& s& R: j, R2 R+ [我们再在命令行键入(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).% A+ j" {3 Y* h1 n2 s- f/ Z9 w5 A) r
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.9 L/ _6 _$ u, ]5 u4 V2 ]2 ?
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
2 O) w3 S# o; K" h  {  I. b0 O) [
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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