BShick5088 发表于 2022-7-5 15:51:42

获取一个属性,然后使用它

下午好
我对LISP很陌生,需要你们的帮助,目前我只能对现有代码做一些小改动,但很多代码对我来说仍然很神奇。
 
我有一个带有属性“CIRCID”的块“ULTRA INFO”,可以用来帮助关闭在末尾添加“-DATA”的层。我认为我们需要做的是获取属性变量并存储它,然后在末尾添加通配符*,最后让它关闭具有该名称的层。
 
以下是我的想法:
如果找到名为“CIRCID”的属性,则如何扫描图形以将其存储为“LAName”以供以后使用。
然后关闭图层:(命令“-layer”“off”“(LAName)*”“)
 
非常感谢任何可能的帮助。
提前谢谢大家。
布瑞恩

BIGAL 发表于 2022-7-5 15:57:30

您是否计划在屏幕上选取1个块,否则它将找到第一个出现的标记CIRCID,并在不为空的情况下使用该标记。
 
其次(命令“-Layer”“off”LAName”“)您可以通过lisp(setq LAName(strcat LAName“*”)将*添加到层名称中。
 
发布带有块的dwg,使其更容易匹配100%非常简单的任务。

BShick5088 发表于 2022-7-5 15:58:14

附件是需要更改的许多图纸之一的示例。
 
需要做的两件事是:
1) 打开“快照”层,我可以使用:
(命令“-layer”“O”“SHOTS”“”)
 
2) 抓取ULTRA INFO块的CIRCID属性,在其中添加一个*然后关闭该层。
 
如果打开“快照”层,您将看到第二条注释指向同一点,显示数字和管道壁厚。该公司决定回到以前的方式,用数字显示一个圆圈,该圆圈将引用excel电子表格,该电子表格将显示每个点的壁厚腐蚀历史。
非常感谢你的帮助!!!
实例图纸

steven-g 发表于 2022-7-5 16:02:58

难道你不能只使用“layouf”命令并在需要时选择图层上的一个项目来关闭吗

BShick5088 发表于 2022-7-5 16:05:27

该层上的文本和引线将在不同的位置,从一个图形到另一个图形,我想用脚本文件运行它,这样我就可以一次将更改应用到数百个,而不需要用户做任何事情。如果我必须包含一个交叉拾取来抓取块“ULTRA INFO”,我可以,至少它在所有图形中都位于同一位置。"6.047,1.214" "5.689,1.291"

Tharwat 发表于 2022-7-5 16:08:35

我看到“CIRCID”是一个标记值,而不是属性值!此外,图形中没有任何以该标记值开始的图层可以将其关闭!

BShick5088 发表于 2022-7-5 16:12:29

是的,CIRCID是ULTRA INFO块的标记,但我需要做的是从该标记中获取属性值。在前面的示例图纸中,值为“H1-023”,在所附示例2中,值为“H2-020”。通过获取该值,我们可以连接“*”或层的实际结束名称-数据”,并能够自动关闭层。我只是不太了解LISP,无法:
1) 从块的标记中获取值。
2) 将“*”或“-DATA”连接到标记的值
3) 然后使用该存储值关闭图层。
我想以这种方式使用标记的值,因为它是图形编号的简化形式,过去曾用于创建多个图层,现在需要关闭这些图层,尤其是以数据结尾的图层。我附上了第二个例子,让你明白我的意思。
示例2.dwg

steven-g 发表于 2022-7-5 16:15:47

“layer”“off”“*-data”怎么样
layer命令接受通配符

Tharwat 发表于 2022-7-5 16:19:28

如果层与目标块名称中的属性值的值匹配,则应根据层名称的状态打开和关闭层。
 
试试看,让我知道。
 

(defun c:Test (/ s i l lst e n a)
;;    Tharwat 12.9.2014    ;;
(if (setq s (ssget "_X" '((0 . "INSERT") (66 . 1) (2 . "ULTRA INFO"))))
   (repeat (setq i (sslength s))
   (mapcar
       '(lambda (u)
          (if
            (eq (strcase (vla-get-tagstring u)) "CIRCID")
             (setq lst (cons (vla-get-textstring u) lst))
          )
      )
       (vlax-invoke
         (vlax-ename->vla-object (ssname s (setq i (1- i))))
         'getAttributes
       )
   )
   )
)
(if lst
   (while (setq a (tblnext "LAYER" (not a)))
   (foreach x lst
       (if (wcmatch (setq n (cdr (assoc 2 a))) (strcat x "*"))
         (entmod
         (subst (cons 62 (- (cdr (assoc 62 a))))
                  (assoc 62 (setq e (entget (tblobjname "LAYER" n))))
                  e
         )
         )
       )
   )
   )
)
(princ)
)(vl-load-com)

BShick5088 发表于 2022-7-5 16:22:26

现在这个想法会起作用。。。
我陷入了Lisp程序的状态,想着这样一个简单的答案可能永远不会出现。
 
 
你听说过“你看不到森林,只看到树木……”我的想法似乎更像是“你看不到落叶针叶树的森林……”
 
 
如果还有人能给我举一个LISP风格的例子,这将帮助我理解在这个领域可能更重要的其他东西。至少现在我可以完成我的任务。
 
 
谢谢你,史蒂文,你救了我的理智!!!
我知道我整个周末都在忙这个。。。
页: [1] 2
查看完整版本: 获取一个属性,然后使用它