QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 + z0 j# P/ X  E# `
7 t( i% N2 M9 B0 \% M
请教下斑竹,trans到底是怎么理解的?
* j8 l! A! ^% @8 Q/ r$ L' L问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:7 i1 y$ O  U+ Q3 F
  1. (defun c:gcx(/)1 w' ]5 \1 u, P4 e5 O0 @6 G
  2. (setq l1_en (entget (car (entsel))))( g9 @! R3 v+ T. D
  3. (setq l2_en (entget (car (entsel))))
    1 Z) ^- i2 y. N& c4 ~' ^) N
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    # i' ?- u+ `# T# j5 Q
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    " n' `! V/ w4 `- b
  6. (setq pt21 (cdr (assoc 10 l2_en)))- ?. n2 H- j6 v6 n% J3 n
  7. (setq pt22 (cdr (assoc 11 l2_en)))9 P: v+ `* }9 u, g$ e: g% K
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    * F9 n) C! P+ W. H
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    ; b" A. J, [: t! R; _
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    ! v: K2 H3 Z4 ]: ~& f
  11. (command "ucs" "3" pt21 pt22 pt)
    & k+ K. q, h( b1 i7 B3 L5 o' {
  12. (setq pt110 (trans pt11 0 1))! M% a8 `" }8 U! j
  13. (setq h (nth 2 pt110))# L+ L5 ~( d7 [6 @6 {0 P
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))8 U* S" O: o+ O7 G$ Y$ J( j$ p. D, d# n, g
  15. (setq pt120 (trans pt12 0 1))1 s) b" x3 T0 f$ w0 o' P
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))3 E0 g) k/ p% _
  17. (setq pt210 (trans pt21 0 1))
    : R5 o$ H7 P# V1 L* ]
  18. (setq pt220 (trans pt22 0 1))
    : k/ R3 [& L; j7 `' R
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil)). j; [! G5 D/ f' K) ?
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    / ^& W" W5 t$ [
  21. (command "line" pt1 pt2 "" )
复制代码

" ~% m0 i- Z* {& F# \前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?% B  M' X, W. b) s1 j6 Q
另外,我在明经看到trans的解释:
+ U, G$ c) H1 b9 |( Z* ^# z4 |将一个点(或位移量)从一个坐标系转换成另一个坐标系
( ^( @/ g& U2 I  T, N(trans pt from to [disp])   参数
, w8 X# a- z4 q6 }9 |% e% ipt' j5 ^2 L& _4 Y# f
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。4 o1 `' h4 G# k7 [
from
, I* j6 L: @* J# Q; h; o: u整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:5 l- j' _+ z' G3 S+ \5 ^( m9 [8 [
0  世界坐标系(WCS)
! f0 D. t2 [1 Z' B1 P- a  L1  用户坐标系(当前 UCS)2 S! |% q) o9 v/ R; L* p
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
: q- l5 m$ ]* f7 ^- ]3  图纸空间 DCS(仅用于代码 2)
" R) \6 ?9 p  S5 V
" r& Q* V' `& {8 s* B( K5 Y# c2 q# l后面的解释就不贴了,此外还有一个例子:# Z1 E: N: p+ q6 }( \
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:* L* }. M( V: G6 i
命令: (trans '(1.0 2.03.0) 0 1)
% ?3 x; E2 H0 Z& J, N  C(2.0 -1.0 3.0)
/ N# g6 b+ L1 V- S8 f8 \! C" v6 s9 n# r7 U9 t0 ]3 F% S0 `* _4 c% z
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
) ^  q2 H% a2 a9 d5 a4 z最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
7 I' c$ b3 [" C' s) z! @
% Y. ^% j( S' v7 g我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
8 M! S- b! J) S(trans pt from to [disp])0 g+ R( U/ R1 M" S, P
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
1 W$ i; u) `1 Z6 N) v1 v% P" l" T' `除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。  F# l( b# T3 S" Y/ @& S

. {9 r6 F# I# k3 l我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
* H8 F$ ]' Z* P0 K0 h(trans pt from to [disp])9 y0 O; R2 G# U
这个很明白了,转化点从哪到哪的意思 ...4 s: m4 b6 T# G2 ^& K
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
# r0 L6 W6 [6 H0 F

! W# O0 `3 z: f  L) i是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    + n# [7 H- o& d# X5 X3 q' [! Z/ V( Z
  2.   (command "ucs" "w")8 R0 `2 _' B6 P
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线! ^6 C% I5 K0 Z: e9 w' Y# @
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线: b4 d. |- `- m$ k. J
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    + q. C5 R3 |  E( p
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    2 D' r; ^# h( E$ d
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)0 p! F& A8 R( w
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)! L$ ]2 R0 i( j. A9 w
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))" V# |% y5 l' ?+ y& j* l0 }" [, C
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))6 X3 |0 s$ b+ \) ^! X  F3 r
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    7 b' \* z$ S9 n( x) e) P
  12.            )
    ! \- ^! |/ S1 x. P; [. {# w
  13.   )                                        ;求辅助点,用于下一步新建三点UCS5 t. i4 V# ]' H6 C+ i
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点+ ^1 v2 |9 B. `  }5 a4 I
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    8 {& L' t( O( s( W. k1 t
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面# h0 ^+ n6 G. }3 i; O# H
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值9 }) d/ l+ ~; H! _3 ]) q
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    5 W$ M/ @% S0 a7 b5 J$ ?9 l6 c( E
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))$ E- Y) W6 N( i# R0 M3 G8 o& f
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    ! @% |0 c- H5 B7 X: S
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值* ?$ t0 }- e, p+ h) B( \0 C/ @( p, G
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    $ f$ S, {9 y9 C0 m. p+ P
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    4 d* @0 i- r3 n
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点0 Z4 d# n6 x! R. f) y' `* Y
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标) s, T3 U# n8 R8 K
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    6 d3 v5 D9 ~& X! I7 T. B% a
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    ! {( g" [& K  S7 c4 N: S
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    . E, c$ W( K0 C; Y' c& W4 t! W
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点: r$ h3 C7 r7 V7 F
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    5 ^' J5 i" o5 G8 |$ b
  31.   (princ)& G% s9 g8 |+ y6 A
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标4 E$ G3 w4 t/ `& r0 u0 @
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
% \, a  d5 ]  `$ Q' P5 Z/ x6 {, k谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!  l/ q9 N8 a5 T
看了你的解释,有种醍醐灌顶的感觉,呵呵
. ]* b+ w6 Z1 f0 C$ @7 p& y, g% ?1 V# Y) r
1.& M+ R0 `& z- z
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
5 M& F, ?: A$ v7 n' D) s" W                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
5 l% t4 w  |. P: [" t4 D1 q- _                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
  G  M# ?% N. [* V- P6 t$ L& P6 F. ~           )/ X: H* ?. v: j+ D* D$ e/ R! ]
  ) ;求辅助点,用于下一步新建三点UCS                                       
. X, @. w; a+ j( G0 r1 Z  k;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点" i! {0 x1 `; |0 c5 p! [8 A
" B& M7 R# Y9 m4 `7 x4 C9 P

, `# D- r5 h$ p+ E# y) t/ Q最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!3 N: p5 N0 L, @- Y
4 q. a- P9 y9 C* O& e; ?
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
" e' G1 Y( @2 v# b5 w; g+ t最开始看到的trans解释:
0 J7 i6 x9 x& }+ u4 @( S5 Y在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
$ ?0 ]5 o/ L: s% T- Q命令: (trans '(1.0 2.03.0) 0 1)8 G% [" z0 Y2 G
(2.0 -1.0 3.0)
: d% m5 O" A! _% V我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!' X. _! T$ f+ h+ N% l1 K6 d4 K

& I8 f1 Z( X; A" a4 ~) \# W
! h, `% l, m* B3 B我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。+ M4 s& b$ Z' `
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
1 a  Y! |9 W; f' W
不对.7 m4 [3 _! ?3 }+ _) @8 U" R9 J2 R5 o
下面举例说明:
) ?9 d- `0 d# Y8 `* ~3 B( n在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.% Y, c: v7 Z# `" B, a* R) [8 \
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
0 R. |9 n' {# A$ C下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.) ^- O/ I( w, ?- R6 t% r/ e* |/ n
我们再在命令行键入(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).
, u" u4 x! \7 S4 H我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
5 y2 @5 S1 k0 L5 }5 q  C结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
3 z- W+ @( C  A! U; Q$ U. ]
2 V# B9 I' _4 ^: `9 J) x( }- }7 X另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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