QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
8天前
查看: 5043|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑
  u* ?3 H& n0 R. t, Z; U5 E! p; V& j; k1 Z
请教下斑竹,trans到底是怎么理解的?# g: W7 P. B- b, U; V; ?" I
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:8 j- g, q% ^& s
  1. (defun c:gcx(/)  p! w7 A) M5 ~7 P8 }- z
  2. (setq l1_en (entget (car (entsel))))
    : `5 B3 p7 G; [/ L. @) o/ O2 {  Z
  3. (setq l2_en (entget (car (entsel))))
    : t1 X' v; c6 y- G! U! Z
  4. (setq pt11 (cdr (assoc 10 l1_en)))
    : {) f& g6 V0 v4 x
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    & p  {3 p% t& G* E
  6. (setq pt21 (cdr (assoc 10 l2_en)))% H/ f5 g8 b. Y: C0 C+ M
  7. (setq pt22 (cdr (assoc 11 l2_en)))
    9 E( \$ g. s! q8 m7 h1 J' }
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11))
    3 {7 R0 f9 G. q* o; l
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))0 |) N9 R" ~) B! Z% i) M
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))1 {- H, t1 W  x9 d9 \0 i
  11. (command "ucs" "3" pt21 pt22 pt)* w5 P, }7 O. c% l
  12. (setq pt110 (trans pt11 0 1))
    1 b( T, W- B& @/ [% _" H, ?8 h$ s
  13. (setq h (nth 2 pt110))  l# D5 k: Z* S( p8 G; U+ P
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))& z( x6 p- a  R
  15. (setq pt120 (trans pt12 0 1))% r5 ?: M$ e. B  s, @
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))
    & g. A; H" l. [- D3 C
  17. (setq pt210 (trans pt21 0 1))
    2 i& O: d& T  z7 Y/ t! q" R2 A
  18. (setq pt220 (trans pt22 0 1))
    ! K, l5 e, C; J6 Q% n; b
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    . g( Z; g$ P6 g$ _& u
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    " M, ]/ A! V# r9 u0 j; c
  21. (command "line" pt1 pt2 "" )
复制代码

/ \0 k, t' f0 D# y0 q( }前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
# F: ~. a% A, O1 j& S' r另外,我在明经看到trans的解释:; O- q, M) g) y3 t" E# D, @6 w2 V
将一个点(或位移量)从一个坐标系转换成另一个坐标系3 k/ I2 F& j. D$ t5 ~
(trans pt from to [disp])   参数
) k6 g. t# T/ s# o! _9 Zpt
, j& [! z; o. g/ @  ]三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。
# O- M5 R) C) ~  D" w3 tfrom
8 _! d- {2 z8 c8 ~2 D整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:: u9 C3 O; U3 V& O' H5 ^+ j* @
0  世界坐标系(WCS)
- P, _+ i( a+ n1 q3 h1  用户坐标系(当前 UCS)
' y' F$ `8 F' L7 K2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。
& s; [, T& D& F" [2 P9 `4 M9 I3  图纸空间 DCS(仅用于代码 2): ~5 x8 \# _1 g. G) a8 a# V  b
# G( g' f+ D+ ?( `
后面的解释就不贴了,此外还有一个例子:
  y( H: N7 ]: I3 p, }7 f$ m, Z, D& D- U' h在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:9 n  y& v6 F# n0 U, H1 l/ m; t
命令: (trans '(1.0 2.03.0) 0 1)4 r- D- f; F, e+ b4 h$ c
(2.0 -1.0 3.0)) A4 i! o1 h' F& [+ B& G+ z  F

, H% O! T' K" Z; h这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
( @' {/ e8 x/ L+ Q最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。/ ~; k' Z& e9 ~6 |% \# v; @% F

. z5 L, B3 X$ N我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
7 V: P/ C" W: K$ a; H(trans pt from to [disp])
) a; f- b; Z, L) A; e2 N8 A这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
  Y+ I3 Z7 h% {7 v除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。. {* I$ j+ g$ y5 [' D$ w

! _9 ^% n* v7 w$ z/ j我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。/ Q! W& F3 m- W4 [
(trans pt from to [disp])3 d2 N+ f. M0 q  |+ `, s. M. U
这个很明白了,转化点从哪到哪的意思 ...
& g! I- h; i4 d, w3 e$ ewww1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif
# I+ D. U4 S2 C: M" N% }, F
% c8 d  i* l$ d, ^" d
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)
    , [  J8 ~$ y( M! O, R2 ]# S2 J5 x
  2.   (command "ucs" "w")5 x! D: a& k- m4 x9 }* n
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线* T' Y$ p& M* d
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    % e9 u) ?; k% U1 v
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    3 I0 x9 B/ W4 Z1 v
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)
    . i+ {' I0 `! G9 G) L4 `6 m+ v
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)* B6 M6 s5 e4 ?
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)& o% g2 }. @. Z
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    9 f2 l+ U+ S& }9 C
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    8 f8 }4 i2 x" }- W: f4 h
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))* x2 h5 E+ w5 F3 e( o% ^0 p
  12.            )
    5 F- ]; K8 c4 N
  13.   )                                        ;求辅助点,用于下一步新建三点UCS
    ) q: Z9 M8 w# {0 N! |
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点- Y( i( V. T* q; ^7 R7 u0 r
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向
    2 z. Q! l) `5 P' M: \; g
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    * f! P( q4 W) J3 P! V" R
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
    , L* L- G% l8 |1 S. {
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度' l( e, N7 P$ w7 [  N) D
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))
    9 j* V9 A* @1 w7 t
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标
    , p7 N' L5 k! R. v
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值* e/ q4 h0 p0 S6 ^% K4 w
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))
    + k+ R- |! A" }9 X, x  h2 D6 X
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    # K9 M+ o/ s" \
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    - {1 x7 y% x! E' j7 W) H
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标- }+ ^; w4 D$ m' D; U
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    ( _! Q$ \" g( v/ c! y
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点# L" b% O! s: w% W8 f; E
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    1 F( ~) Y5 Q1 `: N# g1 _
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点0 w& a, T3 S5 V, K  b5 V) Q
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    : }! \& Z4 k  @: I: X
  31.   (princ)% c$ U' V0 [* L* g1 E2 m
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标( b5 _# {; d/ v7 b
本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia * p* S3 {8 E# O' z) p4 n0 A' y
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!( y& C$ w+ o; A% W/ l" W: S
看了你的解释,有种醍醐灌顶的感觉,呵呵
2 \! u0 F6 _' k+ P' F
2 [2 f( E4 U! y! }5 _+ \5 A1.
, r& p! O4 i% P% D4 ` (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))$ A) F' N' T$ q2 z! d) l1 R( q
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11)); `+ b1 n7 M# {. E+ L$ l! h! ]
                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11)); J1 J3 S- W2 K7 U
           )2 P9 @( G: H4 e8 e) v
  ) ;求辅助点,用于下一步新建三点UCS                                       
  U  I/ S3 c% G  j* J) e% z, e;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
3 [+ L: i8 H  T, e* c3 s
. r. d6 j5 }/ a0 i0 ]0 {* A* o: }+ Y2 Y( c& J2 g3 O6 A, n# g
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
5 [% Y0 X+ o/ A6 Z, @, D& m+ C8 s: J  Y/ |
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
( k/ X7 T; d2 P3 q" B3 X最开始看到的trans解释:
/ q3 q; N$ t/ q) G在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:
7 j9 R  ^& V9 {! u命令: (trans '(1.0 2.03.0) 0 1)% l' T, t' r; M; R0 Y0 a
(2.0 -1.0 3.0)9 p$ y. b$ L. c; l! Q
我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!( B8 U: r+ C2 g
6 K( k& X# |& x: X" G

  T& E& U; u1 t* l+ r" u我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
& o, }) K! Z! E- `& c: A4 v; dtataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif
1 ?) b1 m- f! @  I. i* E' G
不对.
7 V8 w0 x/ U& y( m" R5 ?( K下面举例说明:+ N" z) f. l. o! ?: ^
在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.
# c9 A! D/ k% P) h* w现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.) w) ]2 r8 W+ _
下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.7 @; C" n; E% ~$ i4 E2 m  \$ s
我们再在命令行键入(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).
& v$ }6 A. k7 C" I# J我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.( m. g8 V' Y& ~+ {* @) W
结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.! t7 T& u+ W* H3 `2 y. z

* b9 E2 ?8 Q4 x+ _( e) A另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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