FastFiber

OPGELOST - hoogste en laagste waarde

Gestart door gery, vr 20 04 2018, 11:07:52

Vorige topic - Volgende topic

gery

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.
AutoCAD 2020 - Windows 10

EddyBeerke

Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

EddyBeerke

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
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

gery

Merci Eddy, dat is wat ik zocht!  :vreegoe: :vreegoe: :vreegoe:
AutoCAD 2020 - Windows 10

gery

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?
AutoCAD 2020 - Windows 10

EddyBeerke

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:
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

roy_043

Het is mogelijk om de selection set zoveel mogelijk te filteren:
(setq ss (ssget '((0 . "*TEXT") (-4 . "<NOT") (1 . "*[~-.0-9]*,`.,*`.*`.*,-,?*-*") (-4 . "NOT>"))))

EddyBeerke

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>"))))
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

gery

Bedankt Eddy en Roy.

Die code van Roy moet ik toch eens wat nader bestuderen want dat lijkt wel Chinees.  :roll:
AutoCAD 2020 - Windows 10

EddyBeerke

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?
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

gery

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.
AutoCAD 2020 - Windows 10

roy_043

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

EddyBeerke

#12
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:
...
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

gery

AutoCAD 2020 - Windows 10

FastFiber