QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
2天前
查看: 5202|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 ' G3 F' s! W0 `( [: B  V. X

4 M" n) x$ j( b1 _+ x5 W请教下斑竹,trans到底是怎么理解的?
: C  v2 b8 V+ ~6 D2 F问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:0 }% m& r! W5 n8 T
  1. (defun c:gcx(/)
    2 v+ b# M. x* h5 @
  2. (setq l1_en (entget (car (entsel)))). s' h. w/ k2 q. L7 M
  3. (setq l2_en (entget (car (entsel))))
    + p$ i2 |% W" E; u; u( W* s
  4. (setq pt11 (cdr (assoc 10 l1_en)))( c- p5 a- B" `: I2 c
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    1 s6 H; z* L8 x6 K2 p( Q
  6. (setq pt21 (cdr (assoc 10 l2_en)))1 |3 \8 Z# ~& `
  7. (setq pt22 (cdr (assoc 11 l2_en)))
      \- }6 P$ ]; B: ^. N
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))8 k$ c6 n# E  g8 t) q3 }) ?
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    5 l6 G' R* k. j$ p; O  `8 F
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    & D6 e' s4 v, v! {  D6 y1 t. w
  11. (command "ucs" "3" pt21 pt22 pt)
    : Z+ K  ~& z4 n- V0 b
  12. (setq pt110 (trans pt11 0 1))& ^, J9 a3 P0 i5 @$ x9 z% L$ a
  13. (setq h (nth 2 pt110))
    5 r8 Z  {5 n. n* A0 |( c0 L
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    8 |+ F; I# h8 @, q% k
  15. (setq pt120 (trans pt12 0 1))
      l$ S& ]& y4 T5 m4 A5 M
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    + k, f# c* q  @# u( Q
  17. (setq pt210 (trans pt21 0 1))* D) {3 q5 \# ?' Y: n! W9 A
  18. (setq pt220 (trans pt22 0 1))2 v5 H  Z; F8 G3 O9 l" p! b$ d, {& b
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))+ Z$ V, S/ N' N& g6 D: W! g
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))/ j8 M, D0 F( z
  21. (command "line" pt1 pt2 "" )
复制代码

6 S  @5 r- t) M; b0 V& d前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?5 q) {+ K+ l7 Y/ |& I
另外,我在明经看到trans的解释:7 j: q, N7 F1 A, R
将一个点(或位移量)从一个坐标系转换成另一个坐标系
& H: L+ o7 k6 s4 O+ {8 @(trans pt from to [disp])   参数
% R# `6 x  _) s  t- U4 qpt/ ?, J, w9 Y- q* o. r  C5 f% j
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
' {& D8 Z: a+ _. ~' ~2 e6 P% o& zfrom9 q* M+ r% z" |) L, j
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:: T( _! U% A: ?  h- n  z; X
0  世界坐标系(WCS)
4 j% p5 h. i) i1 u- j$ c1  用户坐标系(当前 UCS)' K; a. u1 w5 o) D1 V8 P( M
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
9 ^$ k. a# h$ G- f$ M. \3  图纸空间 DCS(仅用于代码 2)
8 {5 y$ [1 y& Y  B0 q" b5 I3 S. a, d7 K! z" N! b, E
后面的解释就不贴了,此外还有一个例子:
, D' M# Q* C9 B1 q; }- L在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
7 E% r+ Q! ?9 Y命令: (trans '(1.0 2.03.0) 0 1)
# O3 Y( k& w: `) S5 \(2.0 -1.0 3.0); v/ y7 D( l: k

- x" c* h. L6 Y  p- ]这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
6 P1 l2 G, E6 b最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
* @1 L# R5 U! v% [, {  P; o% I: U2 f& i7 j. N+ g
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
9 X+ m- g2 k# I- F8 _(trans pt from to [disp])% M; V1 T6 h% J0 b, A8 j+ S9 i
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
4 q# _3 t, j9 c. a; l  i! x% k除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。6 v& t9 z6 u8 A7 J& k- ~% s0 J

  u" k3 T- J$ r' [. T+ r" c我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
2 E: U9 X& b4 t4 I8 `# z- q2 ?(trans pt from to [disp]). [9 U! Z$ \" \/ u/ O3 H4 n
这个很明白了,转化点从哪到哪的意思 ...
7 `7 o- @8 h$ t, M  Hwww1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
, [# \( ?# C, Y  K7 Q8 l) C
  `  m- b! B+ E" Z9 T3 I  v  ~8 M
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    % k- y5 C* o+ w. s7 k
  2.   (command "ucs" "w")
    4 {! C$ K; a- k" A8 R3 R
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线% t6 ^) r, x, N$ v9 y, n
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线" X  p$ D) S, e' I
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    4 T' `0 e2 D1 i' m  l2 s
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)& G' d0 T8 k+ j" o! H* u3 y
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)2 n6 U6 E! ]( K* b# F( d
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS): Y1 \) |9 \/ ^( n# c( o/ [
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))' r9 c% n+ w) F0 y" I
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    0 s- z! O8 \: o/ Y2 M! s5 M
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    7 U% W2 q! o. q/ G( Y' @1 q
  12.            ), p. Z  J7 Q1 S% X
  13.   )                                        ;求辅助点,用于下一步新建三点UCS) K- H2 R" T$ R/ p- i
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    * E5 X1 S; e& B9 ^+ c/ B& ^
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    9 Y1 C' L' \6 [& [  S4 }& K
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面! P! v  T( ~3 G0 z; {# Z5 E
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值: n) ^( j* Z! j& F0 U
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度/ [: S# Y: w1 u5 F
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))0 D1 B% i& Z! o$ O  u5 a" K$ ~
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    - T; W2 t5 q# B) i4 {0 c6 b
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值, r& v+ b$ k- _& Q
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    ' Z5 H# \) q7 `$ e
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标8 s8 z; b3 v1 G  {' T
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    7 S6 U% Q# L( V" |- E" r  H- g
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标5 x2 u6 V3 i) Z& @0 ?9 d
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))$ `: b# z/ ?" d% v, e+ `. y5 E" j
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点2 s0 t$ W  c# v9 k
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))* f1 y& k9 ~0 ]: [( V# Q6 \
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点
    , ~8 E. ~6 g) z  n" h6 n+ y
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    & h2 l! C8 s; k: T( m* P
  31.   (princ)9 q" N9 g7 P4 {0 X/ p
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标  V" j% ~( T. A. z" ^$ a
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
( i; H6 S/ j6 x$ s谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
: }1 @, h) i$ A9 Y+ @1 @2 X看了你的解释,有种醍醐灌顶的感觉,呵呵
; d3 B& x) d% H/ A7 y, s& G4 R! k, v
1.! ~$ n" |9 h  D+ K6 p6 [5 o+ n$ ^
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
% H% |: f) \7 I! w8 D$ n                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))7 t* R& C3 v% {  S* @
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))% p" L* T; Y  ~
           )
4 j% H2 e4 y6 {9 c' g" A: `; r  ) ;求辅助点,用于下一步新建三点UCS                                       
5 u, p7 |% c' \9 L; D8 F;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
, H0 M) m9 z* [2 O- f' k
) g7 u5 L$ f3 f  N$ [. {
6 ]3 e) _5 t) i% d; d, Z- E最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
# f5 p  N  z2 t4 }, D: w8 Q: B
' Q* l2 d" v: l) X) _4 p, \3 t2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。( j( A6 w2 o+ h
最开始看到的trans解释:' d7 J- I! q! Y
在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:' P1 s/ F1 B, Y# n! V+ u
命令: (trans '(1.0 2.03.0) 0 1)
3 V5 q' O' e& v$ L( G8 N$ J4 Q3 ?(2.0 -1.0 3.0)6 r! e& s8 ]/ ~+ X0 g5 w
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
. |$ P8 S3 ]  N2 J
" j8 z' L* L* c9 k4 u, [( B5 T  g
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
8 O0 f, U( ~* `6 `4 J& D8 ?3 C  {tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
, O( s7 K4 h5 y8 O9 Y: T
不对., J9 T( W2 T/ a; x; c6 \
下面举例说明:: W7 Z) b3 v7 W7 Y* _/ V* W
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
& D7 ^: O* i6 L" k  B9 D' h4 M$ |现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
4 l9 I1 i; }- P) |0 A% t! M3 p  c下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
4 c# [" r, J+ \* \- S! W0 }& A* Y' b6 |我们再在命令行键入(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).- b! k7 w0 b6 s$ V) f" \
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.0 j3 I/ R6 V( n( H3 ]/ t3 Y( ?0 v
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.9 B/ t. l. L! b" Q5 K9 u, Z5 q

; d9 s6 H5 @( d: U2 n+ l8 r另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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