QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 4 u/ d2 Y% t  |8 i7 E, ?3 f7 P) }8 |- o
1 D2 O6 R# ^/ M( z
请教下斑竹,trans到底是怎么理解的?
# W8 h) ^2 E3 o' c问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:& E) U& Z2 v/ m" G7 v3 X' I
  1. (defun c:gcx(/)2 y% b' T9 S$ P& Z% U
  2. (setq l1_en (entget (car (entsel))))7 N+ P2 I1 ]8 L2 O/ I
  3. (setq l2_en (entget (car (entsel)))). R7 }: {/ R3 K
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    ( o7 e& q: `4 D5 v  t, b  a
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    , b9 w7 u+ h1 @8 R* p. D
  6. (setq pt21 (cdr (assoc 10 l2_en)))- ~2 E$ v; y5 e9 {2 e
  7. (setq pt22 (cdr (assoc 11 l2_en)))  y& i$ i9 b! Q1 j0 M
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))& F5 V" h, ?/ y9 U* Z
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))! a9 p1 z$ O4 H' B! x& u: Y  f
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    0 [( l) ~# c1 a: W; ]2 [8 C
  11. (command "ucs" "3" pt21 pt22 pt)
      V7 o" M6 ?: S* |6 G9 E% B2 [- A
  12. (setq pt110 (trans pt11 0 1))
    ( G- X! f! L7 e* p3 S
  13. (setq h (nth 2 pt110))( @* j9 ]! _& _! z% l
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))% W/ i- L& V. w3 F. m9 I" C0 \
  15. (setq pt120 (trans pt12 0 1))4 `4 ~+ c" D% j- F1 u9 v
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    / ~; ^( L" z  h9 s
  17. (setq pt210 (trans pt21 0 1))' n7 }) ?0 @6 z+ o% Y# P
  18. (setq pt220 (trans pt22 0 1))6 y3 |3 p" p6 t' U: e, q
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))+ p1 }+ G- C4 h6 W8 [' C
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))7 U2 p- h3 T- B  b
  21. (command "line" pt1 pt2 "" )
复制代码
. M4 l0 i* `& l: @& t& `5 e% X
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?' m% ?" u3 n( H0 u+ }( E% x
另外,我在明经看到trans的解释:
- g+ M+ O$ e6 r9 Q! O将一个点(或位移量)从一个坐标系转换成另一个坐标系4 V% \1 _" W: r! F5 J- Y8 w
(trans pt from to [disp])   参数2 |5 x; K: C; G. X3 k
pt
8 u) o5 n1 a5 t三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。! J% i" o3 U8 A. i
from
  A6 c; z! s; [整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
1 X/ e0 [! D* X6 x& x8 _, Q0  世界坐标系(WCS)
+ x# `9 J; {# T2 r. G1  用户坐标系(当前 UCS)
, @9 I3 V3 ]( T- B0 j/ M$ z& Y! X' W2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。8 S* ^; m& F5 D
3  图纸空间 DCS(仅用于代码 2)% g) R9 `& c* N/ ]

3 h0 {8 n* r0 r$ b  X4 g, p/ H后面的解释就不贴了,此外还有一个例子:4 Q, l$ h1 G" I
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:# S8 ^% A0 z! N" a
命令: (trans '(1.0 2.03.0) 0 1), K6 \* E8 ]" N: g) r  O3 J  q- a- m) {
(2.0 -1.0 3.0)
3 {  R- ~! d/ z# L$ F" p' O6 e/ a1 O5 r7 ~+ }* S
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?. a( K/ y0 U; L2 }6 k
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
  o* y7 c5 O0 `4 i. [! b
: O5 h0 V1 B0 c! N我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。: T' E* l4 G9 R1 M! l3 M( W
(trans pt from to [disp])
0 n6 W; Z- @0 O( y. O8 b+ K这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?/ {/ s: q. V4 ^8 o# P$ S  ~0 H& I0 O
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
" V( V/ {' d+ v1 J3 O$ T9 D
4 }- E- H5 x5 i# S' F我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。. U( {, W, f' y/ @
(trans pt from to [disp])9 q9 F+ L0 [- a: ?: [
这个很明白了,转化点从哪到哪的意思 ...5 H/ l6 @* Y6 a/ M6 N9 s3 Z) W* d
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

; V* |; H" V) l% x/ E# }$ |% d0 h/ U& D0 Y
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    ( _: `/ k- v; g
  2.   (command "ucs" "w")6 h8 H7 N! y: |. ?( o' L( ^
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线0 ~2 R$ w& y9 C3 E1 s
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线+ q/ I: U3 f+ t! H9 w# I
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    4 R: M- g6 l+ k+ V4 l7 [
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS), p2 O; e- I' V' J1 @% e3 s/ M! C
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    # w1 X+ |% j% t) `9 Y5 p5 X
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    : `: R4 Y& Z1 M) y" F
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))% c+ m9 Y2 |( f# ?% |, f9 M3 S% F/ P
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))/ D5 w! t" V0 W- l/ |
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))$ K) I0 r- E6 r% y% b/ P
  12.            )
    5 l4 c- o+ z/ o9 S  X5 l% \) b# y
  13.   )                                        ;求辅助点,用于下一步新建三点UCS$ T2 G9 r9 N0 O* t
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点0 D6 ^# ^! ~$ V, K! ?; s( A
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向# S8 ]3 o+ Z, b
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面+ {$ T  M0 a) L) V) \
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    ' Z* ?" D  e" P" i* _4 \6 `# i' f3 l
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    - q% N+ p' N0 N0 Y5 N% Z
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    & y; V2 i- d3 k: W- F: X( h
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    + ?# x& W: e0 K! I/ g
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    ; v: x% h- I( |7 H) m; J: _' M2 t
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0)), j" Y- X- b7 [0 ^9 {
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标; x9 T; K: K# f0 m
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    1 n1 ~: Z' M+ O6 A2 x
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标& R. I* K8 \; B1 b" J
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
      U- }! v4 h2 s, S
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    7 W9 _* k7 {8 E7 ?7 x! U3 B
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))) p0 f; ?3 ?: b6 w- @# A8 b
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    ( H. A" ]% K5 E* w" v
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    7 p; j, z3 i; w7 Q# K3 m* K0 C
  31.   (princ)
    : R3 |+ g9 m- X3 y" j
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
2 \# K: O' {/ K8 P本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
3 b, s( f1 c( c$ x' ~  }! c谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
) s9 P3 ~* \5 ]8 D, R看了你的解释,有种醍醐灌顶的感觉,呵呵
" E9 y4 |5 b. N+ @" w* A' {
: c! x! S. W' L1.
9 p, C3 q( Q+ c( D# | (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
8 p3 ?, s5 P$ w  Q& d! ~                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))8 x' K# q5 C$ U
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))' d2 L2 A! p8 e: ?/ J$ Q
           )3 i! B0 l8 |: a8 r5 [2 J
  ) ;求辅助点,用于下一步新建三点UCS                                        + T3 h6 m7 H/ _2 u8 _8 F
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点- R* I. [6 b) J( C' W% l

# o8 q* H% c8 h5 K* k( R- p
7 E. h" l9 l- ?; s3 k1 ^# V最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
4 I1 ^# f6 X! O
. l. Y" @6 o! W4 l: W  a7 K/ k" y2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
7 Z9 t4 f  l; g3 |! n: [5 y9 x最开始看到的trans解释:
  O1 ~/ x% ?  l/ a% d7 \- W在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
3 P0 i8 y8 d/ P- R命令: (trans '(1.0 2.03.0) 0 1)$ D) Z8 {% F" t! K' n' t" K1 j0 A
(2.0 -1.0 3.0)
6 p0 G6 b8 M# y+ @4 }0 `8 g; d  [我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!8 X/ o, w* f( }
/ c) o- _$ s1 i1 K

# y2 ?# W% e3 }2 l7 ?5 ]* y0 H我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
  t& v. E/ n8 o, t/ B6 b7 q8 etataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
5 B7 E, }4 B0 I2 F5 O4 |2 ~1 m; C2 |
不对.
) A0 I2 u, B4 {2 O+ d5 P0 V下面举例说明:
8 R5 s; M6 D! q* m, O3 b在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.6 y6 ^5 G* V! D  f9 w) D
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
# \" K0 L7 B0 z; Z( L2 Q下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.! ?3 k+ z3 H2 J, i
我们再在命令行键入(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 l, s2 ^; _/ p8 u' _5 ^
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
7 E- p, B! I: g4 c% o/ Y2 h结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
- ?6 s; `' U8 ?% j/ ?; x/ p: N8 g" U# F: P8 K6 s+ S3 ~
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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