QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 , |  e6 l" J' ^3 G1 d- r5 |' N
  e( }, n0 e: a6 ^4 T7 |) F, X
请教下斑竹,trans到底是怎么理解的?% p' H: j8 e0 X- I( U9 y! B
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
" S# @' w) H* V# y$ a' K2 J+ b5 y
  1. (defun c:gcx(/)
    ! W4 ]7 C; `' d3 V  ?
  2. (setq l1_en (entget (car (entsel))))1 k6 z  h0 Q1 s5 S
  3. (setq l2_en (entget (car (entsel))))" Y1 F- T' ^& J8 q  m
  4. (setq pt11 (cdr (assoc 10 l1_en)))% Q2 y% i: z( m7 Y3 z
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    3 E- _* o* U. h$ B2 H
  6. (setq pt21 (cdr (assoc 10 l2_en)))- Z# C/ J4 n  F0 ]
  7. (setq pt22 (cdr (assoc 11 l2_en)))! O! N3 m' ]' ^8 B
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))1 n1 ^+ @" l! Z; c4 b. {
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    ' c9 V3 [* t2 z* o( c* c/ T% L" g
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))& z# }9 N% C- T, f- X# x
  11. (command "ucs" "3" pt21 pt22 pt)
    / s0 u8 x1 G2 r4 ~- ?9 ]) }
  12. (setq pt110 (trans pt11 0 1))
    $ y% h2 E, y- Y  P9 M, @. E- L7 Y
  13. (setq h (nth 2 pt110))9 M) b( N) T* U, {# L
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    " H5 j# W; O3 Y7 I# U
  15. (setq pt120 (trans pt12 0 1))
    ' ?( e6 H5 G8 o' a5 {" |# Y( x; k
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))% u# H5 ?/ Y" [; J
  17. (setq pt210 (trans pt21 0 1)): G' U$ M' V5 G6 V" l0 j3 e( ^
  18. (setq pt220 (trans pt22 0 1))# p  h# b+ P4 x- v
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    , y1 A- K& x8 \3 L) L0 o! i
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    + L0 Q; L8 p) i
  21. (command "line" pt1 pt2 "" )
复制代码
+ o, J5 G& V/ }2 m8 o) |* O' T( F8 x' o
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
) M4 S! `4 @' A- W另外,我在明经看到trans的解释:
. I! L. ^; B) Z, Q将一个点(或位移量)从一个坐标系转换成另一个坐标系2 K) Q: e4 }$ V
(trans pt from to [disp])   参数+ w$ u& n# |+ |# u3 P3 C, Z0 v$ M% e
pt4 E0 u8 j# r' z
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
5 L, v0 I' ?3 a- f3 {$ \, zfrom
- a( |( _- ]# |5 V$ ~整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:8 W5 z1 Q/ d2 @2 H) A6 q
0  世界坐标系(WCS). h# `& s* V5 G! Q# [+ i; N
1  用户坐标系(当前 UCS)( E* _9 W8 o$ @6 J" A+ t- ^" H: z
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。/ u7 u. a/ z1 i* h$ r+ Q! Q* m
3  图纸空间 DCS(仅用于代码 2)
; D+ ]: B2 J. K) R8 Z- k) H
7 H. p! U! b  D, Y- c( X后面的解释就不贴了,此外还有一个例子:
1 m) ~% L3 ]) a在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:- v* u; q% U# ^) V9 q
命令: (trans '(1.0 2.03.0) 0 1)# i6 A" O- H$ i
(2.0 -1.0 3.0)
2 ^% l/ C! g7 r- ~0 M
; M" i! z& A& H; _  i这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?: p/ C: C3 _% J' x+ k" z8 P! g( I
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。* ^7 W0 s* Y7 h; j4 @- h8 v

% f' P/ x: q% X2 D5 A" N- J( V: u我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
, i4 l9 i) _$ J/ L2 o/ g! P(trans pt from to [disp])! H& u# V9 J1 p! K. t: r
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?& X7 Q9 J0 @# v7 q6 h9 m% f3 B
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。# j; M$ A# l$ Q, p0 ~3 W8 U- Y3 V7 ]7 m

, {3 |8 \; d8 k* O1 h我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。" o0 o1 T) _# A$ n6 n
(trans pt from to [disp]); B0 Z4 X/ ]8 G: w+ @, R$ {- c
这个很明白了,转化点从哪到哪的意思 ...
. V; c% @& h: X. Hwww1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
( b& I+ Q/ T, `5 V! F+ d
: v; u5 @- h- n" F( c) U9 H
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    & ]/ M: r9 |% B  U) a
  2.   (command "ucs" "w")
    7 B4 L5 {4 ^% h8 K% J. `: W! a  L2 Q$ _
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线
    9 `( X1 \; e0 w! _
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线! m' T3 ^1 N7 f' [! Y# \2 Z
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)+ I' j1 S. }4 E' e2 P1 i  w
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS), D; b; }. P  V, c; j4 i- B& @
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    : [  k6 G5 J: X: k
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)3 Z. Q! S) _+ f2 o* `- e8 W
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))0 V3 v" w! U8 U' O' n
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    & s" g0 R6 i/ L! M& G8 A
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    / p, N; l5 c/ g  {% K" Y. r& ~
  12.            )
    . z, l7 G! Q! X* t
  13.   )                                        ;求辅助点,用于下一步新建三点UCS7 a5 q* ~5 y4 G; V
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点5 }! M, R' K7 G
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向! R' r+ b& _# b7 }4 P6 G. L( w
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面. Z% V4 ~1 w$ J6 V$ b2 ^0 w
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值+ K) Y, Y9 y$ o# _; u
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度' ^( ]0 T( y$ h7 m0 t3 a6 R
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))1 z, j# I+ g( p# i
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标8 b9 y. \% f/ u; g5 J' j% B
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值. [2 L, Y6 O* k8 _- Q( R
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    0 \" E- P/ T& P( B
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标  r3 C; Z1 C- C9 s7 {$ P2 W
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点2 e/ j# Z- u# [
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    1 P; y* s" `3 P* V
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))" K- L6 q0 \1 J
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点/ C& V4 b! L/ w* p" C
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))! ^8 t) x. m& g# S, z' g) g
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    0 s" T' N$ V" @( c0 @- D
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    ' P6 T" t5 ~) f6 A7 T
  31.   (princ)7 b& J! [! O$ H2 G5 Y* Y
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标, d0 P1 o4 S8 x8 K
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
, i  I! @5 w. u" U/ k谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!. e# J% x/ k) O9 p& g( C) k# K
看了你的解释,有种醍醐灌顶的感觉,呵呵( t" @" |% y& O2 ~6 q1 c
/ U: V2 O8 {+ D0 W4 Y' A& H) q" P
1.6 t: `4 d3 P+ r4 z, w5 K
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))5 D, G( w( G* R5 J; k
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
% P# C) m" f/ F. Z/ f# o                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
- M; _, c( d6 X& T5 `) w           )
. [% V! ~9 i4 R1 Q! H2 g  ) ;求辅助点,用于下一步新建三点UCS                                        7 e! v* z- g3 b: d* s
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
0 g; c% y* o: S0 H1 D8 `. w! E+ t! |2 D4 |
( n' F& a1 {+ r, Z4 Q' i( o. U
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!& u# \& _3 U3 X1 {
) S0 Q9 g5 R' C. O" t' U
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。: e/ p7 g: X9 D+ p+ J' }* e. ]
最开始看到的trans解释:
" m. K) n# ~  u0 c  E在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
1 \$ E- d$ B8 ~$ Z$ R! n命令: (trans '(1.0 2.03.0) 0 1)
8 s3 a4 F6 x% V5 U1 M(2.0 -1.0 3.0)0 Q- ]  f7 F/ t6 g  P+ b3 s8 H
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
# V" r6 d* t& f
7 z6 n+ Y% x; L2 h# r' N. h0 q+ ?$ E( F# r4 `7 ~; k
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。3 S+ V/ T* B0 L4 _) `+ E$ @2 C
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

% [4 [0 M3 }$ U" t1 }) d- s% n6 A不对.
9 C" ~) L# l/ T0 h$ K下面举例说明:
0 I4 S7 V8 J) _在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
; o, [4 t. O* d; h" Z现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
0 |, Q. G2 f- U  v8 p( M下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.' B3 R! |+ R6 q+ h3 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).
6 T9 n  b% I3 L2 v) i我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.9 R3 B/ A& t' z9 |& P4 J
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
7 o" \, p; z4 a
' V$ ]: K3 A( A% S2 O7 D/ ^8 D另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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