johnengineer 发表于 2022-7-6 16:00:22

平均值、最小值、最大值

有人能帮我找到一个lisp,用数值计算文本的平均值、最小值和最大值吗?

ReMark 发表于 2022-7-6 16:03:57

CAD TIPS中有一个完整的Lisp例程存档,它是cadalyst杂志网站的一部分。为了回答这里提出的问题,我在那里进行了多次搜索。试试看。从这里开始:
 
www.cadalyst。通用域名格式

Lee Mac 发表于 2022-7-6 16:09:45

如果你在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

Lee Mac 发表于 2022-7-6 16:10:08

我对在Max和Min操作中选择文本实体的“entsel”方法不太满意——我更愿意再次使用ssget选择方法。
 
但我遇到的问题是,在最小值和最大值运算中,可能需要一个基准进行比较,即取集合中的一个数字,然后将其他数字与之进行比较,如果每个数字都大于或小于基准,则将其设置为新的基准,依此类推。所以我考虑使用选择集的第一个元素作为基准,但这并没有放弃第一个元素可能不是文本元素的可能性。
我想我可以设计一个程序来做到这一点,但我需要更多的时间-暂时使用上述内容。

MaxwellEdison 发表于 2022-7-6 16:14:19

 
李不可接受。我们现在需要修复,否则你就得不到报酬!:x
 
 
附笔。

ReMark 发表于 2022-7-6 16:18:25

懒鬼:lol::lol:
 
李:
 
第一你如此轻松地完成了这些事情,我很嫉妒。你似乎真的有Lisp程序的本领。
 
第二你睡过吗?

Lee Mac 发表于 2022-7-6 16:19:29

 
谢谢-我在这里有很多练习
 
 
我必须承认,很少。。。

johnengineer 发表于 2022-7-6 16:25:20

谢谢你的帮助李。我同意你选择文本实体的“entsel”方法。我有数百个文本实体,这使得它不切实际。

Lee Mac 发表于 2022-7-6 16:27:44

好的,约翰,我有几分钟的时间,试试这个:
 

; 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

johnengineer 发表于 2022-7-6 16:29:13

谢谢李。你有非凡的能力!
页: [1] 2
查看完整版本: 平均值、最小值、最大值