QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
3天前
查看: 5204|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
. g& g% N4 i  A. _' ^# b
3 W5 H9 T+ M; d* {2 f请教下斑竹,trans到底是怎么理解的?0 S3 w! @' L+ K6 B+ s/ @+ u
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:* k8 b9 T3 H4 M6 @0 A
  1. (defun c:gcx(/)
    * b  n7 m. y& n. {) V3 {
  2. (setq l1_en (entget (car (entsel))))8 d* E# c6 Z( w' N" s/ O
  3. (setq l2_en (entget (car (entsel))))
    7 Q6 x9 B; p" e5 }. K4 G( X
  4. (setq pt11 (cdr (assoc 10 l1_en))); S% s! O8 P9 C' i, m" V0 @9 i
  5. (setq pt12 (cdr (assoc 11 l1_en)))3 z4 y# O% {( h% m5 \- C& K7 z3 a
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    7 b+ Z9 [: Q0 ?. c0 U! W
  7. (setq pt22 (cdr (assoc 11 l2_en)))
    7 @) Y0 f1 X" B$ t- @; G
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))& _( a7 J# Y+ m" r
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    " A4 k5 j% {, |, L+ h' m
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11)))). `% _0 a% `9 |- W3 @+ x2 e
  11. (command "ucs" "3" pt21 pt22 pt)
    8 w3 D' @4 H: O9 C
  12. (setq pt110 (trans pt11 0 1))% }# p, S/ g( O4 u1 @
  13. (setq h (nth 2 pt110))
      M4 C; R& x2 }) Z& t
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    ' g  H8 L) P/ n0 s  h
  15. (setq pt120 (trans pt12 0 1))2 S9 L7 }+ T$ P  N
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))! y) X' F6 c: ]0 M: g, q
  17. (setq pt210 (trans pt21 0 1))
    : W" Z& d4 w2 q# O, U- ^5 A3 ]2 o" }
  18. (setq pt220 (trans pt22 0 1))
    6 J( h5 R; L4 X0 C* A  k6 V
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))& f0 S0 V8 W' X9 t$ U& D
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))8 W9 c( x0 c2 E& P& r5 Y  w
  21. (command "line" pt1 pt2 "" )
复制代码
0 q4 d5 [: |' |2 ~
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
0 K+ {) H- ^9 Y" q* b另外,我在明经看到trans的解释:4 ]4 i$ ]" g- f4 ^! z) G
将一个点(或位移量)从一个坐标系转换成另一个坐标系5 `- T9 H0 @) ~9 n8 k
(trans pt from to [disp])   参数* x$ V. m% t! _4 [9 D$ z
pt8 b2 ^, Y5 A6 A$ }7 w) o" ?
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
" p7 f. u7 t" ^# i0 A9 V' A5 Z) Afrom6 D# y  h" O2 j
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:7 @; q! h! R% M
0  世界坐标系(WCS)5 r: v* D4 @" s* N+ k% t9 s" R
1  用户坐标系(当前 UCS)# @1 C8 a9 n$ W- e- v7 m$ t
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。* x2 n- w5 i! y) P  f) L; z; d
3  图纸空间 DCS(仅用于代码 2)
; J! W0 g3 x) |4 u  x$ |+ `7 @. \
" K6 r4 a+ r1 R# _/ ?# B: M后面的解释就不贴了,此外还有一个例子:' t$ q( z- [- @- c
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
. o3 b) F- ~" W命令: (trans '(1.0 2.03.0) 0 1)
! u+ u1 W5 e* H$ W% ^(2.0 -1.0 3.0)! K  `9 y/ T, R" i+ p

" R" U% r- w% |8 n& A这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
6 ~( J. T: y7 |$ h最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。/ w  N6 [" G0 ^0 I
4 ~4 R) G  N3 m4 Q( w
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
: o8 s5 r7 G6 O4 s- Z# ^7 t(trans pt from to [disp]): d  {; }; ?2 M
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
6 s( h1 }2 A2 j3 R% M, j! ?9 n除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
2 V9 ]3 x/ a& e9 a' x$ H- t1 s6 X  `7 u
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。8 |/ H* ^- T* k* @8 |# k
(trans pt from to [disp])
7 @0 }- x/ z5 w* m这个很明白了,转化点从哪到哪的意思 ...
1 s/ N1 I) t6 Pwww1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
- l/ a' H: J: S' M
( t1 n9 |& t& J5 O- M2 Q# {
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)8 q! {1 {- P8 V
  2.   (command "ucs" "w")* W4 K0 \, y1 G7 y
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线5 V* }. y- L& M& p
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线0 p7 \7 B8 A. h' E
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)6 M; p# k6 `& P# j2 s
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)0 v0 `+ \" V8 S) F/ S0 h
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)# v. u! y0 g' f
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    6 w4 _2 v* f6 e! Y
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
      p6 _: U' W# f- U, X
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    # P: F5 [/ P# {% I0 c
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    + ]5 d* e' |4 R1 l
  12.            )/ n- J* O7 O$ }
  13.   )                                        ;求辅助点,用于下一步新建三点UCS5 b' ?% [; ]3 q5 J- z
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点/ I; E. y9 d" {8 k" O, K0 v3 [
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    9 T" Y8 G8 A( Q3 Q8 @* `
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面' _5 n' d4 ?9 s4 j+ p
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    ) H- z6 Y, T) d. b/ q
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度0 l  T0 ~$ q% f1 J. r
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))9 K5 W# h, f; p. I, B4 A& ]  K" g+ }
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    ' d, t5 D& H) i0 X" a- q. a
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    + j/ d9 E% J7 S$ f2 O1 h7 p
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    3 f# X1 J% b- j' t8 {  H# w
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    # E8 n" {8 c; z7 l8 p5 y
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    . W8 h. Y' ~" G# ?" z
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    * K7 E! I* e$ L( a  O2 D9 Y
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))" E- F( ^9 h, R* g- {
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    4 |4 \& \+ S1 N( a
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    % N2 D7 E  o' l: }% [
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点0 p" f3 C  ?2 l1 N6 m, x+ o- `
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    / t: ]3 g& h" n$ z- O
  31.   (princ)/ n6 ]$ O& R" c) j& d
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标! O. T8 G) p  b% O3 h
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia " I$ Y; c: z/ s5 e! B
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!$ N/ q, D/ Q9 H8 D/ r# j& W
看了你的解释,有种醍醐灌顶的感觉,呵呵: k  l/ Y% f. `/ A( h2 ?

" r4 q% x- c' v/ [0 c. G" M$ k! G1 X1.+ ~( L& X3 \8 i
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
  P$ Z; k% D' a                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))6 U( I# A/ ~  `4 J+ V* q+ n
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11)). Q. p2 W2 W8 L2 V
           )
/ O* O+ c0 G5 x  ) ;求辅助点,用于下一步新建三点UCS                                        , [8 A' P% v6 w3 w, ^" R4 e
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
. q4 E3 i  P3 ~4 k( ^: S: j' x

; m' ~# J8 z  p最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
) w" ]+ v0 B  V& I8 C+ W1 k7 P  F2 x" T' M& `7 s8 c8 W, ^5 D
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
( [! r7 O9 z3 @7 |0 m最开始看到的trans解释:
: E- [: @7 B% J4 G7 p3 K# O8 i在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
$ Q' F# ]5 I7 I0 v8 y! y* W4 A) z命令: (trans '(1.0 2.03.0) 0 1)( u" B% P/ F  s( x" J. Y1 x
(2.0 -1.0 3.0)
9 M+ ]. d! e' g. Q0 _我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
; _3 Y* Y. ?/ b6 f
/ X, ]% n/ i1 h" ]8 `6 q6 L9 z7 I4 \7 @( Q1 t4 Q
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
& n% b. y& K9 j! B! y! Y# W1 Ttataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
) N& [, u5 e2 l! f
不对.9 I/ s, q: H; h2 U
下面举例说明:5 Z3 s4 l. ^6 z  B' R9 n
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
) P: B- ^8 s$ }' k现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.: K6 i* ]" }8 ^- @4 K
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
, ^  \8 a" l8 }( t我们再在命令行键入(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& A0 n; n1 i: w; _0 ^1 l  P$ y
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.* q, l5 a# F1 ]% u
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
, U( o! h# n$ i7 t5 J. ]) {6 l: i2 O/ [8 p
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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