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.
http://www.cadtutor.net/forum/archive/index.php/t-30548.html
Staat hier iets bij waar je wat aan hebt?
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
Merci Eddy, dat is wat ik zocht! :vreegoe: :vreegoe: :vreegoe:
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?
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:
Het is mogelijk om de selection set zoveel mogelijk te filteren:
(setq ss (ssget '((0 . "*TEXT") (-4 . "<NOT") (1 . "*[~-.0-9]*,`.,*`.*`.*,-,?*-*") (-4 . "NOT>"))))
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>"))))
Bedankt Eddy en Roy.
Die code van Roy moet ik toch eens wat nader bestuderen want dat lijkt wel Chinees. :roll:
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?
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.
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
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:
...
Duidelijk zo! :vreegoe: