![]() |
【原创】怎么知道图块是否是嵌套块?
【原创】怎么知道图块是否是嵌套块?
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. |