Lispboy 发表于 2013-7-25 18:29:58

(XD::Entity:BOXatECS)获得选择集或实体对齐参考实体ECS下实际的包围盒


;|
获得实体ECS下实际的包围盒
参数:
   ss ---实体名 or 选择集
   e---参考实体或ecs(确定X轴方向), ecs=(原点 X轴 Y轴 Z轴)

返回值:
对齐一个实体的包围盒(UCS点)
|;
(defun XD::Entity:BOXatECS (ss e / box from mat pj r to xAxis yAxis zAxis)
(if (= (type e) 'ENAME)
   (setq from (xdrx_entity_getecs e))
   (progn
      (setq xAxis e
            yAxis (xdrx_vector_perpVector xAxis)
            zAxis (xdrx_vector_crossProduct xAxis yAxis)
            from (list '(0 0 0) xAxis yAxis zAxis)
      )
   )
)
(xdrx_document_ucsoff)
(setq box (xdrx_entity_box ss))
(setq pj (car box)
        to (list pj '(1 0 0) '(0 1 0) '(0 0 1))
        mat (xdrx_matrix_AlignCoordSystem from to)
)
(xdrx_entity_transform ss Mat)
(setq box (xdrx_entity_box ss))
(xdrx_entity_transform ss (setq r (xdrx_matrix_inverse Mat)))
(XD::Pnts:WCS2UCS (XD::Pnts:Transform box r))
)

Lispboy 发表于 2013-7-25 18:30:38

测试命令代码:


(defun c:ttt ()
(if (and
      (setq e (car (xdrx_entsel "\n拾取参考实体确定X轴<退出>:")))
      (progn
          (princ "\n选取要处理的实体<退出>:")
          (setq ss (ssget))
      )
      )
    (progn
      (XD::Begin)
      (setq box (XD::Pnts:UCS2WCS (XD::Entity:BoxAtEcs ss e)))
      (apply
      'xdrx_polyline_make
      (cons t box)
      )
      (XD::End)
    )
)
(princ)
)

st788796 发表于 2013-7-25 18:46:30

看了下 EntityBox 函数的代码, 能不能不 Transform ss 仅 transform box, 毕竟这个 SS 一般要比 Box 大很多,Box就是 四个点,把四个点缩放和旋转要效率高的多
,

wowan1314 发表于 2013-7-25 19:10:15

{:soso_e101:}
都去研究XDapi啦!!
我也不玩lisp了。
玩看书去。

Lispboy 发表于 2013-7-25 19:30:41

本帖最后由 Lispboy 于 2013-7-25 19:31 编辑

st788796 发表于 2013-7-25 18:46
看了下 EntityBox 函数的代码, 能不能不 Transform ss 仅 transform box, 毕竟这个 SS 一般要比 Box 大很多 ...
不行的,不同坐标系下,那个盒子大小是不一样的,只变换点,除了要旋转外,还要缩放,平移,这个矩阵不好找出来。
还是让transform ent 来找盒子吧。找到盒子,再给转回去,只旋转变换好实现。

Lispboy 发表于 2013-7-25 19:44:12

wowan1314 发表于 2013-7-25 19:10
都去研究XDapi啦!!
我也不玩lisp了。
玩看书去。

别啊,你也一起来研究啊,你看书是大家的损失啊。

Free-Lancer 发表于 2013-7-25 20:08:43

wowan1314 发表于 2013-7-25 19:10
都去研究XDapi啦!!
我也不玩lisp了。
玩看书去。

api不用研究,想用啥吱一声就有:)

cre8o 发表于 2013-7-27 01:08:07

Free-Lancer 发表于 2013-7-25 20:08
api不用研究,想用啥吱一声就有

xdapi除了2006版的还有其他说明文件吗 2010版看着好多函数不知道参数表

newer 发表于 2013-7-27 09:24:51

cre8o 发表于 2013-7-27 01:08
xdapi除了2006版的还有其他说明文件吗 2010版看着好多函数不知道参数表

api 2006版本手册是早年发布的,至少在2005年左右就有了,那个时候是200多个函数, 现在的每个版本的函数都是一样的,700多了吧。新版手册还没有出来,部分函数用法论坛出来了。

cre8o 发表于 2013-7-27 22:37:08

newer 发表于 2013-7-27 09:24
api 2006版本手册是早年发布的,至少在2005年左右就有了,那个时候是200多个函数, 现在的每个版本的函数 ...

谢谢 去看看

凝思 发表于 2017-3-28 20:18:48

啥也不说了,感谢楼主分享哇!

dyjwyqz5221 发表于 2018-7-3 15:26:31

这个函数速度很慢,哪个快些?

pxt2015 发表于 2024-7-1 17:36:27

dyjwyqz5221 发表于 2018-7-3 15:26
这个函数速度很慢,哪个快些?

这个矩阵太复杂,太多函数了,看得晕,所以效率低。
其实两步就搞定了
(apply 'xdrx_ucs_set ucs-lst);_设置用户坐标系
(xdrx_entity_box ss)

如果用矩阵解决,高飞鸟的纯Lisp效果不错。

页: [1]
查看完整版本: (XD::Entity:BOXatECS)获得选择集或实体对齐参考实体ECS下实际的包围盒