平均值、最小值、最大值
有人能帮我找到一个lisp,用数值计算文本的平均值、最小值和最大值吗? CAD TIPS中有一个完整的Lisp例程存档,它是cadalyst杂志网站的一部分。为了回答这里提出的问题,我在那里进行了多次搜索。试试看。从这里开始:www.cadalyst。通用域名格式 如果你在Cadalyst上运气不好,试试这个,这是我刚才输入的
; Max, Min and Average by Lee McDonnell -- 12/08
(defun c:number (/ ans ent1 nmax ent num ent2 nmin ent3 num2 ss ssl index tents tot ent4 num3 ave)
(princ "\nInitializing...")
(initget 1 "Max Min Average")
(setq ans (getkword "\nSpecify Numerical Requirement : "))
(cond
((= ans "Max")
(if
(setq ent1 (car (entsel "\nSelect Numerical Text: ")))
(progn
(setq nmax (atof (cdr (assoc 1 (entget ent1)))))
(while
(/= (setq ent (car (entsel "\nSelect Numerical Text: "))) nil)
(if (= (cdr (assoc 0 (entget ent))) "TEXT")
(progn
(setq num (atof (cdr (assoc 1 (entget ent)))))
(if (> num nmax)
(setq nmax num)
) ;_end if
) ;_end progn
(alert "Selected Entity must be Text.")
) ;_end if
) ;_end while
(alert (strcat "Maximum Number is: " (rtos nmax)))
) ;_end progn
(alert "Text Required.")
) ;_end if
)
((= ans "Min")
(if
(setq ent2 (car (entsel "\nSelect Numerical Text: ")))
(progn
(setq nmin (atof (cdr (assoc 1 (entget ent2)))))
(while
(/= (setq ent3 (car (entsel "\nSelect Numerical Text: "))) nil)
(if (= (cdr (assoc 0 (entget ent3))) "TEXT")
(progn
(setq num2 (atof (cdr (assoc 1 (entget ent3)))))
(if (< num2 nmin)
(setq nmin num2)
) ;_end if
) ;_end progn
(alert "Selected Entity must be Text.")
) ;_end if
) ;_end while
(alert (strcat "Minimum Number is: " (rtos nmin)))
) ;_end progn
(alert "Text Required.")
) ;_end if
)
((= ans "Average")
(setq ss (ssget)
ssl (sslength ss)
index 0
tents 0
tot 0
) ;_end setq
(repeat ssl
(setq ent4 (entget (ssname ss index)))
(if (= (cdr (assoc 0 ent4)) "TEXT")
(progn
(setq num3 (atof (cdr (assoc 1 ent4))))
(setq tot (+ num3 tot))
(setq tents (1+ tents))
) ;_end progn
) ;_end if
(setq index (1+ index))
) ;_end repeat
(if (/= tents 0)
(progn
(setq ave (/ tot tents))
(alert (strcat "Average of " (rtos tents) " Numbers is: " (rtos ave)))
) ;_end progn
(alert "No Text Entities Selected.")
) ;_end if
)
) ;_end cond
(princ)
) ;_end defun
我对在Max和Min操作中选择文本实体的“entsel”方法不太满意——我更愿意再次使用ssget选择方法。
但我遇到的问题是,在最小值和最大值运算中,可能需要一个基准进行比较,即取集合中的一个数字,然后将其他数字与之进行比较,如果每个数字都大于或小于基准,则将其设置为新的基准,依此类推。所以我考虑使用选择集的第一个元素作为基准,但这并没有放弃第一个元素可能不是文本元素的可能性。
我想我可以设计一个程序来做到这一点,但我需要更多的时间-暂时使用上述内容。
李不可接受。我们现在需要修复,否则你就得不到报酬!:x
附笔。 懒鬼:lol::lol:
李:
第一你如此轻松地完成了这些事情,我很嫉妒。你似乎真的有Lisp程序的本领。
第二你睡过吗?
谢谢-我在这里有很多练习
我必须承认,很少。。。 谢谢你的帮助李。我同意你选择文本实体的“entsel”方法。我有数百个文本实体,这使得它不切实际。 好的,约翰,我有几分钟的时间,试试这个:
; Max, Min and Average by Lee McDonnell -- 12/08
(defun c:number (/ ans ss_max ssl_max xth tent_maxent_max ent_base_max
num_max ss_min ssl_min yth tent_minent_min ent_base_min
num_min ss ssl index tents tot ent num
ave
)
(princ "\nInitializing...")
(initget 1 "Max Min Average")
(setq ans (getkword "\nSpecify Numerical Requirement : "))
(cond
((= ans "Max")
(setq ss_max (ssget)
ssl_max (sslength ss_max)
xth 0
tent_max 0
) ;_end setq
(if (/= ssl_max 0)
(progn
(while (< xth ssl_max)
(setq ent_max (entget (ssname ss_max xth)))
(if (= (cdr (assoc 0 ent_max)) "TEXT")
(progn
(setq ent_base_max (atof (cdr (assoc 1 ent_max))))
(setq xth ssl_max)
) ;_end progn
(setq xth (1+ xth))
) ;_end if
) ;_end while
(setq xth 0)
(repeat ssl_max
(setq ent_max (entget (ssname ss_max xth)))
(if (= (cdr (assoc 0 ent_max)) "TEXT")
(progn
(setq num_max (atof (cdr (assoc 1 ent_max))))
(if (> num_max ent_base_max)
(setq ent_base_max num_max)
) ;_end if
(setq tent_max (1+ tent_max))
) ;_end progn
) ;_end if
(setq xth (1+ xth))
) ;_end repeat
(alert (strcat "Maximum of " (rtos tent_max) " Numbers is: " (rtos ent_base_max)))
) ;_end progn
(alert "No Entities Selected.")
) ;_end if
)
((= ans "Min")
(setq ss_min (ssget)
ssl_min (sslength ss_min)
yth 0
tent_min 0
) ;_end setq
(if (/= ssl_min 0)
(progn
(while (< yth ssl_min)
(setq ent_min (entget (ssname ss_min yth)))
(if (= (cdr (assoc 0 ent_min)) "TEXT")
(progn
(setq ent_base_min (atof (cdr (assoc 1 ent_min))))
(setq yth ssl_min)
) ;_end progn
(setq yth (1+ yth))
) ;_end if
) ;_end while
(setq yth 0)
(repeat ssl_min
(setq ent_min (entget (ssname ss_min yth)))
(if (= (cdr (assoc 0 ent_min)) "TEXT")
(progn
(setq num_min (atof (cdr (assoc 1 ent_min))))
(if (< num_min ent_base_min)
(setq ent_base_min num_min)
) ;_end if
(setq tent_min (1+ tent_min))
) ;_end progn
) ;_end if
(setq yth (1+ yth))
) ;_end repeat
(alert (strcat "Minimum of " (rtos tent_min) " Numbers is: " (rtos ent_base_min)))
) ;_end progn
(alert "No Entities Selected.")
) ;_end if
)
((= ans "Average")
(setq ss (ssget)
ssl (sslength ss)
index 0
tents 0
tot 0
) ;_end setq
(repeat ssl
(setq ent (entget (ssname ss index)))
(if (= (cdr (assoc 0 ent)) "TEXT")
(progn
(setq num (atof (cdr (assoc 1 ent))))
(setq tot (+ num tot))
(setq tents (1+ tents))
) ;_end progn
) ;_end if
(setq index (1+ index))
) ;_end repeat
(if (/= tents 0)
(progn
(setq ave (/ tot tents))
(alert (strcat "Average of " (rtos tents) " Numbers is: " (rtos ave)))
) ;_end progn
(alert "No Text Entities Selected.")
) ;_end if
)
) ;_end cond
(princ)
) ;_end defun
谢谢李。你有非凡的能力!
页:
[1]
2