| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: DCL-Boxen Fragen (895 / mal gelesen)
|
ReneReichel Mitglied Technischer Projektleiter
Beiträge: 71 Registriert: 07.02.2018 ACAD 2023 Win10 Enterprise, AMD Ryzen Threadripper 3960X 24-Core, 3.80 GHz, 128 GB RAM, NVIDIA RTX A4000
|
erstellt am: 12. Sep. 2023 11:05 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, dank der umfangreichen Hilfen hier im Forum habe ich schon einige Hilfsroutinen für die tägliche ACAD-Arbeit geschrieben. Allerdings hänge ich jetzt an zwei grundlegenden Problemen mit den DCL-Boxen... 1. Wie kann ich eine List_box mit den Daten aus einer Excel- oder Textdatei füttern? Im Anhang ein Beispiel für eine Schraubenauswahl => hier würde ich gern als erstes die Box für die Norm füllen. Die zur Verfügung stehenden Durchmesser sollen nach Anklicken einer Norm automatisch in die Popup-List geladen werden, gleiches gilt für die verfügbaren Längen (in Abhängigkeit des gewählten Durchmessers). Die entsprechenden Werte würde ich in eine Excel packen... Ist das so überhaupt machbar? 2. Kann man der dcl beibringen, die in der ACAD-Arbeitssitzung ausgewählten Werte als Vorwahl zu behalten, d.h. dass die letzte Konfiguration beim Aufrufen der dcl wieder angezeigt wird? Für eure Anregungen wie immer schonmal danke im Voraus. Grüße René Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Archäologie Bubi Mitglied Archäologische Funddokumentation
Beiträge: 64 Registriert: 09.03.2021 AutoCAD Map 3D 2013 AutoCAD Map 3D 2023 AutoCAD Map 3D 2024 Faro AS-Built / TachyCAD BricsCAD V18 Elcovision ElTheo Agisoft Photoscan Agisoft Metashape Professional 1.7 Agisoft Metashape Professional 2.0
|
erstellt am: 12. Sep. 2023 12:26 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
Hallo Rene 1.1 Die list_box kannst du über die Dialogsteuerung in LISP mit 'add_list füllen. Am besten gleich eine kleine Funktion für basteln, da du dieselbe später für die popup-list immer wieder brauchst. z.B. so:
Code: ;;; Befehl: L-Layer |-> UpdateBox ;;; Zweck: Aktualisiert die Listen im Dialogfenster ;;; Funktionen: Keine Unterfunktionen ;;; Autor: Fabian Bubendorf / Archäologische Bodenforschung Basel-Stadt ;;; Datum: 2022/August ;;; Argumente: Key --> Key der Dialogeinrichtung ;;; Lst --> Liste die geladen werden soll ;;; Code: (defun UpdateBox ( Key Lst / ) (start_list Key) (mapcar 'add_list Lst) (end_list) );end defun
Als Lst nimmst du dann deine Daten als Liste aus Excel. 1.2 Die popup_list's ladest du ebenfalls mit der UpdateBox Funktion, steuerst diese aber über ein action_tile der List_box. Also ausgewählter Wert auslesen, passende Liste laden. 2. DCL kann man nix beibringen, man kann es nur steuern. Aber du könntest die Daten mit LISP irgendwo zwischenspeichern und dann wieder laden. ------------------
Bubi spiele, Bubi glücklich! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ReneReichel Mitglied Technischer Projektleiter
Beiträge: 71 Registriert: 07.02.2018 ACAD 2023 Win10 Enterprise, AMD Ryzen Threadripper 3960X 24-Core, 3.80 GHz, 128 GB RAM, NVIDIA RTX A4000
|
erstellt am: 12. Sep. 2023 16:09 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Archäologie Bubi: Hallo Rene1.1 Die list_box kannst du über die Dialogsteuerung in LISP mit 'add_list füllen. Am besten gleich eine kleine Funktion für basteln, da du dieselbe später für die popup-list immer wieder brauchst. z.B. so:
Code: ;;; Befehl: L-Layer |-> UpdateBox ;;; Zweck: Aktualisiert die Listen im Dialogfenster ;;; Funktionen: Keine Unterfunktionen ;;; Autor: Fabian Bubendorf / Archäologische Bodenforschung Basel-Stadt ;;; Datum: 2022/August ;;; Argumente: Key --> Key der Dialogeinrichtung ;;; Lst --> Liste die geladen werden soll ;;; Code: (defun UpdateBox ( Key Lst / ) (start_list Key) (mapcar 'add_list Lst) (end_list) );end defun
Als Lst nimmst du dann deine Daten als Liste aus Excel.
Hallo Bubi, danke für Deine Rückmeldung. Leider stellt sich das nicht so einfach dar. Ich bekomme zwar die Werte aus der Excel in eine Liste (ExcData aus dem Beispiel im Anhang), beim Versuch die Klammern mit subst wegzubekommen, krieg ich die Fehlermeldung 'Fehlerhaftes Element in Argumentliste: "ISO 4014"' Das ist mir völlig unverständlich, warum ist ein String ein fehlerhaftes Argument in einer Liste? Zitat: Original erstellt von Archäologie Bubi:
2. DCL kann man nix beibringen, man kann es nur steuern. Aber du könntest die Daten mit LISP irgendwo zwischenspeichern und dann wieder laden.
Wie macht man das? Grüße René Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Archäologie Bubi Mitglied Archäologische Funddokumentation
Beiträge: 64 Registriert: 09.03.2021 AutoCAD Map 3D 2013 AutoCAD Map 3D 2023 AutoCAD Map 3D 2024 Faro AS-Built / TachyCAD BricsCAD V18 Elcovision ElTheo Agisoft Photoscan Agisoft Metashape Professional 1.7 Agisoft Metashape Professional 2.0
|
erstellt am: 13. Sep. 2023 08:26 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
Guten Morgen Rene Die Daten aus der Excel bekommst du ja schonmal. Wobei dein aktueller Aufbau noch nicht sehr Flexibel scheint. In diesem Fall könnte man die Werte auch gleich in LISP speichern. Zu deiner Fehlermeldung:
Der Fehler kommt eher nicht von subst, obwohl dein Versuch hier ebenfalls ziemlich daneben liegt. Aus der AutoLISP Documentation.help: subst = Searches a list for an old item and returns a copy of the list with a new item substituted in place of every occurrence of the old item Du besitzt beim Einsatz von subst eine Liste mit mehreren Unterlisten, die jeweils einen String besitzen. Keines dieser Elemente in der obersten Liste entspricht dem Item ") (", welches ein String ist! Subst gibt dir deshalb einfach die Liste unverändert zurück. Dein Fehler entsteht, weil du bei (setq LstNorm dem subst-Aufruf keine Liste übergibst, sondern deine Variable als Funktion = fehlerhaftes Argument. Ersetze am besten mal:
Code: (setq ExcData (subst ") (" "" (mapcar (function (lambda (x) (mapcar 'vl-princ-to-string (mapcar 'vlax-variant-value x)))) ExcData)))
durch Code: (setq ExcData (mapcar 'vlax-variant-value (mapcar 'car ExcData)))
und entferne (setq LstNorm Zum speichern der Auswahl kommt es etwas darauf an, wie lange und für was du es speichern willst.
Zur Zeit wird auch gerade ein solches Thema hier im Forum diskutiert -> https://ww3.cad.de/foren/ubb/Forum145/HTML/004936.shtml Du könntest es auch wieder in die Excel schreiben oder einfach eine Globale Variable für diese Zeichnung in der aktuellen Sitzung setzten etc.
------------------
Bubi spiele, Bubi glücklich! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ReneReichel Mitglied Technischer Projektleiter
Beiträge: 71 Registriert: 07.02.2018 ACAD 2023 Win10 Enterprise, AMD Ryzen Threadripper 3960X 24-Core, 3.80 GHz, 128 GB RAM, NVIDIA RTX A4000
|
erstellt am: 15. Sep. 2023 10:32 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Archäologie Bubi: Guten Morgen ReneDie Daten aus der Excel bekommst du ja schonmal. Wobei dein aktueller Aufbau noch nicht sehr Flexibel scheint. In diesem Fall könnte man die Werte auch gleich in LISP speichern.
Hallo Bubi, das war nur die Testliste. Für die Endversion habe ich diverse Schraubennormen, Durchmesser und Längen in der Liste gespeichert, das alles im LISP zu setzen, wäre einfach zu viel. Zudem müsste ich dann bei Ergänzungen immer das Script anpassen, anstatt nur die Excel zu ergänzen. Zitat: Original erstellt von Archäologie Bubi:
[...]Dein Fehler entsteht, weil du bei (setq LstNorm dem subst-Aufruf keine Liste übergibst, sondern deine Variable als Funktion = fehlerhaftes Argument. Ersetze am besten mal:
Code: (setq ExcData (subst ") (" "" (mapcar (function (lambda (x) (mapcar 'vl-princ-to-string (mapcar 'vlax-variant-value x)))) ExcData)))
durch
Code: (setq ExcData (mapcar 'vlax-variant-value (mapcar 'car ExcData)))
und entferne (setq LstNorm
Klar, Denkfehler von mir. Danke für die fertige Lösung, das läuft... Zitat: Original erstellt von Archäologie Bubi:
Zum speichern der Auswahl kommt es etwas darauf an, wie lange und für was du es speichern willst.Zur Zeit wird auch gerade ein solches Thema hier im Forum diskutiert -> https://ww3.cad.de/foren/ubb/Forum145/HTML/004936.shtml Du könntest es auch wieder in die Excel schreiben oder einfach eine Globale Variable für diese Zeichnung in der aktuellen Sitzung setzten etc.
Der Link funzt nicht, brauche ich aber auch nicht. Dass ich nicht daran gedacht habe, die zuletzt abgerufenen Werte einfach zu speichern, ärgert mich jetzt mächtig (da ich auch in Excel-VBA unterwegs bin...) Das funktioniert natürlich einwandfrei... Davon weitergehend taucht gleich die nächste Frage auf. Kann ich per LISP beim Erstellen eines Blocks diesem Attribute mit auf den Weg geben? Hintergrund ist, dass wir im Fassadenbau unterwegs sind und bislang die Gläser der Fassaden "händisch" unterscheiden und nummerieren. Ich würde das gerne automatisieren. Die Scheiben als Block auf Grundlage einer Auswahl von Glastyp und Abmessungen in der Zeichnung zu erstellen, ist ja kein Problem. Nun soll der Block gleich noch ein Attribut erhalten, welches Glastyp (aus der Eingabemaske) und Glasnummer enthält (und als Beschriftung der Scheibe in der Ansicht dienen soll). Die Glasnummer will ich anhand der Scheibenparameter auszählen (das krieg ich hin, denke ich), im Moment scheitere ich aber daran, dem Block das Attribut mitzugeben... Danke Dir für Deine Hilfe. Grüße René [Diese Nachricht wurde von ReneReichel am 15. Sep. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 970 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 15. Sep. 2023 12:00 <-- editieren / zitieren --> Unities abgeben: Nur für ReneReichel
Zitat: Original erstellt von ReneReichel:
Kann ich per LISP beim Erstellen eines Blocks diesem Attribute mit auf den Weg geben?
Ja, natürlich. Dazu braucht die Blockdefinition noch nicht mal ATTDEF Entities zu enthalten. Einfach bei der Erzeugung des INSERTs per ENTMAKE den DXF Flag für "Attribute folgen" setzen (DXF Gruppencode 66: Variables Flag "Nachfolgende Attribute" (optional; Vorgabewert = 0). Wenn dieses Flag auf 1 gesetzt ist, folgt eine Reihe von Attributen auf das eingefügte Objekt, die mit dem Element seqend abschließt.), und dann die ATTRIB Entities erzeugen, und diese mit dem SEQEND Entity abschließen. Vorschlag: Alternativ kannst Du statt ATTRIBs natürlich auch beliebige Daten in XDATA oder XDICTIONARY speichern, was Dir etwas mehr Flexibilität und Kontrolle ermöglicht. Die Anzeige erfolgt dann beispielsweise als MTEXT. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|