mexmr10 发表于 2022-7-5 15:35:20

修改工厂计划Lisp。

有人可以为我修改以下lisp吗?我在cadalyst上找到了它,它几乎是我所需要的,但我想要更多的功能。
 
下面是它的工作原理:
 
1) 我有一个块,我用它作为标签,命名为key plant,它有两个属性:planttype和quantity。“Planttype”是代表特定植物种类的符号/代码,“quantity”是我分配给一组特定植物块的数量。
 
2)我使用带有引线的“关键工厂”块,并标记我的所有工厂块。
 
3)我输入“pll”运行它,它会在记事本文档中给我一个植物列表。。。示例如下:
 
植物类型数量
是。。。。。。。。。。。。。19
反恐精英。。。。。。。。。。。。。170
PA。。。。。。。。。。。。。。。4.
PCA。。。。。。。。。。。。。。2.
VL。。。。。。。。。。。。。。。78
cas。。。。。。。。。。。。。。490
 
以下是我的问题/要求:
 
1.)lisp目前只是汇集了图形中所有块的综合列表。我想在“关键工厂”块中再添加一个属性,如“类别”,以便可以按以下工厂类别组织工厂列表:
 
-落叶荫蔽树
-观赏树木
-常绿树木
-落叶灌木
-常绿灌木
-多年生植物和观赏草
 
2)我希望列表按该顺序输出(如上所示),然后按字母顺序排列每个类别。
 
3.)我想输出到excel文件,而不是记事本文件。
 
有人能帮我吗?我知道这是非常具体的,但它真的会让我的工作更有效率。这里有这么多大师,我完全是Lisp代码的noob。
 
这就是“理想”输出的样子:
 
植物类型数量
 
落叶荫蔽树
是。。。。。。。。。。。。。。。。。19
反恐精英。。。。。。。。。。。。。。。。。170
 
观赏树木
APB。。。。。。。。。。。。。。。。。4.
BN。。。。。。。。。。。。。。。。。。。78
 
常绿乔木
PA。。。。。。。。。。。。。。。。。。。490
PGD。。。。。。。。。。。。。。。。。25
 
 
等等
工厂清单。LSP

Lee Mac 发表于 2022-7-5 15:39:56

我不久前写了这篇文章,没有经过测试,但试一试:
 

;; Summing Attributes Before Extraction
;; By Lee McDonnell

(defun c:AttSum (/ ss ofile file attlst x y lst)
(vl-load-com)

(if (and (setq ss   (ssget "_X" '((0 . "INSERT") (2 . "KEY-PLANT") (66 . 1))))
          (setq file (getfiled "Output File" "" "csv" 9)))
   (progn
   
   (setq ofile (open file "a"))
   (write-line (strcat (getvar "DWGPREFIX") (getvar "DWGNAME")) ofile)
   (write-line "ITEM,QUANTITY" ofile)
   
   (setq attlst
       (mapcar
         (function
         (lambda (x)
             (mapcar
               (function vla-get-TextString) x)))
         
         (mapcar
         (function
             (lambda (x)
               (vl-sort x
               (function
                   (lambda (x1 x2)
                     (< (vla-get-TagString x1)
                        (vla-get-TagString x2)))))))
         (mapcar
             (function
               (lambda (x)
               (vlax-safearray->list
                   (vlax-variant-value
                     (vla-getAttributes x)))))
            
             (mapcar
               (function vlax-ename->vla-object)
               (mapcar (function cadr) (ssnamex ss)))))))
   
   (while (setq x (car attlst))
       (if (setq y (assoc (car x) lst))
         (setq lst (subst (append y (cdr x)) y lst))
         (setq lst (cons x lst)))
       (setq attlst (cdr attlst)))
   
   (foreach x lst
       (write-line
         (strcat (car x) (chr 44)
         (rtos
             (apply (function +)
               (mapcar (function distof) (cdr x))))) ofile))
   
   (write-line "-----,-----" ofile)      
   (close ofile))
   
   (princ "\n<!> No Blocks Found <!>"))

(princ))

mexmr10 发表于 2022-7-5 15:44:29

效果很好,但。。。。。您能根据第三个名为“category”的属性对excel输出进行组织/字母排序吗?
 
谢谢你的帮助,李。

Lee Mac 发表于 2022-7-5 15:45:00

可能
 
你能上传一个你正在使用的区块的例子吗?

mexmr10 发表于 2022-7-5 15:50:29

当然给我两分钟。

mexmr10 发表于 2022-7-5 15:51:45

哎呀。。。完全忘记了最后4个类别(地被植物、藤蔓植物、一年生植物、混合种子)
 
因此,最终的excel输出应按以下顺序包含以下类别,并按类别按字母顺序排列。
 
-落叶荫蔽树
-观赏树木
-常绿树木
-落叶灌木
-常绿灌木
-多年生植物和观赏草
-地被植物
-藤蔓植物
-一年生植物和鳞茎植物
-种子混合物
 
最后一个请求。。。。有没有可能得到一个选择集提示,这样我就可以有选择地选择我想从哪些区块获得这些信息?我可以为这个选择集使用多段线边界吗。?

Lee Mac 发表于 2022-7-5 15:57:16

没有看到您的上一个请求,但请在第一部分中尝试以下操作:
 

;; Summing Attributes Before Extraction

(defun c:AttSum (/ *error* Get_Unique ATTLST CAT CAT_TAG ENT FILE I
                            N NUM NUM_TAG OBJ OFILE SS SYM SYM_TAG)
(vl-load-com)
;; Lee Mac~01.02.10

(setq Cat_Tag "CATEGORY"
       Sym_Tag "SYMBOL"
       Num_Tag "QUANTITY")

(defun *error* (msg)
   (and ofile (close ofile))
   (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
       (princ (strcat "\n** Error: " msg " **")))
   (princ))

(defun Get_Unique (lst / Remove_n x ass result)

   (defun Remove_n (n lst)
   (setq i -1)
   (vl-remove-if
       (function
         (lambda (x) (= (setq i (1+ i)) n))) lst))
   
   (while (setq x (car lst)) (setq lst (cdr lst))

   (while (setq ass (assoc (car x) lst))

       (setq x (cons (car x) (append (cdr x) (cdr ass))))

       (setq lst (Remove_n (vl-position ass lst) lst)))

   (setq result (cons x result)))

   result)

(mapcar (function set) '(Cat_Tag Sym_Tag Num_Tag)
         (mapcar (function strcase) (list Cat_Tag Sym_Tag Num_Tag)))

(if (and (setq i -1 ss (ssget '((0 . "INSERT") (2 . "KEY-PLANT") (66 . 1))))
          (setq file    (getfiled "Output File" "" "csv" 9)))
   (progn
   
   (setq ofile (open file "a"))
   (write-line (strcat (getvar "DWGPREFIX") (getvar "DWGNAME")) ofile)
   (write-line "PLANT-TYPE,QUANTITY" ofile)

   (while (setq ent (ssname ss (setq i (1+ i))))
       (setq obj (vlax-ename->vla-object ent))

       (foreach att (vlax-invoke obj 'GetAttributes)      

         (cond ((eq Cat_Tag (strcase (vla-get-TagString att)))
                  (setq Cat (vla-get-TextString att)))

               ((eq Sym_Tag (strcase (vla-get-TagString att)))
                  (setq Sym (vla-get-TextString att)))

               ((eq Num_Tag (strcase (vla-get-TagString att)))
                  (setq Num (vla-get-TextString att)))))

       (if (and Cat Sym Num)
         (setq AttLst (cons (cons Cat (list (cons Sym (list Num)))) AttLst))))

   (setq AttLst (vl-sort (mapcar
                           (function
                               (lambda (x)
                                 (cons (car x)
                                       (vl-sort (Get_Unique (cdr x))
                                       (function
                                           (lambda (a b)
                                             (< (car a) (car b)))))))) (Get_Unique AttLst))
                           (function
                           (lambda (a b)
                               (< (car a) (car b))))))   
   
   (foreach x Attlst
       (write-line (car x) ofile)

       (foreach y (cdr x)
         (write-line
         (strcat (car y) (chr 44)
             (rtos
               (apply (function +)
               (mapcar (function distof) (cdr y))))) ofile))

       (write-line "" ofile))

   (setq ofile (close ofile)))

   (princ "\n<!> No Blocks Found <!>"))

(princ))

 
编辑:根据上次请求更新

mexmr10 发表于 2022-7-5 15:59:44

这几乎是死在。。。先生,你真是个天才!
 
类别名称按字母顺序显示,但我需要按以下特定顺序显示:
 
-落叶荫蔽树
-观赏树木
-常绿树木
-落叶灌木
-常绿灌木
-多年生植物和观赏草
-地被植物
-藤蔓植物
-一年生植物和鳞茎植物
-种子混合物
 
我需要按字母顺序排列的是每个类别中的内容。

Lee Mac 发表于 2022-7-5 16:02:43

 
你没有要求太多…:眨眼:

mexmr10 发表于 2022-7-5 16:06:07

对不起。。。我真的很感谢你的帮助。
 
好的,如果我在每个类别名称前插入一个数字,使其首先读取数字而不是第一个字母,它会起作用吗?
页: [1] 2
查看完整版本: 修改工厂计划Lisp。