明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1396|回复: 8

提取块中块的问题

[复制链接]
发表于 2008-5-21 19:45 | 显示全部楼层 |阅读模式
请问在图形中有多个图块~~其中有些图块里还有图块~~(不止两层,某些图块里还包含有图块)
比如:一个图块由两个或以上图块组成~~而这两个或以上图块中又包含有图块~~
不知能否把这些图块中包含的指定图形(如圆形的圆心)提取出来
发表于 2008-5-21 21:06 | 显示全部楼层
当然可以。本论坛有许多类似程序。先搜索下看看。
发表于 2008-5-22 07:58 | 显示全部楼层
编个函数,使用递归...
发表于 2008-5-22 12:30 | 显示全部楼层
本帖最后由 作者 于 2008-5-22 12:36:48 编辑

;;帮你写一个,试试看,提取多重套嵌块中圆的圆心

(defun c:test (/ blkfor en blks lst)
  (defun blkfor (blks obj / ins bn ty p lst)
    (setq ins (vla-get-InsertionPoint obj)
          ins (vlax-safearray->list (vlax-variant-value ins))
          bn  (vla-get-name obj)
    )
    (vlax-for ent (vla-item blks bn)
      (setq ty (vla-get-objectname ent))
      (cond ((= ty "AcDbCircle")
             (setq p   (vla-get-Center ent)
                   p   (vlax-safearray->list (vlax-variant-value p))
                   lst (cons (mapcar '+ ins p) lst)
             )
            )
            ((= ty "AcDbBlockReference")
             (setq lst (append lst
                               (mapcar '(lambda (p) (mapcar '+ ins p))
                                       (blkfor blks ent)
                               )
                       )
             )
            )
      )
    )
    lst
  )
  (if (setq en (entsel "\n选择块: "))
    (progn
      (setq blks (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))))
      (blkfor blks (vlax-ename->vla-object (car en)))
    )
  )
)

 楼主| 发表于 2008-5-22 14:57 | 显示全部楼层
楼上的谢了~!!!
用着不错~!!不知不用VL函数能不能实现这样的功能

(setq blks (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))))
的意思是返回当前选择的图块里的所有子图块吗???
如果是用选择集的话返回的是??????
发表于 2008-5-22 15:12 | 显示全部楼层

(setq blks (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object))))
的意思是返回当前选择的图块里的所有子图块吗???
如果是用选择集的话返回的是??????

;;返回当前文档的所有块定义的VLA集合,跟选择集没有关系

发表于 2008-5-22 15:14 | 显示全部楼层
不用vla函数,用 entnext 也可以实现
 楼主| 发表于 2008-5-23 18:46 | 显示全部楼层
(defun c:zh (/ s s_ent ent s1 tkm pins zty xh wzg)
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setq s (ssget '((0 . "insert"))))
  (setq xh (getint "输入起始序号<1>:"))
  (if (null xh)(setq xh 1))
  (setq wzg (getdist "输入文字高度<400>:"))
  (if (null wzg)(setq wzg 400))
  (repeat (setq s1 (sslength s))
    (setq s_ent (ssname s (setq s1 (1- s1))))
    (setq ent (entget s_ent))
    (setq tkm (cdr (assoc 2 ent)))
    (setq pins (cdr (assoc 10 ent)))
    (zh_a tkm pins)
  )
  (setvar "cmdecho" 1)
  (setvar "osmode" 5)
)

(defun zh_a(tkm1 pins1 / yx bj pins z_ent tkm)
  (setq z_ent (entget (cdr (assoc -2 (tblsearch "block" tkm1)))))
  (if (= (cdr (assoc 0 z_ent)) "circle")
    (progn
      (setq yx (cdr (assoc 10 z_ent)))
      (setq bj (cdr (assoc 40 z_ent)))
      (setq yx (mapcar '+ pins1 yx))
      (command ".text" "tl" (polar (polar yx 0 bj) (/ pi -2) bj) wzg 0 (itoa xh))
      (setq xh (1+ xh))
    )
  )
  (if (= (cdr (assoc 0 z_ent)) "insert")
    (progn
      (setq tkm (cdr (assoc 2 z_ent)))
      (setq pins (mapcar '+ pins1 (cdr (assoc 10 Z_ent))))
      (setq zty (cdr (assoc -2 (tblsearch "block" tkm))))
      (zh_a tkm pins)
      )
    ))

高手帮忙看一下~!!!哪里出问题了~~

发表于 2008-5-25 09:22 | 显示全部楼层

大概看了一下

(if (= (cdr (assoc 0 z_ent)) "circle")...

(if (= (cdr (assoc 0 z_ent)) "insert")...

红色应为大写

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 11:25 , Processed in 0.281734 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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