明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 自贡黄明儒

[源码] [已经解决]获取对象包围盒、最小包围盒-----(也适于UCS)

    [复制链接]
 楼主| 发表于 2013-9-18 08:16 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2013-9-18 10:06 编辑
namezg 发表于 2013-9-17 19:40
最近刚写的


我用此得出的结果好象不对
你的mxp同highflybir论矩阵中的MAT:mxp有什么差别?
 楼主| 发表于 2013-9-18 09:55 | 显示全部楼层
;;下面的代码可以求UCS下任何对象的四个角点,但太罗索
;;哪位高手优化一下

  1. ;;考虑UCS,照搬highflybird的程序
  2. ;|
  3. 4 = 左上;3 = 右上
  4. 1 = 左下;2 = 右下
  5. |;
  6. ;;(HH:Ename4pt (car (entsel))),返回UCS坐标系下坐标
  7. (defun HH:Ename4pt (ent             /              LASTENT  LST        MATLST         MATRIX
  8.                     MAXPT    MINPT    OBJ      ORIGIN        REVMAT         UCSFLAG
  9.                     WCSORG   XDIR     YDIR     ZDIR
  10.                    )
  11.   ;;1 矩阵的变换与逆变换
  12.   (defun GetMatrix (lst org Revflag / I J MAT)
  13.     (setq mat (vlax-make-safearray vlax-vbDouble '(0 . 3) '(0 . 3)))
  14.     ;;初始化一个4X4的矩阵
  15.     (setq i 0)
  16.     (repeat 3
  17.       (vlax-safearray-put-element mat i 3 (nth i org)) ;平移变换
  18.       (setq j 0)
  19.       (repeat 3
  20.         (if RevFlag
  21.           (vlax-safearray-put-element mat i j (nth j (nth i lst))) ;角度逆变换
  22.           (vlax-safearray-put-element mat i j (nth i (nth j lst))) ;角度的变换
  23.         )
  24.         (setq j (1+ j))
  25.       )
  26.       (setq i (1+ i))
  27.     )
  28.     (vlax-safearray-put-element mat 3 3 1)
  29.     mat                                                  ;返回矩阵
  30.   )
  31.   ;;2 构造矩形
  32.   (defun Make-Rectange (pt1 pt2)
  33.     (entmake
  34.       (list
  35.         '(0 . "LWPOLYLINE")                          ;轻多段线
  36.         '(100 . "AcDbEntity")
  37.         '(100 . "AcDbPolyline")
  38.         '(90 . 4)                                  ;四个顶点
  39.         '(70 . 1)                                  ;闭合
  40.         (cons 38 (caddr pt1))                          ;高程
  41.         (cons 10 (list (car pt1) (cadr pt1)))          ;左下角
  42.         (cons 10 (list (car pt2) (cadr pt1)))          ;右下角
  43.         (cons 10 (list (car pt2) (cadr pt2)))          ;右上角
  44.         (cons 10 (list (car pt1) (cadr pt2)))          ;左上角
  45.         (cons 210 '(0 0 1))                          ;法线方向
  46.       )
  47.     )
  48.   )

  49.   ;;3 本程序主程序
  50.   (cond        ((= (type ent) 'ENAME)
  51.          (setq obj (vlax-ename->vla-object ent))
  52.         )
  53.         ((= (type ent) 'VLA-OBJECT) (setq obj ent))
  54.         (T (exit))
  55.   )

  56.   (command "_.UCS" "NEW" "Object" ent)

  57.   ;;先判断UCS是否与WCS相同。如是则取得UCS的X方向,
  58.   ;;Y方向,Z方向,UCS原点及WCS的原点相对UCS的坐标点
  59.   ;;然后得到UCS变换矩阵和到WCS的逆变换矩阵
  60.   (setq UcsFlag (getvar "WORLDUCS"))
  61.   (if (= UcsFlag 0)                                  ;UCS是否与WCS相同
  62.     (setq UcsFlag T                                  ;设置标志位为true
  63.           xdir          (getvar "UCSXDIR")                  ;X方向矢量
  64.           ydir          (getvar "UCSYDIR")                  ;Y方向矢量
  65.           zdir          (MAT:vxv xdir ydir)                  ;X和Y的方向矢量的叉积
  66.           origin  (getvar "UCSORG")                  ;原点
  67.           WcsOrg  (trans '(0 0 0) 0 1)                  ;WCS的原点相对UCS的坐标
  68.           matLst  (list xdir ydir zdir)                  ;旋转的变换矩阵表
  69.           matrix  (GetMatrix matLst origin nil)          ;从WCS到UCS的变换矩阵
  70.           revMat  (GetMatrix matLst WcsOrg T)          ;从UCS到WCS的变换矩阵
  71.     )
  72.     (setq UcsFlag nil)                                  ;否则不予变换
  73.   )
  74.   ;;在UCS下先变换物体到WCS下,取得每个物体的包围框,
  75.   ;;求出包围框集合的最小XY,最大XY,并用矩形框画出来
  76.   ;;然后把物体变换回到UCS,并把矩形也变换回去
  77.   (and UcsFlag (vla-TransformBy obj revMat))          ;反变换到WCS
  78.   (vla-GetBoundingBox obj 'minPt 'maxPt)          ;得到包围框
  79.   (setq minPt (vlax-safearray->list minPt))
  80.   ;;(setq minPt (trans minPt ent 1))
  81.   (setq maxPt (vlax-safearray->list maxPt))
  82.   (and UcsFlag (vla-TransformBy obj matrix))          ;变换回到UCS
  83.   (command "_.UCS" "p")

  84.   (and
  85.     (make-Rectange minPt maxPt)                          ;构造边框
  86.     UcsFlag                                          ;如果UCS的话
  87.     (vla-TransformBy (vlax-ename->vla-object (entlast)) matrix)
  88.   )

  89.   (foreach x (entget (entlast))
  90.     (if        (equal (car x) 10)
  91.       (setq lst (cons (cdr x) lst))
  92.     )
  93.   )
  94.   ;;(REVERSE lst);返回世界坐标系下坐标
  95.   (mapcar '(lambda (x) (trans x ent 1)) (REVERSE lst))
  96. )
发表于 2013-9-18 20:44 | 显示全部楼层
本帖最后由 namezg 于 2013-9-18 20:53 编辑

我这边没有问题,获得的是对象UCS包围盒四角点的WCS坐标(注意不是UCS坐标)

而我测试你发的却是有问题的,绘制的矩形不正确。
 楼主| 发表于 2013-9-18 22:21 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2013-9-18 22:22 编辑

我发的图就是用12楼的代码画出来的,应该没有问题呀,只不过写得不好
发表于 2013-9-18 22:23 | 显示全部楼层
自贡黄明儒 发表于 2013-9-17 16:46
我是想直接取得对象的四个角点,而且是通用的。
确又搞不定

  1.       ;;返回四个角点WCS坐标
  2.       (princ
  3.       (list
  4.       (mat:mxp (vlax-safearray->list  matrix) minPt) ;_ 左下角坐标
  5.       (mat:mxp (vlax-safearray->list  matrix) (list (car minpt) (cadr maxPt) (caddr minPt))) ;_ 左上角坐标
  6.       (mat:mxp (vlax-safearray->list  matrix) maxPt) ;_ 右上角坐标
  7.       (mat:mxp (vlax-safearray->list  matrix) (list (car maxPt) (cadr minpt) (caddr minPt))) ;_ 右下角坐标
  8.       ))

点评

我仔细研究一下再说  发表于 2013-9-18 22:26
发表于 2013-9-18 23:08 | 显示全部楼层

红色的包围盒是用我的函数获得的。黄色的包围盒使用12楼的函数获得的。

本帖子中包含更多资源

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

x
发表于 2013-9-18 23:41 来自手机 | 显示全部楼层
namezg 发表于 2013-9-18 23:08
红色的包围盒是用我的函数获得的。黄色的包围盒使用12楼的函数获得的。

最小包围盒和平行与ucs的包围盒!
发表于 2013-9-19 16:02 来自手机 | 显示全部楼层
楼主不是要ucs坐标系下的包围盒吗?难道要的是最小包围盒.
 楼主| 发表于 2013-9-19 16:34 来自手机 | 显示全部楼层
namezg 发表于 2013-9-19 16:02
楼主不是要ucs坐标系下的包围盒吗?难道要的是最小包围盒.

两种情况都搞定了,还需要验证一下,电脑出问题了!
 楼主| 发表于 2013-9-20 21:05 | 显示全部楼层
不用command的程序以后再写
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-29 23:05 , Processed in 0.197901 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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