明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1720|回复: 8

请教:block中的图元如何提取

[复制链接]
发表于 2005-7-8 17:06:00 | 显示全部楼层 |阅读模式
刚学lisp不久,对图元群码的功能很感兴趣,却有一个问题始终不得要领: 画了两条交叉直线,建立了一个block,名为“1” 在vlisp的命令控制台输入(setq block (tblnext "Block" 1)) 获得((0 . "BLOCK") (2 . "1") (70 . 0) (10 0.0 0.0 0.0) (-2 . <Entity name: 7efb9f98>)) 获得的应该是非图元对象"BLOCK" 再输入(setq x(entget(cdr (assoc -2 block)))) 想获得它的名称参照 结果得到了((-1 . <Entity name: 7efb9f98>) (0 . "LINE") (330 . <Entity name: 7efb9f80>) (5 . "EB") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbLine") (10 125.684 167.352 0.0) (11 97.9638 82.7115 0.0) (210 0.0 0.0 1.0))
是一个直线图元,按理说应该是block中两条直线的一条 但是我把block炸开单独提取的直线属性却是 ((-1 . <Entity name: 7ec541c0>) (0 . "LINE") (330 . <Entity name: 7efb9cf8>) (5
. "128") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 .
"AcDbLine") (10 125.684 167.352 0.0) (11 97.9638 82.7115 0.0) (210 0.0 0.0 1.0)) 以及 ((-1 . <Entity name: 7ec541e8>) (0 . "LINE") (330 . <Entity name: 7efb9cf8>) (5
. "12D") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 .
"AcDbLine") (10 77.1736 155.81 0.0) (11 142.624 91.1755 0.0) (210 0.0 0.0 1.0)) 看样子先前找到的图元并不是这个block含的直线,如果我想编辑block中的图元,那么在不用炸开block的情况下怎么找到block里面所含的所有图元呢,请高手指教,万分感谢
发表于 2005-7-8 19:26:00 | 显示全部楼层
你的概念有的混乱
 楼主| 发表于 2005-7-8 23:56:00 | 显示全部楼层
这样啊,那还请不吝赐教,帮忙纠正一下错误概念
发表于 2005-7-9 09:29:00 | 显示全部楼层
一个INSERT对象是对BLOCK的引用,如果炸开了,就跟BLOCK无关,又要保证原来引用是的对象存在,就重新生成了对象...


你想想如果多个引用都炸开,按你的想法,那不是有多个名字相同的对象了


你的前部分说的都很正确,就是"但是"以后就出现了概念混淆了
 楼主| 发表于 2005-7-9 14:17:00 | 显示全部楼层
哦,原来是这样的啊,多谢meflying了 可是在我先前定义的那个非图元对象"BLOCK"里面,明明有两条直线
我为什么只能找到一条直线的属性呢,另一条如何找到,如果我想对这个非图元对象"BLOCK"所含的所有图元对象的某些属性进行替换(比如换颜色或者图层),如何实现呢。
发表于 2005-7-9 15:37:00 | 显示全部楼层
参考entnext函数介绍
发表于 2005-7-9 20:58:00 | 显示全部楼层
用tblobjname得到图元名,,再Entnext去找,然后Entget数据列表去修改


(setq en(tblobjname "block" "1"))


(entget(entnext en))


(entget(entnext(entnext en)))
发表于 2005-7-10 11:30:00 | 显示全部楼层
如果定义的块里面图元很多,用ENTNEXT函数查找那不是很麻烦。例如我定义了带标题栏(含属性)的图框这样一个块,如果要找到里面的属性用entnext话,真是浪费时间!!!有没有更快的方法?????
发表于 2005-7-10 15:45:00 | 显示全部楼层
entnext 会浪费时间? 反正是计算机在运行,一秒钟的时间也不要的啊 (defun c:t1 (/ en)
(setq en (car (entsel "请选择一个图框:\n")))
(setq attr_DWGNO (get_attribute en "DWGNO"))
(setq attr_DATE (get_attribute en "DATE"))
)
(defun get_attribute (en tag_name / flag en_data retval)
(setq flag 1)
(while (= 1 flag)
(setq en (entnext en))
(setq en_data (entget en))
;;;到末尾 或者 找到 了就 停止循环
(if (or (equal (cons 0 "SEQEND") (assoc 0 en_data)) (equal (cons 2 tag_name) (assoc 2 en_data)))
(progn (setq flag 0) (setq retval (cdr (assoc 1 en_data))))
)
)
;;;返回
retval
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 17:38 , Processed in 0.175876 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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