QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 5048|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 4 u/ f5 W& R; O; i  j, ?
1 J3 v1 o9 H. V8 ^$ f' K; y
请教下斑竹,trans到底是怎么理解的?% R$ q/ i) B" E" P
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:+ q. Q' n: B* Q% y
  1. (defun c:gcx(/)! f- P8 {6 U" k/ g8 W
  2. (setq l1_en (entget (car (entsel))))
    $ H" r% T' O) c' S' W
  3. (setq l2_en (entget (car (entsel))))
    7 X7 g* x8 W5 I, w/ Y3 |+ W
  4. (setq pt11 (cdr (assoc 10 l1_en)))) x( G: e0 e( z; r5 P( n1 q4 F8 `
  5. (setq pt12 (cdr (assoc 11 l1_en)))% |" j- }& a+ \8 k0 ~$ l4 S
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    9 R3 y9 J) W  K# g" z8 e& m  W
  7. (setq pt22 (cdr (assoc 11 l2_en)))6 V, J2 z. M9 e. R7 {( D3 e
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))% `1 `+ B/ |$ n2 O
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))1 C7 H: J9 D4 G2 `- p4 H
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11)))): }* w9 G" C  y: n4 S, o0 U, t9 h
  11. (command "ucs" "3" pt21 pt22 pt), Y, P. J% |. X5 \
  12. (setq pt110 (trans pt11 0 1))
      S' f. b' f( @5 A6 L1 ]% b
  13. (setq h (nth 2 pt110))
    0 z$ T% w" F: \2 Y0 h3 h
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0)), x* [- h5 Q" O! L
  15. (setq pt120 (trans pt12 0 1)): C& x5 w+ v* g* H3 c
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    ; `( J9 b( n/ m6 p0 Z( D' u
  17. (setq pt210 (trans pt21 0 1))3 g3 Z* g5 X1 H0 m
  18. (setq pt220 (trans pt22 0 1))
    $ N# `3 A' K; w, j8 n$ [
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))8 W- C* }! @% L, t+ B9 j$ d
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))& s9 G) y1 [2 H. m0 L1 W
  21. (command "line" pt1 pt2 "" )
复制代码
: V0 U* X: q+ S4 f
前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
% Q/ @3 a& i( Z, T# e4 B3 L另外,我在明经看到trans的解释:+ M( ]* z$ h! ~( J9 y
将一个点(或位移量)从一个坐标系转换成另一个坐标系; I' S& c' S2 F6 X( u7 K  U( w
(trans pt from to [disp])   参数9 ]; n, r% y! h9 v
pt, h+ d# y7 G7 L; e
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
) L2 ?) F# _/ d, W8 b9 {from" r( S$ G" X& z5 l
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:3 D1 `& T' s& f$ L* m+ |
0  世界坐标系(WCS)
% Z+ d  y6 L# ^: P! P1  用户坐标系(当前 UCS)
' y9 L7 w0 N* T6 x4 c- ^0 Z2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。# ?9 Y6 x+ d0 l  R# R8 P
3  图纸空间 DCS(仅用于代码 2)! d) `/ I; G& `: @3 g4 }
3 `: a7 x9 o$ z+ u" u3 b1 v: q
后面的解释就不贴了,此外还有一个例子:
2 g& ~" `& d0 z! p$ b在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:" p0 b( \+ u, a9 Y4 f  N
命令: (trans '(1.0 2.03.0) 0 1)
* M+ `0 S$ [: _' u, E(2.0 -1.0 3.0)
' f. g% F7 s! Q2 ?, }5 P; o: z# f2 o. f0 D0 ^5 T, Q  \! i. j7 r
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?9 V% e- G- `3 B! q) D9 E2 D1 D
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
% g" j3 Y% @! a" s) X
, ]; m! D+ A1 t3 [6 V. m3 P我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
$ {3 `- k7 a1 E- }1 _$ y(trans pt from to [disp])
/ U; C2 E7 n+ W9 R& @7 q这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
. O+ Y! y# Q# z- p8 Y除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。4 V  k, K# ~: M1 t1 _, _

( X& `! O4 f) k7 |% T! a我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。6 A- _6 @0 o* [, v* {
(trans pt from to [disp])/ z) J* k& h7 g6 N- D3 t! }/ }
这个很明白了,转化点从哪到哪的意思 ...
' k, H, k3 c0 ^- y# Iwww1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
9 \# E( W3 J$ }9 U3 e
, t4 t, Z& _# Q0 Z& X
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)( m- v7 _2 E- [  N! @
  2.   (command "ucs" "w")
    9 y0 k+ n( w+ b
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线
    6 `( w: @1 S9 n- U$ y$ t7 }
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    8 m) L: R. G  W* X! y3 e% Z
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    - F1 {" H9 {1 V# T% H8 h4 S
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)5 P0 T) r' M/ Z
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    1 Y' T- L* n1 [1 C$ H
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)8 k0 i8 a3 M' `1 M; p$ J! h
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    7 S) M3 G! n  d5 O
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    . _5 j$ ?$ J, a6 X  E* s& y6 Q
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
      P& Q$ E1 Z/ D+ x1 |
  12.            )! ^* y8 k- l: t! ^% U
  13.   )                                        ;求辅助点,用于下一步新建三点UCS2 [! @! J2 ^% Q6 U- T( x
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点8 Z4 |/ O, Q- @/ k
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    : k- ?1 W9 g( [3 b, I! q
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    5 Q( d. b& G% m- J) t
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    4 W: `3 G! [( H! p
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    ; c5 X2 T3 R+ U* v9 h7 t; h
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    5 |( h# E- C5 x# ]& W5 \5 a4 [
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标% {/ l: Y0 ]$ r
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值& m$ f9 A& H. T- d$ ]; w) |
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))- g+ K" u' N9 E6 D9 U! P! R- \. \
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标# {7 t+ g9 h9 ?6 W/ ^+ ^$ V
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点. ?1 x0 h; d' f& P+ U5 w- o
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标4 m" L8 ^/ }9 z0 t
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    9 X7 A, w. _; f9 C) C9 ]! U
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点  K  F" G! e- }" x
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))5 c6 k% _& D# c* s
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点+ U+ ^" |2 h  M" T# j) s1 E
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    0 W! B( {# h8 ]- @( {2 T: b4 R  w
  31.   (princ)% T; }7 f* N& x; a
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标0 {) q' f% h& Z2 b. e! R: L
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
  E$ t% ?' {6 ]5 K  p4 Z谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!) a" f" S8 c" {2 [0 m4 Z
看了你的解释,有种醍醐灌顶的感觉,呵呵/ [; b  }" a; k: I& D

4 \2 Q! J4 V! I9 t1.& a  x, v! l9 B4 _* O3 B4 k( {
(setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
4 F# ~; I& o, J, ?                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
3 G0 c8 J( ^5 N                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))( Q1 ]* U) w5 l: ]
           )9 B  u" i8 G7 A2 \
  ) ;求辅助点,用于下一步新建三点UCS                                        3 Y" u0 v. j1 H% W  K; N: o( r
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
$ }: `' S! g' t* j7 b8 j
/ R: A8 s; j( M% i9 f9 G1 B. j
# F1 ?! _/ }! G# a最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!6 n: ^8 c- m0 P' S0 U9 r
: S5 k; E9 k- I$ z
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。5 L' C. P- _% h1 {- h
最开始看到的trans解释:
( i; M( ?0 B, M/ b1 n: a0 w在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:8 e, b. C8 p+ H: N6 \7 o8 F
命令: (trans '(1.0 2.03.0) 0 1)/ t8 K) ^4 n3 l+ I% R& I) F
(2.0 -1.0 3.0)( E' V3 y% ]+ P4 F! ^. [
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
' P9 S* M2 e; g  X. U& S$ o) a* B9 M/ R. B- y* l* C. I6 k7 f
* ]( R2 z/ }% I( ]' u
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。+ E5 a/ ?: ^3 J% n  ?
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

  N' Q9 `' }3 J0 ^) }+ H不对.. F5 _& L( Y. a! {( ^" i6 q
下面举例说明:
: V& |% h) }& y3 ^5 g/ y6 Z# f在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.% a; x2 O! R+ W; m+ b9 s
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.5 q% x, P" J/ I1 q8 D/ b7 r
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
  y6 c! R* w! T9 \6 E: h# \, J( `2 v4 L我们再在命令行键入(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).9 G0 y8 X7 d+ |/ d8 x3 G
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
$ \9 S) W3 \4 N9 ^. b8 u( ~4 E2 h5 P. l. t结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.
+ m5 J$ N. j4 W/ @( [/ u4 O" N6 n8 b6 p: J
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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