QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
1天前
查看: 5194|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
) j# `5 a; U" K! A# f* J) Q8 F9 H6 `+ ]1 l% g. l3 h7 W! a0 a+ w% a
请教下斑竹,trans到底是怎么理解的?
. n$ c$ R6 J0 B0 I% }; V; S. b: X2 b问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
$ F& ]/ |) z5 K- N6 J
  1. (defun c:gcx(/)+ {! s9 R3 L0 p- ?
  2. (setq l1_en (entget (car (entsel))))) N3 @0 D" Z- m( t' ]1 b
  3. (setq l2_en (entget (car (entsel))))
    5 y/ i7 p: F6 t2 S. b; J
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    . v. s# h; p, i! S7 |7 ?
  5. (setq pt12 (cdr (assoc 11 l1_en)))9 `+ ?* M! a3 B) J
  6. (setq pt21 (cdr (assoc 10 l2_en)))
    8 Y2 j: q# G% L* o
  7. (setq pt22 (cdr (assoc 11 l2_en)))
    - M0 Z  b5 q9 l
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
      \  K) z, K) R! {" B" x
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))- q2 l! U5 T3 C: p" v
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))0 z! E% a. E: Q8 y0 ?( R6 I
  11. (command "ucs" "3" pt21 pt22 pt)
    ) E% k" U6 Y6 w  h- U/ |6 P
  12. (setq pt110 (trans pt11 0 1))) Z2 b1 }. Y' M, G. Z+ u) w
  13. (setq h (nth 2 pt110))  M1 {9 r- g, Y; O& k
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))
    / R' M$ E7 ]) \5 I" @' l" Z
  15. (setq pt120 (trans pt12 0 1))
    ' \6 o! U, U5 l1 i& g- f* H
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))( e* {5 I7 j; i8 m
  17. (setq pt210 (trans pt21 0 1))* c$ t& ?/ `+ a3 K+ q: M
  18. (setq pt220 (trans pt22 0 1))
    6 W+ q5 V3 w: l3 `1 a. h% i5 P
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    5 q$ K7 o9 ?! v+ g
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    , O" z) z8 A! x3 x1 y* K7 L
  21. (command "line" pt1 pt2 "" )
复制代码

( p! v2 _$ _9 ?/ @前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?; t! Y  }" Z5 H, O3 Y# K
另外,我在明经看到trans的解释:+ f1 V( m& h( ]0 v
将一个点(或位移量)从一个坐标系转换成另一个坐标系# b+ u- J9 v" R5 M1 a8 P
(trans pt from to [disp])   参数) n) P1 Z2 k; G  M" ~0 u
pt
" m- Y& s! k) x" }三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
6 k  h) Y9 Z  w" I( Wfrom; W+ f( [& X7 G" @8 |
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:
" _( W+ B2 C- ?# o0  世界坐标系(WCS)
0 z/ j3 \, x8 ~8 u1  用户坐标系(当前 UCS)
( O/ s) x& b+ g% m2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
1 k, K- Z3 A1 n: U3  图纸空间 DCS(仅用于代码 2)
$ v' B& \; P9 ]4 f0 V, Y" Q) q% H6 [, |  s2 u, b
后面的解释就不贴了,此外还有一个例子:
! s4 \( p) Y, E$ v$ s2 E, m" b( G在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
: A' j% l  ~; e( K- |' r+ N1 r7 a( R命令: (trans '(1.0 2.03.0) 0 1)
; |5 a  ~  C' u$ E, K(2.0 -1.0 3.0)! x( I/ _7 B0 K5 n
8 e$ s* Z! N$ T  {. g
这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
6 C/ D' ~3 o) n6 D最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
" T; {1 @1 v0 R- g  B% @2 o7 N8 r
, c; B+ {5 A3 Z我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。1 m+ m+ c0 z# y. t: k4 F
(trans pt from to [disp])
  a% p' k9 W. _7 L3 x这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?& h) O- ^9 U3 @4 z5 x: `1 Y
除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。
( M, Z2 u. A* l/ {; B3 @4 i6 d: ~7 m) |7 T; S" m# P
我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。! [8 X8 \- T' I9 q" j6 @
(trans pt from to [disp])5 C8 V! w' s6 s4 S7 }& i/ O
这个很明白了,转化点从哪到哪的意思 ...2 I$ W/ {+ H! `  {
www1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

8 @7 r8 _/ i1 g' |& _$ T9 e: L
) E3 D! H7 P8 X7 V是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)% O' Y7 j2 E* Z: e
  2.   (command "ucs" "w")2 i, D/ _6 I) [7 O0 g' A* w  z0 q
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线) @8 Q& B# U! J: b" F/ O$ U
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线! m3 Y) G3 G# e2 I# s
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)3 p4 _& K; H4 K0 W- H
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)) F1 l/ Z+ x  I6 |% L
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)
    * Y8 M" x6 M* n# J3 G4 k2 o
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)
    & L) o7 T6 H" `  c) |+ h/ M, Y& s
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    ; n" }- Q( E6 V
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))( m, B+ I* T$ L6 I$ e
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
    $ M/ r) W+ g: e
  12.            )% Q% X/ V- b, z9 c9 A* D" m9 ^
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    # @9 U% G! |  ~% b; ]
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
    + O  q3 _! `! g. [$ @1 Z4 g  ?
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    ' ?  t, K+ G7 E/ ~
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面4 p0 {$ A) f9 `' M4 U6 k
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值3 D1 m& |3 T' P* W# ]$ J
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度8 A. i$ V& g: m- s$ q* h6 ]9 u
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0)); w: g7 y. X4 j/ p9 P( X2 q* a
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    - m  \. @- T" U
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值
    6 }% a+ e/ M" ^! n3 f
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))- z" l  O% X  R$ N: C* O  r
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    % W0 P1 q9 X: q: j4 o
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    ; @9 H/ c/ h3 [" J; E3 t  V" ]
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标7 M' |7 q5 {- D/ q. n
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    # t1 ]; v9 L! y8 r& S" I
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    ! @- M4 A' s7 N2 Q
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))8 ^6 [8 I9 u$ ]1 y" v" O% m
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点8 s$ a3 p  \, h3 D
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线$ Y! }0 T/ U7 X2 N/ o9 n( c
  31.   (princ)
    0 J% P0 j$ K& ]9 ^' H$ D  i
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
( B5 W/ O- _2 I* D, F! Q本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia   ?/ V' P, f6 @  h
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!
$ A3 P9 ?3 D6 a3 k' Q看了你的解释,有种醍醐灌顶的感觉,呵呵. ]$ d  ~4 Y2 U5 x1 W  j

9 i+ g- C9 _4 S% B1.
8 v4 \4 A& k5 G (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
0 m4 m( G% M5 \) {, [: u$ Z                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
3 U% y) k0 b" N; h- B! g' [                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
: W5 j9 P. m& N" g           )
- \9 I4 y" r8 _  ) ;求辅助点,用于下一步新建三点UCS                                        $ x; R7 q' Q. t
;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点% d4 a5 t  n) `' Q8 G
, E( L1 Q4 Y8 G7 |' F2 x3 O$ G9 j
" q! B; u! v5 n. V* c! `8 J& L5 ]
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
3 ]" _+ g% U# S( x% ~! I& V1 d1 ]3 X. E# x- N4 |
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。" H" X, q: g6 W7 M0 \4 N
最开始看到的trans解释:
, {6 Z4 r$ ?; X$ S9 d4 }8 ^在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:  ^$ T* Q# x6 C+ V" ~
命令: (trans '(1.0 2.03.0) 0 1)0 l/ r5 \% c  k* B
(2.0 -1.0 3.0)
1 y8 u4 F3 |# f# C& p4 q我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!
+ v( V* K' M2 J  s( N9 O8 H) l3 n# C4 L0 f/ X$ q
$ Y9 N1 i7 O9 H8 K' _
我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。8 ?7 _7 O& L+ [! E9 s' _
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

$ n8 J6 k) w; ]2 u+ I  S不对.
$ W  y5 g$ H- ~. M1 N下面举例说明:" [% F2 E2 V4 N. s, `7 w1 }' i, A
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.0 h/ X5 P8 }, `$ L* l
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.2 g# m) K( G8 k, b  s5 q# E
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.. c$ f, x  [" S2 k1 l9 E# ~' V
我们再在命令行键入(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).' Z9 h3 S9 E3 N$ J
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
) P0 O' E9 W5 j+ W5 Z结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.2 w1 B* o# B: k. ?- l! s

$ j5 w" x8 `" X' G另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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