QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2012-5-31 20:57 编辑 " J9 w9 B9 Q! V7 A: ~

/ Y$ e" R8 h( e请教下斑竹,trans到底是怎么理解的?* K6 ]4 L$ k( j# a, \* U
问题是这样:有两条异面直线,我要画它们的公垂线,dwg文件里面红色粗线和白色粗线的公垂线。然后在网上找到了一段代码:
( D  b$ e  Y" j) v8 ~3 _9 a1 u, p
  1. (defun c:gcx(/)
    ; |) L8 I( }3 T
  2. (setq l1_en (entget (car (entsel))))
    7 U# L9 Y9 h5 E4 n
  3. (setq l2_en (entget (car (entsel))))$ u  W5 H9 a5 _: E) u+ j$ `4 t
  4. (setq pt11 (cdr (assoc 10 l1_en)))+ v6 ]$ f9 y3 `% [9 R
  5. (setq pt12 (cdr (assoc 11 l1_en)))
    / w. I  ?3 t2 F2 ]
  6. (setq pt21 (cdr (assoc 10 l2_en)))9 F7 h$ X/ H# K3 ~/ N
  7. (setq pt22 (cdr (assoc 11 l2_en)))
    5 K3 W' W% d# A/ g# [. p
  8. (setq pt (list (- (+ (nth 0 pt21)(nth 0 pt12)) (nth 0 pt11)); M; n8 l2 R  q0 A. V7 }
  9.    (- (+ (nth 1 pt21)(nth 1 pt12)) (nth 1 pt11))
    . V( C2 [4 c. @" }. L  X
  10.    (- (+ (nth 2 pt21)(nth 2 pt12)) (nth 2 pt11))))
    1 m% Q5 D( g% X+ Z" U4 l+ M6 B9 W0 I
  11. (command "ucs" "3" pt21 pt22 pt)7 [1 v1 f: x& N" v+ K
  12. (setq pt110 (trans pt11 0 1))
    : y/ f( m9 |; |" |; J4 b
  13. (setq h (nth 2 pt110))
    : l5 W+ s% i6 J5 U3 F
  14. (setq pt110 (list (nth 0 pt110)(nth 1 pt110) 0))# R& E! t5 a2 |1 G/ Q
  15. (setq pt120 (trans pt12 0 1))1 J1 L4 W. Y; n( ~: K: V  J* e  g
  16. (setq pt120 (list (nth 0 pt120)(nth 1 pt120) 0))1 }& F% ~! O* d2 {
  17. (setq pt210 (trans pt21 0 1))
    ) {+ s& _1 B. r) I- D. h
  18. (setq pt220 (trans pt22 0 1))
    , K' F5 x& a' O4 c' R
  19. (setq pt1 (inters pt110 pt120 pt210 pt220 nil))
    : m: \: J7 a( L9 p8 H
  20. (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))
    ) e, A' E7 B. _
  21. (command "line" pt1 pt2 "" )
复制代码

& M) x  l3 J4 W/ F前面几句还能看得懂,这一句:(setq pt110 (trans pt11 0 1))怎么理解?pt11被trans后成为pt110,这样做到底是为了什么?后面的几个trans也把我弄崩溃了,不知道这段代码的工作流程是什么,能给注释一下吗?
  |9 Y: N3 m# n0 @0 q8 P" e另外,我在明经看到trans的解释:
- s) M! D* C5 |将一个点(或位移量)从一个坐标系转换成另一个坐标系
6 g  S& ?0 ?0 N% |( Z  l( R(trans pt from to [disp])   参数
$ d: g5 E$ _; p' Z" i7 D& a/ hpt' w+ x* W$ G3 R* R) b& S. p1 Y  y
三维实数列表,既可以被解释成一个三维点,又可以被解释成一个三维位移(矢量)。' w6 g/ M8 H1 P) M8 F" n
from2 T; K; A$ ?. x' l
整数代码、图元名或三维拉伸矢量,指定 pt 的坐标系。整数代码可以为如下值:3 S8 c6 x: p! x2 F0 \" |
0  世界坐标系(WCS)# G5 Z6 f* }- {
1  用户坐标系(当前 UCS)" T1 Z7 C9 R0 F4 }  ~
2  与代码 0 或代码 1 一起使用时,表示当前视口的显示坐标系 (DCS)。与代码 3 一起使用时,表示当前模型空间视口的 DCS。: W" K  ?+ t9 k; }5 P1 ~) z
3  图纸空间 DCS(仅用于代码 2)
& [; p- M2 K1 x, H
# R& m: t+ x; D5 q3 `0 o2 q! Y* p, b后面的解释就不贴了,此外还有一个例子:
+ J# F: w8 J5 d8 {5 W  w6 |在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:  _, o1 ^2 e. Q1 `$ z2 a7 n  W, ]
命令: (trans '(1.0 2.03.0) 0 1)3 A) }2 N. t% @& ^( }
(2.0 -1.0 3.0)
( C. l! h/ i' ~; R0 y% s: O: c6 D0 c
* W. }0 A% `) w2 z这个我理解,可是换到我说的那行代码,我就不清楚了,我已经把现在的ucs给用平面表示出来了,哪位能不能把旋转后的ucs给表示出来啊?
9 C8 q% @& D! ]2 m/ }7 i& ^最主要的还是不知道trans是干嘛用...谢谢

trans.dwg

54.81 KB, 下载次数: 3

发表于 2012-5-31 19:24:19 | 显示全部楼层 来自: 中国江苏无锡
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。: A/ O/ h7 Z! ~8 S& g* `6 H

# G2 @3 N' R! e: |9 `9 u( W; ?我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
5 D2 t& C( U; o# \6 ~3 \- R1 n; A(trans pt from to [disp])% g. u* S" {( V2 _" l: K! f
这个很明白了,转化点从哪到哪的意思。如果你不转ucs怎么能表述起来from to 呢?
# o8 }& y6 W4 o6 p: Y8 \: f除非你自己有一套记录ucs状态和坐标转换的算法,这个是可以实现的。
 楼主| 发表于 2012-5-31 21:12:15 | 显示全部楼层 来自: 中国广东珠海
看你说了一大堆话,愣是没发现你要干什么,唯一看明白的标题,被你的说明搞糊涂了。* {  X/ v* @/ D; p( p/ p7 y8 S# T8 l

( G, u8 }/ |7 |我猜你问题是不想旋转UCS就能转化到某个坐标系下的点坐标。
* {2 n7 U6 N: O6 y6 X1 }(trans pt from to [disp]). R2 k3 d6 i. u' |6 ]* P0 D
这个很明白了,转化点从哪到哪的意思 ...
3 j  ?& _7 _2 ~" g2 kwww1974 发表于 2012-5-31 19:24 http://www.3dportal.cn/discuz/images/common/back.gif

# i- ^/ K" z0 |( c. k* d  `4 R+ y5 b. T9 y3 M& t3 b: \
是啊,我就是想要转化,问题是你能解释一下为什么网上的代码要那么转化呢?我就是不明白他那样转化的目的在哪里?坐标转到哪个上面去了
发表于 2012-5-31 22:36:11 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:gcx (/)) ^+ T: k8 }- o
  2.   (command "ucs" "w")9 e( f: K; U7 A: _: Q
  3.   (setq l1_en (entget (car (entsel))))        ;第一条直线
    % _4 d9 V" K* l% D0 C' n
  4.   (setq l2_en (entget (car (entsel))))        ;第二条直线
    2 J+ c2 Y. I/ ?
  5.   (setq pt11 (cdr (assoc 10 l1_en)))        ;第一条直线起点(WCS)
    8 W, q" I0 d$ I; N
  6.   (setq pt12 (cdr (assoc 11 l1_en)))        ;第一条直线端点(WCS)1 V9 M  p+ C# o
  7.   (setq pt21 (cdr (assoc 10 l2_en)))        ;第二条直线起点(WCS)9 Q3 B; ?1 g, v$ M+ h. p
  8.   (setq pt22 (cdr (assoc 11 l2_en)))        ;第二条直线端点(WCS)9 R6 b' O: v9 \  a! p- l$ _& D/ {
  9.   (setq        pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))
    9 K3 ]8 B0 d/ \8 @& Q+ E
  10.                  (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
    % `% N0 ^" L  G
  11.                  (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))9 u, z# d% q$ W1 O& y4 p
  12.            )( i# p! @3 }6 X& x- x2 d9 E3 q
  13.   )                                        ;求辅助点,用于下一步新建三点UCS% t! `" i+ J1 @8 u' C6 I
  14.                                         ;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点9 Y  D% R' c/ L7 F) |, J- o: H& a6 O
  15.   (command "ucs" "3" pt21 pt22 pt)        ;新建三点UCS,以第二条直线的起点为原点,第二条直线的端点为X方向,新直线的端点为Y方向* ?, N# B' o+ T! a
  16.                                         ;--即第二条直线在UCS的XY平面内,且第一条直线平行于UCS的XY平面
    0 l% n& C9 I/ }" x' Y* O
  17.   (setq pt110 (trans pt11 0 1))                ;求第一条直线起点在UCS的坐标值
      D( i2 e. M/ ]2 x2 Y' G" x4 I
  18.   (setq h (nth 2 pt110))                ;第一条直线起点在UCS的Z坐标--其绝对值即为公垂线的长度, t! n, n4 B. i, Y& E
  19.   (setq pt110 (list (nth 0 pt110) (nth 1 pt110) 0))% l8 y8 F/ m# F  \+ q
  20.                                         ;第一条直线起点在UCS的XY平面上投影的坐标; m" q. ~4 P. I6 s
  21.   (setq pt120 (trans pt12 0 1))                ;求第一条直线端点在UCS的坐标值1 v% D5 t( d" Z2 M+ J( f4 `  o
  22.   (setq pt120 (list (nth 0 pt120) (nth 1 pt120) 0))  Z* ?3 C& }* i( C/ k) c. M
  23.                                         ;第一条直线端点在UCS的XY平面上投影的坐标
    ! D* f' d$ i3 Z1 V- P# M
  24.   (setq pt210 (trans pt21 0 1))                ;求第二条直线起点在UCS的坐标--多此一举了吧?明明是UCS原点
    3 x3 I) Q5 c( J: l* z+ W$ Y
  25.   (setq pt220 (trans pt22 0 1))                ;求第二条直线端点在UCS的坐标3 G; O- h# n; Y0 ^' T. G3 c
  26.   (setq pt1 (inters pt110 pt120 pt210 pt220 nil))2 q* q8 u. C4 G
  27.                                         ;求第一条直线在UCS的XY平面的投影与第二条直线的交点
    % Y0 G+ v8 ]# W. q" \. h
  28.   (setq pt2 (list (nth 0 pt1) (nth 1 pt1) h))# g4 q+ t$ u0 j- r& X
  29.                                         ;以第一点在UCS的X,Y坐标和前面求出的第一条直线在UCS的Z坐标组成第二点7 x1 U, {; e% u. i1 X# A- ~, e' e; j
  30.   (command "line" pt1 pt2 "")                ;画直线--即公垂线
    7 Z9 }7 t+ K2 a
  31.   (princ), f9 b$ n: T, \1 C5 Q2 v7 a
  32. )
复制代码
trans的用途就是在不同的坐标系中换算点坐标
0 T' c. t7 N6 l: B4 i0 J! m5 w本例程的原理是:新建一个UCS,要求第二条直线在该UCS的XY平面上,且第一条直线与该UCS的XY平面平行;把两条直线的起,端点WCS坐标都换算为UCS坐标;求出第一条直线在UCS上的Z坐标;在UCS的XY平面上求出两条直线的外观交点......公垂线就OK了
 楼主| 发表于 2012-6-1 09:11:28 | 显示全部楼层 来自: 中国广东珠海
4# woaishuijia . [+ N% P4 y, O/ J& g
谢谢斑斑一行一行的详细注释!每次遇到问题了都跑到这提问,提问都能得到斑斑详细即时的解答!论坛有你,俺们真的很感谢!+ V1 K* M' H- J* k( E6 O" M+ v/ B
看了你的解释,有种醍醐灌顶的感觉,呵呵
- E3 R9 @' G7 [4 @  q, c( d1 Q2 G4 Y1 Z6 b
1.
2 k' p: P$ {' C" A; X# T (setq pt (list (- (+ (nth 0 pt21) (nth 0 pt12)) (nth 0 pt11))! y+ Y7 `0 h+ l6 V
                 (- (+ (nth 1 pt21) (nth 1 pt12)) (nth 1 pt11))
9 N' i, Q) p4 c' ]4 P, I                 (- (+ (nth 2 pt21) (nth 2 pt12)) (nth 2 pt11))
" a! ?) c1 c9 e/ \6 \2 y4 g0 ^           )
3 ~3 V; T, J0 I8 q  ) ;求辅助点,用于下一步新建三点UCS                                       
- k) @$ {/ z3 a$ J+ R" C" `; j;该点相当于:以第一条直线的端点为基点,复制第一条直线到第二条直线的起点,所得新直线的端点
3 _  B. }7 A. G2 }2 }% I
% A+ e1 N/ a2 h7 Z1 f- ~) _, H3 H) K+ e1 K$ u- n4 ^
最开始我没看出来这个辅助点是怎么来的,原来是复制第一条直线到第二条直线的起点,这样两个直线就确定了一个平面,然后在这个平面上做了ucs,后面的就是求投影,高度和交点!!!终于明白啦这段代码的流程了,呵呵!
' L; i7 r3 M  z5 ]& p' l& W
' F- X* Z0 B6 A2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。
& L& V. D9 j% b$ T2 _7 s+ U! a最开始看到的trans解释:
9 P9 D8 P; ]1 b2 \' V, N( ?+ J在下面的样例中,UCS 绕世界坐标系的 Z 轴旋转 90 度:' X4 H0 o# B, O2 d
命令: (trans '(1.0 2.03.0) 0 1)5 `" Q& H7 E3 i5 ]* h
(2.0 -1.0 3.0)
4 k( {* C: L' y9 q% K我就被这段话弄糊涂了,总是以为trans是把ucs给旋转了...所以各种迷糊啊!: X8 I* N' J4 I9 ^0 x
4 r* Z. e6 N: C# D8 V

+ W, E$ E" m; g. X# W9 u3 E/ c. O我现在在学vba,不太懂lisp,可是好多功能的实现都是用的lisp程序,自己也弄不明白,辛苦斑斑讲解啦!
发表于 2012-6-1 12:51:12 | 显示全部楼层 来自: 中国辽宁
2.trans我可不可以直接理解成把某个点的坐标(WCS的坐标)向一个UCS做的投影点呢?一条直线的两点都trans到ucs后,那投影点连接起来后就是投影线段了吧。8 a# o. U; f( x: K
tataki 发表于 2012-6-1 09:11 http://www.3dportal.cn/discuz/images/common/back.gif

7 X! Z' w9 m$ ~不对., @4 {, m: U7 o
下面举例说明:
7 e0 ~5 t6 M1 m6 @* k% y' Q/ @" m- b在WCS的XY平面上画一条直线,起.端点分别为(10,10,0)和(100,80,0).打开"特性"管理器,选择该直线,可以从"特性"管理器中看到该直线的起端点坐标与上面的一样.( a/ W7 {: G. g  I
现在用原点UCS方法把UCS的原点移到直线的起点,再次选择该直线,可以从"特性"管理器中看到直线的起端点坐标分别变成了(0,0,0)和(90,70,0).显然,这是该直线的起端点在UCS中的坐标.
2 {: f7 {- h. Y+ s下面,我们在命令行键入(trans '(10 10 0) 0 1)回车--注意,其中的列表'(10 10 0)就是该直线在WCS中的起点坐标--命令行返回的是(0.0 0.0 0.0).我们得到了该直线在UCS中的起点坐标.
7 v4 _( I, L& t) I7 e$ x1 S* j) [" 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).0 e8 v8 A) ]) ?* k1 ]
我们再在命令行键入(trans '(100 80 0) 0 1)回车,再键入(trans '(90 70 0) 1 0)回车.自己看结果吧.
: s& Y/ M% K: k' f3 l结论,trans函数就是换算空间某点在不同坐标系中的坐标值的一个工具,就像人民币和美元的换算,毫米和英寸的换算一样.+ u5 K+ x8 Z" B5 e. k/ X; ]9 w

  h, {" H3 b9 s5 _3 G, y( ]9 L另外,同样的方法在VBA中也有,就是Utility对象中的TranslateCoordinates方法
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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