由于一些我不知道的原因,我无法附上示例dwg,所以我制作了pdf。希望这足以让事情变得更清楚。
每个SP——它是一个名为EMBED的块(所有块都有相同的名称“EMBED”)
每个块有3个属性:
标签:板(示例:SP100)
标签:(例如:2)
标记:描述(由LISP填写)
此外,请在附件中找到带有铭牌名称和说明的txt文件。
这两个文件都将在P:/JOB123/PRODUCTION中
谢谢你的帮助
附件.pdf
收件人列表。txt文件 塔兹,
以下是我使用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))
)
)
)
测验图纸 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)
) 比加尔,
问题是,我不得不从帽子里拿出示例dwg。
OP从未发布过。
现在正在发生的是:
1) 读取文件列表。txt并从中创建和关联列表,“PLLIST”
2) 调用子例程“GETBLKENAME”并获取列表“bl”,其中包含块“PLATE”每次出现的名称
3) 通过读取属性来处理列表“bl”。
如果我们有属性A1,我们从“plist”中获取描述,并将A1和描述保存在“bomlist”中
如果我们有属性A3,则更新该属性。
4) 我们完成了,剩下的就是做“波姆利斯特”的计数
至于尺寸和所有这些,我真的不知道OP有什么。
他需要贴一张画。
ymg公司 将其添加到程序末尾以获取计数
每个项目和排序的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 你好
正如我在你的附件中看到的那样,最终的结果非常好。
你的Lisp程序超出了我的要求,我对此表示感谢。
我的方块很简单,只有3个属性,周围没有任何边界。
明天早上我会测试这个Lisp程序,让你知道它是如何工作的。
不知道我们之间的时间差所以。。。“新年快乐”
非常感谢。 我添加了一个表生成例程,并将其名称更改为开始将例程设置为PLATE。
完成后,将在屏幕中央生成BOM表。移动命令在已选择表格的情况下激活,等待您选择目标点。
我没有试图调整这列的宽度。选择表格并进行调整后,只需使用夹点即可。
新年快乐!!
ymg公司
盘子LSP 你好
我用这个Lisp程序有困难。由于我无法上传我的属性示例,如果您同意的话,您可以上传用于测试lisp的cad文件。我想这可能是我们用属性定义这个块的方式不同。起初,我收到一条消息,如:“错误:参数类型错误:file nil”,但现在我只能插入表的标题。
你能帮我做这件事吗?
非常感谢。 塔兹,
你来了!
顺便说一句,已经有一些帖子了。
块非常简单,只是一个具有属性A1、A2和A3的矩形。
您可能遇到问题的另一个原因是attlist。txt文件应为c:\,
否则,更新程序中文件的名称。
ymg公司
测验图纸 Ymg,
谢谢,这个Lisp程序很好用。
现在,为了向您提出更多挑战,您能否改进此LIsp,使其能够:
-将A3设为多行属性(现在仅当A3为单行时有效);
-加载多个txt文件作为引用,并能够输入我需要的txt文件(因为作业123中的SP100与作业456中的SP100不同)
再次感谢你的Lisp程序和抽出时间。
页:
1
[2]