更改块中的属性
好的,首先我Lisp程序。我的CAD管理课程向我们介绍了其中的一些内容,我还成功地创建了一些程序。也就是说,我在使用这段代码时遇到了不少麻烦。我们的教授提供了大部分/全部信息,我们必须通过标签修改它以更改其他属性。(defun C:chatts()
(setq Blk (ssget "X" '((2 . "AttributeTest"))))
(setq BlkName (ssname blk 0))
(defun attsearch()
(setq TagSearch (entnext BlkName))
);;defun
(attsearch)
(setq TagFound (cdr(assoc 2(entget BlkName))))
(while (/= TagFound "DWG_TITLE")
(setq TagSearch (entnext TagSearch))
(setq TagFound (cdr(assoc 2 (entget TagSearch))))
);;while
(setq old (assoc 1 (entget TagSearch)))
(setq new (cons 1 "Attribute Lisp"))
(setq NewList (subst new old (entget TagSearch)))
(entmod NewList)
(entupd (cdr (assoc -1 (entget TagSearch))))
);;defun
他说,这主要是简单地重复代码,并将“TagFound”更改为其他属性标记,但无论出于何种原因,每次尝试都失败了。重复从哪里开始和结束?我认为这是一个“我已经看了太久”的问题。
谢谢你的帮助。
刻痕 毕竟这是一个家庭作业。所以一个提示就足够了:
Tagsearch变量的计算结果为零
TagFound变量结果的blockname不是标记名 嗯。也许我应该澄清一下。这是为了更改和插入块的属性。
LISP可以正常工作。我只是无法确定重复部分的开始。
此外,教授允许使用外部资源,因为从技术上讲,这不是一门LISP课程,而且我自己自学了大部分内容,所以没有必要因为这是“家庭作业”而犹豫。
抱歉,尼克,无论如何,所以问题是通过选择迭代正确吗? 不确定这是否是问题所在。基本上,根据我的理解,我会将代码的一部分从say,(attsearch)复制到末尾,并将TagFound“DWG\u TITLE”更改为TagFound“COURSE\u NAME”,当然也会将相应的cons 1“Attribute Lisp”更改为cons 1“CAD Management”,重复标题栏中的所有标记。正如我所说的,他提到了一个简单的复制和粘贴,只需要很少的修改就可以完成。至少我是这样做的。
这有意义吗?对不起,有什么困惑。
谢谢
刻痕 “重复”开始于
(while (/= TagFound "DWG_TITLE")
这一行,但它有嵌套语句,在查看(while)循环时必须考虑这些语句。
(setq TagSearch (entnext TagSearch))
(setq TagFound (cdr(assoc 2 (entget TagSearch))))
);;while
不会为你做这一切,但这应该会有所帮助 供参考
(while)
(if)
(repeat)
是迭代(逐步)代码的常见方法吗 为了防止程序“崩溃”,这里有一种方法可以使用您已有的代码行“循环”。
(defun C:chatts ()
(defun attsearch () (setq TagSearch (entnext BlkName))) ;;defun
(if (setq Blk (ssget "X" '((2 . "AttributeTest")(66 . 1))))
(repeat (sslength blk)
(setq BlkName (ssname blk 0))
(attsearch)
(setq TagFound (cdr (assoc 2 (entget BlkName))))
(if (while (and (/= TagFound "DWG_TITLE")
(setq TagSearch (entnext TagSearch))
)
(setq TagFound (cdr (assoc 2 (entget TagSearch))))
)
;;while
(progn
(setq old (assoc 1 (entget TagSearch)))
(setq new (cons 1 "Attribute Lisp"))
(setq NewList (subst new old (entget TagSearch)))
(entmod NewList)
(entupd (cdr (assoc -1 (entget TagSearch))))
)
)
(ssdel BlkName Blk)
)
)
)
哎呀。太晚了,我已经发布了代码,OP说没有必要保留。
粗体颜色的文本是您需要更改的“内容”,以用于另一个标记名和字符串值。
但是,您可以将函数更改为接受参数
(defun chatts (tag str)
(defun attsearch () (setq TagSearch (entnext BlkName))) ;;defun
(if (setq Blk (ssget "X" '((2 . "AttributeTest")(66 . 1))))
(repeat (sslength blk)
(setq BlkName (ssname blk 0))
(attsearch)
(setq TagFound (cdr (assoc 2 (entget BlkName))))
(if (while (and (/= TagFound tag)
(setq TagSearch (entnext TagSearch))
)
(setq TagFound (cdr (assoc 2 (entget TagSearch))))
)
;;while
(progn
(setq old (assoc 1 (entget TagSearch)))
(setq new (cons 1 str))
(setq NewList (subst new old (entget TagSearch)))
(entmod NewList)
(entupd (cdr (assoc -1 (entget TagSearch))))
)
)
(ssdel BlkName Blk)
)
)
)
(chatts“ANOTHERTAG”“另一个字符串值”)
HTH公司 谢谢你的帮助!我会仔细看看这些东西,看看它能给我带来什么。
刻痕
很高兴我们能提供帮助,因为我正在再次阅读您的帖子,如果您需要单步浏览标签名称。您可以使用我发布的sub来指定标记及其相应的值。
(foreach itm '(("DWG_TITLE" "Attribute Lisp")("COURSE_NAME" "CAD Management"))
(chatts (car itm)(cadr itm)))
HTH公司
页:
[1]
2