jxphklibin 发表于 2009-1-12 15:49:00

【原创】怎么知道图块是否是嵌套块?

本帖最后由 作者 于 2009-2-5 10:27:01 编辑

请问,怎么知道一图块是否是嵌套块(多重块)?多谢
也可以用nentsel判断:
(vla-get-objectname(vlax-ename->vla-object(car(entsel))))
-》"AcDbBlockReference"
-》"AcDbMInsertBlock

除了上面的方法和2楼的方法之外,还可以用下面的方法判别:
;;判别嵌套块另一方法

;;还需略加修改排除不是块的实体对象(if (and (setq ens (nentsel));也可以用函数nentselp
(= (length ens) 4)
(> (length (last ens)) 1)
    )
(setq tag T)
(setq tag nil);此举也可以省略 或直接用 nil
)

caoyin 发表于 2009-1-12 16:19:00

<p>;;判断块是否是套嵌块</p><p>(defun TEST (BlockName / TAG)<br/>&nbsp; (vl-catch-all-apply<br/>&nbsp;&nbsp;&nbsp; '(lambda ()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vlax-for X<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-item<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-get-Blocks<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-get-activedocument (vlax-get-acad-object))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BlockName<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (= (vla-get-objectName X) "AcDbBlockReference")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn (setq TAG T) (exit))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; TAG<br/>)</p>

userzhl 发表于 2009-1-12 16:37:00

可不可以改进成:“搜索本图中的所有多重匿名块,并把它们转换成有名块”呢?

caoyin 发表于 2009-1-12 17:02:00

<p>当然可以,但是“多重匿名块”这个名词应该是你首创,</p><p>你所说的“匿名块”是块定义的概念,而“多重”则是图形实例的概念</p><p></p><p></p><p></p>

jxphklibin 发表于 2009-1-12 17:14:00

多谢caoyin版主!!

jxphklibin 发表于 2009-1-12 17:19:00

本帖最后由 作者 于 2009-1-12 17:21:35 编辑

下面这段代码,是要采集所有图块(包括嵌套块)中的圆心,然后把圆心用多段线连起来,但是对于嵌套块,所取得圆心就偏差了,如何解决,请大师修改一下程序,万分感激!!!!(defun AllEntityInBlkdef (blk / bn blkdef e typ el )
(setq bn   (cdr (assoc 2 (entget blk)))
blkdef (tblobjname "block" bn)
)
(while (setq e (entnext blkdef))
    (setq typ (cdr (assoc 0 (entget e))))
    (if (= typ "INSERT")
      (setq el (append (AllEntityInBlkdef e) el))
      (setq el (cons e el))
    )
    (setq blkdef e)
)
el
)
(defun c:AentinBl (/ i en ss entlst ABentlst) ;bn) if while repeat 三函数 foreach
(setq ss(ssget '((0 . "INSERT")))
ABentlst '()
)
(if ss
    (repeat (setq i (sslength ss))
      (setq en (ssname ss (setq i (1- i)))
   entlst   (AllEntityInBlkdef en)
   ABentlst (append (list (list (cons en (length entlst)) entlst)) ABentlst)
      )
      ;;(princ (strcat "该块内共有" (itoa (length entlst)) "个实体\n"))
    )
    (princ "*** 你没有选择任何图块 ***")
)
(princ ABentlst)
;;返回的结果(((第i个图块图元名 . 块内实体图元数) (<图元名: 7ef771b0>...)) ...)
;;;(princ)
)
;; 获取图块(包括嵌套块)内所圆的有圆心坐标,返回圆心坐标组成的表:(pt0 pt1 pt2 ... ptn)
(defun c:GetBlockCircen (/      Par_list      Par_Item
    Par_ent       Par_ent_insPtptcenlst
    Sub_list      Out_LoopN   In_LoopN
    ent      entdata      CenPt
   )
(setq Par_list (c:AentinBl)
ptcenlst '()
)
;;循环
(repeat (setq Out_LoopN (length Par_list))
    (setq Par_Item (nth (setq Out_LoopN (1- Out_LoopN)) Par_list)
   Par_ent (car (car Par_Item))
   Par_ent_insPt (cdr (assoc 10 (entget Par_ent)))
   Sub_list (car (cdr Par_Item))
    )
    (foreach ent Sub_list
      (setq entdata (entget ent))
      (if (= (cdr (assoc 0 entdata)) "CIRCLE")
(setq CenPt    (trans (trans (cdr (assoc 10 entdata)) Par_ent 1) 1 0);OCS坐标系(distance Par_ent_insPt '(0 0))
       ptcenlst (append
    ptcenlst
    (list (list (+ (car Par_ent_insPt) (car CenPt))
         (+ (cadr Par_ent_insPt) (cadr CenPt))
         (+ (caddr Par_ent_insPt) (caddr CenPt))
          );仅对单层图块或插入点重合在一点嵌套块适用(等比例图块1:1)
    )
         )
)
;;取得的是世界坐标值(不一定,要看块的插入点?还是建立块的时候的坐标系情况?),使用的时候需要再转换为用户坐标值
;;经过测试,取得坐标值,与图块的插入点相关,所以上面加上块的插入点偏移值
      )
    )
)
(command "pline"
    (foreach i (trans_pt_0->1 ptcenlst) (command i))
;;;    ""
)   ;该语句实现,由点表画线
(princ ptcenlst)
(princ)
)
(defun trans_pt_0->1 ( ptlst / )
(mapcar '(lambda (x) (trans x 0 1)) ptlst)
)
(defun trans_pt_1->0 ( ptlst / )
(mapcar '(lambda (x) (trans x 1 0)) ptlst)
)

页: [1]
查看完整版本: 【原创】怎么知道图块是否是嵌套块?