tazzzz 发表于 2022-7-6 00:16:40

你好
由于一些我不知道的原因,我无法附上示例dwg,所以我制作了pdf。希望这足以让事情变得更清楚。
每个SP——它是一个名为EMBED的块(所有块都有相同的名称“EMBED”)
每个块有3个属性:
标签:板(示例:SP100)
标签:(例如:2)
标记:描述(由LISP填写)
此外,请在附件中找到带有铭牌名称和说明的txt文件。
这两个文件都将在P:/JOB123/PRODUCTION中
谢谢你的帮助
附件.pdf
收件人列表。txt文件

ymg3 发表于 2022-7-6 00:20:58

塔兹,
 
以下是我使用assoc列表的意思。
 

;; platelist         by ymg                                                   ;
;; Given a file location (full path)                                          ;
;; Creates an assoc list of the contents                                    ;

(defun c:test (/ )
(setq f (open "c:\\attlist.txt" "r"))
(setq pllist nil)
(while (setq line (read-line f))
    (setq pllist (cons (str2lst line ",") pllist))
)
(close f)
;; platelist is a list of list '((PlName Dimension)....)                  ;
;; Access with (cdr (assoc plname pllist)) -> Dimension                     ;

(setq bl (getblkename "PLATE")
       al nil)
(foreach e bl      
    (setq en (entnext e)
       elist (entget en)
    )      
    (while (= (cdr (assoc 0 elist)) "ATTRIB")
       (cond
         ((= (cdr (assoc 2 elist)) "A1") (setq plName (cdr (assoc 1 elist))
                                                   desc (cadr (assoc plname pllist))
                                                bomlist (cons (list plname desc) bomlist)
                                           )
         )
         ((= (cdr (assoc 2 elist)) "A3") (entmod (subst (cons1 desc) (assoc 1 elist) elist)))
       )
      
       (setqen (entnext en)         
         elist (entgeten)
       )   
    )
)
;; Attributes have now been inserted in all block                           ;
;; bomlist is a list of list'((plname description)... )                   :
;; You need to count each occurrence of a given plate name                  ;

(princ)
)

;; str2lst         by Gilles Chanteau                                       ;
;; Transforme un chaine avec séparateur en liste de chaines                   ;
;;                                                                            ;
;; Arguments                                                                  ;
;; str : la chaine à transformer en liste                                     ;
;; sep : le séparateur                                                      ;
;;                                                                            ;
;; Exemples                                                                   ;
;; (str2lst "a b c" " ") -> ("a" "b" "c")                                     ;
;; (str2lst "1,2,3" ",") -> ("1" "2" "3")                                     ;
;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3)                            ;

(defun str2lst (str sep / pos)
(if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
         (str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
)
)

;; getblkename       by ymg                                                   ;
;;                                                                            ;
;; Original Code by Tim Wiley                                                 ;
;; Argument: Block Name                                                       ;
;;Returns: list of enames Block in Drawing                                  ;
(defun getblkename (blkname / blklst)
(vlax-for obj (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-Acad-Object)))
      (if (and (= (vla-get-ObjectName obj) "AcDbBlockReference")
               (= (vla-get-EffectiveName obj) blkname)
          )
         (setq blkLst (cons (vlax-vla-object->ename obj) blkLst))
      )
)
)



测验图纸

BIGAL 发表于 2022-7-6 00:23:31

YMG可能会添加更多,从块板开始,作为1x1 sq,其中一个属性SP101填充,其他两个可以为空,运行时,从1/2x8x8大小的板中拉出细节,然后在X和Y中重新缩放块,以显示正确的8x8形状。
 
如果这样做,最好将文本更改为SP100,板3/8“x4”x6“现在是SP100,板3/8,4,6,很快添加“返回”。做一个额外的defun。变量板厚L W str2lst看起来像它将作为个人完成。只需对每个变量使用n。
 
(setq platetype (nth str 0))
(setq thick (nth str 1))
(setq L (nth str 2))
(setq W (nth str 3)
)

ymg3 发表于 2022-7-6 00:28:38

比加尔,
 
问题是,我不得不从帽子里拿出示例dwg。
OP从未发布过。
 
现在正在发生的是:
 
1) 读取文件列表。txt并从中创建和关联列表,“PLLIST”
 
2) 调用子例程“GETBLKENAME”并获取列表“bl”,其中包含块“PLATE”每次出现的名称
 
3) 通过读取属性来处理列表“bl”。
如果我们有属性A1,我们从“plist”中获取描述,并将A1和描述保存在“bomlist”中
如果我们有属性A3,则更新该属性。
 
4) 我们完成了,剩下的就是做“波姆利斯特”的计数
 
至于尺寸和所有这些,我真的不知道OP有什么。
他需要贴一张画。
 
ymg公司

ymg3 发表于 2022-7-6 00:31:00

将其添加到程序末尾以获取计数
每个项目和排序的bomlist:

;; Attributes have now been inserted in all block                           ;
;; bomlist is a list of list'((plname description)... )                   :
;; You need to count each occurrence of a given plate name                  ;

(setq count (countItems bomlist))
(setq bomlist nil)
(foreach item count
    (setq bomlist (cons (list (caar item) (cdr item) (cadar item)) bomlist))
)         
(setq bomlist (vl-sort bomlist (function (lambda (a b) (< (car a) (car b))))))

 
您还需要此子程序:

;; Count Items-Lee Mac                                                    ;
;; Returns a list of dotted pairs detailing the number of                     ;
;; occurrences of each item in a supplied list.                               ;

(defun countItems ( l / c x )
   (if (setq x (car l))
       (progn
         (setq c (length l)
               l (vl-remove x (cdr l))
         )
         (cons (cons x (- c (length l))) (countItems l))
       )
   )
)

 
随附更新代码。
 
ymg公司
盘子LSP

tazzzz 发表于 2022-7-6 00:34:23

你好
正如我在你的附件中看到的那样,最终的结果非常好。
你的Lisp程序超出了我的要求,我对此表示感谢。
我的方块很简单,只有3个属性,周围没有任何边界。
明天早上我会测试这个Lisp程序,让你知道它是如何工作的。
不知道我们之间的时间差所以。。。“新年快乐”
非常感谢。

ymg3 发表于 2022-7-6 00:36:26

我添加了一个表生成例程,并将其名称更改为开始将例程设置为PLATE。
 
完成后,将在屏幕中央生成BOM表。移动命令在已选择表格的情况下激活,等待您选择目标点。
 
我没有试图调整这列的宽度。选择表格并进行调整后,只需使用夹点即可。
 
新年快乐!!
 
ymg公司

盘子LSP

tazzzz 发表于 2022-7-6 00:40:07

你好
我用这个Lisp程序有困难。由于我无法上传我的属性示例,如果您同意的话,您可以上传用于测试lisp的cad文件。我想这可能是我们用属性定义这个块的方式不同。起初,我收到一条消息,如:“错误:参数类型错误:file nil”,但现在我只能插入表的标题。
你能帮我做这件事吗?
非常感谢。

ymg3 发表于 2022-7-6 00:42:13

塔兹,
 
你来了!
 
顺便说一句,已经有一些帖子了。
 
块非常简单,只是一个具有属性A1、A2和A3的矩形。
 
您可能遇到问题的另一个原因是attlist。txt文件应为c:\,
否则,更新程序中文件的名称。
 
ymg公司
测验图纸

tazzzz 发表于 2022-7-6 00:46:26

Ymg,
谢谢,这个Lisp程序很好用。
现在,为了向您提出更多挑战,您能否改进此LIsp,使其能够:
-将A3设为多行属性(现在仅当A3为单行时有效);
-加载多个txt文件作为引用,并能够输入我需要的txt文件(因为作业123中的SP100与作业456中的SP100不同)
再次感谢你的Lisp程序和抽出时间。
页: 1 [2]
查看完整版本: 根据t填充属性