本帖最后由 highflybird 于 2011-8-1 18:24 编辑
啵浪鼓 发表于 2011-7-31 19:54
回复 highflybir 的帖子
还是没法解决,飞版出高招呀
解决代码在此。
- (vl-load-com)
- (prompt "\n命令是:test")
- ;;;取得块的正常插入点,如果这个块中有圆,弧,或者椭圆,则取其中心为插入点;
- ;;;如果没有,则取这个块的包围盒为正常点,然后判断块的插入点。如果他们的位
- ;;;置重合,则什么都不做;如果不重合,则用点标记。
- (defun c:test (/ i lst sel ent dxf Name Cen mat pnt obj ret ll ur)
- (setq i 0)
- (setq lst nil)
- (if (setq sel (ssget '((0 . "INSERT")))) ;选择块参照
- (repeat (sslength sel)
- (setq ent (ssname sel i)) ;块参照的图元名
- (setq dxf (entget ent)) ;块参照的实体数据
- (setq Name (cdr (assoc 2 dxf))) ;块的名字
- (if (setq Cen (assoc Name lst)) ;是否求出中心点
- (setq Cen (cdr Cen))
- (setq Cen (GetCorrectInsertion Name) ;求中心点
- lst (cons (cons Name Cen) lst)
- )
- )
- (if Cen
- (setq mat (RefGeom ent) ;中心点存在的话,求变换矩阵
- pnt (mapcar '+ (mxv (car mat) Cen) (cadr mat)) ;并把这点变换到WCS
- )
- (setq obj (vlax-ename->vla-object ent)
- ret (vla-GetBoundingBox obj 'll 'ur) ;不存在则求包围盒
- ll (vlax-safearray->list ll) ;包围盒的左下点
- ur (vlax-safearray->list ur) ;包围盒的右上点
- pnt (mapcar '/ (mapcar '+ ll ur) '(2 2 2)) ;这两点的中点为中心点
- )
- )
- (if (not (equal pnt (cdr (assoc 10 dxf)) 1e-6)) ;容差可自定义
- (MarkIt pnt) ;中心点跟插入点不符合,标记位置
- )
- (setq i (1+ i))
- )
- )
- (princ)
- )
|