谢谢
很乐意帮忙。 (defun c:textvals (/ ss i tv vl)
(while (not ss)
(princ "\nSelect Text To Calulate...")
(setq ss (ssget '((0 . "TEXT")))))
(setq i (sslength ss))
(while (not (minusp (setq i (1- i))))
(setq tv (cdr (assoc 1 (entget (ssname ss i)))))
(setq vl (cons (atof tv) vl)))
(setq min_val (apply 'min vl)
max_val (apply 'max vl)
avg_val (/ (apply '+ vl) (length vl)))
(prin1))
这里有一些问题:
您需要测试多行文字实体吗?
您需要测试文本中的0-9个字符和小数点。
允许昏迷吗?
一个(wcmatch)可以做到这一点,但它有点笨重。
您可能需要过滤出纸面空间/模型数据库实体
可能还有更多的方法可以帮助你-大卫 大卫,你让我羞愧
就在我认为我已经理解了LISP的时候,我惊讶地发现还有更多的东西需要学习 我对你的代码David印象深刻,希望能从中学到很多。我理解大部分代码,除了这一行:
我知道您正在创建选择集中所有数字的列表,但它如何处理“vl”的初始值?
i、 e.如果文本包含以下内容,您是否会留下:
1,2,3,4,5:
(1 2 3 4 5 nil)或类似的东西,如vl的初始值(nil)在那里?
提前感谢您的帮助 李,
nil的值是一个空列表()。
Command: (null nil)
T
Command: (listp nil)
T
这就是为什么在处理列表时将变量声明为局部变量非常重要的原因之一。否则,由于变量已绑定到列表,因此会得到错误的结果。
大卫 不错。谢谢,我现在明白多了。
当我创建LISP时,限制我的是如何将选择集转换为列表我真的很想在LISP中使用内置的“min”和“max”函数,但因为我不知道如何将选择集转换为列表,所以我不得不即兴创作并用自己的方式找到最大值。
我还喜欢LISP只要求一个选择集并从那里处理事情的方式,这使事情变得更简单。 下面是使用选择集的另一个示例。
(defun c:test (/ ss lst numlst txt2num)
(defun txt2num (txt / num)
(or (setq num (distof txt 5))
(setq num (distof txt 2))
(setq num (distof txt 1))
(setq num (distof txt 4))
(setq num (distof txt 3))
)
num
)
(prompt "\nSelect text to analize numbers.")
(if (setq ss (ssget '((0 . "TEXT,MTEXT"))))
(progn
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(mapcar '(lambda (x) (setq numlst (cons (txt2num (cdr (assoc 1 (entget x)))) numlst)))
lst
)
(if (setq numlst (vl-remove-if 'listp numlst))
(progn
(print "Min number ")
(princ (apply 'min numlst))
(print "Max number ")
(princ (apply 'max numlst))
(print "Average of numbers ")
(princ (/ (apply '+ numlst) (length numlst)))
)
(prompt "\nNo numberf found.")
)
)
)
(princ)
) 你的代码给我留下了深刻的印象,但在我想问的许多问题中,有一个问题:
distof和atof之间有什么区别?
谢谢
李 谢谢李,
对于字符串的格式,distof更宽容。
出于这个原因,我几乎总是使用getdist。
另请参阅附件中更详细的例程。
下面是另一个示例:
7
Text2Num驾驶室2-1。LSP 啊,我现在更明白了。谢谢
我必须说,你附加的Lisp程序绝对是惊人的写得这么好(不是说我大部分都懂)。。。但还是很精彩
页:
1
[2]