我在AutoCAD绘图中有几个(很多)对象,每个对象在其首选项中都有相同的属性字段。现在我想用一个数字填充这个属性字段(对象1 - 数字1,对象2 - 数字2,依此类推)。手动输入数字是非常耗时的,因此我想问你是否有针对这个问题的自动化方法。
提前多多感谢!
答案 0 :(得分:4)
以下程序是一个非常简单的示例,它将提示您编号的属性标记和一个从中开始编号的整数,然后将连续提示您选择要编号的属性块引用,增加数字每个有效选择一个:
(defun c:attnum ( / ent enx num tag )
(if (/= "" (setq tag (strcase (getstring "\nSpecify attribute tag <exit>: "))))
(progn
(setq num (cond ((getint "\nSpecify starting number <1>: ")) (1)))
(while
(not
(progn
(setvar 'errno 0)
(setq ent (car (entsel (strcat "\nSelect block number " (itoa num) " <exit>: "))))
(cond
( (= 7 (getvar 'errno))
(prompt "\nMissed, try again.")
)
( (null ent))
( (/= "INSERT" (cdr (assoc 0 (setq enx (entget ent)))))
(prompt "\nThe selected object is not a block.")
)
( (/= 1 (cdr (assoc 66 enx)))
(prompt "\nThe selected block is not attributed.")
)
( (progn
(setq ent (entnext ent)
enx (entget ent)
)
(while
(and
(= "ATTRIB" (cdr (assoc 0 enx)))
(/= tag (strcase (cdr (assoc 2 enx))))
)
(setq ent (entnext ent)
enx (entget ent)
)
)
(/= "ATTRIB" (cdr (assoc 0 enx)))
)
(prompt (strcat "\nThe selected block does not contain the attribute \"" tag "\"."))
)
( (entmod (subst (cons 1 (itoa num)) (assoc 1 enx) enx))
(entupd ent)
(setq num (1+ num))
nil
)
( (prompt "\nUnable to edit attribute value."))
)
)
)
)
)
)
(princ)
)
.lsp
(确保Save As Type
设置为All Files (*.*)
)。APPLOAD
。Load
加载程序。APPLOAD
对话框。ATTNUM
以运行程序。我可以在How to Run an AutoLISP Program的教程中找到类似的说明。
如果您希望为在AutoCAD中打开的每个新图纸或现有图纸自动加载程序,请参阅我在Loading Programs Automatically上的教程。
除上述内容外,您可能还对以下程序感兴趣:
我的Incremental Numbering Suite应用程序将提供更广泛的选项集,允许您自定义编号格式,允许使用前缀和附件。后缀,多个递增部分和字母数字递增。
您可以使用此应用程序对现有的属性块引用进行编号,方法是键入&#39; R&#39;或者&#39; r&#39;在对象放置期间在AutoCAD命令行输入替换模式。
我的Incremental Array应用程序允许您在排列属性块引用(或其他对象)时自动递增属性值。
答案 1 :(得分:1)
此 lsp 可帮助您为任何块属性添加前缀或后缀,但同时对所有块,我遇到了与您类似的情况,因此我将上面的 attnum.lsp 与此 Presuf.lsp 结合起来。
首先使用 attnum 将标签字段设置为递增数字 1、2、3、4 等。然后隔离对象并运行presuf,指明是要添加的后缀还是前缀,指明所需的值,然后选择所有对象。
(defun c:presuf ( / as el en i ss str typ )
(initget "Prefix Suffix")
(setq typ (cond ((getkword "\nAdd Prefix or Suffix? [Prefix/Suffix] <Prefix>: ")) ("Prefix")))
(setq str (getstring t (strcat typ " to Add: ")))
(if (setq ss (ssget '((0 . "INSERT") (66 . 1))))
(repeat (setq i (sslength ss))
(setq en (ssname ss (setq i (1- i))))
(while (eq "ATTRIB" (cdr (assoc 0 (setq el (entget (setq en (entnext en)))))))
(setq as (cdr (assoc 1 el)))
(if (eq "Prefix" typ)
(if (not (wcmatch as (strcat str "*")))
(entmod (subst (cons 1 (strcat str as)) (assoc 1 el) el))
)
(if (not (wcmatch as (strcat "*" str)))
(entmod (subst (cons 1 (strcat as str)) (assoc 1 el) el))
)
)
)
)
)
(princ)
)
答案 2 :(得分:0)
如果我有属性标记或阻止名称,我可以尝试使用自定义解决方案回答您的问题,但是,我相信您可以找到所需的全部here(BFind或Global Attribute Extractor & Editor)。