QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 5049|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
% k9 T: ]4 N  ?  \! r( ]' w% i: A
请教下斑竹,trans到底是怎么理解的?
- ]% o! ^8 r% Y问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
2 y( i, C- {; Z" H) Z+ j, M: t
  1. (defun c:gcx(/)
    1 n1 R6 K  t3 x7 }0 J0 j% c( g
  2. (setq l1_en (entget (car (entsel))))
    1 V, U. g0 M8 V2 |1 s
  3. (setq l2_en (entget (car (entsel))))
    ) A0 ]6 i4 l- R/ ~& u; \; N
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    6 h, }4 C8 J* b% Y
  5. (setq pt12 (cdr (assoc 11 l1_en)))# O- {  _. j2 g. l
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    : T1 s6 {; O3 Y# J! A6 p, l
  7. (setq pt22 (cdr (assoc 11 l2_en)))2 C* q# ^2 S  A# U. z
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))7 N' P" X5 f% @% P1 c' |
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))! R6 C. o: M( I5 Z/ j( w8 D
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    7 ^- u/ O- E5 P
  11. (command "ucs" "3" pt21 pt22 pt)
    , ^* e3 s! l" G. @
  12. (setq pt110 (trans pt11 0 1))
    / x/ K' i) l) p& C% Z% b$ I
  13. (setq h (nth 2 pt110))7 k8 d; p8 o2 I( y( M5 P' i
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    ' |9 N* p$ [  l5 ^" C1 L
  15. (setq pt120 (trans pt12 0 1))
    , ^. m% g, i/ p$ D8 B  m7 ^; r' R# v
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    0 N2 d( [! J# I( W* ]! y9 j, q
  17. (setq pt210 (trans pt21 0 1))5 ^/ ?9 C2 s6 V. W, B( F& U5 e
  18. (setq pt220 (trans pt22 0 1))
    . k4 J9 z* L) R
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))1 n. e: e8 B2 o% ^
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h)), [5 p( ^* F/ l9 c) y
  21. (command "line" pt1 pt2 "" )
复制代码

: j- X0 ~$ \. n) F前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
2 [; I  Q4 J; L4 d! c- }另外,我在明经看到trans的解释:# q. G4 e, Q% k+ p$ }
将一个点(或位移量)从一个坐标系转换成另一个坐标系' g. d+ d! L* i' S' G! Z) H, \
(trans pt from to [disp])   参数% ^, k( C4 B) w5 ^8 i! b* ?: h
pt
% k) v1 R3 u' N9 X$ w& n三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。) |2 X. m& _1 S! w
from
- o) \# B( J* P8 R+ _整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:" m4 a4 ]. G. |7 N( G( c
0  世界坐标系(WCS)
2 Y! |3 P+ W* r" G# i/ ^: m1 x, I1  用户坐标系(当前 UCS)" Z0 k  J; i+ }
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。; q  |) U/ @* t' q: {0 x3 I
3  图纸空间 DCS(仅用于代码 2)
1 ~4 ~% d; V% b7 R
1 r' c2 M5 ~! V后面的解释就不贴了,此外还有一个例子:: m2 Q! N+ I# z- F. }, U
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
# U/ C8 r. Y- q$ _0 _8 n# i! J命令: (trans '(1.0 2.03.0) 0 1)# M4 A" c/ n* a
(2.0 -1.0 3.0)( Y8 I; s& `& M, Q6 q* _
* |# e8 P- y4 h' o0 q, J9 {
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?. R: {$ U  _$ ^/ x8 d
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。1 N: s! s0 H8 m# H
5 N1 l" a' D$ N2 c. `
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。: a4 H" L& n' W; s" V0 x
(trans pt from to [disp])
( y3 l3 r7 ^) l  H. V; f$ v这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
- ?3 V# v+ H9 E0 c除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
+ p' r& C% b! A0 ^5 x# o
# b% y% j2 U2 ~; f我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。+ \) v8 r7 O( \+ B! y
(trans pt from to [disp])$ C7 j/ v, M8 t* S
这个很明白了,转化点从哪到哪的意思 ...! |0 V; _3 G; x1 B# d
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
3 O4 }6 e  X2 p" a6 \

6 ~5 z/ T4 Q, {0 z是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)! T6 u' P, B7 ^2 w$ w$ G0 d
  2.   (command "ucs" "w")
    ' `% f9 R4 U$ O" I# q- g/ s3 ^5 K
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线3 r% }/ O+ C5 b+ G, c
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    3 a' ~" f% l, {+ @1 j$ U' F5 Z, x
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    # S0 m+ |! x8 l2 Q
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)- l  s9 E& x2 N( c: K" k
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS). z$ U2 G3 W, O6 ]5 l5 `
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    8 c, T; X* r& d0 a8 L/ l; p1 r
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    " j! q' G, D" D3 H7 R5 X3 {
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    ( t+ n# S8 `+ H
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))6 I+ a1 X) i+ w' d
  12.            )# `. P5 [/ V, K" @
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    6 ~6 \$ x9 O; M  n. P. ]
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点7 e4 N( g$ C" U3 @8 s( q
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
      O4 L" h% n1 R# |1 n% @, B$ C
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面0 x) O6 K0 n, u( R: u/ B
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值  ~* _/ g& o" s
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度2 J& a2 H: B/ y+ Y& W/ g8 F, U
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    * s1 A# s) \. b* w) r2 A7 ]
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标8 S$ y' j* f. Y0 z. o
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值* P6 \  w1 F/ c" B
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))! Z  b& {1 H& T6 R. H, u3 |4 k
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    # a. b; T* O) L
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    ! d) `5 K( g/ G) ~6 b1 h
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    7 O- ]) }( e  ]- v: V
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    . z( ?; {! z- p% M0 M% J
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    ) R9 w& I: x. H" ?- r' {, {" r
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    " x8 {/ \# |7 L
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点7 \" @( z. h1 w. v& M9 K
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    & v) ]. Z  q9 L% v1 _) `4 L
  31.   (princ)! Y  _" q; ^2 @3 B
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标4 ~7 q& I3 f0 Y8 c0 ?$ s
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia & p9 _& ~  ]; K  ?$ u+ ^
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
" a& T5 H' Y" v  a看了你的解释,有种醍醐灌顶的感觉,呵呵( `0 T$ B8 l; v0 h) N
( ^9 e' j2 k3 x4 J1 q9 |- O
1.: W# F) ]2 [$ r! d3 X- {( V4 ]
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
& J4 P% H: K9 p' s+ f+ h5 B                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
( r# b4 n3 V# ~4 Z0 E                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
, h' {' N* n! i% o" W' ]  [. c           )7 x6 c* S& u/ K0 C, u
  ) ;求辅助点,用于下一步新建三点UCS                                       
! f: y. p. F! B! j+ }0 c/ h;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
* o. y& `  V, Y! @+ [7 X1 K! u2 ^$ f7 T$ A5 E

/ m2 [- R1 G8 g4 [5 _6 Z最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
  H# w1 s  Q, Z, x$ I$ F8 L9 @: X; E; z9 e8 u8 B( Y4 A
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
( z! m+ ?1 m7 R' B最开始看到的trans解释:
  |& F1 D' M- O在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
, U7 m5 j/ Y, g5 e0 T! |6 D( d命令: (trans '(1.0 2.03.0) 0 1)
- z* g8 C5 e1 V6 k9 s(2.0 -1.0 3.0)0 u7 Z- z  j9 ^# x' x7 h- H8 c- S1 p
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
' q& U9 Q1 k; Y& W% ~6 m' C
: j" l. K8 i0 u. A5 Z+ H7 s2 `% a
8 s  F" c1 X9 m& c6 ?; q% g我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
7 M, w! p6 G0 M+ ~+ `) E5 itataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

) m" g% A2 x; X0 U! I. Z$ T7 T$ B不对.; L% o. p. C) r5 Y& A  ^; Q0 L( u
下面举例说明:
6 ?& W& g, s7 }$ D在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
3 W. B1 w8 p3 e# C# G现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
0 |3 D) w" G0 }4 K1 u% ?  J下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
, m& V+ W  k: r. @" ?; O我们再在命令行键入(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 a! B. t! y1 L
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
4 ^2 D: d/ c) h' A结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
/ v" S" C) K9 {) S8 h6 Q6 k3 `2 g7 o
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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