找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2307|回复: 38

[精彩文萃] 关于trans函数和对象坐标系(OCS)的理解...

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-8-3 14:33:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 newer 于 2017-8-3 15:22 编辑

首先我们来看看OCS。

一些2D对象的坐标定义在对象坐标系(lwpolyline,blocks,text ...等等)中,此外,lwpolylines有一个高程数据。

例如,在WCS(图片中为白色)的原点为(1.402 0.347 4.866)并绕3轴旋转的UCS(图片中的绿色)上,以(0 0 0)的方式插入块,旋转为0.0 (橙色)。

OCS_1.PNG

现在,得到块参考DXF数据:

得到插入点:

(cdr (assoc 10 (entget ent))) -> (1.444 1.806 4.519)

得到旋转角:

(cdr (assoc 50 (entget ent))) -> 0.39099

我们可以看到插入点坐标既不是WCS(1.402 0.347 4.866)也不是UCS(0.0 0.0 0.0),旋转不是0。
因为坐标是在OCS中定义的,并且关于OCS的X轴的旋转。
OCS根据挤出方向(或正常)和任意轴动量守恒定义(参见帮助手册 “开发人员指南” 的DXF部分中的 “高级DXF概念”)。
对于根据Z矢量计算OCS的X轴和Y轴的例子,您可以看到此消息。

让我们看看有关OCS(红色)的更多信息:

OCS_2.PNG

所以,所有OCS的起源与WCS起源相同,和具有相同拉伸方向(210 DXF代码或普通属性)的所有对象都具有相同的OCS。

要计算由3点定义的平面的法向量,见下面的代码:


计算点P1到P2的单位向量

  1. ;;; VEC1 Returns the single unit vector from p1 to p2
  2. (defun vec1 (p1 p2)
  3.   (if (not (equal p1 p2 1e-009))
  4.     (mapcar
  5.       '(lambda (x) (/ x (distance p1 p2)))
  6.       (mapcar '- p2 p1)
  7.     )
  8.   )
  9. )


求三点组成平面的法线向量

游客,如果您要查看本帖隐藏内容请回复

获取当前UCS的Z轴向量

  1. ;;; UCSZDIR Returns the Normal Unit Vector of the current UCS
  2. (defun ucszdir  ()
  3.   (trans '(0 0 1) 1 0 T)
  4. )


一些数学函数

  1. ;;; ASIN Returns the arcsinus of a number in radians
  2. (defun ASIN (num)
  3.   (if (<= -1 num 1)
  4.     (atan num (sqrt (- 1 (expt num 2))))
  5.   )
  6. )

  7. ;;;ACOS Returns the arccosinus of a number in radians
  8. (defun ACOS (num)
  9.   (if (<= -1 num 1)
  10.     (atan (sqrt (- 1 (expt num 2))) num)
  11.   )
  12. )

  13. ;;; ANGLE_3PTS Returns the angle (in radians) defined by its summit and two points
  14. ;;; Returned angle is always positive and less than or equal to pi radians.

  15. ;; Using vector calculus
  16. (defun angle_3pts (sum p1 p2 / v1 v2)
  17.   (if (and
  18.         (setq v1 (vec1 sum p1))
  19.         (setq v2 (vec1 sum p2))
  20.       )
  21.     (cond
  22.       ((equal v1 v2 1e-009) 0.0)
  23.       ((equal v1 (mapcar '- v2) 1e-009) pi)
  24.       (T (* 2 (asin (/ (distance v1 v2) 2))))
  25.     )
  26.   )
  27. )

  28. ;; Using the "Théorème de Carnot"
  29. (defun angle_3pts (sum p1 p2 / d1 d2 d3)
  30.   (setq        d1 (distance sum p1)
  31.         d2 (distance sum p2)
  32.         d3 (distance p1 p2)
  33.   )
  34.   (if (and (not (zerop d1)) (not (zerop d2))
  35.     (ACOS (/ (+ (* d1 d1) (* d2 d2) (- (* d3 d3)))
  36.              (* 2 d1 d2)
  37.           )        
  38.     )
  39.   )
  40. )


下面代码求一点相对一个平面的高程

  1. ;;; ELEV Returns the elevation of point pt from the plane defined by p1 p2 p3

  2. (defun elev (pt p1 p2 p3)
  3.   (* (cos (angle_3pts p1 (mapcar '+ p1 (norm_3pts p1 p2 p3)) pt))
  4.      (distance p1 pt)
  5.   )
  6. )


下面代码返回点投影到平面上的坐标

  1. ;;; PROJ_PT Returns the coordinates of the projection of point pt
  2. ;;; on the plane defined by the points p1 p2 p3.

  3. (defun proj_pt (pt p1 p2 p3)
  4.   (mapcar '-
  5.           pt
  6.           (mapcar '(lambda (x) (* x (elev pt p1 p2 p3)))
  7.                   (norm_3pts p1 p2 p3)
  8.           )
  9.   )
  10. )



知道了上面,我觉得通过下面的代码,应该比较容易在3D下理解TRANS函数的作用。


要得到块参考插入点的WCS坐标,使用的方法是使用它的ename数据:

(trans (cdr (assoc 10 (entget ent))) ent 0) -> (1.402 0.347 4.866),它是WCS中的UCS起始坐标。

以及在UCS中获得它:
(trans(cdr(assoc 10(entget ent)))ent 1)返回非常接近(0.0 0.0 0.0)的(4.440e-016 4.440e-016 8.881e-016)

也可以使用DXF组码210 :

(trans(cdr(assoc 10(entget ent))))(cdr(assoc 210(entget ent)))0)

要使用(entmake ...)或(vla-add ...)在UCS平面上创建2D对象,必须使用另一种方法,因为ent不存在。
所以我们必须计算UCS XY平面的法向量:

(setq ucszdir(trans'(0 0 1)1 0 T))

可以使用ucszdir以及ent或(cdr(assoc 210(entget ent)))。
在与entmake一起使用的列表中:

(cons 210 ucszdir)

ucszdir也是在(vla-put-Normal ...)表达式中使用的Normal属性。


现在坐标的X,Y可以求出,但是旋转如何计算呢?
要获得OCS X轴和UCS X轴之间的角度:

(angle '(0 0 0) (trans (getvar "UCSXDIR") 0 ucszdir)) -> 0.39099作为块旋转DXF数据。


最后,得到lwpolyline的高程(对于块参考的Z坐标的分形,文本...)

要使用entmake或vla-add在UCS平面上创建lwpolyline,我们必须使用trans和ucszdir来指定它的高程:

(caddr(trans'(0 0 0)1 ucszdir)) - > 4.519作为块插入点的Z坐标(DXF组码10)。


希望上面能对您有帮助。




评分

参与人数 1D豆 +5 收起 理由
sh_h + 5

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2017-8-3 14:47:02 | 显示全部楼层
块内坐标还是算不清楚..
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 769个

财富等级: 财运亨通

发表于 2017-8-3 15:13:20 | 显示全部楼层
这个感觉有点难,收藏起来,慢慢学习!谢谢大师分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2017-8-3 15:15:23 | 显示全部楼层
谢谢讲解~~~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 541个

财富等级: 财运亨通

发表于 2017-8-3 16:30:05 | 显示全部楼层
一直搞不懂这个函数的用法,先收藏
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 550个

财富等级: 财运亨通

发表于 2017-8-3 16:38:45 | 显示全部楼层
马克,慢 慢 学
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5578个

财富等级: 富甲天下

发表于 2017-8-3 17:19:18 | 显示全部楼层
感谢大师!太高深了,得慢慢来吃透。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2017-8-3 18:44:04 | 显示全部楼层
我来测试一下,行不行
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

发表于 2017-8-3 19:37:55 | 显示全部楼层
有点难度,谢谢!

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3701个

财富等级: 富可敌国

发表于 2017-8-3 21:13:57 | 显示全部楼层
回复学习学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2963个

财富等级: 家财万贯

发表于 2017-8-3 22:58:09 | 显示全部楼层
回复学习,学习分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 475个

财富等级: 日进斗金

发表于 2017-8-4 00:05:03 | 显示全部楼层
回复学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 8711个

财富等级: 富甲天下

发表于 2017-8-4 06:51:11 | 显示全部楼层

回复学习学习!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 326个

财富等级: 日进斗金

发表于 2017-8-4 09:39:10 | 显示全部楼层
好经验,学习了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 26个

财富等级: 恭喜发财

发表于 2017-8-6 02:24:56 | 显示全部楼层
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-3-29 14:20 , Processed in 0.222067 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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