anjan008 发表于 2022-7-5 22:38:47

lisp for for sum text number b

有谁能帮我创建一个lisp,在一个特定的字母表字符之前求和文本数
实例
 
5*M16*35
2*M16*40
4*M16*45
 
4*M16*35
3*M16*40
6*M16*45
 
M16*35
M16*40
M16*45
 
 
后果
 
M16*35=10
M16*40=6
M16*45=11
 
第一个数字表示工件的数量,就像一个图形中的文本有这么多一样。
我需要一个lisp来计算每种类型有多少在该图纸,并给我在csv文件或在同一个图纸表。
 
如果M16前面没有数字。。应该是一件
请帮助我任何人。
 
 
 
谢谢

Snownut 发表于 2022-7-5 22:42:50

真的不管第一个字母是什么,数字和第一个字母之间总是有一个“*”吗?

anjan008 发表于 2022-7-5 22:48:01

感谢您的回复
否当件数为1时,将不存在*
 
如果该数字大于1,则仅表示为
2*M16*35
 
因此,当M16*35前面没有*时,应该将其视为1
 
谢谢

David Bethel 发表于 2022-7-5 22:48:31

对于您提出的非常受限的格式(包含在ascii文本文件中)tsv。txt:
 

(defun c:tsv (/ file rf nl q v c fl)
(setq file (if dat_file
            (getfiled "DATA File" dat_file "txt" 2)
            (getfiled "DATA File" "/acad/" "txt" 2)))
(setq dat_file file)
(setq rf (open (findfile file) "r"))
(while (setq nl (read-line rf))
      (cond ((= "" nl))
            ((= "M" (strcase (substr nl 1 1)))
               (setq q 1
                     v nl
                  fl (if (assoc v fl)
                           (subst (cons v (+ q (cdr (assoc v fl))))
                                  (assoc v fl) fl)
                           (cons (cons v q) fl))))
            ((setq c 1)
               (while (/= "*" (substr nl c 1))
                      (setq c (1+ c)))
               (setq q (atoi (substr nl 1 (1- c)))
                     v (substr nl (1+ c))
                  fl (if (assoc v fl)
                           (subst (cons v (+ q (cdr (assoc v fl))))
                                  (assoc v fl) fl)
                           (cons (cons v q) fl))))))
(close rf)
(prin1 fl)
(prin1))


 
-大卫
TSV。TXT文件

anjan008 发表于 2022-7-5 22:54:35

没有运气
 
autocad绘图中的所有文本都是如此,所以我需要先创建txt文件。
 
谢谢

Snownut 发表于 2022-7-5 22:57:02

图形中的文字是怎样的,例如:块名、纯文本、多行文字。你需要以某种方式将相关文字收集到一个列表中。
 
请更具体地说明你从什么开始!

anjan008 发表于 2022-7-5 22:57:58

纯文本和多行文字
 
不需要列出。。。如果它能在命令区显示,也会做好我的工作。
图纸1.dwg

Snownut 发表于 2022-7-5 23:02:00

在图纸中,所有螺栓信息都在“25_螺栓名称”层上,该层上没有其他信息,这是否成立。您需要一种方法来构建列表,而该层似乎是一个很好的起点。

anjan008 发表于 2022-7-5 23:04:56

是的,该层仅包含螺栓信息

Snownut 发表于 2022-7-5 23:09:35

然后试着这样做,上面David代码中的重载将应用于图纸中的螺栓列表。
 

(defun c:tsv (/ file rf nl q v c fl)
   (defun Mk_Bolt_Lst ( / ent lth sel txt boltl)
      (setq sel (ssget "_X" (list (cons 0   "TEXT")
                   (cons 8    "25_Bolt designation")))
         )
   (repeat (setq lth (sslength sel))
   (setq ent (ssname sel (setq lth (1- lth)))
            txt (list(cdr(assoc 1 (entget ent))))
            boltL (append boltL txt)
       )
   )
   );defun
   
   (foreach nl (Mk_Bolt_Lst) ; David Bethal modified code
            (cond ((= "" nl))
                  ((= "M" (strcase (substr nl 1 1)))
                   (setq q 1
                         v nl
                        fl (if (assoc v fl)
                               (subst (cons v (+ q (cdr (assoc v fl))))
                                    (assoc v fl) fl)
                               (cons (cons v q) fl))))
                  ((setq c 1)
                   (while (/= "*" (substr nl c 1))
                        (setq c (1+ c)))
                   (setq q (atoi (substr nl 1 (1- c)))
                         v (substr nl (1+ c))
                        fl (if (assoc v fl)
                               (subst (cons v (+ q (cdr (assoc v fl))))
                                    (assoc v fl) fl)
                               (cons (cons v q) fl))))))
   (prin1 fl)
   (prin1)
   );defun

以上内容在你发布的图纸上效果很好。
 
这仅适用于纯文本。
页: [1] 2
查看完整版本: lisp for for sum text number b