Alaskachick 发表于 2022-7-6 10:14:19

如何提取第四属性

我试图提取一个块中大约有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.

BlackBox 发表于 2022-7-6 10:18:52

可以使用第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))))
...

Lt Dan's l 发表于 2022-7-6 10:21:52

这是我不久前写的。轻微修改
 

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


 
只需单击要修改的属性
 
*只是为了澄清*
“当我说这更好”时,我在谈论我的代码和我编辑的原因。

BlackBox 发表于 2022-7-6 10:26:08

 
 
我相信杰夫会很感激你把他的工作作为“你的”日常工作的基础,但我认为如果你能包括适当的归因(即在代码中给他评分),他可能会更感激你的赞美。。。看起来很专业,你不觉得吗眨眼:

Alaskachick 发表于 2022-7-6 10:27:15

就在我想我明白的时候。。。我读了多一点,困惑又爬回了我大脑的宝座。
 
只是澄清一下——所有属性都是不可见的,我不想更改其中任何一个。我只想能够点击一个块并返回第四个属性的值。
 
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
 
我知道的仅仅是无法完成任何事情。我想我需要休息一下。

BlackBox 发表于 2022-7-6 10:31:48

请发布包含您的区块的图形(2007文件格式或更旧版本)。

Alaskachick 发表于 2022-7-6 10:34:58

我完全喜欢。让我把这个弄对。
 

; 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))
...代码继续
 
这是一个适当的信用吗?我学习的教程中没有代码的标题或任何内容,因此标题来自网站标题。

BlackBox 发表于 2022-7-6 10:36:32

不用担心,这就足够了。
 
再说一次,我当然不是想对你唠叨。如果你没有指明你是从他的网站上得到的,我永远也不会知道。当你花时间在你的作品描述中赞扬他时,我觉得你可能觉得在这个庄园这样做是合适的。
 
::回到主题:
 
一旦你发布你的帖子,我(或更聪明的人!)我可以试着帮你。

Alaskachick 发表于 2022-7-6 10:42:21

 
这是我用于实验的示例文件。我将应用的原始块也有敏感信息,因此必须使用模拟块。
 
测试文档。图纸

BlackBox 发表于 2022-7-6 10:43:17

试试这个:
 

(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
查看完整版本: 如何提取第四属性