明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2554|回复: 5

[求助]如何得知任一block内的图元数量

[复制链接]
发表于 2007-4-19 15:49:00 | 显示全部楼层 |阅读模式

请问各位高手,如何藉由autolisp得知任一block内的图元数量?我目前知道的方法就是explode后再一个个数。请问有其它较为便捷的方法吗?谢谢!

发表于 2007-4-19 16:08:00 | 显示全部楼层

先用tblobjname读块定义对象,

然后用entnext遍历该块就行了

注意处理嵌套块就行。

发表于 2007-4-21 02:28:00 | 显示全部楼层

如果炸开,不用一个个数

(command ".explode" (car(entsel)) "")

(sslength(ssget "p"))

发表于 2007-4-21 14:50:00 | 显示全部楼层
  1.   (vla-get-count
  2.     (vla-item
  3.       (vla-get-blocks
  4.         (vla-get-activedocument
  5.           (vlax-get-acad-object)
  6.         )
  7.       )
  8.       (cdr (assoc 2 (entget (car (entsel)))))
  9.     )
  10.   )
复制代码

如果用vlisp则可以这么写。
注意了!可能炸开后的实体数量并不一定是block内的图元数量。
(因为插入块如果是不均匀比例缩放块,则多段线等物体会分解成几个物体-这显然不是我们需要的)
发表于 2010-9-28 23:56:00 | 显示全部楼层
本帖最后由 作者 于 2010-9-30 20:31:44 编辑

这段代码太有价值了。写得很好,我略改一下。

     ;块计数
(defun countblock (/ blockname count)
  (setq blockname (cdr (assoc 2 (entget (car (entsel))))))
  (setq count (vla-get-count (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) blockname)))
  (alert (strcat "块" blockname "组成元素为: " (itoa count) " 个"))
)

 

;;;--------------------------------------------------------------------------------
;;;从块选择集中选择指定块名的对象,并返回结果选择集

(defun C:sbn
       (/ ssObjects listEntityDXF strBlockName intCountSingleBlock)

   (setvar "cmdecho" 0)   ;不显示命令提示

;;;块统计
  (defun intCountSingleBlock (ssOriginal  strTargetBlockName
         /    strEntityName
         listEntityDXF  strBlockName
         intSingleBlockCount
         k
        )
    (setq intSingleBlockCount
    0
   k -1
    )
    (repeat (sslength ssOriginal) ; 循环与所选择的对象数量相等的次数
      (setq strEntityName (ssname ssOriginal (setq k (1+ k))))
     ; strEntityName,取得第k个对象名
      (setq listEntityDXF (entget strEntityName))
      (setq strBlockName (cdr (assoc 2 listEntityDXF)))
      (if (= strBlockName strTargetBlockName)
 (setq intSingleBlockCount (1+ intSingleBlockCount))
      )
    )
    intSingleBlockCount
  )

;;;获取整个图形作为选择集
  (setq ssObjects
  (ssget "X" '((0 . "insert") (100 . "AcDbBlockReference")))
  )     ; 创建选择集 ssObjects
;;;获取块名
  (setq listEntityDXF (entget (car (entsel "\n拾取一个块:"))))
  (setq strBlockName (cdr (assoc 2 listEntityDXF)))
  (setq intCountSingleBlock
  (intCountSingleBlock ssObjects strBlockName)
  )
  (alert (strcat "块" strBlockName "数量为: " (itoa intCountSingleBlock) " 个"))
  (gc)
 (princ)
)

发表于 2010-9-29 00:51:00 | 显示全部楼层
如果希望得到嵌套块:可用如下代码:
  1. (defun c:test (/ *BLK ENT NAM OBJ)
  2.   (setq *BLK
  3.   (vla-get-blocks
  4.     (vla-get-activedocument
  5.       (vlax-get-acad-object)
  6.     )
  7.   )
  8.   )
  9.   (if (setq ent (car (entsel)))
  10.     (progn
  11.       (setq obj (vlax-ename->vla-object ent))
  12.       (setq nam (vla-get-objectname obj))
  13.       (if (= nam "AcDbBlockReference")
  14.         (progn
  15.    (setq nam (vla-get-name obj))
  16.           (princ "\n块内图元数量是(包含嵌套块):")
  17.           (princ (getnum (vla-item *blk nam) *blk))
  18.         )
  19.       )
  20.     )
  21.   )
  22.   (princ)
  23. )
  24. (defun GetNum (obj *BLK  / i name)
  25.   (setq i 0)
  26.   (vlax-for n obj
  27.     (setq name (vla-get-objectname n))
  28.     (setq i (1+ i))
  29.     (if (= name "AcDbBlockReference")
  30.       (setq i (+ (GetNum (vla-item  *blk (vla-get-name n)) *BLK) i -1))
  31.     )
  32.   )
  33.   i
  34. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-2 12:20 , Processed in 0.191553 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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