修改工厂计划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 我不久前写了这篇文章,没有经过测试,但试一试:
;; 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))
效果很好,但。。。。。您能根据第三个名为“category”的属性对excel输出进行组织/字母排序吗?
谢谢你的帮助,李。 可能
你能上传一个你正在使用的区块的例子吗? 当然给我两分钟。 哎呀。。。完全忘记了最后4个类别(地被植物、藤蔓植物、一年生植物、混合种子)
因此,最终的excel输出应按以下顺序包含以下类别,并按类别按字母顺序排列。
-落叶荫蔽树
-观赏树木
-常绿树木
-落叶灌木
-常绿灌木
-多年生植物和观赏草
-地被植物
-藤蔓植物
-一年生植物和鳞茎植物
-种子混合物
最后一个请求。。。。有没有可能得到一个选择集提示,这样我就可以有选择地选择我想从哪些区块获得这些信息?我可以为这个选择集使用多段线边界吗。? 没有看到您的上一个请求,但请在第一部分中尝试以下操作:
;; 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))
编辑:根据上次请求更新 这几乎是死在。。。先生,你真是个天才!
类别名称按字母顺序显示,但我需要按以下特定顺序显示:
-落叶荫蔽树
-观赏树木
-常绿树木
-落叶灌木
-常绿灌木
-多年生植物和观赏草
-地被植物
-藤蔓植物
-一年生植物和鳞茎植物
-种子混合物
我需要按字母顺序排列的是每个类别中的内容。
你没有要求太多…:眨眼: 对不起。。。我真的很感谢你的帮助。
好的,如果我在每个类别名称前插入一个数字,使其首先读取数字而不是第一个字母,它会起作用吗?
页:
[1]
2