tmelancon 发表于 2022-7-5 18:20:06

单属性编辑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))
      )
)
)

marko_ribar 发表于 2022-7-5 18:24:27

什么是bname变量值?我认为它是零-所以ssget不会被创建

kpblc 发表于 2022-7-5 18:27:07

嘿,马克,谢谢你的回复,我已经尝试了你修改的代码,但没有结果。唯一不同的是它在命令行返回“1 found”,没有对REVBY标记的属性值进行更改。
 
嘿,kpblc,谢谢你的来电。bname变量是通配符,因为并非每个标题栏在每个图形中的名称都相同。有时是TBLOCK、BLOCKT或ASDFG。这就是为什么我决定通配符块名,然后在该块中搜索标记名为REVBY的属性标记。任何其他帮助都将不胜感激。我会继续评估。

tmelancon 发表于 2022-7-5 18:30:02

这是可以工作的原始代码,但它会提示用户输入块名、标记名、旧值和新值。这违背了目的。我希望我的人能够键入他们的首字母(我将复制他们各自的代码),它会自动更新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)
)

 
 
-大卫

tmelancon 发表于 2022-7-5 18:35:45

漂亮的工作善良的先生!

David Bethel 发表于 2022-7-5 18:37:17

不客气。我倾向于采取一种过于简单的方法-大卫

tmelancon 发表于 2022-7-5 18:41:48

可能为首字母添加此方法,然后只需要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 Bethel 发表于 2022-7-5 18:44:53

嘿,David,我如何在同一代码中包含另一个标记变体?例如,我想让代码看看标记“REVBY”和“REVBY”。。。我现在看到了不同的变化。。谢谢

BIGAL 发表于 2022-7-5 18:47:44

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))

 
 
只需在(成员)调用中继续将变体(所有大写)添加到列表中即可
 
-大卫

tmelancon 发表于 2022-7-5 18:51:01

把它插上电源,我们现场直播!谢谢大卫。上帝保佑!
页: [1] 2
查看完整版本: 单属性编辑LISP