找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4986|回复: 32

[有奖答题] 测测你们的包围盒函数代码...

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-4-26 21:11:44 | 显示全部楼层 |阅读模式

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

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

×

很多朋友都有自己的“包围盒”代码,但很多只是能获得WCS下的,如果用户的UCS下画图并出图,那么这样的“包围盒”代码就是不能用的,大家贴贴代码,要你的包围盒函数能支持UCS。当然WCS下也要正常。

QQ截图20130426210406.png




测试图见附件。

test7.rar

5.35 KB, 下载次数: 38, 下载积分: D豆 -1 , 活跃度 1

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-4-27 21:47:25 | 显示全部楼层
[pcode=lisp,true](entmake
  (append
    (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")
          '(90 . 4) '(70 . 1) '(43 . 0.0) '(38 . 0.0) '(39 . 0.0) '(62 . 1))
    (
     (lambda (SS / XDIR ORG CP ANG N OBJ LL UR pl UL LR)
       (setq xdir (getvar 'ucsxdir)
             org  (getvar 'ucsorg)
             cp          (vlax-3d-point '(0.0 0.0 0.0))
             ang  (atan (cadr xdir) (car xdir))
       )
       (repeat (setq n (sslength ss))
         (setq
           obj (vlax-ename->vla-object (ssname ss (setq n (1- n))))
         )
         (vla-rotate obj cp (- ang))
         (vla-update obj)
         (vla-GetBoundingBox obj 'll 'ur) ;_ 计算包围盒
         (setq ll (vlax-safearray->list ll) ;_ 坐下角点
               ur (vlax-safearray->list ur) ;_ 右上角点
         )
         ;;_ 还原对象位置
         (vla-rotate obj cp ang)
         (setq pl (cons ll pl)
               pl (cons ur pl)
         )
       )
       (setq ll        (apply 'mapcar (cons 'min pl)) ;_ 坐下角点
             ur        (apply 'mapcar (cons 'max pl)) ;_ 右上角点
             ul        (list (car ll) (cadr ur) (caddr ll)) ;_ 左上角点
             lr        (list (car ur) (cadr ll) (caddr ll)) ;_ 右下角点
       )
       ;;返回UCS方向的WCS坐标
       (mapcar '(lambda (x) (cons 10 (mapcar '- (trans x 1 0) org)))
               (list ll ul ur lr)
       )
     )
      (ssget)
    )
  )
)[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-27 22:33:30 | 显示全部楼层

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

使用道具 举报

发表于 2013-4-28 02:02:27 | 显示全部楼层
ucs下求实体包围盒,可先用vla-GetUCSMatrix求ucs转换矩阵,进行transfrom变换后求box,
        用x#-1求逆矩阵,transfrom方法将box转换回ucs.参程序: x#ucsbox 函数.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-28 02:26:50 | 显示全部楼层
梦断江南 发表于 2013-4-28 02:02
ucs下求实体包围盒,可先用vla-GetUCSMatrix求ucs转换矩阵,进行transfrom变换后求box,
        用x#-1求逆 ...

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

使用道具 举报

发表于 2013-4-28 08:02:38 | 显示全部楼层
XDSoft 发表于 2013-4-27 22:33
这大段,给整理出个函数吧,要返回四个脚点的,也通用。

[pcode=lisp,true](defun ucsbox (SS / XDIR ORG CP ANG N OBJ LL UR pl UL LR)
    (setq xdir (getvar 'ucsxdir)
          org  (getvar 'ucsorg)
          cp   (vlax-3d-point '(0.0 0.0 0.0))
          ang  (atan (cadr xdir) (car xdir))
          )
    (repeat (setq n (sslength ss))
      (setq
        obj (vlax-ename->vla-object (ssname ss (setq n (1- n))))
        )
      (vla-rotate obj cp (- ang))
      (vla-update obj)
      (vla-GetBoundingBox obj 'll 'ur) ;_ 计算包围盒
      (setq ll (vlax-safearray->list ll) ;_ 坐下角点
            ur (vlax-safearray->list ur) ;_ 右上角点
            )
      ;;_ 还原对象位置
      (vla-rotate obj cp ang)
      (setq pl (cons ll pl)
            pl (cons ur pl)
            )
      )
    (setq ll (apply 'mapcar (cons 'min pl)) ;_ 左下角点
          ur (apply 'mapcar (cons 'max pl)) ;_ 右上角点
          ul (list (car ll) (cadr ur) (caddr ll)) ;_ 左上角点
          lr (list (car ur) (cadr ll) (caddr ll)) ;_ 右下角点
          )
    ;;返回UCS方向的WCS坐标
    (mapcar '(lambda (x) (mapcar '- (trans x 1 0) org))
            (list ll ul ur lr)
            )
    )[/pcode]

评分

参与人数 1D豆 +4 收起 理由
XDSoft + 4 很给力!

查看全部评分

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

使用道具 举报

已领礼包: 345个

财富等级: 日进斗金

发表于 2013-4-28 09:51:50 | 显示全部楼层
试试附件的文件,出错。。。

测试.rar

13.12 KB, 下载次数: 12, 下载积分: D豆 -1 , 活跃度 1

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-28 10:08:13 | 显示全部楼层
userzhl 发表于 2013-4-28 09:51
试试附件的文件,出错。。。

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

使用道具 举报

已领礼包: 345个

财富等级: 日进斗金

发表于 2013-4-28 10:43:45 | 显示全部楼层
附件是测试的DWG文件,用了“夜来风语声”求出的包围盒有误。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-28 11:26:00 | 显示全部楼层
userzhl 发表于 2013-4-28 10:43
附件是测试的DWG文件,用了“夜来风语声”求出的包围盒有误。

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

使用道具 举报

发表于 2013-4-28 12:11:48 | 显示全部楼层
userzhl 发表于 2013-4-28 10:43
附件是测试的DWG文件,用了“夜来风语声”求出的包围盒有误。

实体SPline用vla-GetBoundingBox计算的包围盒并不是其真正的包围盒!这个是CAD本身的问题!计算spline的真正包围盒可用拟合逼近法近似计算其包围盒!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-4-28 13:14:09 | 显示全部楼层
下面是我的代码:
其实在UCS下最主要的是如何得到ucs的变换矩阵。
当然,对spline是有些问题的。不过如果要真正得到spline的,需要采用迭代或者其他方法。我已经发过这个情况的帖子。
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:UCSBOX20130428.LSP 
下载次数:76  文件大小:4.15 KB 
下载权限: 不限 以上  [免费赚D豆]


[pcode=lisp,true];;;-----------------------------------------------------------;;
;;;Highflybird  2008.03.22 海南    2013.04.28 修订于深圳      ;;
;;;-----------------------------------------------------------;;
;;;程序功能:画出选择集的包围盒,可适用于UCS下                ;;
;;;免责申明:本着开源的精神,此代码可以免费拷贝复制,但使用此 ;;
;;;          程序带来的一切责任由使用者这承担。               ;;
;;;程序用法:命令为Test,选择一个或多个,自动创建物体包围盒    ;;
;;;-----------------------------------------------------------;;
(defun C:Test (/ B DOC ENT I ISUCS LL LR UL UR MATRIX REVMAT OBJ  SEL pl)
  ;;先判断UCS是否与WCS相同。
  ;;如是UCS,得到UCS变换矩阵和到WCS的逆变换矩阵
  (if (zerop (getvar "WORLDUCS"))                                    ;UCS是否与WCS相同
    (setq IsUCS T                                                     ;设置标志位为true
          matrix (vlax-tmatrix (MAT:Trans 1 0))                 ;UCS的变换矩阵
          revMat (vlax-tmatrix (MAT:Trans 0 1))                 ;UCS的逆变换矩阵
    )
    (setq IsUCS nil)                                                  ;否则不予变换
  )
  (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  ;;在UCS下先变换物体到WCS下,取得每个物体的包围框,
  ;;求出包围框集合的最小XY,最大XY,并用矩形框画出来
  ;;然后把物体变换回到UCS,并把矩形也变换回去
  (if (setq sel (ssget))                                        ;选择物体
    (progn
      (setq i 0)
      (vla-StartUndoMark doc)
      (repeat (sslength sel)
        (setq ent (ssname sel i))                               ;图元
        (setq obj (vlax-ename->vla-object ent))                 ;obj对象
        (and IsUCS (vla-TransformBy obj revMat))                      ;反变换到WCS
        (vla-GetBoundingBox obj 'll 'ur)                          ;得到包围框
        (setq ll (vlax-safearray->list ll))
        (setq ur (vlax-safearray->list ur))
        (setq pl (cons ll pl))                                       ;得到左下角点表
        (setq pl (cons ur pl))                                       ;得到右上角点表
        (and IsUCS (vla-TransformBy obj matrix))                      ;变换回到UCS
        (setq i (1+ i))                                         
      )
      (setq ll (apply 'mapcar (cons 'min pl)))                        ;左下角
      (setq ur (apply 'mapcar (cons 'max pl)))                  ;右上角
      (setq lr (list (car ll) (cadr ur) (caddr ll)))            ;右下角
      (setq ul (list (car ur) (cadr ll) (caddr ur)))            ;左上角
      (setq b (Make3dPoly (list ll lr ur ul)))                        ;构造边框
      (if IsUCS                                                        ;如果UCS
        (vla-TransformBy (vlax-ename->vla-object b) matrix)     ;变换边框到UCS
      )
      (vla-EndUndoMark doc)
    )
  )
  (princ)
)

;;;-----------------------------------------------------------;;
;;; 从一个坐标系统到另一个坐标系统的变换矩阵                  ;;
;;; 输入:from - 源坐标系;to - 目的坐标系                    ;;
;;; 输出:一个4X4的变换CAD的标准变换矩阵                      ;;
;;;-----------------------------------------------------------;;
(defun MAT:Trans (from to)
  (append
    (MAT:trp
      (mapcar
        (function (lambda (v d) (trans v from to d)))
        '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.) (0. 0. 0.))
        (list t t t nil)
      )
    )
    '((0. 0. 0. 1.))
  )
)

;;;-----------------------------------------------------------;;
;;; 矩阵转置   MAT:trp Transpose a matrix -Doug Wilson-       ;;
;;; 输入:矩阵                                                ;;
;;; 输出:转置后的矩阵                                        ;;
;;;-----------------------------------------------------------;;
(defun MAT:trp (m)
  (apply 'mapcar (cons 'list m))
)

;;;-----------------------------------------------------------;;
;;; 画3d多段线                                                ;;
;;; draw a closed 3d Polyline                                 ;;
;;;-----------------------------------------------------------;;
(defun Make3dPoly (pts / e)
  (setq e (Entmake (list '(0 . "POLYLINE")'(70 . 9))))
  (foreach p Pts
    (entmake (list '(0 . "VERTEX") '(70 . 32) (cons 10 p)))
  )
  (entmake '((0 . "SEQEND")))
  (entlast)
)

(vl-load-com)
(prompt "\n请输入命令test")
(princ)[/pcode]

点评

你的lisp轮矩阵中,如上代码。。 跟你现在贴的代码中的说法不同啊?? 是不是写反了??  详情 回复 发表于 2013-8-4 00:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-4-28 14:23:46 | 显示全部楼层
XDSoft 发表于 2013-4-28 11:26
在你机器上测试的包围盒,截取个图片贴论坛吧。



测试了下 夜来风雨声和高飞鸟的代码,夜来风雨声的代码有错误。

夜来风雨声的图片

QQ截图20130428141905.png

高飞鸟的图片

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

使用道具 举报

已领礼包: 345个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-28 14:37:10 | 显示全部楼层
userzhl 发表于 2013-4-28 14:30
再发现BUG,对裁剪过的图块也有误。

像LISPBOY那样,你截取个图片贴上来吧,并把有BUG的DWG传上来。高飞鸟版主和夜来风雨声的图片都贴下,现在不知道你说哪个代码有错误了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 08:54 , Processed in 0.445099 second(s), 67 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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