Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  acad_strlsort

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  acad_strlsort (893 mal gelesen)
Bernd10
Mitglied



Sehen Sie sich das Profil von Bernd10 an!   Senden Sie eine Private Message an Bernd10  Schreiben Sie einen Gästebucheintrag für Bernd10

Beiträge: 763
Registriert: 20.11.2003

Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz
16 GB RAM
Windows 10 Pro 64-bit
AutoCAD Mechnical 2020 Deu

erstellt am: 26. Apr. 2004 14:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

ich habe ein seltsames Problem mit der Lisp-Funktion acad_strlsort. Als Beispiel folgender Sourece-Code:
( defun c:testsort ( /
                    ltestunsort ltestsort )

  (setq ltestunsort (list "0"
                          "AWSatzPolylinienErstellen_schwarz_250"
                          "A_blau_170"
                          "A_braun_18"
                          "A_gelb_2"
                          "A_grün_90"
                          "A_orange_30"
                          "A_rot_10"
                          "A_schwarz_250"
                          "A_weiß_7"
                          "Anreißhilfe_SF210_210"
                          "KoorKon_schwarz_250"
                          "TextTemporär_schwarz_250"
                          "Textbox_SF130_130"))
  (setq ltestsort (acad_strlsort ltestunsort))
  (terpri)
  (princ "ltestsort: ")
  (princ ltestsort)

; Rückgabewert
  (princ)

)

Führe ich das o.g. Beispiel in der Visual LISP-Konsole aus, so erhalte ich das erwartete Ergebnis:
ltestsort: (0 A_blau_170 A_braun_18 A_gelb_2 A_grün_90 A_orange_30 A_rot_10 A_schwarz_250 A_weiß_7 Anreißhilfe_SF210_210 AWSatzPolylinienErstellen_schwarz_250 KoorKon_schwarz_250 Textbox_SF130_130 TextTemporär_schwarz_250)

Füge ich das o.g. Beispiel aber in das VLX-Projekt ein und führe den Befehl testsort der VLX-Anwendung aus, so erhalte ich das Ergebnis so:
ltestsort: (0 AWSatzPolylinienErstellen_schwarz_250 A_blau_170 A_braun_18
A_gelb_2 A_grün_90 A_orange_30 A_rot_10 A_schwarz_250 A_weiß_7
Anreißhilfe_SF210_210 KoorKon_schwarz_250 TextTemporär_schwarz_250
Textbox_SF130_130)

Warum ist der Eintrag AWSatzPolylinienErstellen_schwarz_250 in diesem Fall an der 2. Position bzw. stimmt die Sortierung nicht?

Danke im Voraus und viele Grüße
Bernd

PS:
- o.g. Beispiel mit der Systemvariable MAXSORT und deren Werte 200, 1000 und 2000 getestet, aber ohne Erfolg.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Bernd10
Mitglied



Sehen Sie sich das Profil von Bernd10 an!   Senden Sie eine Private Message an Bernd10  Schreiben Sie einen Gästebucheintrag für Bernd10

Beiträge: 763
Registriert: 20.11.2003

Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz
16 GB RAM
Windows 10 Pro 64-bit
AutoCAD Mechnical 2020 Deu

erstellt am: 28. Apr. 2004 15:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

ich kann das Sortierproblem inzwischen beheben, indem ich in den Eigenschaften meiner VLX-Anwendung (Visual Lisp -> Datei -> Anwendung -> Eigenschaften einer Anwendung) auf der Registerkarte "Anwendungsoptionen" den Haken der Eigenschaft "Separater Namensbereich" entferne. Alle anderen Eigenschaften und Einstellungen bleiben unverändert. Meine grobe Umgebung sieht so aus:
- mehrere Zeichnungen können gleichzeitig geöffnet sein (Multiple Document Interface)
- VLX-Anwendung einmal für alle Dokumente laden mit vl-load-all
- Variablen, die nur für das aktuelle Dokument gelten sollen mit vl-doc-set/vl-doc-ref bearbeitet
- Variablen, die für alle Dokumente gelten sollen mit vl-bb-set/vl-bb-ref bearbeitet
- lokale Variablen mit setq bearbeitet und nach dem Zeichen / bei der Funktion defun eingetragen

Wo sind die Unterschiede (Vor-/Nachteile) der beiden möglichen Einstellungen für die Eigenschaft "Separater Namensbereich"?

Danke im Voraus.

Mit freundlichen Grüßen
Bernd

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Dabrunz
Mitglied



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 29. Apr. 2004 08:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Bernd10 10 Unities + Antwort hilfreich

Tag.

Zitat:

ich kann das Sortierproblem inzwischen beheben, indem ich in den Eigenschaften meiner VLX-Anwendung (Visual Lisp -> Datei -> Anwendung -> Eigenschaften einer Anwendung) auf der Registerkarte "Anwendungsoptionen" den Haken der Eigenschaft "Separater Namensbereich" entferne.

Meiner bescheidenen Meinung nach keine glückliche Wahl - verwende dann lieber vl-sort oder vl-sort-i, wenn Einträge in der Liste mehrfach vorkommen dürfen. Damit gibt's dann keine Notwendigkeit mehr, diesen Bug zu umgehen.

Zitat:

[..] Meine grobe Umgebung sieht so aus:
- mehrere Zeichnungen können gleichzeitig geöffnet sein (Multiple Document Interface)
- VLX-Anwendung einmal für alle Dokumente laden mit vl-load-all
- Variablen, die nur für das aktuelle Dokument gelten sollen mit vl-doc-set/vl-doc-ref bearbeitet
- Variablen, die für alle Dokumente gelten sollen mit vl-bb-set/vl-bb-ref bearbeitet

So weit, so gut. Allerdings musste ich feststellen, dass die vl-bb-*-Funktionen ab AutoCAD 2004 ordendlich (und damit meine ich auch ordendlich!) an Zugriffs-Tempo eingebüßt haben. Das BlackBoard scheint mir außer als reine Ablage, die doch noch performanter als ein Dateizugriff ist, zu nicht mehr viel zu gebrauchen zu sein ..

Zitat:

- lokale Variablen mit setq bearbeitet und nach dem Zeichen / bei der Funktion defun eingetragen

Soso - ein wenig, sagen wir mal unkonventionell ausgedrückt, aber soll wohl heißen, dass die übrigen Variablen lokal sind, also mit anderen Worten: im separaten Namensraum der jeweiligen Funktion liegen.

Zitat:

Wo sind die Unterschiede (Vor-/Nachteile) der beiden möglichen Einstellungen für die Eigenschaft "Separater Namensbereich"?

Das wesendliche Merkmal eines separaten Namensraums ist - nun ja - dass er separat ist. Das bedeutet und ist auch schon sein Vorteil, dass alle innerhalb verwendeten Namen (für Variablen und Funktionen, was eigendlich in VLisp keinen Unterschied macht) nur in diesem Namensraum gültig sind und weder andere, gleichzeitig geladenen Funktionen überschreiben, noch von ihnen überschrieben werden können. Meiner Meinung nach unverzichtbar!

Der Nachteil bestehen im Wesendlichen aus Komfort-Verlust: Funktionen und Größen, die außerhalb - insbesondere nach Abarbeitung eines Funktions-Aufrufs - der VLX verwendet werden sollen, müssen exportiert werden. Das tust aber mit vl-doc-* sowieso, kannst aber ohne separaten Namensräume darauf verzichten - da wird eh alles im Document-NameSpace zur Verfügung gestellt.

Auch extern deklarierte Funktionen müssen vor ihrer Verwendung erst in den Namensraum geladen werden. Alles in Allem ist also strukturiertere Programmierung erforderlich. Meiner Meinung nach durchaus akzeptabel.

Achim Dabrunz

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Bernd10
Mitglied



Sehen Sie sich das Profil von Bernd10 an!   Senden Sie eine Private Message an Bernd10  Schreiben Sie einen Gästebucheintrag für Bernd10

Beiträge: 763
Registriert: 20.11.2003

Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz
16 GB RAM
Windows 10 Pro 64-bit
AutoCAD Mechnical 2020 Deu

erstellt am: 29. Apr. 2004 10:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Achim,

zunächst vielen Dank für Deine Informationen.

Zitat:
----------------------------------------------------------------------
Meiner bescheidenen Meinung nach keine glückliche Wahl - verwende dann lieber vl-sort oder vl-sort-i, wenn Einträge in der Liste mehrfach vorkommen dürfen. Damit gibt's dann keine Notwendigkeit mehr, diesen Bug zu umgehen.
----------------------------------------------------------------------

Die Funktion vl-sort hatte ich auch schon getestet, allerdings ist es mir dabei auch damit nicht gelungen das gewünschte Ergebnis zu erzielen. Wie muss ich die Funktion vl-sort für mein Beispiel verwenden?

Danke im Voraus und viele Grüße
Bernd

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Bernd10
Mitglied



Sehen Sie sich das Profil von Bernd10 an!   Senden Sie eine Private Message an Bernd10  Schreiben Sie einen Gästebucheintrag für Bernd10

Beiträge: 763
Registriert: 20.11.2003

Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz
16 GB RAM
Windows 10 Pro 64-bit
AutoCAD Mechnical 2020 Deu

erstellt am: 04. Mai. 2004 14:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo,

ich hatte das gleiche Problem (Sortierung anders als erwartet) auch in einer C++-Klasse in Visual C++, da ich zum Vergleichen zunächst die Funktion Compare der Klasse CString verwendet habe. Nach dem Verwenden der Funktion Collate der Klasse CString ist dort das Ergebnis der Sortierung nun wie gewünscht.

Wie muss die entsprechende Funktion Collate in VLisp aussehen, damit ich sie bei der Funktion vl-sort verwenden kann?
Kann ich alternativ meine C++-Klasse verwenden und wenn ja wie muss ich das machen?

Danke im Voraus für die Informationen.

Gruß Bernd

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Dabrunz
Mitglied



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 05. Mai. 2004 10:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Bernd10 10 Unities + Antwort hilfreich

Tag.

Die Probleme mit der Sortier-Reihenfolge resultieren aus der Art un Weise, wie die einzelnen Zeichen ausgewertet werden. Ohne es mit letztendlicher Sicherheit beschwören zu können (weiß es jemand GANZ genau?) gehe ich davon aus, dass einfach der ASCII-Code verglichen wird und der ist nunmal so:

(ascii"W") -> 87
(ascii"_") -> 95

Weil aber:

(ascii"w") -> 119,

was auch für die übrigen Klein-Buchstaben gilt - allesamt gößere als 95 - sieht die passende Ordnungs-Relation für vl-sort so aus:

Code:

(vl-sort
  ltestunsort
'(lambda (x y)
    (< (strcase x'lowercasse)(strcase y'lowercasse))
  )
)

Wie deine C++-Funktionen funktionieren muss dir jemand anderes erzählen, damit hab' ich nix am Hut.

Achim Dabrunz

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Bernd10
Mitglied



Sehen Sie sich das Profil von Bernd10 an!   Senden Sie eine Private Message an Bernd10  Schreiben Sie einen Gästebucheintrag für Bernd10

Beiträge: 763
Registriert: 20.11.2003

Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz
16 GB RAM
Windows 10 Pro 64-bit
AutoCAD Mechnical 2020 Deu

erstellt am: 05. Mai. 2004 16:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Achim,

Zitat:
Original erstellt von Dabrunz:
Tag.

Die Probleme mit der Sortier-Reihenfolge resultieren aus der Art un Weise, wie die einzelnen Zeichen ausgewertet werden. Ohne es mit letztendlicher Sicherheit beschwören zu können (weiß es jemand GANZ genau?) gehe ich davon aus, dass einfach der ASCII-Code verglichen wird und der ist nunmal so:

(ascii"W") -> 87
(ascii"_") -> 95

Weil aber:

(ascii"w") -> 119,

was auch für die übrigen Klein-Buchstaben gilt - allesamt gößere als 95 - sieht die passende Ordnungs-Relation für vl-sort so aus:

Code:

(vl-sort
  ltestunsort
'(lambda (x y)
    (< (strcase x'lowercasse)(strcase y'lowercasse))
  )
)


Ich denke auch, dass die ASCII-Werte verwendet werden. Ich verstehe aber nicht, warum das Ergebnis der Funktion in der VLisp-Konsole anderes ist, als der Ergebnis der Funktion aus der VLX-Anwendung heaus. Wie auch immer, ich werde Dein Beispiel-Code einmal testen. Ich sehe allerdings noch Handlungsbedarf für mich bei zwei Strings, die sich nur in der Groß-/Kleinschreibung unterscheiden.

Danke schonmal für Dein Bemühen und viele Grüße
Bernd

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Bernd10
Mitglied



Sehen Sie sich das Profil von Bernd10 an!   Senden Sie eine Private Message an Bernd10  Schreiben Sie einen Gästebucheintrag für Bernd10

Beiträge: 763
Registriert: 20.11.2003

Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz
16 GB RAM
Windows 10 Pro 64-bit
AutoCAD Mechnical 2020 Deu

erstellt am: 07. Mai. 2004 15:36    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


sort.zip

 
Hallo,

Zitat:
Original erstellt von Bernd10:

  (setq ltestunsort (list "0"
                          "AWSatzPolylinienErstellen_schwarz_250"
                          "A_blau_170"
                          "A_braun_18"
                          "A_gelb_2"
                          "A_grün_90"
                          "A_orange_30"
                          "A_rot_10"
                          "A_schwarz_250"
                          "A_weiß_7"
                          "Anreißhilfe_SF210_210"
                          "KoorKon_schwarz_250"
                          "TextTemporär_schwarz_250"
                          "Textbox_SF130_130"))


Die oben stehende Liste kann ich nun mit den beiliegenden Lisp-Dateien nach Wunsch sortieren. Start der Sortierung:
(setq lsortiert (vl-sort lunsortiert (function (lambda (c1 c2)    (strvergleichwinexpl c1 c2)))))

Edit: wobei ich nicht sagen kann, ob damit alle Möglichkeiten abgedeckt sind

Gruß Bernd

[Diese Nachricht wurde von Bernd10 am 07. Mai. 2004 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Dabrunz
Mitglied



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 07. Mai. 2004 17:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Bernd10 10 Unities + Antwort hilfreich

Ne-ne, das gibt so nix:

<strvergleichwinexpl.lsp>:Zeile 34-37 hat zu Folge, dass alle Ziffern und Sonderzeichen als gleich behandelt werden, wenn sie nicht beide entweder Ziffer oder Sonderzeichen sind:

Code:

  ..
  ((and (or (= ibuken1 4) (= ibuken2 4))
        (or (= ibuken1 3) (= ibuken2 3)))
  (setq svglwinexpl t) ;<-- das ist unnötig - siehe (1)
  )
  ..

(1) Unbedeutender Coding-Verbesserungs-Vorschlag:

Code:

  ..
  ((setq svglwinexpl
        (and (or (= ibuken1 4) (= ibuken2 4))
              (or (= ibuken1 3) (= ibuken2 3))))
  ); Was ziemliche Merkwürdigkeiten produziert ..
  ..


Versuche hiermit einmal '("1" "7" "_" "-" "1" ":" "0") zu sortieren und dannach (reverse '("1" "7" "_" "-" "1" ":" "0")).

Besser scheint es mir, eine Liste der Ascii-Codes in der gewünschten Reihenfolge zu erzeugen und anhand dieser Reihenfolge zu sortieren.

Achim Dabrunz

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Bernd10
Mitglied



Sehen Sie sich das Profil von Bernd10 an!   Senden Sie eine Private Message an Bernd10  Schreiben Sie einen Gästebucheintrag für Bernd10

Beiträge: 763
Registriert: 20.11.2003

Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz
16 GB RAM
Windows 10 Pro 64-bit
AutoCAD Mechnical 2020 Deu

erstellt am: 10. Mai. 2004 11:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Achim,

Zitat:
Original erstellt von Dabrunz:

Code:

  ..
  ((and (or (= ibuken1 4) (= ibuken2 4))
        (or (= ibuken1 3) (= ibuken2 3)))
   (setq svglwinexpl t) ;<-- das ist unnötig - siehe (1)
  )
  ..


Diesen bisherigen Code habe ich wie folgt ersetzt:
  ((and (= ibuken1 4) (= ibuken2 3))
    (setq svglwinexpl t)
  )
  ((and (= ibuken1 3) (= ibuken2 4))
    (setq svglwinexpl nil)
  )

Zitat:
Original erstellt von Dabrunz:

Versuche hiermit einmal '("1" "7" "_" "-" "1" ":" "0") zu sortieren und dannach (reverse '("1" "7" "_" "-" "1" ":" "0")).


Nach meiner o.g. Änderung kann ich diese Liste mit meinen Lisp-Dateien sortieren und bekomme das gleiche Ergebnis bei der Fuktion acad_strlsort, wenn ich diese in der VLisp-Konsole ausführe.
Bei der Funktion reverse sehe ich nicht, worauf ich achten soll.

Zitat:
Original erstellt von Dabrunz:

Besser scheint es mir, eine Liste der Ascii-Codes in der gewünschten Reihenfolge zu erzeugen und anhand dieser Reihenfolge zu sortieren.


Ob ich diesen Vorschlag umsetze, muss ich mir noch überlegen.

Auf jeden Fall gibt es für Deine Informationen und Hinweise 10 Us.

Danke und viel Grüße
Bernd

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz