明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2681|回复: 5

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

[复制链接]
发表于 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楼的方法之外,还可以用下面的方法判别:
  1. ;;判别嵌套块另一方法
  2. ;;还需略加修改排除不是块的实体对象(if (and (setq ens (nentsel));也可以用函数nentselp
  3.   (= (length ens) 4)
  4.   (> (length (last ens)) 1)
  5.     )
  6.   (setq tag T)
  7.   (setq tag nil);此举也可以省略 或直接用 nil
  8. )
发表于 2009-1-12 16:19:00 | 显示全部楼层

[Post=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
)[/Post]

发表于 2009-1-12 16:37:00 | 显示全部楼层
可不可以改进成:“搜索本图中的所有多重匿名块,并把它们转换成有名块”呢?
发表于 2009-1-12 17:02:00 | 显示全部楼层

当然可以,但是“多重匿名块”这个名词应该是你首创,

你所说的“匿名块”是块定义的概念,而“多重”则是图形实例的概念

 楼主| 发表于 2009-1-12 17:14:00 | 显示全部楼层
多谢caoyin版主!!
 楼主| 发表于 2009-1-12 17:19:00 | 显示全部楼层
本帖最后由 作者 于 2009-1-12 17:21:35 编辑

下面这段代码,是要采集所有图块(包括嵌套块)中的圆心,然后把圆心用多段线连起来,但是对于嵌套块,所取得圆心就偏差了,如何解决,请大师修改一下程序,万分感激!!!!
  1. (defun AllEntityInBlkdef (blk / bn blkdef e typ el )
  2.   (setq bn     (cdr (assoc 2 (entget blk)))
  3. blkdef (tblobjname "block" bn)
  4.   )
  5.   (while (setq e (entnext blkdef))
  6.     (setq typ (cdr (assoc 0 (entget e))))
  7.     (if (= typ "INSERT")
  8.       (setq el (append (AllEntityInBlkdef e) el))
  9.       (setq el (cons e el))
  10.     )
  11.     (setq blkdef e)
  12.   )
  13.   el
  14. )
  15. (defun c:AentinBl (/ i en ss entlst ABentlst) ;bn) if while repeat 三函数 foreach
  16.   (setq ss  (ssget '((0 . "INSERT")))
  17. ABentlst '()
  18.   )
  19.   (if ss
  20.     (repeat (setq i (sslength ss))
  21.       (setq en (ssname ss (setq i (1- i)))
  22.      entlst   (AllEntityInBlkdef en)
  23.      ABentlst (append (list (list (cons en (length entlst)) entlst)) ABentlst)
  24.       )
  25.       ;;(princ (strcat "该块内共有" (itoa (length entlst)) "个实体\n"))
  26.     )
  27.     (princ "*** 你没有选择任何图块 ***")
  28.   )
  29.   (princ ABentlst)
  30.   ;;返回的结果(((第i个图块图元名 . 块内实体图元数) (<图元名: 7ef771b0>...)) ...)
  31. ;;;  (princ)
  32. )
  33. ;; 获取图块(包括嵌套块)内所圆的有圆心坐标,返回圆心坐标组成的表:(pt0 pt1 pt2 ... ptn)
  34. (defun c:GetBlockCircen (/        Par_list      Par_Item
  35.     Par_ent       Par_ent_insPtptcenlst
  36.     Sub_list      Out_LoopN     In_LoopN
  37.     ent        entdata      CenPt
  38.    )
  39.   (setq Par_list (c:AentinBl)
  40. ptcenlst '()
  41.   )
  42.   ;;循环
  43.   (repeat (setq Out_LoopN (length Par_list))
  44.     (setq Par_Item (nth (setq Out_LoopN (1- Out_LoopN)) Par_list)
  45.    Par_ent (car (car Par_Item))
  46.    Par_ent_insPt (cdr (assoc 10 (entget Par_ent)))
  47.    Sub_list (car (cdr Par_Item))
  48.     )
  49.     (foreach ent Sub_list
  50.       (setq entdata (entget ent))
  51.       (if (= (cdr (assoc 0 entdata)) "CIRCLE")
  52. (setq CenPt    (trans (trans (cdr (assoc 10 entdata)) Par_ent 1) 1 0);OCS坐标系(distance Par_ent_insPt '(0 0))
  53.        ptcenlst (append
  54.     ptcenlst
  55.     (list (list (+ (car Par_ent_insPt) (car CenPt))
  56.          (+ (cadr Par_ent_insPt) (cadr CenPt))
  57.          (+ (caddr Par_ent_insPt) (caddr CenPt))
  58.           );仅对单层图块或插入点重合在一点嵌套块适用(等比例图块1:1)
  59.     )
  60.          )
  61. )
  62. ;;取得的是世界坐标值(不一定,要看块的插入点?还是建立块的时候的坐标系情况?),使用的时候需要再转换为用户坐标值
  63. ;;经过测试,取得坐标值,与图块的插入点相关,所以上面加上块的插入点偏移值
  64.       )
  65.     )
  66.   )
  67.   (command "pline"
  68.     (foreach i (trans_pt_0->1 ptcenlst) (command i))
  69. ;;;    ""
  70.   )     ;该语句实现,由点表画线
  71.   (princ ptcenlst)
  72.   (princ)
  73. )
  74. (defun trans_pt_0->1 ( ptlst / )
  75.   (mapcar '(lambda (x) (trans x 0 1)) ptlst)
  76. )
  77. (defun trans_pt_1->0 ( ptlst / )
  78.   (mapcar '(lambda (x) (trans x 1 0)) ptlst)
  79. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-4-30 20:47 , Processed in 0.174752 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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