怎样用autolisp而不是vlisp(也就是不要用activex)获取块的属性
现在才发现这个极好的网站,我要把平时遇到的问题一一说完,现在我要写一个程序,这个程序要提取块的属性出来,然后到excel中成表
由于我们单位的cad都是R14的,所以不能用visual lisp,考虑到用vb,这样的话,
我以前的小程序(函数)(lisp写得)就不能用了,只好寻找lisp访问块属性的方法
听说符号表可以得,是不,但我好像还是无从下手,能不能给个例子,非常感谢
试试吧....
(setq head(entget(setq head_t(car(entsel "\n选择图块:")))))(if (= (cdr(assoc 0 head)) "INSERT")
(progn
(setq head_gxh(entget(entnext(cdr(car head)))))
(setq head_gxm(entget(entnext(cdr(car head_gxh)))))
....
(setq gxh_1(assoc 1 head_gxh))
(setq gxm_1(assoc 1 head_gxm))
....
(setq gxdh (cdr gxh_1))
(setq gxmc (cdr gxm_1))
....
))
至江湖一代怪才
本帖最后由 作者 于 2003-4-19 0:02:04 编辑哎呀,真是江湖一代奇才啊,困扰我一个多月的问题终于得到了解决,还以为必须换语言呢(不过现在已经改成了vba,碰到了在vba论坛中提到的问题了),还有一个问题是,你这样读出的组码表是块参照中除第一个实体以外的所有实体的吧,但是我们怎样判断是否到了这个块中所有实体的最后一个呢,是不是entget本来就有这个判断功能(当到块最后一个实体时,就返回nil),还是必修由我们来控制,否则entnext就可能会返回不属于块中的那些实体的实体名,不过你的代码已经把最核心的问题解决了,剩下的我会想办法的,真是相见恨晚啊,
块中的最后一个图元的图元名是SEQEND.
哦,你说的和书上有些相同了,我还问一下
是不是图块不会有空图块的,如果有,有什么特别之处,如果没有,且只有一个实体在图块之中的话,那么(cdar(entget (car (entsel)))的返回图元是不是seqend,还有,关于seqend的介绍,书上写的很少,帮助也不多啊,你能不能给我一个小代码,能读出一个块中的属性值,在命令行显示就可以了,要用到seqend啊,有了网站后,人就难得看书了,呵呵,最后问一下,图元名不是什么<图元名*******>这个样子的吗,怎么突然成了一个符号了,不解,先说谢谢了,给我小代码哦回复。
(defun change_att(blkname tag value layname / ss ent n ctrl)(setvar "cmdecho" 0)
(setq ss (ssget (list '(-4 . "<and") '(0 . "INSERT") (cons 2 blkname) '(66 . 1) '(-4 . "and>")))
n 0
ctrl T)
(if ss
(while (setq ent (ssname ss n))
(while ctrl
(setq ent (entnext ent))
(if (= (cdr(assoc 2 (entget ent))) tag)
(progn
(command "-attedit" "" blkname tag value ent "l" layname "")
(setq ctrl nil)
)
(setq ent (entnext ent))
)
)
(setq n (1+ n) ctrl T)
)
)
(setvar "cmdecho" 1)
(princ)
)
这是我以前在这里贴的一个代码,批量修改块中的属性值。你可以看看。
只有具有属性的块才有seqend图元,且是块的最后一个图元。你如果找到了这个图元则说明块定义已经结束了。块可以没有任何图元组成,只是我们这样做没有意义。还有图元名的说法你说的是对的,组码1对应的应该称为实体的字符串值,我只是这么叫顺口的。
嗯,写得非常好,不过,呵呵
你文章里对我体会最深的是你最后的一段评论,我喜欢看不过给你找了几个毛病,
你的过滤集写错了,点对表前是不要加'号的
还有你的assoc语句离地2前掉了一个'号
最后,我在命令行里看了一下seqend,他是0对应的组码值,
我想seqend也不是图元名,而是图元类型,是吧
图元名一般是-1组码对应的,如果你以后给我解答这些问题,
用词准确些我会好理解,因为我想来认为别人说得都是绝对对的(当我不知道时)
真的谢谢
不好意思了。
因为当时确实没有在意,搞的漏洞百出,真是不好意思了!你说的对是0组码对应的是图元类型,-1对应的是图元名。我以后会注意这方面的表达的。但我对于你说的我程序里的漏洞,我不敢苟同,点对表一样需要 ',即quote函数。另外assoc中的2是不需要用 '的。
不信的话,你可以试试我的代码。
你说的对,惭愧惭愧
我告错了,点对表是要quote得,是cons这个函数制造点对表时不要quote还以为自己对表已经很精通得,真是班门弄斧啊,惭愧惭愧 chg 发表于 2003-4-20 09:49 static/image/common/back.gif
(defun change_att(blkname tag value layname / ss ent n ctrl)
(setvar "cmdecho" 0)
(setq ss ( ...
请教如何使用-attedit的方法:
试了几把都产生错误了,不知道在select attribute那选择什么,谢谢。
Command: -attedit
Edit attributes one at a time? <Y>:
Enter block name specification <*>: dcs-1
Enter attribute tag specification <*>: tag
Enter attribute value specification <*>: function
Select Attributes: Specify opposite corner:
0 found
Select Attributes: Specify opposite corner:
0 found
Select Attributes:
0 attributes selected.*Invalid*
页:
[1]
2