明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2320|回复: 3

[提问] 请教如何可以用所选的块根据名称查询区域内所选块的数量

[复制链接]
发表于 2014-4-8 00:50:48 | 显示全部楼层 |阅读模式
下面这个只能选择全部对象,但是我想要先选择块,然后记住块的名字,再选择一块区域,根据块的名字查找块的数量 。

(princ "统计块数量请按tt")
(defun c:tt()
(vl-load-com)
(if (setq Ent (entsel))
     (progn
      ;转换成vla对象
      (setq Obj (vlax-ename->vla-object (car Ent)))
      ;获取块名称
      (setq BlkName (vla-get-effectivename Obj))
      ;根据块名称对整个图纸中符合条件的块建立选择集
      (setq en (ssget "X" (list (cons 0 "INSERT")(cons 2 BlkName))))
      ;获得选择集中图元的个数
      (setq sumen (sslength en))
      ;选中选择集
      (sssetfirst nil nil)
      (sssetfirst nil en)
      ;打印
      (print (strcat "块参照—>名称:"  BlkName ))
      (print (strcat "      —>共计:【" (rtos sumen) "】个;其中:"))
      ;中间变量ii赋初值0,建立空表集jh1
      (setq ii 0 jh1 nil)
      ;对每个块提取属性值
      (repeat sumen
     ;依次提取选择集每个图元名称
            (setq Ent (ssname en ii) ii (+ 1 ii))
     ;将图元名称转换为vla对象
            (setq Obj (vlax-ename->vla-object Ent))
            ;判断是否是属性块
            (if (and (= (vla-get-objectname Obj) "AcDbBlockReference") (= (vla-get-hasattributes Obj) :vlax-true))
                (progn
                 ;提取属性对象
                 (setq Objatt (vlax-safearray->list (vlax-variant-value (vla-getattributes Obj)))
                      ;提取属性值,该属性值为表一个表存在
                      Attstring (mapcar 'vla-get-textstring Objatt)
                  )
   ;将属性值表连接成一个字符串
          (setq jh1 (cons (vl-princ-to-string  Attstring) jh1))
  );内progn结束
             );结束if
        );结束repeat
      );结束progn
);结束if
;调用函数
(dd jh1)
);函数结束

(defun dd(jh / i j )
     (setq i (length jh))
     (while(> i 0)
           (setq ys (car jh))
           (if(member ys jh)
              (setq jh (vl-remove ys jh))
            );结束IF
           (setq j (length jh))
           (print (strcat "            —>" ys ":" (rtos (- i j))))
           (setq i j)
           (princ)
     );结束while
);结束函数

发表于 2014-4-9 02:02:00 | 显示全部楼层
你要得到那个区域的边界点坐标表pt
另外(setq BlkName (cdr(assoc 2(entget(car Ent)))))就行,没必要为一个块名称用VLA
 (setq en (ssget "X" (list (cons 0 "INSERT")(cons 2 BlkName))))
改成(setq en(ssget"WP"(list'(0 . "INSERT")(cons 2 BlkName))))
发表于 2014-4-9 08:37:17 | 显示全部楼层
  1. (defun c:tt ()
  2. (if (and (princ "\n选择块: ")
  3. (setq s1 (ssget ":s" '((0 . "INSERT")))))
  4.   (sslength (ssget (list '(0 . "INSERT") (assoc 2 (entget(ssname s1 0))))))
  5. )
  6. )
 楼主| 发表于 2014-4-17 00:01:53 | 显示全部楼层
llsheng_73 发表于 2014-4-9 02:02
你要得到那个区域的边界点坐标表pt
另外(setq BlkName (cdr(assoc 2(entget(car Ent)))))就行,没必要为一 ...

谢谢,我试试看先。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 21:18 , Processed in 0.177642 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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