shailujp 发表于 2022-7-5 22:33:52

向ITEM\u编号t添加前缀

你好
 
任务1:我需要帮助为名为ITEM\u NUMBER的属性标记添加前缀,但不想增加。下面是Lee Mac的一段代码,前缀+增量,我试图操作它,但没有成功。谁能帮我一下吗?
 
此外,前缀将在不同图形之间更改。所以,如果它要求前缀,那就太好了。
 
任务#2最终目标是,一旦我将前缀添加到项目编号,我将复制并修改它,以将前缀添加到巴林标记(这是一个气球)。这样,我将为ITEM_编号和BALIN标记使用相同的前缀+编号。
 
任务#3
一旦这是做了,一切安排在绘图上,我想一个实用程序重新编号的项目编号删除前缀和重新递增它。在这样做的同时,它应该同时在两个地方发生变化(因为前缀+数字在两个地方都是精确的)。这里需要技巧的是,多个气球可以引用相同的数字,因为该部分可以在多个地方使用。
 
不确定这听起来是否可行?但如果真的这样做了,那将为我节省大量时间,因为我的一些图纸有大约50多个项目和气球需要安排。
 
 
 

(defun c:incatt ( / tag pre ss1 ) (vl-load-com)

(setq tag "ADDRESS" pre "ADDRESS: ")

(if (setq *num* (cond ( (getint (strcat "\nSpecify Starting Number" (if *num* (strcat " <" (itoa *num*) "> : ") ": ")))) ( *num* )))
(while (setq ss1 (ssget "_+.:E:S:L" '((0 . "INSERT") (66 . 1))))
(if
(vl-some
(function
(lambda ( x )
(if (eq tag (vla-get-tagstring x))
(not (vla-put-textstring x (strcat pre (itoa *num*))))
)
)
)
(vlax-invoke (vlax-ename->vla-object (ssname ss1 0)) 'getattributes)
)
(setq *num* (1+ *num*))
(princ (strcat tag " Attribute not found."))
)
)
)
(princ)
)

cwake 发表于 2022-7-5 22:37:40

我不确定我是否理解任务2和3的工作原理?“BALIN”是与“ITEM\u NUMBER”在同一块中的属性标记吗?我认为可能需要更多的解释。
 
任务1本身并没有任务那么难。
 
(defun c:incatt2 ( / tag pre ss1 ) (vl-load-com)

(setq tag "ITEM_NUMBER")

(if (/= (setq pre (getstring T (strcat "\nEnter Prefix for Attribute \"" tag "\": "))) "")
   (while (setq ss1 (ssget "_+.:E:S:L" '((0 . "INSERT") (66 . 1))))
   (if
       (null
         (vl-some
         (function
             (lambda ( x )
               (if (eq tag (vla-get-tagstring x))
               (not (vla-put-textstring x (strcat pre (vla-get-textstring x))))
               )
               )
             )
         (vlax-invoke (vlax-ename->vla-object (ssname ss1 0)) 'getattributes)
         )
         )
       (princ (strcat "Attribute " tag " not found."))
       )
   )
   )
(princ)
)

shailujp 发表于 2022-7-5 22:42:00

嗨,克林特。
 
任务2是我将复制任务1路由的内容,只需将标记名从ITEM_NUMBER更改为BALIN。物料编号实际上是物料清单(BOM)的一部分,BALIN是对应于物料编号的气球。我的工作需要从其他图纸复制部分BOM表(一次可能是2或3个图纸),然后根据标准重新构造目标图纸BOM表(即首先是所有螺钉,然后是所有垫圈等)。因此,通常我会从其他图纸复制部分BOM表,并添加前缀,如“A”,并从其他图纸复制带有前缀“A”的气球。类似地,“B”和“C”等。。。。在将新项目插入到图形中后,我将重新构造bom表,将类似项目分组在一起。一旦我完成了所有事情,我将使用Lee的Lisp例程增加BOM的项目编号。此时,在执行增量时,我正在寻找新例程是否也可以自动触发气球更改(基于属性匹配)。实际上,这也将帮助我减少检查时间,因为Lisp可以减少错误气球编号的错误。
 
这个解释有用吗?

cwake 发表于 2022-7-5 22:45:04

如果没有其他人帮忙,我明天可能会看一看。我不得不说,我听到的听起来像是它适合田地。如果使用链接到引出序号中巴林值的字段替换ITEM_NUMBER属性,则只需更新引出序号中的属性值,BOM表就会自动更新

cwake 发表于 2022-7-5 22:48:50

我认为在这种情况下,如果可能的话,包含气球和BOM表示例的示例图纸也会有所帮助?也许我之前建议的是背对背?如果BOM表中有多个引出序号和一个条目,则字段将转到另一个方向。。。

shailujp 发表于 2022-7-5 22:50:06

遗憾的是,由于一些技术问题,我不能与fields一起去。现在,如果通过lisp很难,也不值得付出努力,我可以只解决任务1,然后手动完成其余的部分。

cwake 发表于 2022-7-5 22:53:21

嗨,Shailujp
 
您正在寻找任务3的一个相当具体的结果,根据可用的信息,我确实觉得不值得付出努力。
我所做的是编写一个非常通用的例程,允许您添加前缀、后缀或在特定属性的值内搜索和替换。
 
如果我理解您的意图,那么您就是在通过添加前缀来区分来自不同图形的数据。这个函数允许你这么做;你可以在开始、结束或两者都做。
然后,在目标图形中对所有信息进行整理和排序后,您希望将参照更改为另一个代码,仍然是唯一的代码,但反映了新的整理顺序?搜索和替换将允许您这样做。
 
这是一个通用的解决方案,只有在我正确理解问题的情况下,它才会有帮助。希望如此。
 
(defun c:modatt ( / _Replacetext pref repl srch sscnt ss1 suff tag )

(vl-load-com)

(defun _Replacetext ( string pat newstr / found patlen replen strtsrch )
   (setq patlen (strlen pat)
         replen (strlen newstr)
         strtsrch 0
         )
   (while (setq found (vl-string-search pat string strtsrch))
   (setq string (strcat (substr string 1 found) newstr (substr string (+ found patlen 1)))
         strtsrch (+ found replen)
         )
   )
   string
   )

(cond
   ((= (setq tag (getstring "\nEnter the Tag name of the Attribute to change: ")) "")
    (princ "\nNeed a tag name to proceed... exiting...")
    )
   ((progn
      (setq pref (getstring T (strcat "\nEnter Prefix to add to Attribute \"" tag "\" (or ENTER for none): "))
            suff (getstring T (strcat "\nEnter Suffix to add to Attribute \"" tag "\" (or ENTER for none): "))
            srch (getstring T (strcat "\nEnter String to Search for in Attribute \"" tag "\" (or ENTER for none): "))
            )
      (vl-every
      (function
          (lambda ( x )
            (= x "")
            )
          )
      (list pref suff srch)
      )
      )
    (princ "\nNothing to do... exiting...")
    )
   (T
    (and (/= srch "")
         (setq repl (getstring T (strcat "\nEnter String to Replace " srch " with in Attribute \"" tag "\" (or ENTER to remove it): ")))
         )
    (if (setq ss1 (ssget "_:L" '((0 . "INSERT") (66 . 1))))
      (repeat (setq sscnt (sslength ss1))
      (vl-some
          (function
            (lambda ( x )
            (if (eq tag (vla-get-tagstring x))
                (not
                  (vla-put-textstring x
                  ((lambda ( str )
                     (strcat pref
                               (if (= srch "") str (_Replacetext str srch repl))
                               suff
                               )
                     )
                      (vla-get-textstring x)
                      )
                  )
                  )
                )
            )
            )
          (vlax-invoke (vlax-ename->vla-object (ssname ss1 (setq sscnt (1- sscnt)))) 'getattributes)
          )
      )
      (princ "\nNothing selected."))
    )
   )
(princ)
)

shailujp 发表于 2022-7-5 22:56:12

嗨,克林特,
 
我认为您的第一个程序(incatt2)非常适合添加前缀,这解决了我的需求,因为我只针对ITEM\u编号。一旦添加了前缀,当我按照所需的顺序进行排列时,我将使用incatt函数,该函数将只对物料清单上的所有标签重新编号。这就是我打算使用它的方式。气球无论如何都是手工制作的,因为它们在图纸上随处可见,不可能按顺序选择。
 
当我使用incatt2时,我认为如果它允许我选择多个(预选择或post但多个),而不是单个选择,那会更好,因为我有多个标记作为前缀。
我的巴林标签遇到了另一个问题。我刚刚发现有两种类型的气球,标签名要么是巴林,要么是X(必须是新旧混合在一起的东西)。我想知道是否可以将所有标记(ITEM_NUMBER、BALIN或X)添加到incatt2 lisp中,然后我只需键入所需的前缀并继续选择这些块中的任何一个。我认为这听起来很符合逻辑,因为我必须同时为项目编号和气球添加相同的前缀。你同意吗?
 
 
MODATT程序也是一个很好的通用工具,可以更新任何给定的attirbute。这里唯一的缺点是我必须知道标记名,而不是从该属性的选择中自动找到。这听起来可能吗?这样,我只需选择标签(它会自动从选择中知道标签名称),然后要求我添加/删除前缀/后缀?
 
现在,我只会坚持incatt2来完成我的工作。
 
谢谢你的帮助。

cwake 发表于 2022-7-5 22:59:57

嗨,Shailujp,
 
这相当于编写incatt2来处理插入的选择集,而不是单独拾取和处理它们。为了解决一系列可能的属性标记名称的问题,它将对照标记列表(可以编辑)检查所有属性。如果标记名在列表中,它将向其属性值添加前缀。
 
(defun c:prefatts ( / pref sscnt ss1 tags )
(vl-load-com)
(setq tags (mapcar
            'strcase
            '("ITEM_NUMBER" "BALIN" "X") ;<==== Put attribute TAG names here inside the list
            )
       )
(cond
   ((= (setq pref (getstring T "\nEnter Prefix to add to the selected attributes: ")) "")
    (princ "\nNothing to do... exiting...")
    )
   ((progn
      (if (null (cadr (ssgetfirst)))
      (princ "\nSelect Blocks to Modify: ")
      )
      (setq ss1 (ssget '((0 . "INSERT") (66 . 1))))
      )
    (repeat (setq sscnt (sslength ss1))
      (foreach x (vlax-invoke (vlax-ename->vla-object (ssname ss1 (setq sscnt (1- sscnt)))) 'getattributes)
      (if (member (strcase (vla-get-tagstring x)) tags)
          (vla-put-textstring x (strcat pref (vla-get-textstring x)))
          )
      )
      )
    )
   (T
    (princ "\nUnsuitable selection... Exiting...")
    )
   )
(princ)
)
 
当我试图修改它以增加字母时,它给了我stringp 66错误。有人能帮我吗?
 
我需要这个来将字母从A增加到Z,当这个过程结束时,下一个数字应该是AA,AB,AC等等。这听起来可能吗?
 
修改代码:
(defun c:INCATT ( / tag pre ss1 ) (vl-load-com)

(setq tag "ITEM_NUMBER" pre "")

(if (setq *num* (cond ( (getint (strcat "\nSpecify Starting Number"(if *num* (strcat " <" (itoa *num*) "> : ") ": ")))) ( *num* )))
   (while (setq ss1 (ssget "_+.:E:S:L" '((0 . "INSERT") (66 . 1))))
   (if
       (vl-some
         (function
         (lambda ( x )
             (if (eq tag (vla-get-tagstring x))
               (not (vla-put-textstring x (strcat pre (itoa *num*))))
             )
         )
         )
         (vlax-invoke (vlax-ename->vla-object (ssname ss1 0)) 'getattributes)
       )
       (setq *num* (1+ *num*))
       (princ (strcat tag " Attribute not found."))
   )
   )
)
(princ)
)
 
提前感谢!!

shailujp 发表于 2022-7-5 23:04:22

有人能帮我吗?
页: [1] 2
查看完整版本: 向ITEM\u编号t添加前缀