几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量

几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 (http://www.dimcax.com/hust/index.php)
-   ObjectARX(AutoLISP) (http://www.dimcax.com/hust/forumdisplay.php?f=178)
-   -   【原创】怎么知道图块是否是嵌套块? (http://www.dimcax.com/hust/showthread.php?t=11452)

yang686526 2009-04-26 03:54 PM

【原创】怎么知道图块是否是嵌套块?
 
【原创】怎么知道图块是否是嵌套块?
www.dimcax.com
【原创】怎么知道图块是否是嵌套块?
请问,怎么知道一图块是否是嵌套块(多重块)?多谢
也可以用nentsel判断:
(vla-get-objectname(vlax-ename->vla-object(car(entsel))))
-》"acdbblockreference"
-》"acdbminsertblock
除了上面的方法和2楼的方法之外,还可以用下面的方法判别:
;;判别嵌套块另一方法
;;还需略加修改排除不是块的实体对象( ( ( ens ());也可以用函数nentselp
( ( ens) 4)
( ( ( ens)) 1)
)
( tag t)
( tag nil);此举也可以省略 或直接用 nil
)
d
以下内容需要帖子数达到20才可以浏览
;;判断块是否是套嵌块
(defun test (blockname / tag)
(vl-catch-all-apply
'(lambda ()
(vlax-for x
(vla-item
(vla-get-blocks
(vla-get-activedocument (vlax-get-acad-object))
)
blockname
)
(if (= (vla-get-objectname x) "acdbblockreference")
(progn (setq tag t) (exit))
)
)
)
)
tag
)
d
可不可以改进成:“搜索本图中的所有多重匿名块,并把它们转换成有名块”呢?
d
当然可以,但是“多重匿名块”这个名词应该是你首创,
你所说的“匿名块”是块定义的概念,而“多重”则是图形实例的概念
d
多谢caoyin版主!!
d
下面这段代码,是要采集所有图块(包括嵌套块)中的圆心,然后把圆心用多段线连起来,但是对于嵌套块,所取得圆心就偏差了,如何解决,请大师修改一下程序,万分感激!!!!
(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)
)


所有的时间均为北京时间。 现在的时间是 11:08 AM.