FastFiber

blockname als variabele

Gestart door Martin, di 21 09 2004, 21:48:38

Vorige topic - Volgende topic

bart

als je cijfers als tekst wilt sorteren moet je voorloop nullen gebruiken
dus 001 i.p.v. 1 dan kan je sorteren tot 999

als je de getallen als getallen behandeld is er volgens mij geen standaard sorteerfuntie voor (weet iemand er een dan hoor ik het ook graag)
en moet je aan de slag met sublijsten en de > (groter dan funtie)
werkwijze:

neem het eerste getal van de lijst en vergelijk die met de tweede
is deze groter ga dan verder met het tweede getal zo niet neem dan het eerste getal
plaats het kleinste getal in sublijst 1

herhaal dit tot je door de hele lijst heen bent (en dus het grooste getal hebt) en plaats het grootste getal in sublijst 2

vervang de hoofdlijst door sublijst 1
en herhaal alles

uiteindelijk is sublijst 2 op volgorde en kan je de hoofdlijst door sublijst 2 vervangen.


ps bij grote hoeveelheden kan dit afhankelijk van je systeem even tijd in beslag nemen
neem een regel op in de lus die bijvoorbeeld sublijst 2 afdrukt tijdens het debuggen van de lisp
en haal deze er uit als alles goed werkt omdat het constand uitvoeren naar het scherm de lisp behoorlijk vertraagt
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

Joop

Bart schreef:

Citeerals je de getallen als getallen behandeld is er volgens mij geen standaard sorteerfuntie voor (weet iemand er een dan hoor ik het ook graag)

De oplossing is simpel (nou ja  :duivel1: ).
1) verander de lijst van getallen in een lijst van tekst. itoa
2) controleer of elk element uit minder dan (bijvoorbeeld) 5 tekens bestaat. lambda of nth
3) zo ja voeg aan het begin genoeg nullen toe om er 5 tekens van te maken. strcat
4) sorteer de tekst lijst. acad_strlsort
5) converteer de tekest lijst naar een lijst van getallen. atoi

QED
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

bart

ja dat is inderdaad een goede oplossing (met voorloop nullen :mrgreen: )
maar wel zo dat ze er alleen tijdelijk voor worden geplaatst.

Ik denk dat ik hem maar eens ga proberen
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

Joop

Normaal verdwijnen bij getallen de voorloopnullenvanzelf, doen ze dit niet dan maakt het nog niets uit want 00001 = 1 :lol:. Is toch zo?
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

bart

Citaat van: JoopNormaal verdwijnen bij getallen de voorloopnullenvanzelf, doen ze dit niet dan maakt het nog niets uit want 00001 = 1 :lol:. Is toch zo?

Dat is waar maar er is binnen autocad geen funtie beschikbaar waarmee je cijfers als cijfers op je tekening zet
alles wat je ziet is tekst. (zelfs bij de maatvoering als je newtext gebruikt)

het onderscheid is alleen aanwezig tijdens het uitvoeren van een programma als je dus  00001 als waarde van een attribute opgeeft zal dit ook gewoon als 00001 op het scherm komen en niet vanzelf verdwijnen.
Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

Joop

Ik kom hier morgen op terug.
Nu eerst naar de vrouw.
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

Joop

:D Het is wat later geworden dan beloofd, maar hier ben ik dan.

Om de nullen aan het begin van een "getal als tekst" weg te halen doe je het volgende.

Aan het begin van je LISP routine moet je (vl-load-com) plaatsen. Hiermee maak je de Visual Lisp actief.
Vervolgens:
(vl-string-left-trim "0" "000125")
Dit geeft als resultaat "125".
Met de foreach of lambda functie kun je dit op elk element van de lijst toepassen. :lol:
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

bart

Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

Anonymous

Citaat van: Anonymous
vraag 2.
   (setq txtlst2 (acad_strlsort txtlst))
dit commande vond ik ergens in een lisp. Als ik dit gebruik sorteer hij
op tekst / eerste karakter niet op nummervolgorde. Kan dit wel?
bijv. 1, 2, 3, 15, 16, 22 sorteert hij op 1, 15, 16, 2, 22, 3

Beste Gast,

In Visual LISP is er een functie VL-SORT die we goed sorteert.
Eerst moet U natuurlijk wel Visual LISP laden met de functie (vl-load-com), als u daarna bijvoorbeeld:
(VL-SORT '(2 1 5 7 6 16 3 3 22 3 3 25 4 8 11 9 14) '<) ingeeft
dan krijgt men:
(1 2 3 4 5 6 7 8 9 11 14 16 22 25)
Dubbelingen worden hierbij weg gelaten!

Groetjes HofCAD.

PS

(defun C:sorteer1()
(vl-load-com)
(setq txtlst2 '(2 1 5 7 6 16 3 3 22 3 3 25 4 8 11 9 14))
(VL-SORT txtlst2 '<)
;;dit geeft: (1 2 3 4 5 6 7 8 9 11 14 16 22 25)
)

(defun C:sorteer2()
(vl-load-com)
(setq txtlst2 '(2 1 5 7 6 16 3 3 22 3 3 25 4 8 11 9 14))
(VL-SORT txtlst2 '>)
;;dit geeft: (25 22 16 14 11 9 8 7 6 5 4 3 2 1)
)

Joop

HofCAD schreef:
Citeerdefun C:sorteer1()
(vl-load-com)
(setq txtlst2 '(2 1 5 7 6 16 3 3 22 3 3 25 4 8 11 9 14))
(VL-SORT txtlst2 '<)
;;dit geeft: (1 2 3 4 5 6 7 8 9 11 14 16 22 25)
)

(defun C:sorteer2()
(vl-load-com)
(setq txtlst2 '(2 1 5 7 6 16 3 3 22 3 3 25 4 8 11 9 14))
(VL-SORT txtlst2 '>)
;;dit geeft: (25 22 16 14 11 9 8 7 6 5 4 3 2 1)
)

Zoals je ziet verdwijnt hier wel alle dubbele getallen. 3 komt vier keer voor in de oorspronkelijke lijst en slechts 1 keer in de gesorteerde lijst.
Als je vl-sort-i gebruikt blijven wel alle dubbel voorkomende getallen aanwezig. Je krijgt echter een lijst met de positie van de getallen in de oorspronkele lijst retour. Dit betekent alleen maar dat jemet de nth functie de eigen lijst moet maken.
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".