Taoyimaier 发表于 2003-4-18 22:25:00

怎样用autolisp而不是vlisp(也就是不要用activex)获取块的属性

现在才发现这个极好的网站,我要把平时遇到的问题一一说完,
现在我要写一个程序,这个程序要提取块的属性出来,然后到excel中成表
由于我们单位的cad都是R14的,所以不能用visual lisp,考虑到用vb,这样的话,
我以前的小程序(函数)(lisp写得)就不能用了,只好寻找lisp访问块属性的方法
听说符号表可以得,是不,但我好像还是无从下手,能不能给个例子,非常感谢

mccad 发表于 2003-4-18 22:54:00

试试吧....

(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))
      ....
      ))

Taoyimaier 发表于 2003-4-19 00:02:00

至江湖一代怪才

本帖最后由 作者 于 2003-4-19 0:02:04 编辑

哎呀,真是江湖一代奇才啊,困扰我一个多月的问题终于得到了解决,还以为必须换语言呢(不过现在已经改成了vba,碰到了在vba论坛中提到的问题了),还有一个问题是,你这样读出的组码表是块参照中除第一个实体以外的所有实体的吧,但是我们怎样判断是否到了这个块中所有实体的最后一个呢,是不是entget本来就有这个判断功能(当到块最后一个实体时,就返回nil),还是必修由我们来控制,否则entnext就可能会返回不属于块中的那些实体的实体名,不过你的代码已经把最核心的问题解决了,剩下的我会想办法的,真是相见恨晚啊,

chg 发表于 2003-4-19 10:24:00

块中的最后一个图元的图元名是SEQEND.

taoyimaier 发表于 2003-4-19 11:16:00

哦,你说的和书上有些相同了,我还问一下

是不是图块不会有空图块的,如果有,有什么特别之处,如果没有,且只有一个实体在图块之中的话,那么(cdar(entget (car (entsel)))的返回图元是不是seqend,还有,关于seqend的介绍,书上写的很少,帮助也不多啊,你能不能给我一个小代码,能读出一个块中的属性值,在命令行显示就可以了,要用到seqend啊,有了网站后,人就难得看书了,呵呵,最后问一下,图元名不是什么<图元名*******>这个样子的吗,怎么突然成了一个符号了,不解,先说谢谢了,给我小代码哦

chg 发表于 2003-4-20 09:49:00

回复。

(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对应的应该称为实体的字符串值,我只是这么叫顺口的。

Taoyimaier 发表于 2003-4-21 00:02:00

嗯,写得非常好,不过,呵呵

你文章里对我体会最深的是你最后的一段评论,我喜欢看
不过给你找了几个毛病,
你的过滤集写错了,点对表前是不要加'号的
还有你的assoc语句离地2前掉了一个'号
最后,我在命令行里看了一下seqend,他是0对应的组码值,
我想seqend也不是图元名,而是图元类型,是吧
图元名一般是-1组码对应的,如果你以后给我解答这些问题,
用词准确些我会好理解,因为我想来认为别人说得都是绝对对的(当我不知道时)
真的谢谢

chg 发表于 2003-4-21 18:06:00

不好意思了。

因为当时确实没有在意,搞的漏洞百出,真是不好意思了!你说的对是0组码对应的是图元类型,-1对应的是图元名。我以后会注意这方面的表达的。
但我对于你说的我程序里的漏洞,我不敢苟同,点对表一样需要 ',即quote函数。另外assoc中的2是不需要用 '的。
不信的话,你可以试试我的代码。

Taoyimaier 发表于 2003-4-21 20:17:00

你说的对,惭愧惭愧

我告错了,点对表是要quote得,是cons这个函数制造点对表时不要quote
还以为自己对表已经很精通得,真是班门弄斧啊,惭愧惭愧

cindy_fisher 发表于 2012-2-9 19:13:44

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
查看完整版本: 怎样用autolisp而不是vlisp(也就是不要用activex)获取块的属性