stusic 发表于 2022-7-6 08:36:00

LISP增加唯一属性

大家好!
 
作为我的第一篇帖子,我将发表一篇文章。我搜索了又搜索,但找不到有助于解决问题的lisp或信息。也许我可以在这里找到一些帮助——即使我已经变灰了,我仍然会很感激。
 
那么,我们开始吧。。。
 
我将属性块插入到我的图纸中,列出零件号、型号等。除了这些属性外,还有另一个标记,它是一个递增的数字(在我们的物料清单中使用)。如果有两个相同的部件(即相同的型号),则增量数量需要相同;如果零件不同,则需要使用下一个序列号。
 
手工操作不仅耗时,而且往往非常错误。所以我想做一个lisp例程,我可以运行它来自动为这些块编号。我想我可以插入我的块(或重复使用它们、复制等),而不用太担心数字标记,然后在最后运行lisp,为每个唯一的块提供数字。如果已经存在的数字能够保持不变(我们一直在重复使用图形),那就太好了。
 
 
块:
博姆塔格
标签:
项目(增量编号)
型号(型号)
零件(零件号)
 
我一点都不懂Lisp程序,所以我不知道我自己能做到,但也许朝着正确的方向轻推一下可以让我不浪费很多时间。有什么想法吗?
 
列一个区块列表,对其进行处理,给出if-then语句,必要时重新编号,移动到下一个区块。易于输入,难以编程。免费渲染给任何获得获奖代码的人。
 
非常感谢,非常感谢您的帮助。
 
-斯图

pBe 发表于 2022-7-6 08:40:15

欢迎来到论坛stu
 
您所要求的听起来很容易编码,您希望它仅适用于BOMTAG块吗?
 
项目是块的第一个属性吗?
是否通过复制和粘贴导入块?
这意味着型号alrady有一个值,或者
为模型标记插入具有常量属性的块?

VVA 发表于 2022-7-6 08:43:05

附着带有示例的dwg文件

stusic 发表于 2022-7-6 08:48:35

谢谢你的回复。
 
只有BOMTAG?不完全一样,有几乎相同的块称为BOMTAG\u TR、BOMTAG\u T、BOMTAG\u TL、BOMTAG\u L、BOMTAG\u BL、BOMTAG\u B、BOMTAG\u BR、BOMTAG\u R。它们用于从块中引出的引线。如果我有选择的话,我不会那样做。
 
是的,项是第一个属性,它们通常已经从另一个作业中存在(我们从另一个作业复制绘图并重新使用)。我们将只在图形中复制,因此所有标记通常都是填充的(一些标记将永远保持为空,因为没有确切的型号),并且没有恒定的字段。
 
再次感谢!

pBe 发表于 2022-7-6 08:50:13

那么它的复制和粘贴?或通过“插入”从另一个图形导入?

Tharwat 发表于 2022-7-6 08:55:04

有时用图片会比文字清晰得多,所以如果你上传一张图片,展示前后会受到大家的高度赞赏。

Lee Mac 发表于 2022-7-6 08:56:54

你好,stusic,
 
首先,欢迎来到CADTutor
 
如果我理解正确(并使用了您描述的正确属性标记),请尝试以下操作:
 

;; Dependent Attribute Numbering-Lee Mac-2011-www.lee-mac.com
;; Assigns a number to a specific attribute whose 'dependent' attribute is
;; the same for all attributes with the same number.

(defun c:AttNum ( / att blk dep inc itm lst num obj sel tmp val )

   (setq blk "BOMTAG" ;; Block Name
         num "ITEM"   ;; Numbering Tag
         dep "MODEL";; Numbering Dependent Tag
   )
   (mapcar 'set '(blk num dep) (mapcar 'strcase (list blk num dep)))

   (if
       (setq sel
         (ssget "_X"
               (list
                  '(0 . "INSERT")
                  '(66 . 1)
                   (cons 2 (strcat "`*U*," blk))
                   (cons 410 (getvar 'CTAB))
               )
         )
       )
       (progn
         (repeat (setq inc (sslength sel))
               (setq obj (vlax-ename->vla-object (ssname sel (setq inc (1- inc)))))
               (if
                   (or
                     (null (vlax-property-available-p obj 'effectivename))
                     (eq blk (strcase (vla-get-effectivename obj)))
                   )
                   (progn
                     (setq tmp
                           (mapcar
                               (function
                                 (lambda ( att )
                                       (cons (strcase (vla-get-tagstring att)) att)
                                 )
                               )
                               (vlax-invoke obj 'getattributes)
                           )
                     )
                     (if
                           (and
                               (setq val (cdr (assoc dep tmp)))
                               (setq val (vla-get-textstring val))
                               (setq att (cdr (assoc num tmp)))
                           )                           
                           (if (setq itm (assoc val lst))
                               (setq lst (subst (vl-list* val att (cdr itm)) itm lst))
                               (setq lst (cons(list val att) lst))
                           )
                     )
                   )
               )
         )
         (setq inc 1)
         (foreach grp (vl-sort lst (function (lambda ( a b ) (< (car a) (car b)))))
               (foreach att (cdr grp)
                   (vla-put-textstring att (itoa inc))
               )
               (setq inc (1+ inc))
         )
       )
       (princ (strcat "\nNo " blk " blocks found in this layout."))
   )
   (princ)
)
(vl-load-com) (princ)

 
如果是剪切粘贴。但一次只能处理一个街区

Lee Mac 发表于 2022-7-6 08:59:14

附件是一幅典型绘画的绝佳范例。注释气泡(1、2、5、8和30)是包含需要更改的信息的块(BOM块与这种情况完全相同,只是块名称不同,因为这是上载的图形,我将使用这些块作为示例)。1和2是不同的零件/型号(隐藏属性),因此它们在注释编号中需要不同的编号。除了顺序错误外,编号为8的两个气泡都是正确的,因为它们具有相同的零件/型号。但是,5和30不正确,因为它们的编号不同,但零件/型号相同。lisp应该保留1、2和8,并将5和30更改为相同的数字,最好是3(如果不使用)。
 
我们将按原样使用这幅画。由于需要新的标记,我们将复制一个旧的标记(1、2、5、8或30)并修改属性。复制,是的,但仅限于Autocad内部。
 
我真的很感谢你们的帮助!
块标记示例。图纸

pBe 发表于 2022-7-6 09:03:12

你试过我的密码吗?

stusic 发表于 2022-7-6 09:07:01

我想让标签8有不同的零件号,但相同的标签(项目)号。
页: [1] 2
查看完整版本: LISP增加唯一属性