Alistair 发表于 2022-7-5 17:40:42

创建属性自动编号

你好
 
我对AutoLISP比较陌生,但了解其原理。
 
我正在尝试为已经在另一个程序中绘制并导入为DXF的单个树自动生成一个数字。
 
我希望自动编号是一个属性,这样我可以将编号和X&Y数据导出到。CSV文件,然后我可以在其他地方使用。
 
我无法确定自动生成器是否会生成一个逻辑数字序列,或者这些数字是否只是随机出现在树状结构中。在这种情况下,我还可以使用自动生成的编号创建一个新块,并按我想要的顺序定位这些块。
 
任何帮助都将不胜感激。
 
干杯,阿利斯泰尔。

Lee Mac 发表于 2022-7-5 17:45:31

嗨,阿利斯泰尔,
 
一个程序可以用来对你的树进行编号,可能是从左到右或从上到下(反之亦然)等等。所有块的标记名是否都相同?
 

Alistair 发表于 2022-7-5 17:54:17

是的,所有树的标记名都是相同的。
 
我发现通常我会以顺时针或逆时针的方式对树进行编号。
 
谢谢你的帮助。

Lee Mac 发表于 2022-7-5 17:55:53

嗨,阿利斯泰尔,
 
请尝试这个函数,它将以升序递增按Y坐标排序的属性数,因为我不太确定你说的顺时针是什么意思?围绕中心块顺时针旋转?
 
根据需要更改标记名称(顶部)。
 

(defun c:AttNum (/ *error* MakeVariant Itemp MakeSelectionSet
                   DOC OBJ OBJECTLIST SS TAG UFLAG)
(vl-load-com)
;; Lee Mac~15.04.10

(setq tag "TAG1")

(defun *error* (msg)
   (if uFlag
   (vla-EndUndoMark
       (vla-get-ActiveDocument
         (vlax-get-acad-object)
       )
   )
   )
   (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
       (princ (strcat "\n** Error: " msg " **")))
   (princ)
)

(defun MakeVariant (data datatype)
   (vlax-make-variant
   (vlax-safearray-fill
       (vlax-make-safearray (eval datatype)
         (cons 1 (length data))
       )
       data
   )
   )
)

(defun Itemp (collection item / result)
   (if (not (vl-catch-all-error-p
            (setq result
                (vl-catch-all-apply
                  (function vla-item) (list collection item)
                )
            )
            )
      )
   result
   )
)

(defun MakeSelectionSet (ref / SelSets SelSet)
   (if (setq SelSet
         (itemp
         (setq SelSets
             (vla-get-SelectionSets
               (vla-get-ActiveDocument
               (vlax-get-acad-object)
               )
             )
         )
         ref
         )
       )
   
   (vla-delete SelSet)
   )
   (vla-add SelSets ref)
)

(setq *start
   (cond
   (*start) ( 1 )
   )
)

(setq *start
   (1-
   (cond
       ((getint
            (strcat "\nSpecify Starting Number <"
            (itoa *start) "> : "
            )
          )
       )
       (*start)
   )
   )
)   

(if (zerop
       (vla-get-Count
         (setq ss
         (vla-get-PickFirstSelectionSet
             (setq doc
               (vla-get-ActiveDocument
               (vlax-get-acad-object)
               )
             )
         )
         )
       )
   )
   (progn
   (setq ss (MakeSelectionSet "Tree_SS"))
   (vla-SelectOnScreen ss
       (MakeVariant '(0 66) vlax-vbInteger)
       (MakeVariant '("INSERT" 1) vlax-vbVariant)
   )
   )
)
(if (not
       (zerop
         (vla-get-Count ss)
       )
   )
   (progn
   (setq UFlag
       (not
         (vla-StartUndoMark doc)
       )
   )
   (vlax-for obj ss
       (setq ObjectList
         (cons
         (cons obj
             (vlax-safearray->list
               (vlax-variant-value
               (vlax-get-property obj 'InsertionPoint)
               )
             )
         )
         ObjectList
         )
       )
   )
   (vla-delete ss)
   (mapcar
       (function
         (lambda ( block )
         (mapcar
             (function
               (lambda ( attribute )
               (if (eq tag (vla-get-TagString attribute))
                   (vl-catch-all-apply (function vla-put-TextString)
                     (list attribute (itoa (setq *start (1+ *start))))
                   )
               )
               )
             )
             (vlax-invoke block 'GetAttributes)
         )
         )
       )
       (mapcar (function car)
         (vl-sort ObjectList
         (function
             (lambda ( point1 point2 )
               (< (caddr point1) (caddr point2))
             )
         )
         )
       )
   )
   (setq UFlag
       (vla-EndUndoMark doc)
   )
   )
)
(princ))

Alistair 发表于 2022-7-5 18:02:45

你好,李,
 
非常感谢你的帮助;但是,没有显示数字。
 
这可能是我没有在块属性中设置的吗?
 
非常感谢
 
阿利斯泰尔

Lee Mac 发表于 2022-7-5 18:05:58

代码顶部的标记名是否正确?

Alistair 发表于 2022-7-5 18:12:09

非常感谢你的帮助,李,它正在工作。
 
随着我的进步,我可能需要帮助,并尝试自动化更多的绘图过程。
 
非常感谢,
 
阿利斯泰尔

Lee Mac 发表于 2022-7-5 18:15:03

根据PM的要求:
 

(defun c:AttNum (/ tag dxf ent eLst)

(setq dxf (lambda (c l) (cdr (assoc c l))))

(setq tag "TAG1") ;; Tag to be Updated

(setq *start (cond (*start) ( 1 ))
       *start (1- (cond ((getint (strcat "\nSpecify Starting Number <"
                                     (itoa *start) "> : ")))
                        (*start))))
(while
   (progn
   (setq ent (car (entsel (strcat "\nSelect Block Number "
                              (itoa (setq *start (1+ *start))) " <Exit> : "))))

   (cond ((eq 'ENAME (type ent))

            (if (and (eq "INSERT" (dxf 0 (entget ent)))
                     (= 1 (dxf 66 (entget ent))))

                (while (not (eq "SEQEND" (dxf 0 (setq eLst (entget (setq ent (entnext ent)))))))
                  (if (eq tag (dxf 2 elst))
                  (entupd
                      (dxf -1
                        (entmod
                        (subst
                            (cons 1 (itoa *start)) (assoc 1 eLst) eLst)))) t))

                (princ "\n** Must be an Attributed Block **"))))))
(princ))

 
为了所有人的利益而发布。

Alistair 发表于 2022-7-5 18:21:18

哦,哇,非常感谢李,你甚至让它要求标签,而不是停留在Lisp程序。。我喜欢我喜欢
再次感谢您抽出时间。
詹姆斯

Lee Mac 发表于 2022-7-5 18:25:37

不客气,詹姆斯
页: [1] 2
查看完整版本: 创建属性自动编号