如何提取第四属性
我试图提取一个块中大约有40个属性的第4个属性的值。该值是指向我希望在单独窗口中打开的网站的路径。我正在提取属性的值。我正在使用我在Jeffery Sanders网站上找到的lisp,现在我正试图调整它以完全满足我的需要。
我可以得到前2个属性值(我不需要),所以我尝试用第4个值的请求替换该请求。它不起作用了。有人能帮我吗?
(if (setq ent (entsel "\nSelect a Block: "))
(progn
(setq en (car ent))
(setq enlist (entget en))
(setq blkType (cdr(assoc 0 enlist)))
(if (= blkType "INSERT")
(progn
(if(= (cdr(assoc 66 enlist)) 1)
(progn
(setq en2(entnext en))
(setq enlist2(entget en2))
(while (/= (car (cadar (cdddr 1st (assoc 0 enlist2)) "SEQEND")))
(princ "/n ")
(princ enlist2)
(setq en2(entnext en2))
(setq enlist2(entget en2))
)
)
) ; Close the if group code 66=1 statement
)
) ; Close the if block type = "ATTRIB" statement
)
) ; Close the if an Entity is selected statement. 可以使用第n个函数返回列表中特定位置的项。
例如:
;; Get fourth item in a list
(nth 3 <list>)
但是,我建议您不要使用nth,而是使用while语句逐步遍历属性,直到满足一对条件,其中实体是属性,并且属性标记已匹配。
例如:
...
(while
(and
(/= (cdr (assoc 0 eData)) "ATTRIB")
(/= (cdr (assoc 2 eData)) "YourTagHere"))
(progn
(setq eName (entnext eName))
(setq eData (entget eName))))
...
这是我不久前写的。轻微修改
(defun c:test (/ ent)
(while
(not
(and
(setq ent (car (Nentsel "\nSelect Attribute: ")))
(eq "ATTRIB" (cdr (assoc 0 (setq ent (entget ent)))))
)
)
(prompt "\n**Please select an attribute to modify!**")
)
(entmod (subst (cons 1 "Cadtutor.net")(assoc 1 ent) ent))
(entupd (cdr (car ent)))
(princ)
)
只需单击要修改的属性
*只是为了澄清*
“当我说这更好”时,我在谈论我的代码和我编辑的原因。
我相信杰夫会很感激你把他的工作作为“你的”日常工作的基础,但我认为如果你能包括适当的归因(即在代码中给他评分),他可能会更感激你的赞美。。。看起来很专业,你不觉得吗眨眼: 就在我想我明白的时候。。。我读了多一点,困惑又爬回了我大脑的宝座。
只是澄清一下——所有属性都是不可见的,我不想更改其中任何一个。我只想能够点击一个块并返回第四个属性的值。
RenderMan--我把你的代码插入到我现有的代码中,我认为,是正确的位置。它一直有效,直到我完成下面复制的内容。我正在使用VisualLISP编辑器并逐行运行代码。
(if (setq ent (entsel "\nSelect a Block: "))
(progn
(setq en (car ent))
(setq enlist (entget en))
(setq blkType (cdr(assoc 0 enlist)))
(while
(and
(/= (cdr (assoc 0 eData)) "ATTRIB")
(/= (cdr (assoc 2 eData)) "website"))
在这一点之后,我得到了这个错误
error: bad argument type: lentityp nil
我知道的仅仅是无法完成任何事情。我想我需要休息一下。 请发布包含您的区块的图形(2007文件格式或更旧版本)。 我完全喜欢。让我把这个弄对。
; Original Code from "The AutoCAD Advanced Tutorial: Attributes"
; www.jeffreypsanders.com
(defun c:blockpath ()
(if (setq ent (entsel "\nSelect a Block: "))
(progn
(setq en (car ent))
(setq enlist (entget en))
...代码继续
这是一个适当的信用吗?我学习的教程中没有代码的标题或任何内容,因此标题来自网站标题。 不用担心,这就足够了。
再说一次,我当然不是想对你唠叨。如果你没有指明你是从他的网站上得到的,我永远也不会知道。当你花时间在你的作品描述中赞扬他时,我觉得你可能觉得在这个庄园这样做是合适的。
::回到主题:
一旦你发布你的帖子,我(或更聪明的人!)我可以试着帮你。
这是我用于实验的示例文件。我将应用的原始块也有敏感信息,因此必须使用模拟块。
测试文档。图纸 试试这个:
(defun c:FOO(/ eName blockObj tagString)
(vl-load-com)
(if (and (setq eName
(car (entsel "\n>>Select an Attributed Block: ")))
(= "INSERT" (cdr (assoc 0 (entget eName))))
(setq blockObj (vlax-ename->vla-object eName))
(vlax-method-applicable-p blockObj 'getattributes))
(foreach x(vlax-invoke blockObj 'getattributes)
(if (= "WEBSITE" (setq tagString (vla-get-tagstring x)))
(prompt
(strcat "\n<!>Attribute Value = "
(vla-get-textstring x)
"<!> ")))))
(princ))
编辑:是的,这个代码看起来非常不同!哈哈,没关系,我选择用ActiveX来做这个,但这两种方法都可以。我只是觉得考虑到函数术语,这会更容易理解。
希望这有帮助!
页:
[1]
2