乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 78|回复: 19

[编程交流] 如何提取第四属性

[复制链接]

4

主题

20

帖子

16

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 10:14:19 | 显示全部楼层 |阅读模式
我试图提取一个块中大约有40个属性的第4个属性的值。该值是指向我希望在单独窗口中打开的网站的路径。
 
我正在提取属性的值。我正在使用我在Jeffery Sanders网站上找到的lisp,现在我正试图调整它以完全满足我的需要。
 
我可以得到前2个属性值(我不需要),所以我尝试用第4个值的请求替换该请求。它不起作用了。有人能帮我吗?
 
  1. (if (setq ent (entsel "\nSelect a Block: "))
  2. (progn
  3.    (setq en (car ent))
  4.    (setq enlist (entget en))
  5.    (setq blkType (cdr(assoc 0 enlist)))
  6.    (if (= blkType "INSERT")
  7.      (progn
  8.        (if(= (cdr(assoc 66 enlist)) 1)
  9.          (progn
  10.             (setq en2(entnext en))
  11.             (setq enlist2(entget en2))
  12.             (while (/= (car (cadar (cdddr 1st (assoc 0 enlist2)) "SEQEND")))
  13.                   (princ "/n ")
  14.      (princ enlist2)
  15.      (setq en2(entnext en2))
  16.      (setq enlist2(entget en2))
  17. )
  18.      )
  19.    ) ; Close the if group code 66=1 statement
  20.   )
  21.   ) ; Close the if block type = "ATTRIB" statement
  22. )
  23. ) ; Close the if an Entity is selected statement.
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 10:18:52 | 显示全部楼层
可以使用第n个函数返回列表中特定位置的项。
 
例如:
 
  1. ;; Get fourth item in a list
  2. (nth 3 <list>)

 
 
 
但是,我建议您不要使用nth,而是使用while语句逐步遍历属性,直到满足一对条件,其中实体是属性,并且属性标记已匹配。
 
例如:
 
  1. ...
  2.      (while
  3.        (and
  4.          (/= (cdr (assoc 0 eData)) "ATTRIB")
  5.          (/= (cdr (assoc 2 eData)) "[color=red]YourTagHere[/color]"))
  6.         (progn
  7.           (setq eName (entnext eName))
  8.           (setq eData (entget eName))))
  9. ...
回复

使用道具 举报

62

主题

466

帖子

404

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
310
发表于 2022-7-6 10:21:52 | 显示全部楼层
这是我不久前写的。轻微修改
 
  1. (defun c:test (/ ent)
  2. (while
  3.    (not
  4.      (and
  5.        (setq ent (car (Nentsel "\nSelect Attribute: ")))
  6.        (eq "ATTRIB" (cdr (assoc 0 (setq ent (entget ent)))))
  7.      )
  8.    )
  9.   (prompt "\n**Please select an attribute to modify!**")
  10. )
  11. (entmod (subst (cons 1 "Cadtutor.net")(assoc 1 ent) ent))
  12. (entupd (cdr (car ent)))
  13. (princ)
  14. )

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

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 10:26:08 | 显示全部楼层
 
 
我相信杰夫会很感激你把他的工作作为“你的”日常工作的基础,但我认为如果你能包括适当的归因(即在代码中给他评分),他可能会更感激你的赞美。。。看起来很专业,你不觉得吗眨眼:
回复

使用道具 举报

4

主题

20

帖子

16

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 10:27:15 | 显示全部楼层
就在我想我明白的时候。。。我读了多一点,困惑又爬回了我大脑的宝座。
 
只是澄清一下——所有属性都是不可见的,我不想更改其中任何一个。我只想能够点击一个块并返回第四个属性的值。
 
RenderMan--我把你的代码插入到我现有的代码中,我认为,是正确的位置。它一直有效,直到我完成下面复制的内容。我正在使用VisualLISP编辑器并逐行运行代码。
 
  1. (if (setq ent (entsel "\nSelect a Block: "))
  2. (progn
  3.    (setq en (car ent))
  4.    (setq enlist (entget en))
  5.    (setq blkType (cdr(assoc 0 enlist)))
  6.    (while
  7.        (and
  8.          (/= (cdr (assoc 0 eData)) "ATTRIB")
  9.          (/= (cdr (assoc 2 eData)) "website"))

 
在这一点之后,我得到了这个错误
  1. error: bad argument type: lentityp nil

 
我知道的仅仅是无法完成任何事情。我想我需要休息一下。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 10:31:48 | 显示全部楼层
请发布包含您的区块的图形(2007文件格式或更旧版本)。
回复

使用道具 举报

4

主题

20

帖子

16

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 10:34:58 | 显示全部楼层
我完全喜欢。让我把这个弄对。
 
  1. ; Original Code from "The AutoCAD Advanced Tutorial: Attributes"
  2. ; www.jeffreypsanders.com
  3. (defun c:blockpath ()
  4. (if (setq ent (entsel "\nSelect a Block: "))
  5. (progn
  6.    (setq en (car ent))
  7.    (setq enlist (entget en))

...代码继续
 
这是一个适当的信用吗?我学习的教程中没有代码的标题或任何内容,因此标题来自网站标题。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

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

使用道具 举报

4

主题

20

帖子

16

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 10:42:21 | 显示全部楼层
 
这是我用于实验的示例文件。我将应用的原始块也有敏感信息,因此必须使用模拟块。
 
测试文档。图纸
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 10:43:17 | 显示全部楼层
试试这个:
 
  1. (defun c:FOO  (/ eName blockObj tagString)
  2. (vl-load-com)
  3. (if (and (setq eName
  4.                  (car (entsel "\n  >>  Select an Attributed Block: ")))
  5.           (= "INSERT" (cdr (assoc 0 (entget eName))))
  6.           (setq blockObj (vlax-ename->vla-object eName))
  7.           (vlax-method-applicable-p blockObj 'getattributes))
  8.    (foreach x  (vlax-invoke blockObj 'getattributes)
  9.      (if (= "WEBSITE" (setq tagString (vla-get-tagstring x)))
  10.        (prompt
  11.          (strcat "\n  <!>  Attribute Value = "
  12.                  (vla-get-textstring x)
  13.                  "  <!> ")))))
  14. (princ))

 
 
编辑:是的,这个代码看起来非常不同!哈哈,没关系,我选择用ActiveX来做这个,但这两种方法都可以。我只是觉得考虑到函数术语,这会更容易理解。
 
希望这有帮助!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 20:58 , Processed in 0.499491 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表