乐筑天下

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

[编程交流] 更改属性值错误

[复制链接]

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 09:31:28 | 显示全部楼层 |阅读模式
我编译了以下LISP。虽然目前只有一个区块列在顶部,但还有15个区块可以用于我们使用的其他边界。
 
  1. (defun c:AD (/ TodayDate str)
  2. (vl-load-com)                                        ;;; Do not forget to add
  3. (setq blocks
  4.   '(
  5.      "BORDER (ABOVENET) -BRC"
  6.    )
  7. )
  8. (setq str
  9.    (cond
  10.      (
  11.        (eq ""
  12.          (setq str
  13.            (getstring t
  14.              (strcat "\nDate to be Placed <"
  15.                (setq today (menucmd "m=$(edtime,$(getvar,DATE),MO/DD/YY)")) ">: "
  16.              )
  17.            )
  18.          )
  19.        )
  20.        today
  21.      )
  22.      ( str )
  23.    )
  24. )
  25.   (AttribChng blocks "DATE" str)
  26.   (princ "\n ----------------------------------------------")
  27.   (princ (strcat "\n --------- Adjust Date - Version " ADTVerNum " ---------"))
  28.   (princ (strcat "\n ---------------- Date: " str " --------------"))
  29.   (princ "\n ----------------------------------------------")
  30.   (princ)
  31.   )
  32. (defun AttribChng (blk tag val / ss)
  33. (vl-load-com)
  34. (mapcar (function set) '(blk tag)
  35.          (mapcar (function strcase) (list blk tag)))
  36. (setq *doc (cond (*doc) ((vla-get-ActiveDocument
  37.                             (vlax-get-acad-object)))))
  38. (if (ssget "_X" (list '(0 . "INSERT") (cons 2 blocks) '(66 . 1)))
  39.    (progn
  40.      (vlax-for obj (setq ss (vla-get-ActiveSelectionSet *doc))
  41.        (foreach att (vlax-invoke obj 'GetAttributes)
  42.          (if (eq (strcase (vla-get-TagString att)) tag)
  43.            (vla-put-TextString att val))))
  44.      (vla-delete ss))
  45.    (princ "\n** No Blocks Found **"))
  46. (princ))

 
然而,我得到一个错误:
 
错误的参数类型:stringp(“BORDER(overnet)-BRC”)
 
我不太确定如何修复它。
 
谢谢
回复

使用道具 举报

7

主题

143

帖子

136

银币

初来乍到

Rank: 1

铜币
36
发表于 2022-7-6 09:44:33 | 显示全部楼层
试试这个:
  1.   (setq blocks    (eval
  2.     '(
  3.      "BORDER (ABOVENET) -BRC"
  4.     )
  5.   )
  6. )

 
AutoLisp解释器此时正在查找字符串,但它接收的是一个列表。你需要引用变量块吗?或者你可以写下来吗
 
  1. (setq blocks "BORDER (ABOVENET) -BRC")
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 09:54:02 | 显示全部楼层
在第一个代码中,我得到了一个糟糕的函数错误。第二个可行,但我需要找到一种方法,使其适用于包含16个可能边界的列表。目前我们正在使用一个自定义字段,但如果有人进入块编辑器并在那里调整值(这已经是我们的过程一段时间了),它会否定LISP程序。
回复

使用道具 举报

7

主题

143

帖子

136

银币

初来乍到

Rank: 1

铜币
36
发表于 2022-7-6 09:57:31 | 显示全部楼层
我认为问题在于你试图构建的虚线对。
  1. (cons 2 blocks)

在这里,您必须传递一个块名。我不相信你能给出一个名单。在构造选择集时尝试集成OR过滤器。。我理解您试图完成的是从选择集中筛选出那些不在块列表中的块。
  1. (-4 . "<or") (2 . "BLOCK_NAME_01") (2 . "BLOCK_NAME_02") (2 . "BLOCK_NAME_03") (2 . "BLOCK_NAME_15") (-4 . "or>")
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:08:57 | 显示全部楼层
问题是,您从这里获取的子函数仅用于单个块。
 
试试这个:
 
  1. (defun c:AD ( / blocks str today ) (vl-load-com)
  2. (setq blocks
  3.   '(
  4.      "BORDER (ABOVENET) -BRC"
  5.    )
  6. )
  7. (setq str
  8.    (cond
  9.      (
  10.        (eq ""
  11.          (setq str
  12.            (getstring t
  13.              (strcat "\nDate to be Placed <"
  14.                (setq today (menucmd "m=$(edtime,$(getvar,DATE),MO/DD/YY)")) ">: "
  15.              )
  16.            )
  17.          )
  18.        )
  19.        today
  20.      )
  21.      ( str )
  22.    )
  23. )
  24. (ChangeAttribValue blocks "DATE" str)
  25. (princ "\n ----------------------------------------------")
  26. (princ (strcat "\n --------- Adjust Date - Version " ADTVerNum " ---------"))
  27. (princ (strcat "\n ---------------- Date: " str " --------------"))
  28. (princ "\n ----------------------------------------------")
  29. (princ)
  30. )
  31. (defun ChangeAttribValue ( blocklist tag value / ss i e l )
  32. ;; Example By Lee Mac
  33. (setq tag       (strcase tag)
  34.        value     (cons 1 value)
  35.        blocklist (mapcar 'strcase blocklist)
  36.        blocklist (apply 'strcat (cons (car blocklist) (mapcar '(lambda ( x ) (strcat "," x)) (cdr blocklist))))
  37. )
  38. (if (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 blocklist) '(66 . 1))))
  39.    (repeat (setq i (sslength ss))
  40.      (setq e (ssname ss (setq i (1- i))))
  41.      (while
  42.        (eq "ATTRIB"
  43.          (cdr (assoc 0 (setq l (entget (setq e (entnext e))))))
  44.        )
  45.        (if (eq tag (strcase (cdr (assoc 2 l))))
  46.          (entupd
  47.            (cdr
  48.              (assoc -1
  49.                (entmod (subst value (assoc 1 l) l))
  50.              )
  51.            )
  52.          )
  53.        )
  54.      )
  55.    )
  56. )
  57. (princ)
  58. )
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 10:11:17 | 显示全部楼层
所以它可以工作,但这个区块嵌入到另一个区块中,因为我们的边界具有动态可视性,我们将该区块用于24x36和11x17尺寸。随着它的嵌入,它没有改变。仅当它位于图形中最外层的块上时才会更改。
 
如果这意味着什么的话,外部块的名称是“BORDER(overnet)”。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:23:34 | 显示全部楼层
由于它是嵌套的,因此您必须深入了解块定义并更改属性值-这种更改将反映在所有插入中。
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 10:30:55 | 显示全部楼层
你到底是怎么做到的?我只是不知道你的意思。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:32:59 | 显示全部楼层
使用vlax for函数循环块集合中相关块对象中的对象,并使用条件测试属性对象;或者,也可以使用entnext循环浏览块定义中的实体,这些实体可以使用tblobjname函数获取,再次使用条件测试属性实体并继续修改值。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 02:31 , Processed in 0.521153 second(s), 70 queries .

© 2020-2025 乐筑天下

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