单属性编辑LISP
大家好,我只是需要一些帮助来编辑我在浏览网页时发现的一个例程,这将非常有用。我希望我的CAD人员能够在命令行中键入他们的缩写,并自动更改图形中的修订缩写。这些首字母位于标题栏中(名称是随机的,因为多年来业余CAD管理员对“标准”一无所知),因此我想将该块视为通配符。然后我想在块中搜索标记“REVBY”,然后我想搜索的首字母是通配符。接下来,我想用运行代码的CAD操作员的首字母替换这些值。一旦我运行它,我将为它们各自的首字母进行自定义。请在下面查看。我卡住了
(defun changeAttribValue (ent atttag oldval newval / entl)
(while (and ent (/= "SEQEND" (cdr (assoc 0 (setq entl (entget ent))))))
(and (= atttag (cdr (assoc 2 entl)))
(= oldval (cdr (assoc 1 entl))) ;<- could use WCMATCH instead
(entmod (subst (cons 1 newval) (assoc 1 entl) entl))
(entupd ent)
(mapcar 'princ (list "\n" oldval " -> " newval))
)
(setq ent (entnext ent))
)
)
(defun C:TJM (/ ss a attag bname oldval newval)
(and (/= "" (setq bname "*"))
(/= "" (setq attag "REVBY"))
(/= "" (setq oldval "*"))
(/= "" (setq newval "T.J.M."))
(setq a0
ss (ssget "X" (list '(0 . "INSERT") '(66 . 1) (cons 2 bname)))
)
(repeat (sslength ss)
(changeAttribValue (ssname ss a) attag oldval newval)
(setq a (1+ a))
)
)
) 什么是bname变量值?我认为它是零-所以ssget不会被创建 嘿,马克,谢谢你的回复,我已经尝试了你修改的代码,但没有结果。唯一不同的是它在命令行返回“1 found”,没有对REVBY标记的属性值进行更改。
嘿,kpblc,谢谢你的来电。bname变量是通配符,因为并非每个标题栏在每个图形中的名称都相同。有时是TBLOCK、BLOCKT或ASDFG。这就是为什么我决定通配符块名,然后在该块中搜索标记名为REVBY的属性标记。任何其他帮助都将不胜感激。我会继续评估。 这是可以工作的原始代码,但它会提示用户输入块名、标记名、旧值和新值。这违背了目的。我希望我的人能够键入他们的首字母(我将复制他们各自的代码),它会自动更新REVBY首字母,无论块名是什么,他们的首字母。自动执行一条命令,无需提示。
(defun changeAttribValue ( ent atttag oldval newval / entl )
(while (and ent (/= "SEQEND" (cdr (assoc 0 (setq entl (entget ent))))))
(and (= atttag (cdr (assoc 2 entl)))
(wcmatch oldval (cdr (assoc 1 entl)))
(entmod (subst (cons 1 newval) (assoc 1 entl) entl))
(entupd ent)
)
(setq ent (entnext ent))
)
)
(defun C:TJM ( / ss a attag bname oldval newval )
(and (/= "" (setq bname "*"))
(/= "" (setq attag "REVBY"))
(/= "" (setq oldval "*"))
(/= "" (setq newval "T.J.M."))
(setq a0
ss (ssget "_X" (list '(0 . "INSERT") '(66 . 1) (cons 2 bname)))
)
(not (equal '(nil nil) (sssetfirst nil ss)))
(setq ss (ssget "_:L"))
(sssetfirst nil nil)
(repeat (sslength ss)
(changeAttribValue (ssname ss a) attag oldval newval)
(setq a (1+ a))
)
)
(princ)
)
-大卫 漂亮的工作善良的先生! 不客气。我倾向于采取一种过于简单的方法-大卫 可能为首字母添加此方法,然后只需要1个版本的代码。
(defun changeAttribValue (ent atttag oldval newval / entl)
(while (and ent (/= "SEQEND" (cdr (assoc 0 (setq entl (entget ent))))))
(and (= atttag (cdr (assoc 2 entl)))
(= oldval (cdr (assoc 1 entl))) ;<- could use WCMATCH instead
(entmod (subst (cons 1 newval) (assoc 1 entl) entl))
(entupd ent)
(mapcar 'princ (list "\n" oldval " -> " newval))
)
(setq ent (entnext ent))
)
)
(defun C:CHATTRIB (/ ss a attag bname oldval newval)
(and (/= "" (setq bname (getstring "\nBlock name: ")))
(/= "" (setq attag (getstring T "\nTag: ")))
(/= "" (setq oldval (getstring T "\nOld value: ")))
(/= "" (setq newval (getstring T "\nNew value: ")))
(setq a0
ss (ssget "X" (list '(0 . "INSERT") '(66 . 1) (cons 2 bname)))
)
(repeat (sslength ss)
(changeAttribValue (ssname ss a) attag oldval newval)
(setq a (1+ a))
)
)
)
(defun c:revby (/ by ss i en an ad f)
(setq by "T.J.M.")
(and (setq ss (ssget "X" (list (cons 0 "INSERT")(cons 66 1))))
(setq i 0)
(while (setq en (ssname ss i))
(setq f nil
an (entnext en)
ad (entget an))
(while (= "ATTRIB" (cdr (assoc 0 ad)))
(and (= "REVBY" (cdr (assoc 2 ad)))
(setq f T)
(entmod (subst (cons 1 by) (assoc 1 ad) ad)))
(setq an (entnext an)
ad (entget an)))
(if f (entupd en))
(setq i (1+ i))))
(prin1))
嘿,David,我如何在同一代码中包含另一个标记变体?例如,我想让代码看看标记“REVBY”和“REVBY”。。。我现在看到了不同的变化。。谢谢 1种方式是:
(setq lst (list "tjm" "T.J.M" "tmelancon" "BIGAL")
(AT:ListSelect "Rev update" "pick your name"12 12 "False" lst)
(setq REVBY (nth (atoi item) lst))
只需在(成员)调用中继续将变体(所有大写)添加到列表中即可
-大卫 把它插上电源,我们现场直播!谢谢大卫。上帝保佑!
页:
[1]
2