QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 ! H# X5 s; ~. T: i5 u4 e! g$ Y" P
) E2 F! z$ J  z! [3 h
请教下斑竹,trans到底是怎么理解的?
8 M; X7 o! }0 p4 H* s$ z' h问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:& W( V3 @2 z" Q
  1. (defun c:gcx(/)4 A: t- a9 O4 C5 F" u
  2. (setq l1_en (entget (car (entsel))))
    + [1 ]% g) ~' w. k# u3 `
  3. (setq l2_en (entget (car (entsel))))
    ( X4 f  z- m! }4 a7 W
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    0 C3 n# j! A, ^& K2 v* Y
  5. (setq pt12 (cdr (assoc 11 l1_en)))2 K! n& G! u- T5 }7 Q
  6. (setq pt21 (cdr (assoc 10 l2_en)))0 u3 C* k5 w4 [, A* e
  7. (setq pt22 (cdr (assoc 11 l2_en)))5 [( [) f( h* e- B. l0 E" R/ s
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))8 g" d) F+ \# R3 X
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))5 [; x: Q% b& G. ^6 W
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))& T3 L! o* V: b6 |8 n& i7 ?# l
  11. (command "ucs" "3" pt21 pt22 pt)
    ) a7 C/ h8 R. ~6 n8 k
  12. (setq pt110 (trans pt11 0 1))
    : E5 ?) M: S' ^6 T5 F# Y. i
  13. (setq h (nth 2 pt110))% l8 e! x, e1 o0 [
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))2 B( B3 v8 U# e
  15. (setq pt120 (trans pt12 0 1))7 Y" W' y2 K# d+ `2 w
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))8 B/ [+ ~+ e6 L/ \
  17. (setq pt210 (trans pt21 0 1))
    . V/ i3 e3 B4 Z" d
  18. (setq pt220 (trans pt22 0 1))" }5 S5 p# b( \0 ?4 p; R' x
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))6 ?' p. r) s: Y- a, A6 ~
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))  v% `9 D. m. |( O2 }6 R) u8 @
  21. (command "line" pt1 pt2 "" )
复制代码

0 m' V7 ~) i$ O+ }* Z" E0 q前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?" i- u: b$ z5 r0 M* n
另外,我在明经看到trans的解释:
# i7 z1 t4 m& n* h% a% e9 C将一个点(或位移量)从一个坐标系转换成另一个坐标系
, z4 Z8 P8 M$ x) `0 m8 \; h6 M(trans pt from to [disp])   参数1 Z# h) o+ m' o  z5 U
pt
# V7 t0 L7 T( @3 ^7 Z1 _1 J三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
$ G- H  J7 G$ K$ tfrom
4 Y& r  N8 M( w整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
$ u' A% q/ r; O. L0  世界坐标系(WCS)- Q( k# L( i8 V
1  用户坐标系(当前 UCS)
' l2 i1 r; w9 u1 H3 d2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。  ^) g0 D9 O/ ^. x9 O. G
3  图纸空间 DCS(仅用于代码 2)
( V) J% a7 s( F
+ v7 c. x" D7 K( {: f% [+ q, n后面的解释就不贴了,此外还有一个例子:
7 G0 ?: F, ]5 {, x, e+ V在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:) k2 l  H5 ?4 n# f4 ?
命令: (trans '(1.0 2.03.0) 0 1)
+ [' }% J8 L# |  i1 @- m(2.0 -1.0 3.0)" X& C) J4 {3 \9 ]# Y% }' v  u

4 r: ?6 _+ N; N5 m0 Y这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?+ j; b. ?8 `. d) e
最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。- S4 K( X" M% z
- d$ _& E$ Y; r  d7 J; C
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
8 u: q# j, C0 j# B! e7 A/ h- ?0 b7 v(trans pt from to [disp])$ k: `6 f5 s) ?" j# M
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
3 S! c8 s* R, |  m$ A- G. x除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。; X, H0 K. c! h+ j

2 \8 M2 f) Y) Y3 D我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
4 T9 Q" ?: A7 Y. P(trans pt from to [disp])% ?' l1 R7 E. o* W/ f; u
这个很明白了,转化点从哪到哪的意思 ...2 p3 d2 r/ B/ h5 s0 {4 `( j7 R4 L
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

! s& a5 _/ t7 m5 A4 m' ?
; v: i/ Z+ E( e7 X# A5 ^  l是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    ; g0 j) \0 f, q: z# F
  2.   (command "ucs" "w")9 }5 |% l% g3 P( \; d
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线
    ' w' r% C/ c% c& ~& {7 q! u
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
      M; l, t# G/ a1 k
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)6 J/ i" J! K% ~5 u' M
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    * u3 s2 z( d( {: G) K6 ]  Q
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)$ V7 Q; g( D% I' A" s: b
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    . v. t) O- x; S; t3 R' Y- I
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))7 `; x+ s; Z7 c8 C5 f
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    5 Z! j3 i" }) b  v
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))7 ?" |: s8 f$ v* M( j0 W3 ?; ^( I
  12.            )  c  S( l- z3 k; U# m% \$ Y* ?4 D
  13.   )                                        ;求辅助点,用于下一步新建三点UCS8 j# z$ s1 G' w
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点5 }. A+ o, n! K  K+ P
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向0 ^3 T3 y) J' Z4 R
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    ; h! }& I1 v% a, {
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值! p* a* M+ o: D9 R
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度
    9 o. }9 }: L: [. J2 {- U" u: u
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))1 M' B+ ]. k# @8 q
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    : p- \" j  Q  ~
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    % e/ `% e+ W6 O: p% f
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))1 a4 l9 m  K- y- E$ m% `* G6 M
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标- ~3 e+ `8 f" {; `$ P
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    $ S7 M1 \7 c, u, L
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标
    ( Z# n1 w# a" }4 Y& ~
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    : d3 B; t" G0 W
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点+ S4 x; Y( ~% Q7 T
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    . f8 s0 a7 A4 V9 v; @+ ~+ T
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点% O( u% P2 ?6 j" h% ]# T$ d
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    ' R" t( ~% G: K" Q  l" D0 D
  31.   (princ)5 M/ ?# l' z* H4 w
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
( I& H3 P% H" g本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia
! K5 s7 q& M1 m! J. |; O: E谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
- ~0 a2 K, }0 P. q: Y0 }7 n看了你的解释,有种醍醐灌顶的感觉,呵呵
- M0 O8 M5 M0 P+ ~' h4 ]
* q* N& E% _7 `5 H1.
3 e# a$ |+ [% j4 v (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11)): T- @2 a5 M9 f; c. p
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
  h- @; u& O, O* a3 V                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
5 D  k2 P6 C  Y% B, l           )
) u" D8 X8 A  c, b8 }. b. y; H  i  ) ;求辅助点,用于下一步新建三点UCS                                       
! F" l, ~; X1 I" U( c# X% ~6 g; u;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点/ g0 W# }* w! Y3 e1 M8 X/ `
1 t  {, t5 i4 M

: b9 W& o  P2 V& T+ ~最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
& o5 q: @1 _$ }& O& x6 m( g0 ?) _- l1 w, a5 H: J
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。- s6 {: P. F- O, U5 z& F" A0 X0 u6 l
最开始看到的trans解释:
; u' `- O  C( q' ^5 ^& [在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
  z, U% c# H& `命令: (trans '(1.0 2.03.0) 0 1)
$ o( X6 i0 a# ]0 p(2.0 -1.0 3.0)
; h& _0 v8 e% b! S2 N5 N) q我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!* D9 y% u$ \9 Z- }6 E# W5 _

2 T  A) C# V$ e9 z- Q5 T) K% d
# w+ k1 X. J3 J我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
1 N  @. c, v8 C7 mtataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

: }- @+ a# ~1 P( `( ]' B不对.
) ?2 N1 S( j) v  o, `下面举例说明:
9 E2 q+ s) C6 v3 f5 [在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
& }9 l3 _0 U. S1 `' a8 n$ }现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.% a8 n) ~3 e6 O; |* U
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标., [- ^8 ~( d2 i2 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).
3 x2 f; Q" V, l; R, l$ C) N" H我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.2 I' v& W  i& T
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.- x! F, r: s- x' g. S3 P6 A
9 P% w9 K) ]. q
另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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