CADsite forum

AutoCAD => Autolisp => Topic gestart door: gery op vr 20 04 2018, 11:07:52

Titel: OPGELOST - hoogste en laagste waarde
Bericht door: gery op vr 20 04 2018, 11:07:52
Ik zoek een LISP routine die de hoogste en de laagste waarde zoekt in een willekeurig aantal op het scherm geselecteerde teksten. Is dit een standaard functie in AutoCAD 2012?
Iemand een tip waar ik dit zou kunnen vinden, of misschien zelfs de volledige code?
'k Heb al gezocht via Google, maar niet direct iets bruikbaars gevonden.
Titel: Re: hoogste en laagste waarde
Bericht door: EddyBeerke op vr 20 04 2018, 12:28:54
http://www.cadtutor.net/forum/archive/index.php/t-30548.html
Staat hier iets bij waar je wat aan hebt?
Titel: Re: hoogste en laagste waarde
Bericht door: EddyBeerke op vr 20 04 2018, 12:37:53
Met een kleine aanpassing van eentje die daar staat:
(defun c:textvals  (/ ss i tv vl)
  (while (not ss)
    (princ "\nSelect Text To Calulate...")
    (setq ss (ssget '((0 . "TEXT"))))
  ) ;_ end of while
  (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))
  ) ;_ end of while
  (setq  min_val  (apply 'min vl)
        max_val  (apply 'max vl)
        avg_val  (/ (apply '+ vl) (length vl))
  ) ;_ end of setq
  (princ "\n Minimum: ")(princ min_val)
  (princ "\n Maximum: ")(princ max_val)
  (princ "\n Gemiddeld: ")(princ avg_val)
  (princ)
) ;_ end of defun
Titel: Re: hoogste en laagste waarde
Bericht door: gery op vr 20 04 2018, 15:42:43
Merci Eddy, dat is wat ik zocht!  :vreegoe: :vreegoe: :vreegoe:
Titel: Re: hoogste en laagste waarde = OPGELOST
Bericht door: gery op di 24 04 2018, 14:19:27
De code werkt goed maar als er ergens een tekstobject met letters tussen de geselecteerde tekstobjecten zit, loopt het niet helemaal goed. Hoe kan ik enkel de tekstobjecten met enkel een getal erin selecteren?
Titel: Re: hoogste en laagste waarde = OPGELOST
Bericht door: EddyBeerke op wo 25 04 2018, 09:21:48
Je zou dan een functie moeten toevoegen die controleert of het een nummer is.

Ik dacht aan:
(numberp (read tv))

CiteerCommand: (numberp (read "11BN"))
nil

Command: (numberp (read "11"))
T

Command:
Titel: Re: hoogste en laagste waarde = OPGELOST
Bericht door: roy_043 op wo 25 04 2018, 16:15:16
Het is mogelijk om de selection set zoveel mogelijk te filteren:
(setq ss (ssget '((0 . "*TEXT") (-4 . "<NOT") (1 . "*[~-.0-9]*,`.,*`.*`.*,-,?*-*") (-4 . "NOT>"))))
Titel: Re: hoogste en laagste waarde = OPGELOST
Bericht door: EddyBeerke op wo 25 04 2018, 17:40:44
Beter!  :vreegoe:
Citaat van: roy_043 op wo 25 04 2018, 16:15:16
Het is mogelijk om de selection set zoveel mogelijk te filteren:
(setq ss (ssget '((0 . "*TEXT") (-4 . "<NOT") (1 . "*[~-.0-9]*,`.,*`.*`.*,-,?*-*") (-4 . "NOT>"))))
Titel: Re: hoogste en laagste waarde = OPGELOST
Bericht door: gery op wo 25 04 2018, 21:56:30
Bedankt Eddy en Roy.

Die code van Roy moet ik toch eens wat nader bestuderen want dat lijkt wel Chinees.  :roll:
Titel: Re: hoogste en laagste waarde = OPGELOST
Bericht door: EddyBeerke op do 26 04 2018, 08:32:43
Bij deze de volledige code met de aanpassing van Roy:
(defun c:textvals  (/ ss i tv vl min_val max_val avg_val)
  (while (not ss)
    (princ "\nSelect Text To Calulate...")
    (setq ss (ssget '((0 . "*TEXT") (-4 . "<NOT") (1 . "*[~-.0-9]*,'.,*'.*'.*,-,?*-*") (-4 . "NOT>"))))
  ) ;_ end of while
  (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))
  ) ;_ end of while
  (setq  min_val  (apply 'min vl)
        max_val  (apply 'max vl)
        avg_val  (/ (apply '+ vl) (length vl))
  ) ;_ end of setq
  (princ (strcat "\n Minimum: "   (rtos min_val)
                 "\n Maximum: "   (rtos max_val)
                 "\n Gemiddeld: " (rtos avg_val)
         );_ end strcat
);_ end princ
  (princ)
) ;_ end of defun


Misschien dat Roy de uitleg kan geven van dat filter?
Titel: Re: hoogste en laagste waarde = OPGELOST
Bericht door: gery op do 26 04 2018, 08:58:08
Ik had ook dit nog gevonden:

(vlax-for #tx (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
  (if (not (distof (vla-get-textstring #tx)))
    (ssdel (vlax-vla-object->ename #tx) #ss)))


Deze code verwijdert alle tekstobjecten die geen getal zijn uit een selection set.
Ik heb deze code uiteindelijk niet gebruikt maar kan misschien van nut zijn voor iemand anders.
Titel: Re: hoogste en laagste waarde = OPGELOST
Bericht door: roy_043 op do 26 04 2018, 16:13:42
Hierbij wat uitleg over:
(setq ss (ssget '((0 . "*TEXT") (-4 . "<NOT") (1 . "*[~-.0-9]*,`.,*`.*`.*,-,?*-*") (-4 . "NOT>"))))

Ik beperk me tot uitleg over het tweede wcmatch patroon:
Het patroon bevat 5 onderdelen gescheiden door een komma (de komma staat voor OR):
"*[~-.0-9]*" : Matcht strings die een karakter bevatten dat niet in een decimaal getal thuishoort.
"`."         : Matcht strings die bestaan uit een enkele punt ".".
               Omdat de punt voor wcmatch een speciale betekenis heeft moet het karakter 'ge-escapet'
               worden met het "`" teken.
"*`.*`.*"    : Matcht strings met twee of meer punten.
"-"          : Matcht strings die bestaan uit een enkele minteken.
"?*-*"       : Matcht strings met een minteken dat niet het eerste karakter is. 'Vangt' automatisch
               ook strings met meerdere mintekens.

Als de string matcht met één van deze patronen dan is het geen decimaal getal en moet het betreffende
tekstobject worden uitgefiltered (vandaar het gebruik van NOT).

Let overigens op de verschillen tussen read, atof en distof:
(read "1")     => 1
(read "1.2")   => 1.2
(read ".3")    => ERROR MELDING
(read "1'3\"") => 1 (FOUT!)

(atof "1")     => 1.0
(atof "1.2")   => 1.2
(atof ".3")    => 0.3
(atof "1'3\"") => 1.0 (FOUT!)

(distof "1")     => 1.0
(distof "1.2")   => 1.2
(distof ".3")    => 0.3
(distof "1'3\"") => 15.0
Titel: Re: hoogste en laagste waarde = OPGELOST
Bericht door: EddyBeerke op do 26 04 2018, 16:36:03
Super! :ole:  Super! :ole:  Super! :ole:  Super! :ole:  Super! :ole:  Super! :ole:font]
Citaat van: roy_043 op do 26 04 2018, 16:13:42
Hierbij wat uitleg over:
...
Titel: Re: hoogste en laagste waarde = OPGELOST
Bericht door: gery op do 26 04 2018, 18:29:57
Duidelijk zo!  :vreegoe: