| |
| 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: Kann man Variablen dauerhaft... (4058 mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 23. Nov. 2012 16:02 <-- editieren / zitieren --> Unities abgeben:
Ähnlich wie bei den Systemvariablen, kann man denn lokale Variablen dauerhaft in der Zeichendatenbank speichern. Bei meiner Aufgabenstellung habe ich ZeichnungsStempelBeschriftungen, die über Textfields aus der entsprechenden LispVariable gefüllt werden. Jetzt ist es so wenn ich die Zeichnung neu öffne sind logischweise die Variablen leer. ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 23. Nov. 2012 17:51 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, vielleicht über ein Dictionary, anbei ein Beispiel: Code:
;;;-Neues Dict anlegen, wenn vorhanden löschen (defun JB_Dict:New(GcList name / NEWDICT) (if(dictsearch (namedobjdict) name)(dictremove (namedobjdict) name)) (setq newdict(dictadd (namedobjdict) name (entmakex (list '(0 . "DICTIONARY") '(100 . "AcDbDictionary"))))) (dictadd newdict name (entmakex (append (list '(0 . "XRECORD") '(100 . "AcDbXrecord")) GCList)))) ;;;vorhandenes Dict auslesen, GC's 1 70 40 10 (defun JB_Dict:Read (name / DICT) (if (setq dict(dictsearch (namedobjdict) name)) (vl-remove-if '(lambda(A) (not(member(car A)'(1 70 40 10)))) (dictnext(cdr(assoc -1 dict))'T))) )(defun c:test ( / liste) (setq liste (list (cons 1 "MeinWert") (cons 70 999) (cons 40 999.1) (cons 10 '(10.0 10.0 10.0)))) (JB_Dict:New liste "JB_Dict1") (JB_Dict:Read "JB_Dict1") )
Als Alternative dazu wären Xdaten, die z.B. an das Stempelfeld gehängt werden auch nicht schlecht. ------------------ viele Grüße Jörn http://www.bosse-engineering.com VektorAdd-HD-Youtube Stammtisch in Wolfsburg am 03.12. oder 10.12.2012 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 23. Nov. 2012 18:58 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 24. Nov. 2012 10:52 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
PixelMission Mitglied Designer
Beiträge: 31 Registriert: 17.12.2011
|
erstellt am: 26. Nov. 2012 09:24 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Moin! Klingt evtl "altbacken" ... aber ich behelfe mir damit, alles Mögliche als Attribute (sind in einem Fall knapp 300!) in einem Block zu hinterlegen - und diesem beim Öffnen der Zeichnung alle Variablen zu "entlocken"... So habe ich alles wieder dort, wo ich es brauche! Die Uservar's haben mir noch nie gereicht... Gruß PM Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 26. Nov. 2012 13:35 <-- editieren / zitieren --> Unities abgeben:
Danke ersteinmal für alle Beiträge, sind alles ganz unterschiedliche Wege. Mein erster Weg war auch der, zu fragen was steht in den Zeichnungseigenschaften. Allerdings bin ich da nicht fündig geworden, wie man die in vlide abfragen kann. Dann kam ich ich rein zufällig auf die Textfields, die es ermöglichen, immer wenn ich eine Änderung in den Eigenschaften vornehme auch die Texte aktualisiert werden. Der Einworf von Jörn ist prima, allerdings muss ich mich auf dem Gebiet der Dictonary´s erstmal einarbeiten. Es funktioniert aber einwandfrei in meinem code und ist bereits das was ich brauche. Bei PM ist mir unklar, wie aus den Attributwerten die Variablen bedient werden sollen Holger, der Vorteil , wie du schon sagtest, es wäre sichtbar auf einen Blick... kannst du sagen, wo die Angaben der Zeichnungseigenschaften abgelegt werden oder wie ich auf diese zugreifen kann ?
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 26. Nov. 2012 13:43 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 26. Nov. 2012 18:39 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
joeycool Mitglied Ingenieur TGA
Beiträge: 1455 Registriert: 01.06.2004 MEP/ACAD 2008, 2010, 2011 2012 und 2013, 2014, 2015 WIN7 64 bit ATI 2,8 GHZ, SSD Platte, 16 GB Ram NVDIA Quadro FX 4600
|
erstellt am: 27. Nov. 2012 09:20 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: ...... Holger, der Vorteil , wie du schon sagtest, es wäre sichtbar auf einen Blick... kannst du sagen, wo die Angaben der Zeichnungseigenschaften abgelegt werden oder wie ich auf diese zugreifen kann ?
Moin, also mein Favourit wären dafür auf jeden Fall die selbst definierten Variablen unter "benutzerdefinierten Eigenschaften", (nicht verwechseln mit Zeichnungseigenschaften) die haben übrigens (erstmal) keine mengenmäßige Beschränkung, und "rankommen" tut man damit mit dwgeigen.... (wie man immer ins richtige der 4 Register kommt, habe ich noch nicht rausgefunden, aber da ich immer nur das Letzte benutze, und das Programm sich das merkt, habe ich kein Problem damit...) Und hier hat mir ein anderer Großmeister die Hand geführt, wie ich aus diesem benutzerdefinierten Variablen ZeichnungsVariablen erzeuge. Joeycool Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 27. Nov. 2012 10:31 <-- editieren / zitieren --> Unities abgeben:
Danke joeycool, nicht unbeding das was ich brauche, aber hab ich für alle Fälle auf meine Platte gelegt. Damit vllt mal Ergebnisse gezeigt werden zum testen. Voraussetzung Odcl-runtime von www.opendcl.com installieren Code:
; >>>>>>>>> Funktionen zum dauerhaften Ablegen von Variablen <<<<<<<<<<<<<<<<<<<<<<<<<<<< ;;;-Neues Dict anlegen, wenn vorhanden löschen (defun JB_Dict:New(GcList name / NEWDICT) (if(dictsearch (namedobjdict) name)(dictremove (namedobjdict) name)) (setq newdict(dictadd (namedobjdict) name (entmakex (list '(0 . "DICTIONARY") '(100 . "AcDbDictionary"))))) (dictadd newdict name (entmakex (append (list '(0 . "XRECORD") '(100 . "AcDbXrecord")) GCList)))) ;;;vorhandenes Dict auslesen, GC's 1 70 40 10 (defun JB_Dict:Read (name / DICT) (if (setq dict(dictsearch (namedobjdict) name)) (vl-remove-if '(lambda(A) (not(member(car A)'(1 70 40 10)))) (dictnext(cdr(assoc -1 dict))'T))) ) ; (defun c:test ( / liste) (setq liste (list (cons 1 "MeinWert"))) (JB_Dict:New liste "JB_Dict1") (JB_Dict:Read "JB_Dict1") )(command "_OPENDCL") (defun c:stamp (/) (dcl_project_load "h:\\MARKTEKNIK\\STÄMPEL.odcl") ; <<<<<<<<<<<<<<<<<<<<<<<<<< Pfad angeben wo die die ODCL-form liegt !!!!!!!!!!!!! (dcl_form_show STÄMPEL_Form1) (setvar "CMDECHO" 0) (princ) ) (defun c:STÄMPEL_Form1_OnInitialize () (if (setq value (cdr (assoc 1 (JB_Dict:Read "JB_Dict1")))) (dcl_Control_SetText STÄMPEL_Form1_tb_HANDLING value) (dcl_Control_SetText STÄMPEL_Form1_tb_HANDLING "-") ) (if (setq value (cdr (assoc 1 (JB_Dict:Read "JB_Dict2")))) (dcl_Control_SetText STÄMPEL_Form1_tb_HANDLÄGGARE value) (dcl_Control_SetText STÄMPEL_Form1_tb_HANDLÄGGARE "-") ) (if (setq value (cdr (assoc 1 (JB_Dict:Read "JB_Dict3")))) (dcl_Control_SetText STÄMPEL_Form1_tb_DWG-FIL value) (dcl_Control_SetText STÄMPEL_Form1_tb_DWG-FIL "-") ) (if (setq value (cdr (assoc 1 (JB_Dict:Read "JB_Dict4")))) (dcl_Control_SetText STÄMPEL_Form1_tb_KONSTR value) (dcl_Control_SetText STÄMPEL_Form1_tb_KONSTR "-") ) (if (setq value (cdr (assoc 1 (JB_Dict:Read "JB_Dict5")))) (dcl_Control_SetText STÄMPEL_Form1_tb_DATUM value) (dcl_Control_SetText STÄMPEL_Form1_tb_DATUM "-") ) (if (setq value (cdr (assoc 1 (JB_Dict:Read "JB_Dict6")))) (dcl_Control_SetText STÄMPEL_Form1_tb_PROJEKTNAMN value) (dcl_Control_SetText STÄMPEL_Form1_tb_PROJEKTNAMN "-") ) (if (setq value (cdr (assoc 1 (JB_Dict:Read "JB_Dict7")))) (dcl_Control_SetText STÄMPEL_Form1_tb_RITNING value) (dcl_Control_SetText STÄMPEL_Form1_tb_RITNING "-") ) (if (setq value (cdr (assoc 1 (JB_Dict:Read "JB_Dict8")))) (dcl_Control_SetText STÄMPEL_Form1_tb_SKALA_A1 value) (dcl_Control_SetText STÄMPEL_Form1_tb_SKALA_A1 "-") ) (if (setq value (cdr (assoc 1 (JB_Dict:Read "JB_Dict9")))) (dcl_Control_SetText STÄMPEL_Form1_tb_SKALA_A3 value) (dcl_Control_SetText STÄMPEL_Form1_tb_SKALA_A3 "-") ) (if (setq value (cdr (assoc 1 (JB_Dict:Read "JB_Dict10")))) (dcl_Control_SetText STÄMPEL_Form1_tb_OBJEKTNR value) (dcl_Control_SetText STÄMPEL_Form1_tb_OBJEKTNR "-") ) ) (defun c:STÄMPEL_Form1_tb_HANDLING_OnEditChanged (handling /) (setq s_handling handling) (setq liste1 (list (cons 1 s_handling))) (JB_Dict:New liste1 "JB_Dict1") (JB_Dict:Read "JB_Dict1") ) (defun c:STÄMPEL_Form1_tb_HANDLÄGGARE_OnEditChanged (handläggare /) (setq s_handlägare handläggare) (setq liste2 (list (cons 1 s_handlägare))) (JB_Dict:New liste2 "JB_Dict2") (JB_Dict:Read "JB_Dict2") ) (defun c:STÄMPEL_Form1_tb_DWG-FIL_OnEditChanged (dwg-fil /) (setq s_dwg-fil dwg-fil) (setq liste3 (list (cons 1 s_DWG-FIL))) (JB_Dict:New liste3 "JB_Dict3") (JB_Dict:Read "JB_Dict3") ) (defun c:STÄMPEL_Form1_tb_KONSTR_OnEditChanged (konstr /) (setq s_konstr konstr) (setq liste4 (list (cons 1 s_KONSTR))) (JB_Dict:New liste4 "JB_Dict4") (JB_Dict:Read "JB_Dict4") ) (defun c:STÄMPEL_Form1_tb_DATUM_OnEditChanged (datum /) (setq s_datum datum) (setq liste5 (list (cons 1 s_DATUM))) (JB_Dict:New liste5 "JB_Dict5") (JB_Dict:Read "JB_Dict5") ) (defun c:STÄMPEL_Form1_tb_PROJEKTNAMN_OnEditChanged (projektnamn /) (setq s_projektnamn projektnamn) (setq liste6 (list (cons 1 s_PROJEKTNAMN))) (JB_Dict:New liste6 "JB_Dict6") (JB_Dict:Read "JB_Dict6") ) (defun c:STÄMPEL_Form1_tb_RITNING_OnEditChanged (ritning /) (setq s_ritning ritning) (setq liste7 (list (cons 1 s_RITNING))) (JB_Dict:New liste7 "JB_Dict7") (JB_Dict:Read "JB_Dict7") ) (defun c:STÄMPEL_Form1_tb_SKALA_A1_OnEditChanged (skala-a1 /) (setq s_skala-a1 skala-a1) (setq liste8 (list (cons 1 s_SKALA-A1))) (JB_Dict:New liste8 "JB_Dict8") (JB_Dict:Read "JB_Dict8") ) (defun c:STÄMPEL_Form1_tb_SKALA_A3_OnEditChanged (skala-a3 /) (setq s_skala-a3 skala-a3) (setq liste9 (list (cons 1 s_SKALA-A3))) (JB_Dict:New liste9 "JB_Dict9") (JB_Dict:Read "JB_Dict9") ) (defun c:STÄMPEL_Form1_tb_OBJEKTNR_OnEditChanged (objektnr /) (setq s_objektnr objektnr) (setq liste10 (list (cons 1 s_OBJEKTNR))) (JB_Dict:New liste10 "JB_Dict10") (JB_Dict:Read "JB_Dict10") ) (defun c:STÄMPEL_Form1_tb_copy_OnEditChanged (copy /) (setq s_copy copy) ) (defun c:STÄMPEL_Form1_cmdLayout_OnClicked (/ anz) (if (setq anz (fix (distof s_copy))) (repeat anz (command "_.-LAYOUT" "_copy" "" "")) ) (setvar "CMDECHO" 1) )
------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 27. Nov. 2012 10:35 <-- editieren / zitieren --> Unities abgeben:
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 28. Nov. 2012 08:28 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, ich würde vielleicht noch versuchen, nur ein Dict zu verwenden, und dann anhand abgespeicherter Gruppencodes die Einträge speichern oder wiederholen. Dabei bin ich aber auf ein Problem gestoßen: Welche Gruppencodes kann ich in den XRecords überhaupt verwenden? 1 String 70 INT 40 REAL 10 Koordinatenliste So war eigentlich mein Stand. Dann habe ich mal 1-9 für String's ausprobiert, das klappt, und dann habe ich noch folgendes Beispiel im Netz gefunden: http://www.orlowski-matthias.de/cad/downloads/AutoLISP-Handbuch.pdf Code:
(defun C:MAKEXRECORD( / xrec xname ) ; Erstellen der Xrecord-Datenliste (setq xrec '((0 . "XRECORD")(100 . "AcDbXrecord") (1 . (1 . "Dies ist eine Testliste") (10 1.0 2.0 0.0) (40 . 3.14159) (50 . 3.14159) (62 . 1) (70 . 180))) ); Entmakex zur Erstellung eines Xrecord ohne Besitzer verwenden (setq xname (entmakex xrec)) ; Neuen Xrecord zum benannten Objekt-Wörterbuch hinzufügen (dictadd (namedobjdict) "XRECLIST" xname) (princ) ) (defun C:LISTXRECORD ( / xlist ) ; Auffinden des Xrecord im benannten Objekt-Wörterbuch (setq xlist (dictsearch (namedobjdict) "XRECLIST")) ; Drucken Xrecord-Datenliste (princ xlist) (princ) )
Das sieht sehr interessant aus, dann könnte man doch unter dem Gruppencode 1 eine ganze Liste speichern, das wäre ziemlich gut, hat bei mir aber leider nicht funktioniert. So in der Form kommt im VLIDE-Editor folgende Meldung: "Überzählige CDR-Exemplare in Listenpaar mit Punkttrennung in Eingabe" Wenn ich den Punkt hinter der 1 wegnehme, dann akzeptiert mir zwar der VLIDE-Editor den Code, aber bei der Ausführung gibt es folgenden Fehler: Befehl: MAKEXRECORD ; Fehler: Fehlerhafte DXF-Gruppe: (1 (1 . "Dies ist eine Testliste") (10 1.0 2.0 0.0) (40 . 3.14159) (50 . 3.14159) (62 . 1) (70 . 180)) Wer von Euch kennt sich mit erlaubten Daten/typen in XRecords für die Verwendung von Dictionary's gut aus und kann das hier mal erläutern?
Aber davon ab, Dirk, ich finde die Idee gut mit dem hinterlegten Bild des Stempelfeldes im Dialogfenster, das hat was. ------------------ viele Grüße Jörn http://www.bosse-engineering.com VektorAdd-HD-Youtube Stammtisch in Wolfsburg am 03.12. oder 10.12.2012 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 28. Nov. 2012 08:48 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
@Jörn Du stehst direkt vor dem Wald der dir die Bäume verdeckt, da müßte man doch etwas mehr als einen Punkt entfernen oder ? (Schreibfehler in der R14-Hilfe)Zitat:
(defun C:MAKEXRECORD ( / xrec xname ) ; Erstellen der Xrecord-Datenliste (setq xrec '((0 . "XRECORD") (100 . "AcDbXrecord") (1 . "Dies ist eine Testliste") (10 1.0 2.0 0.0) (40 . 3.14159) (50 . 3.14159) (62 . 1) (70 . 180)) ) ; Entmakex zur Erstellung eines Xrecord ohne Besitzer verwenden (setq xname (entmakex xrec)) ; Neuen Xrecord zum benannten Objekt-Wörterbuch hinzufügen (dictadd (namedobjdict) "XRECLIST" xname) (princ) )
------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 28. Nov. 2012 09:32 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Sebastian, vom Prinzip hast Du recht, aber ich hatte die vage Hoffnung, daß ich in den Gruppencode 1 eine ganze Liste speichern kann, die dann wiederum mit Gruppencodes gekennzeichnet ist. Das würde dann z.B. beim auswerten der Testliste heißen: (cdr(assoc 1(cdr(assoc 1 Liste)))) => "Dies ist eine Testliste" Wenn das aber nicht funktioniert wäre es trotzdem schön zu wissen, welche Gruppencodes ich wofür verwenden kann. Dann könnte ich mir z.B. einen GruppencodeWertbereich von 200 - 250 anlegen, damit ich direkt mit Assoc darauf zugreifen kann. Aber ich habe auch keine Lust alles einzeln auszuprobieren. In der DXF-Referenz steht:
Zitat: XRecord-Objekte dienen zum Speichern und Verwalten von beliebigen Daten. Sie bestehen aus DXF-Gruppencodes mit “Normalobjekt”-Gruppen (also keine XDaten-Gruppencodes) von 1 bis 369 für unterstützte Bereiche. Das Konzept dieses Objekts ähnelt den XDaten, mit dem Unterschied, dass das Objekt keinen Einschränkungen hinsichtlich der Größe oder der Reihenfolge unterliegt.
Daraus werde ich aber nichts so recht schlau, da steht z.B. nicht davon, daß die Gruppencodes 10, 40 und 70 eine spezielle Verwendung haben. Vielleicht bin ich ja völlig auf dem Holzweg (da waren sie wieder, der Wald und Deine Bäume), wer bringt bei noch etwas Licht ins Dunkle?
------------------ viele Grüße Jörn http://www.bosse-engineering.com VektorAdd-HD-Youtube Stammtisch in Wolfsburg am 03.12. oder 10.12.2012 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 28. Nov. 2012 09:41 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Wald2 Welche m,an verwenden kann steht in der Hilfe und wurde von dir eben auch noch zitiert: 1-369 ! Das steht in der Hilfe, in Release14, aber auch in aktuellen. Wald3 Datentyp für welchen Gruppencode ?! das solltest du eigentlich grob wissen, ansonsten steht das ja aber auch in jeder DXF/Lisp Hilfe: Welcher KLICK! Nachtrag: Ich verstehe dein Problem nicht ganz, aber evtl. hilft es dir zu wissen das du Gruppencodes mehrfach im XRECORD speichern(anlegen) darfst ? ------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad)
[Diese Nachricht wurde von cadffm am 28. Nov. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 28. Nov. 2012 10:15 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 28. Nov. 2012 10:54 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 28. Nov. 2012 11:15 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 28. Nov. 2012 12:45 <-- editieren / zitieren --> Unities abgeben:
Hallo Jörn! Danke nochmal für deinen ursprünglichen Beitrag hier, mit dictionary´s zu arbeiten. So wie ich es hier verstanden habe, ist es besser immer dictionary´s gesondert anzulegen, damit fällt dein Vorhaben alles in ein reinzupacken aus Was ich aber noch nicht verstanden habe, was will man mit dictionary´s erreichen. Kann ja nicht sein, dass die nur eine dwg zu müllen. Eine andere Frage: müssen XDATA immer einen Objekt zugewiesen werden, oder könnte man da eine "Endlosliste" mit allen Projektparametern eingeben, die wiederum mit assoc abgefragt werden könnten ? ------------------ Gruss Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 28. Nov. 2012 12:46 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
... eleganter geht's immer ;-) Das ist aber nicht immer die frage: den Weg, den ihr ihr vor habt, den halte ich für Fehleranfällig. Denn man sollte beachten, dass beim 1er GruppenCode nur eine begrenzte Zeichenanzahl möglich ist .. nicht dass dann irgendwann irgendwelche Daten fehlen oder unvollständige Listen zurück gegeben werden. Daher meine Empfehlung: Finger weg von dieser Lösung. Meine Empfehlung: Dann geht doch über Dictionaries, in welches ihr die Daten ja sogar benannt ablegen könntet. Sinnvolle Strukturierungsmöglichkeiten kann man sich ja ausdenken: z.Bsp: Ein Dictionary, in dem alle Handle's und die zugehörigen Namen der DatenDictionaries, der Objekte, denen Daten angehangen werden sollen, gespeichert sind. Als Zweites gibt's dann noch gaaanz Daten-Dictionaries, die einen zufälligen/eindeutigen Namen haben, in denen die Daten gespeichert werden. Das Ganze gefällt mir persönlich sehr viel Besser, da die ZeichnungsObjekte nicht manipuliert werden, man keinen extra Applikationseintrag erzeugen muss, und die Daten ausgelesen werden können, ohne dass das Objekt erst gesucht werden (alsodie Ganze Zeichnung durchgehechelt werden) muss. Natürlich benötigt man dann noch eine Funktion, die die Dictionaries bereinigt (also die Dicts löscht, zu denen keine Objekte mehr gefunden werden). Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 28. Nov. 2012 14:04 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 28. Nov. 2012 14:09 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 28. Nov. 2012 14:39 <-- editieren / zitieren --> Unities abgeben:
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 28. Nov. 2012 16:14 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
@Dirk, Holger, die Idee, alle Datei in ein Dict reinzupacken finde ich für so kleine Sachen (wie das Beispiel von Dirk) gut, ist übersichtlicher. Sicherlich müßte man mal die Grenzbereiche austesten, wie groß so ein String sein darf, aber denke wegen 10 Einträgen wird mir das nicht gleich um die Ohren fliegen. Ansonsten geben ich Dir, Holger, recht. Aber ich müßte mich dann noch ein bißchen mehr mit dem Thema auseinandersetzten, im Moment nutze ich die Methode nur, um z.B. mal einen Zeitstempel oder so in einer Zeichnung zu sichern. ------------------ viele Grüße Jörn http://www.bosse-engineering.com VektorAdd-HD-Youtube Stammtisch in Wolfsburg am 03.12. oder 10.12.2012 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 29. Nov. 2012 09:10 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von joern bosse: @Dirk, Holger, die Idee, alle Datei in ein Dict reinzupacken finde ich für so kleine Sachen (wie das Beispiel von Dirk) gut, ist übersichtlicher. Sicherlich müßte man mal die Grenzbereiche austesten, wie groß so ein String sein darf, aber denke wegen 10 Einträgen wird mir das nicht gleich um die Ohren fliegen.
Nein, auch bei 1000 Einträgen läuft das sehr gut. Ich habe große Applikationen, die jede Menge eigener "Systemvariablen" haben. Diese speichere ich in einem einzigen Dictionary als Assoc-Liste, also jeweils Liste aus Varnamen und Wert. Zum Screiben habe ich folglich eine Funktion (APP-SETVAR "VarName" <Wert> ), und zum Lesen das entsprechende Analogon. Da man normalerweise keine Symbole, dotted pairs, oder sehr lange Strings speichern kann, muss dafür jeweils ein Trick angewandt werden: die Werte werden verschlüsselt, wobei lange Strings zerhackt werden, und Symbole und dotted pairs mit einem eigenen Schlüssel als solche gekennzeichnet werden, so dass sie beim Lesen wieder rekonstruiert werden können. Damit kann ich grundsätzlich alle von Lisp verwendbaren Daten unter einem Variablennamen in einem Dictionary sichern, also sogar auch kompletten Lisp-Code. Ich habe so ein Programm, das für die DWG spezifische Lisp-Programme erzeugt und so auch in der DWG abspeichert. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PixelMission Mitglied Designer
Beiträge: 31 Registriert: 17.12.2011
|
erstellt am: 29. Nov. 2012 09:38 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 29. Nov. 2012 09:38 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
@archtools die Begrenzung der Datenmenge bezog sich auf die EED's (16kB?). In den Dictionaries spielt die Anzahl (ich habe zumindest noch keine Grenze gefunden) wohl keine Rolle. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PixelMission Mitglied Designer
Beiträge: 31 Registriert: 17.12.2011
|
erstellt am: 29. Nov. 2012 11:42 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
OKEE ... Diese Möglichkeit war mir NEU - besser kann man m. E. keine Werte, wie auch immer geartet, in der DWG ablegen! ABER ... irgendwie bekomme ich es nicht ganz hin - Werte SETZEN kann ich, aber beim Auslesen scheine ich irgendwas falsch zu machen! (vla-setcustombykey isoinfo "koor" "0 0 1000") - wunderbar! aber beim Aufruf von (vla-getcustombykey isoinfo "koor") bekomme ich grundsätzlich "Error: too few / too many arguments at [VLA-GETCUSTOMBYKEY]" Evtl. kann mich jemand vom Schlauch schubsen, bitte?!
Edit: hat sich erledigt - wer lesen kann ...
Für diejenigen, welche auch auf'm Schlauch stehen: NICHT (setq t1 (vla-getcustombykey isoinfo "koor")) sondern (vla-getcustombykey isoinfo "koor" 't1)! Gruß: PM
[Diese Nachricht wurde von PixelMission am 29. Nov. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 29. Nov. 2012 11:52 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von Brischke: @archtoolsdie Begrenzung der Datenmenge bezog sich auf die EED's (16kB?). In den Dictionaries spielt die Anzahl (ich habe zumindest noch keine Grenze gefunden) wohl keine Rolle.
Da haben wir aneinader vorbeigeredet. Ich meinte die Stringlänge in Gruppencode 1. Die ist begrenzt und muss zerhackt und speziell encoded werden, um lange Strings sauber unter einer Variablen speichern zu können. Nachtrag: vermutlich noch ein Missverständnis: ich hatte Jörns Einwand als Bezug zur Performance verstanden, nicht in Bezug zur Datenmenge [Diese Nachricht wurde von archtools am 29. Nov. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 29. Nov. 2012 11:55 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von PixelMission: Hallo archtools ...Was würde denn diese fertige Lösung kosten?! Es sieht mir danach aus, als bräuchte ich exakt so etwas ... Gruß: PM
Du weisst, solche Sachen sind eigentlich unbezahlbar :-) Aber mal sehen, vielleicht kann ich das mal aufbereiten und demnächst hier als Weihnachtsgeschenk veröffentlichen ... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 29. Nov. 2012 12:27 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von archtools:
Du weisst, solche Sachen sind eigentlich unbezahlbar :-) Aber mal sehen, vielleicht kann ich das mal aufbereiten und demnächst hier als Weihnachtsgeschenk veröffentlichen ...
Ach, wozu der Aufwand, es existiert doch schon alles im Netz: http://vnestr.tripod.com/SaveData.txt Für's Encoden seiner Daten verwendet Vlad die Funktion x-enlist, die man für eigene Bedürfnisse passend erweitern kann. Hier die modifizierte Variante, die auch Symbole und Dotted Pairs speichern kann. In der Decode-Funktion re-list-aux muss das dann einfach ausgewertet werden: Code:
(defun x-enlist (lst) ;; encode! (cond ;; 2004 NULL NULL ((null lst) lst) ((null lst) (list (cons 4 (vl-princ-to-string lst)))) ((atom lst) ;; automatic code groups (cond ((= 'REAL (type lst)) (list (cons 40 lst)) ) ((= 'INT (type lst)) (if ;; special handling of long integers (< -32768 lst 32767) (list (cons 70 lst)) (list (cons 41 (float lst))) ) ) ((= 'STR (type lst)) (list (cons 1 lst)) ) ((= 'SYM (type lst)) (list (cons 4 (vl-princ-to-string lst))) ) (T nil) ) ) ((and (cdr lst) (atom (cdr lst))) (cons '(2 . "{") (reverse (cons '(2 . "}") (reverse (apply 'append (mapcar 'x-enlist (list "&&&DOTTETPAIR" (car lst) (cdr lst))) ) ) ) ) ) ;; (list lst) ) ((and (= (length lst) 3) (apply 'and (mapcar 'realp lst)) ) (list (cons 10 lst)) ) ((cons '(2 . "{") (reverse (cons '(2 . "}") (reverse (apply 'append (mapcar 'x-enlist lst) ) ) ) ) ) ) ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PixelMission Mitglied Designer
Beiträge: 31 Registriert: 17.12.2011
|
erstellt am: 29. Nov. 2012 12:45 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Ja ... is' denn scho' Weihnachten?! DANKE!! Bis eben habe ich mir damit beholfen (klappt ganz gut ...): Code:
(defun varsave() (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) (setq sInfo (vla-get-SummaryInfo doc)) ) (defun pvar ( key value / ) (vla-setcustombykey sInfo key value) ) (defun gvar ( key value / ) (vla-getcustombykey sinfo key value) ) (defun zvar ( summaryinfo / i key value result ) (repeat (setq i (vla-NumCustomInfo summaryinfo)) (vla-GetCustomByIndex summaryinfo (setq i (1- i)) 'key 'value) (setq result (cons (cons key value) result)) ) result )
Insgesamt hat mich dieses Thema einen immensen Schritt weitergebracht - ich werde mich ab sofort NOCH mehr mit "vla ..." beschäftigen! Herr Moses legte mir dies' schon ans Herz ... aber als "alter Hase" (seit 1988) fällt es mir ein wenig schwer, mich "umzugewöhnen" - einen alten Baum ... Gruß: Walter - B.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 17. Jun. 2013 12:48 <-- editieren / zitieren --> Unities abgeben:
archtools: kannst du mir mal einen dictionary auslesen, wie er bei dir aussieht. Bin gerade dabei mich mit diesem Thema zu beschäftigen. Jörn Import/Export Funktion von Items in einen Dictionary zu stopfen habe ich kappiert. Aber nicht wie ich mehrere Items in einen Dictionary reinpacken kann...? ------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 17. Jun. 2013 16:49 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: archtools: kannst du mir mal einen dictionary auslesen, wie er bei dir aussieht. Bin gerade dabei mich mit diesem Thema zu beschäftigen. Jörn Import/Export Funktion von Items in einen Dictionary zu stopfen habe ich kappiert. Aber nicht wie ich mehrere Items in einen Dictionary reinpacken kann...?
Hier wird unter Name "TEST", Key "KEY" der String "VALUE" gespeichert: ((-1 . <Entity name: 7ffffb05eb0> ) (0 . "XRECORD") (5 . "263") (102 . "{ACAD_REACTORS") (330 . <Entity name: 7ffffb05ea0> ) (102 . "}") (330 . <Entity name: 7ffffb05ea0> ) (100 . "AcDbXrecord") (280 . 1) (1 . "VALUE")) Hier wird unter Name "TEST", Key "KEY" die Assoc-Liste '(("ASS1" 1) ("ASS2" 2)) gespeichert: ((-1 . <Entity name: 7ffffb05ec0> ) (0 . "XRECORD") (5 . "264") (102 . "{ACAD_REACTORS") (330 . <Entity name: 7ffffb05ea0> ) (102 . "}") (330 . <Entity name: 7ffffb05ea0> ) (100 . "AcDbXrecord") (280 . 1) (2 . "{") (2 . "{") (1 . "ASS1") (70 . 1) (2 . "}") (2 . "{") (1 . "ASS2") (70 . 2) (2 . "}") (2 . "}")) Du siehst, wie Du (2 . "{") als öffnende und (2 . "}") als schließende Klammer verwendest. Du kannst damit also beliebige Daten sichern. Willst Du ein Symbol sichern, so sicherst Du das einfach als String in einer Liste mit einem beliebigen Schlüssel: ("%%SYMBOL" "MYSYMBOL"). Beim Lesen entschlüsselst Du einfach, indem Du prüfst, weas das erste Element der Liste ist. Du kannst so beliebige Daten sichern, auch komplette Lisp-Funktionen. Du kannst so auch sehr einfach beliebige Voreinstellungen in einer DWG sichern. Dazu schreibst Du einfach Funktionen wie (mysetvar <varname> <value> ) und (mygetvar <varname> ). Diese Varnamen samt Wert sicherst Du in einer Assoc-Liste, die Du wie im obigen Beispiel als Dictionary unter passendem Namen und Key sicherst. [Diese Nachricht wurde von archtools am 17. Jun. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 18. Jun. 2013 09:24 <-- editieren / zitieren --> Unities abgeben:
Etwas mühselig habe ich mir ein Programm aufgezogen, welches Dictionaries anlegt und die Möglichkeit hat diverse Items in den Dictionary abzulegen. Jetzt habe ich mal den Versuch unternommen eine Funktion in einem Item abzulegen. Item Beispiel:
Code: ((-1 . <Entity name: 7ffff741cc0>) (0 . "XRECORD") (5 . "3CC64") (102 . "{ACAD_REACTORS") (330 . <Entity name: 7ffff741c30>) (102 . "}") (330 . <Entity name: 7ffff741c30>) (100 . "AcDbXrecord") (280 . 1) (70 . 0) (1 . "(defun c:test () (entsel \"\\nWähle etwas \"))"))
Da stosse ich auf ein Problem, wenn ich mit "-zeichen arbeite, dass ich die Funktion nicht korrekt geschrieben wird. (write-line (cdr (assoc 1 Item))) ergibt Code: "(defun c:test () (entsel \"\\nWähle etwas \"))"
Muss ich jetzt die \"-zeichen durch "-zeichen ersetzen oder gibt es da eine andere Möglichkeit? ------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 18. Jun. 2013 09:38 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hello Zitat: Original erstellt von archtools:
Willst Du ein Symbol sichern, so sicherst Du das einfach als String in einer Liste mit einem beliebigen Schlüssel: ("%%SYMBOL" "MYSYMBOL"). Beim Lesen entschlüsselst Du einfach, indem Du prüfst, weas das erste Element der Liste ist. Du kannst so beliebige Daten sichern, auch komplette Lisp-Funktionen.
eine Frage... Was passiert wenn ich den Schlüssel welcher für ein Symbol stehen soll ("%%SYMBOL"), selbst in der Liste ablegen will? funktioniert nicht, oder? weil dann bei der "entschlüsselung" ein Fehler gemacht wird, sofern der dieser eigentliche Nicht-Schlüssel an erster Stelle einer Liste steht... Um dies zu vermeiden würde ich vorschlagen einfach für jeden Wert bzw. Typ in der Liste einen Schlüssel zu vergeben und die Schlüssel und die Werte in getrennten Listen zu verarbeiten. Ich liebäugle ja mit sowas... Code:
Die zu "verschlüsselnde" Liste: '((1 2) (4 . 20) ((a "t" <Entity name: 7f701506890>) (123.21313 . "hallo") nur als Vorschlag zb. gibt dann... (setq lst '("<II>.II<<STE>.RT>" "1" "2" "4" "20" "a" "t" "621" "123.21313" "hallo"))
(mapcar '(lambda (a / ) (cons 1 a)) lst) Hier steht zB. I für INT < für eine öffnende Klammer; > schließend . dotted Pair der Rest ist ersichtlich?
Wie gesagt, nur ein Vorschlag, zur Übertragung einer Liste in ein formales System von Nur-Strings
oder vielleicht auch "<2II.II<2<3STE.RT" weiteres formales System :P der fantasie sind keine Grenzen gesetzt lg [Diese Nachricht wurde von reltro am 18. Jun. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 18. Jun. 2013 09:40 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1833 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 18. Jun. 2013 09:54 <-- editieren / zitieren --> Unities abgeben:
Hi Jörn! Habe ich genauso eingegeben in den Dictionary, wenn ich den auslese haut der mir noch mehr slashs rein
Code: ((-1 . <Entity name: 7ffff740990>) (0 . "XRECORD") (5 . "3CE39") (102 . "{ACAD_REACTORS") (330 . <Entity name: 7ffff73e9b0>) (102 . "}") (330 . <Entity name: 7ffff73e9b0>) (100 . "AcDbXrecord") (280 . 1) (70 . 0) (1 . "(defun c:test () (getpoint \\\"wähle etwas \\\"))"))
------------------ Gruss Dirk http://cadplayerlounge.blogspot.se [Diese Nachricht wurde von cadplayer am 18. Jun. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 18. Jun. 2013 10:47 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von reltro: eine Frage... Was passiert wenn ich den Schlüssel welcher für ein Symbol stehen soll ("%%SYMBOL"), selbst in der Liste ablegen will? funktioniert nicht, oder?
Stimmt. Du musst Dir den Schlüsselnamen so aussuchen, dass Du den niemals anders verwenden willst :-) Dein Vorschlag würde das Problem lösen, würde aber enorm Performance kosten. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1763 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 18. Jun. 2013 12:31 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 18. Jun. 2013 12:38 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von archtools:
Dein Vorschlag würde das Problem lösen, würde aber enorm Performance kosten.
Können wir das testen? Code:
(setq encode ( (lambda (rec / ) (eval (list 'lambda '(lst / key Out) '(setq key "") (list rec rec 'lst) '(cons (cons 1 key) (reverse Out)) ) ) ) (lambda (rec lst / ) (foreach l lst (cond ((null l) (setq key (strcat key "N"))) ((and (listp l) (atom (cdr l)) (not (null (cdr l)))) (setq key (strcat key ".")) (rec rec (list (car l) (cdr l))) ) ((listp l) (setq key (strcat key "<")) (rec rec l) (setq key (strcat key ">")) ) ((= 'STR (type l)) (setq key (strcat key "-")) (setq Out (cons (cons 1 l) Out)) ) ((= 'SYM (type l)) (setq key (strcat key "S")) (setq Out (cons (cons 1 (vl-princ-to-string l)) Out)) ) ((= 'REAL (type l)) (setq key (strcat key "-")) (setq Out (cons (cons 40 l) Out)) ) ((= 'INT (type l)) (setq key (strcat key "-")) (setq Out (cons (if (< -32768 l 32767) (cons 70 l) (cons 41 (float l)) ) Out ) ) ) ((= 'Ename (type l)) (setq key (strcat key "E")) (setq Out (cons (cons 1 (cdr (assoc 5 (entget l)))) Out)) ) ((= 'VLA-Object (type l)) (setq key (strcat key "V")) (setq Out (cons (cons 1 (cdr (assoc 5 (entget (vlax-vla-object->ename l))))) Out)) ) ) ) ) ) ) ;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------- (setq decode ( (lambda (expr rec / ) (eval (list 'lambda '(lst / key expr) (list 'setq 'expr expr) '(setq key (cdar lst)) '(setq lst (cdr lst)) (list rec rec) ) ) ) (lambda (K V / ) (cond ((eq K "N") nil) ((eq K "S") (read (cdr V))) ((eq K "E") (handent (cdr V))) ((eq K "V") (vlax-ename->vla-object (handent (cdr V)))) ((eq K "-") ( (lambda (a / ) (cond ((= (car a) 41) (cdr a)) ;wie wandelst du lange Integeres zurück? ('T (cdr a)) ) ) V ) ) ) ) (lambda (rec / Out K) (while (not (or (= key "") (= (setq K (substr key 1 1)) ">"))) (cond ((eq K "<") (setq key (substr key 2)) (setq Out (cons (rec rec) Out)) (setq key (substr key 2)) ) ((eq K ".") (setq key (substr key 2)) (setq Out (cons (cons ( (lambda (a / ) (setq a (expr a (car lst))) (setq lst (cdr lst)) a ) (substr key 1 1) ) ( (lambda (a / ) (setq a (expr a (car lst))) (setq lst (cdr lst)) a ) (substr key 2 1) ) ) Out ) ) (setq key (substr key 3)) ) ('T (setq Out (cons (expr K (car lst)) Out)) (setq key (substr key 2)) (if (not (= K "N")) (setq lst (cdr lst)) ) ) ) ) (reverse Out) ) ) )
Wie wandelst du ehemalig große Integer wieder zur?
EDIT: produziert wenn die eingangsliste so etwas '((1 . 2) . 3) enthält einen Fehler... bzw. wenn der car-teil eines dottedPair eine Liste ist... muss ich noch überarbeiten...
[Diese Nachricht wurde von reltro am 18. Jun. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 19. Jun. 2013 12:34 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Im Anhang die überarbeitete Version... Kann jetzt alle Arten von Daten (abgesehn von 'SUBR und 'USUBR) behandeln... Ob Atom oder Liste, dottedPair oder Ename/vla-Object, alles dabei @Archtools... Du meinst mein Vorgehen mindert die Performance? In wie Fern argumentierst du das? Fühl dich bloß nicht angegriffen, würds nur gern erklärt haben. Ich meine du musst ja genauso gut jedes Element prüfen, auf Typ... Außerdem kommen dann noch die ganzen GC 2 dazu um die Liste zu strukturieren. Die Struktur ist bei mir auch im Schlüssel verpackt, demnach, keine GC2
Was mich intressieren würde, wie lange darf ein String werden? Ich könnte ihn ohne Probleme aufteilen, oder gar kürzen, mittels "MusterErkennung".... Hab das ganze versucht einen Code den ich am Anfang meiner Lispkarriere produziert habe zu "verschlüsseln"; ziemlich lang und vieles unnötig... Hat reibungslos funktioniert...
Zur Verwendung:
Code:
(setq d (encode '(ich bin ("Zum" . Beispiel) ((1 e) ((ver . schachtelte) . "Liste")))))(princ d) ;;---> ((0 . "{SS[.S]{{.S}[[SS].]}}") (1 . "ICH") (1 . "BIN") (1 . "Zum") (1 . "BEISPIEL") (70 . 1) (1 . "E") (1 . "VER") (1 . "SCHACHTELTE") (1 . "Liste")) (decode d)
lg [Diese Nachricht wurde von reltro am 19. Jun. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 19. Jun. 2013 13:31 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 19. Jun. 2013 13:41 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von reltro:
@Archtools... Du meinst mein Vorgehen mindert die Performance? In wie Fern argumentierst du das? Fühl dich bloß nicht angegriffen, würds nur gern erklärt haben.
Beim Programmieren fühle ich mich prinzipiell niemals angegriffen. Du musst, damit das konsistent ist und zu keinerlei Verwirrungen mit potentiell anders verwendeten Schlüsselnamen führt, ausnahmslos jedes einzelne Datum Verschlüsseln. Man würde das der Einfachheit halber so machen, wie es beispielsweise im ResBuf bei C++/C# Programmierung läuft, also vor jedes Datum einen Schlüssel schreiben. Aus 1 würde 5001 1, aus 1.0 würde 5002 1.0, aus "1" würde 5003 "1", aus (1 . 2) würde 5008 { 5001 1 5001 2 }, aus (3 5) würde 5009 { 5001 3 5001 5 }. Auf diese Weise kannst Du dann problemlos alle Datentypen sichern und wieder decoden, hast aber wegen der zusätzlich nötigen Schlüssel zwingend mehr Daten zu speichern und damit Performanceverlust. Das Problem existiert real eigentlich gar nicht. Wenn Du individuelle Schlüssel verwendest. sind die natürlich im Extremfall mal gefährdet, aber das kann Dir bei Deinen globalen Variablen, bei Funktionsnamen, bei Appnamen für Xdata und Dictionaries ebenfalls passieren. Jeder andere Programmierer kann jederzeit mit seiner Applikation Deine Xdata/Dictionaries löschen oder überschreiben. Du musst also ohnehin individuelle Namen finden, und das ist bei den Schlüsselnamen ja auch problemlos möglich. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 19. Jun. 2013 13:48 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von reltro: Ich meine du musst ja genauso gut jedes Element prüfen, auf Typ...
Ich muss nur die zurückgegebenen Listen decoden, und brauche deshalb nur auf listp zu prüfen. Zitat: [/i] Was mich intressieren würde, wie lange darf ein String werden? Ich könnte ihn ohne Probleme aufteilen, oder gar kürzen, mittels "MusterErkennung".... [/i]
Mach' ich auch. Lange Strings (maximal sind IIRC 1024 Byte erlaubt) werden als Liste von kleinen Strings gespeichert, erstes Listenelement ist zwecks Erkennung wieder ein individueller Schlüssel. Sieh' Dir einfach mal an, wie lange MTEXTe gespeichert werden - da läuft das analog. Du musst bei Xdata dann auch noch unterschiedlich unter Gruppencodes 1010 und 1011 gespeicherte Vektoren auseinander halten können ...
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 19. Jun. 2013 14:22 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von archtools:
ich muss nur die zurückgegebenen Listen decoden, und brauche deshalb nur auf listp zu prüfen.
versteh ich nicht... ich hab eigentlich vom encoden gesprochen... Aber beim decoden, glaub ich schon was du meinst... Die wieder zusammengebastelte Liste, ürsprünglich mit GC2 strukturiert kommt raus, jetzt läufs du sie nochmal durch und siehst in den Listen nach ob der car-Teil einer Schlüssel ist? liege ich richtig? ;) Kannst du mir vielleicht deinen Code zeigen? Wenn du nicht hier posten willst, meine email haste ja... keine Sorge, werde ihn dir nicht streitig machen, dafür bastle ich zu gerne ;)
Zitat:
Du musst bei Xdata dann auch noch unterschiedlich unter Gruppencodes 1010 und 1011 gespeicherte Vektoren auseinander halten können ...
AiAi Captain... Hab eh schon eine Version für XData geschrieben, die kann/konnte aber keine Symbole oder DottedPairs speichern... Hab ich eigentlich noch nie gebraucht... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 19. Jun. 2013 15:50 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von reltro:
Hab eh schon eine Version für XData geschrieben, die kann/konnte aber keine Symbole oder DottedPairs speichern... Hab ich eigentlich noch nie gebraucht...
... dotted pairs verwende ich auch nie. Einzig sinnvoll in der Anwendung sind sie IMO nur dann, wenn man auf unbekannte, irgendwie in Listen codierte Daten zugreift, denn da kann man dann (siehe DXF Gruppe 10) unabhängig vom Datentyp immer mit CDR auf das Datum zugreifen. Mein Code dafür ist deutlich zu umfangreich, um ihn hier wiedergeben zu können. Ich hab' Funktionen XDATA-PUT, XDICTIONARY-PUT und DICTIONARY-PUT und die analogen GET-Funktionen, die allesamt dieselbe Codierung verwenden. Symbole, dotted pairs und lange Strings werden automatisch in Listen mit vorangestelltem Schlüssel gepackt, für die Vektoren mit 1011er Gruppe (die verwende ich häufig, beispielsweise um ein Objektkoordinatensystem zu speichern) muss aber schon zum Encoden ein Schlüssel zur Unterscheidung von 1010er Vektoren mitgegeben werden. Da ist nichts Exotisches drin. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |