QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
: Y' a% S& B5 N9 i/ C4 \; E! b9 a, d
请教下斑竹,trans到底是怎么理解的?
2 n$ F) [: I$ D! o& G7 W. |" `问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
9 ^& w0 x! m3 V* N2 P
  1. (defun c:gcx(/). ^5 j, T, \+ M# L0 a4 u: q+ D) ~
  2. (setq l1_en (entget (car (entsel))))
    3 Z9 y' `' I8 E, b( x  x$ e
  3. (setq l2_en (entget (car (entsel))))' d3 [* p' G' M0 a7 s9 t, Q
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    & X& s, V9 l, r! X- D
  5. (setq pt12 (cdr (assoc 11 l1_en)))- V) B* C: r1 {: c3 X, J
  6. (setq pt21 (cdr (assoc 10 l2_en))): m# |9 e4 e0 u) H0 \' W1 [
  7. (setq pt22 (cdr (assoc 11 l2_en)))
    8 ~9 L' q, g7 z2 R& b4 }9 o# B
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    # e8 H2 T, ]9 C5 O9 I. A
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    3 n* D/ w! @! M) C8 g( c
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    ) {. {, @) s' b8 l6 c2 ]
  11. (command "ucs" "3" pt21 pt22 pt)
    1 T% `  c& l* `4 ]' K3 H
  12. (setq pt110 (trans pt11 0 1))
    1 \1 o* o4 _# \* E# @) h
  13. (setq h (nth 2 pt110))( c# L4 Z6 r, g) B  ^# M6 m& D# g2 I
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))3 d4 k. E3 d- F' k2 t# A5 Y
  15. (setq pt120 (trans pt12 0 1))4 E( C' c" l% y( f3 n6 g
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))2 `4 H' T; b* D! }: ~: p5 b9 {
  17. (setq pt210 (trans pt21 0 1))2 N( h8 A6 _' Q2 \. ~/ U: O. n: Z4 r
  18. (setq pt220 (trans pt22 0 1))4 V! w  X9 B9 l3 ^. \
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    , Q2 k/ x- l) e# l, ^! t9 u
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    7 H7 E3 W! `% h$ R8 F
  21. (command "line" pt1 pt2 "" )
复制代码

# X6 G. I1 M% x  i- ]9 e! T前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
, ]8 B5 M1 c; F: _0 [3 }另外,我在明经看到trans的解释:
/ ?1 N; B! O3 [' {* f将一个点(或位移量)从一个坐标系转换成另一个坐标系
8 X4 W, E( t. c2 N# i1 O5 Y(trans pt from to [disp])   参数
5 m0 U$ n4 o1 ^9 F4 |% Q( ?$ L! Upt) T/ a4 a* y& y: {% |9 I7 [
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。9 L( i2 m! g4 M$ I# V: b
from, U' ~8 J0 t/ G5 i* x* g) ^
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:3 p+ ~) k) R- Q2 s
0  世界坐标系(WCS)
8 S6 l2 R* d2 X% x* X1  用户坐标系(当前 UCS)
# ^. G, L0 }) [1 [4 O, o2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
2 p- V$ o3 S8 t3  图纸空间 DCS(仅用于代码 2)
& r% @( m) |& v, s& m: c" U9 ]3 S1 b3 C* s: I) ]
后面的解释就不贴了,此外还有一个例子:0 r' y! m( l, ~$ g8 S6 y
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
0 x, P1 |: O$ q5 ^! n9 Y命令: (trans '(1.0 2.03.0) 0 1)5 p* o( `5 n, g& g* y8 B( d8 d
(2.0 -1.0 3.0)
- n& X3 F5 k8 O+ J$ A7 Q0 e/ O
1 g2 N1 m! Y# h! `这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?( O5 G3 @1 @$ Q3 K) z
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
3 U& d/ R; T  ]! e4 q2 u1 _/ F, y; a. U% h
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。( l3 J6 Q6 C! Y) y9 H- I
(trans pt from to [disp])
+ N+ o. _, x" V# V6 S3 u  Z( s这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?8 A' d2 L8 S, ^
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
& L2 D6 R1 u; P  r6 _6 l8 \
6 o9 c% |7 f4 g  U我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。+ V; f  U, \! W" g9 n
(trans pt from to [disp])% I1 U+ P8 M- O1 e; _
这个很明白了,转化点从哪到哪的意思 ...; e- l5 J+ I# J9 X3 p7 ?" w' N- I
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

5 o3 R# Q! T) N8 I% R& S% Y8 a* z2 p% \: \
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    0 a: G7 O* R# ~: M( x
  2.   (command "ucs" "w")6 V: v4 L( i5 ~; Y  V& {
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线
    7 r* E  z3 z6 ?5 ^8 @& ~$ w
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线" u" [- y' l2 ^+ ~  T3 k
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    ! [' C; Q+ _3 C* k  D( E
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)1 \$ N  b9 d4 h% b4 d9 P1 p
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)( d. G" d8 H9 e7 |, C( y
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)6 {- `/ a9 r7 Q0 S7 j, s5 L
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    , ]8 h+ }: t) L# ~
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))" e: u7 `6 \( N, S+ C# }
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))3 c8 F* N8 ~+ t* x9 b+ l5 M9 ]
  12.            )1 Q$ d+ \/ P; c( u, {- i" O
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    , O5 U4 x4 V$ }" p( |
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    7 Y" F/ f& g3 J
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
      e7 ?4 T0 h/ w5 d
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    ( A1 h: ^; c" j0 {& f3 s- R7 m0 P
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    7 R( e' G# G  r* J
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度/ ~. j9 ^2 F3 U. V8 A. Z
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    + r2 E* r! e0 J% p/ T
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标% H! C( m$ g. l. {  t5 E
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值3 G" e: W% U7 \( d# V- A4 c; j
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))' G4 [- i$ E# n! Q4 V
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标- F! _4 X# a7 ]8 k
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    " n' N. E. X1 m0 {6 x
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    : U' H# ^& \2 D% d
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    1 i: d+ C3 O, Q" X$ l! Q# ^
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    . @- \! C: I1 u4 J2 h" O
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))5 y# @* S- X  C$ q
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点2 O6 u( R' k8 v- w# ~
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    3 i7 A7 E; o/ r8 G; @5 ?
  31.   (princ)# M; V* {9 d, l5 e
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标8 {7 v2 u1 O# w* ^
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia . W; H" N- J# R% i; N: ~6 Y
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
) }0 d& p* h8 c9 g- L. S$ f0 M" ^看了你的解释,有种醍醐灌顶的感觉,呵呵
; S! D, S; j3 E% o- T  ~1 T! b
; W) [/ J4 r( \' z1." {/ X- S, f2 N/ K! y# T/ k
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))4 k; S9 l, o# E. e( x5 W- k; l* a
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))- p" {* \- y$ a) {
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
' B2 U3 N4 d- C5 X! b$ r# o           )
9 N5 B1 B7 J# z& F5 z  ) ;求辅助点,用于下一步新建三点UCS                                        8 B- ]4 S. E3 O. M
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点' ~4 g; K, A+ S
, T, m8 |( S- ]8 S% Q+ t# r; ~

" O* I- \" Y" i( A$ S最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!2 y( d% a. e- d4 {/ D, `
% g+ k& q. O* W$ ~
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。* z- e: v2 g4 e
最开始看到的trans解释:
2 D/ S$ h) w1 X. v/ }, T/ z在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:( n% H. ^: y4 ?) G9 N; ^  I# j$ M
命令: (trans '(1.0 2.03.0) 0 1)2 k$ p' H* f: V% t* I4 f( z+ @/ l
(2.0 -1.0 3.0)/ o2 F0 S' S% [+ n& Z; ~$ x0 Z( `
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
3 x1 h" C& |7 \; G- o
3 O) h: m& {3 x  d4 Y2 d
; J4 h' t2 U9 i& D我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
' t8 f3 m& u. otataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
9 l5 }0 c& V' a
不对., k& k. `7 t  w3 N* L
下面举例说明:
+ ~4 u* x! q  K! l6 C' c! p$ a在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
6 J- j2 L  y5 @5 s3 R+ \3 V现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.# H( s: O) E, D3 v: K
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.7 |9 y7 t5 `2 T/ ~% s6 V2 H
我们再在命令行键入(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).
3 |& q) J( @6 L; E8 J& L我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.0 z$ J  E7 h, i! m- B4 q5 N
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
% ]* z( M' D4 u" o9 G  z4 ^/ S. y1 D9 A! D* @" G5 }
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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