| |
| 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: AutoLisp-Funktion in DWG-Datei integrieren (2338 mal gelesen)
|
aRakun Mitglied
Beiträge: 3 Registriert: 26.03.2010
|
erstellt am: 26. Mrz. 2010 09:43 <-- editieren / zitieren --> Unities abgeben:
Hallo AutoLisp-Profis, ich bin neu im Forum und AutoLisp-Anfänger: Ich habe eine Funktion in Lisp geschrieben und möchte diese jetzt zusammen mit der DWG-Datei weitergeben. Nun scheint es nicht so einfach, diese Funktion in eine DWG-Datei einzubinden. Klar könnte ich die Funktion als separate Datei mit der DWG-Datei verschicken. Aber aus Erfahrung weiss ich, dass damit viele AutoCAD-Anwender nicht zurecht kommen werden. Jetzt gibt es meiner Meinung nach 3 Möglichkeiten: 1. Das ist gar nicht möglich bzw. vorgesehen, dann muss ich mir was anderes einfallen lassen. 2. Das ist so einfach, dass in diesem Forum keiner einen Gedanken daran verliert. 3. Bisher ist noch keiner auf so eine bescheuerte Idee gekommen. ;-) Ich bin auf jeden Fall in der AutoCAD-Hilfe und diversen Foren zu keiner Lösung gekommen. Ich arbeite mit AutoCAD 2010 und bedanke mich im Voraus für eine Unterstützung. aRakun Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 26. Mrz. 2010 09:49 <-- editieren / zitieren --> Unities abgeben: Nur für aRakun
|
Ex-Mitglied
|
erstellt am: 26. Mrz. 2010 09:50 <-- editieren / zitieren -->
Hi, herzlich willkommen bei CAD-de! >> 1. Das ist gar nicht möglich bzw. vorgesehen, dann muss ich mir was anderes einfallen lassen. Genau dieses, und damit gibt es (zumindest mit LISP) keine Viren, die man in DWG-Files hineinimpfen kann. Mit VBA wäre das anders, da ginge es, lehne ich aber auch wegen Virengefahr ab. Bekomme ich so eine Zeichung, öffne diese und hüpft mich das Fenster 'Makros aktivieren an' ==> rat mal, wo ich draufklick. - alfred - ------------------ www.hollaus.at |
aRakun Mitglied
Beiträge: 3 Registriert: 26.03.2010
|
erstellt am: 26. Mrz. 2010 10:55 <-- editieren / zitieren --> Unities abgeben:
Schade, dann werde ich mir wohl was anderes einfallen lassen und ich brauche in dieser Richtung keine Zeit mehr zuverschwenden. Das mit den Viren ist natürlich ein gutes Argument. Mir ging's einfach nur um Benutzerfreundlichkeit. Vielen Dank und Gruß Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SebZ Mitglied Bauingenieur Tiefbau
Beiträge: 189 Registriert: 17.10.2004 AutoCAD 2010 Civil 3D DACH WinXP Professional 2002 SP3 MS Office 2007 Intel Core2Duo 2.80 GHz, 3.00 GB RAM
|
erstellt am: 26. Mrz. 2010 17:10 <-- editieren / zitieren --> Unities abgeben: Nur für aRakun
zur Benutzerfreundlichkeit kannst du aber dennoch bedenken, dass man eine Lisp-Datei aus dem Explorer einfach in die AutoCAD-Zeichnung per Drag'n'Drop ziehen kann. Das wäre einem Nutzer mit "einfachem Erfahrungshorizont" sicherlich zuzumuten. Und wenn du in deiner Lisp-Datei eine Code-Zeile spendierst, die dem Nutzer im Augenblick des Ladens sagt, wie er das Makro starten kann, dann ist doch alles schon relativ einfach. Schönes Wochenende! ------------------ Gruß SebZ 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: 27. Mrz. 2010 19:42 <-- editieren / zitieren --> Unities abgeben: Nur für aRakun
Zitat: Original erstellt von aRakun: Hallo AutoLisp-Profis,ich bin neu im Forum und AutoLisp-Anfänger: Ich habe eine Funktion in Lisp geschrieben und möchte diese jetzt zusammen mit der DWG-Datei weitergeben. Nun scheint es nicht so einfach, diese Funktion in eine DWG-Datei einzubinden.
Das ist zwar nicht besonders einfach und nicht vorgesehen, aber machbar ist das schon. Ich habe vor ungefähr 15 Jahren schon ein Programm geschrieben, das das macht: objectiveCAD. Das erzeugt aus einfachen geometrischen Beschreibungen Lisp-Quellcode, der in der Regel der parametrischen Erzeugung von Zeichnungen dient, und speichert diesen in Code in den Zeichnungen, die solche parametrisch definierten Zeichnungselemente enthalten. Man kann die Zeichnungen an Dritte weitergeben, wo dort dann der Lisp-Code automatisch extrahiert und in den Interpreter geladen wird. Damit steht die "Intelligenz" der parametrisch definierten Zeichnung auch dem Empfänger zur Verfügung, der z.B. die Parameter ändern kann, ohne irgend ein Programm laden zu müssen. Das ist also ungefähr sowas wie "custom defined entities". Wie Du Deine Aufgabe am besten löst, kann ich nicht sagen - da hast Du bei weitem zu wenig Informationen darüber gegeben, was Du eigentlich bezweckst. Aber Du kannst Dir gerne mal objectiveCAD ansehen und damit herum spielen: http://www.archtools.de/d-download.html Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-reltro- Mitglied student
Beiträge: 12 Registriert: 01.05.2010 acad 2011
|
erstellt am: 09. Jul. 2010 22:32 <-- editieren / zitieren --> Unities abgeben: Nur für aRakun
Hallo also das schreiben einer Funktion als bespielsweise Text in eine Zeichnung funktioniert im Grunde schon, nur recht kompliziert. Fügt man den Programmcode 1:1 in ein Textelement ein, werden Strings beim lesen des Textes und umwandeln zu Programmcode, nicht mehr als Solche erkannt. So habe ich nun den Programmcode in seine Einzelzeichen zerlegt, um anschließend jedes Zeichen einzeln in einen ascii-code umzuwandeln, und dann alle gemeinsam als Text in die zeichnung zu schreiben... ganz klein und unscheinbar... Geladen werden alle auf einem Layer liegenden Programme. BSP.: (f->txt '(defun Musterprogramm(a b c / ) (Princ "Hello again")) Einfügepunkte "Layer") (txt->f "Layer") lG Reltro
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: 09. Jul. 2010 23:44 <-- editieren / zitieren --> Unities abgeben: Nur für aRakun
Zitat: Fügt man den Programmcode 1:1 in ein Textelement ein, werden Strings beim lesen des Textes und umwandeln zu Programmcode, nicht mehr als Solche erkannt.
Aber natürlich wird Text als Programmcode erkannt, wenn im Text Programmcode steht. (setq str "(defun c:test () (alert \"HALLO\"))") Das speicherst Du jetzt auf eine Dir genehme Weise in einer Zeichnungsdatei ab (als Textelement macht sich das nicht besonders vorteilhaft, als Dictionary schon etwas besser), und holst es dann auf die passende Weise wieder als String zurück. Dann wird das mit (eval (read str)) als Lisp evaluiert. Das geht, wenn Du Strings in Dictionaries oder X-Dictionaries speicherst, mit beliebig großen Lisp-Programmen.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
aRakun Mitglied
Beiträge: 3 Registriert: 26.03.2010
|
erstellt am: 12. Jul. 2010 08:01 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die Infos. Das wird mich hoffentlich in dem Thema weiterbringen. Ich musste das Thema leider aus Zeitmangel einige Prioritätsstufen runtersetzen. Sobald ich mal wieder etwas Luft habe, werd' ich mich da wieder reinsteigern. Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-reltro- Mitglied student
Beiträge: 12 Registriert: 01.05.2010 acad 2011
|
erstellt am: 20. Jul. 2010 11:40 <-- editieren / zitieren --> Unities abgeben: Nur für aRakun
Zitat: Original erstellt von archtools: Aber natürlich wird Text als Programmcode erkannt, wenn im Text Programmcode steht.(setq str "(defun c:test () (alert \"HALLO\"))") Das speicherst Du jetzt auf eine Dir genehme Weise in einer Zeichnungsdatei ab (als Textelement macht sich das nicht besonders vorteilhaft, als Dictionary schon etwas besser), und holst es dann auf die passende Weise wieder als String zurück. Dann wird das mit (eval (read str)) als Lisp evaluiert. Das geht, wenn Du Strings in Dictionaries oder X-Dictionaries speicherst, mit beliebig großen Lisp-Programmen.
Hallo, das mit dem Programmcode im text funktioniert nicht weil wenn man den Text ausliest wird dieser als kompletter String, sprich "(defun C:test( / ) (princ hallo))", ausgelesen - wie man erkennt fehlt beim (princ hallo) die Anführungszeichen. Es sei denn man kann dieses Zeichen durch was anderes ersetzen...
hmmm, du sagst "Dictionary", wo genau ist das Teil zu finden, bzw. was für ein objekt ist das? - ist es überhaupt ein Objekt? wie erzeuge ich dieses? Lg reltro
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 20. Jul. 2010 11:57 <-- editieren / zitieren --> Unities abgeben: Nur für aRakun
Gemeint war: Du liest den Text über Lisp ein, im Beispiel wurde der String sogar an das Symbol "str" gepappt. an 'str' hängt nun also der String "(defun c:test () (alert \"HALLO\"))" nun könnte man so: (eval (read str)) : zB den AutoCADbefehl "Test" definieren - ausgehend von einem "String" der in der Datei gespeichert wurde. Nur wie bereis am Anfang gesagt wurde - du brauchst ja im System erst mal eine Funktion welche diesen lesen&umsetzen macht. Dictionarys.. da sind zB. Multilinienstile gespeichert usw. "ACAD_COLOR" "ACAD_GROUP" "ACAD_IMAGE_DICT" "ACAD_LAYOUT" "ACAD_MATERIAL" "ACAD_MLINESTYLE" "ACAD_PLOTSETTINGS" "ACAD_PLOTSTYLENAME" "ACAD_TABLESTYLE" "ACAD_VISUALSTYLE" um ein paar Standard Dictionarys zu nennen. => (entget(namedobjdict)) ------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) [Diese Nachricht wurde von cadffm am 20. Jul. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 20. Jul. 2010 12:22 <-- editieren / zitieren --> Unities abgeben: Nur für aRakun
@reltro ob das was wird... vllt solltest du dir die Grundlagen erstmal anschauen . hier mal ein kleines Beispiel - (ausführen in leerer Zeichnung) Code: (defun c:test1 (/) (entmake (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") '(10 0.0 0.0 0.0) '(1 . "(defun c:test2 () (alert \"HALLO\"))")) ) ;(princ (cdr (assoc 1 (entget (car(entsel)))))) (princ (cdr (assoc 1 (entget (entlast))))) (eval(read(cdr (assoc 1 (entget (entlast)))))) (princ) )
erstmal test2 starten --> unbekanter Befehl dann test1 starten danach test2 starten ->> Hallo ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-reltro- Mitglied student
Beiträge: 12 Registriert: 01.05.2010 acad 2011
|
erstellt am: 20. Jul. 2010 14:12 <-- editieren / zitieren --> Unities abgeben: Nur für aRakun
Zitat: Original erstellt von Dorfy: @reltro ob das was wird... vllt solltest du dir die Grundlagen erstmal anschauen . hier mal ein kleines Beispiel - (ausführen in leerer Zeichnung)Code: (defun c:test1 (/) (entmake (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") '(10 0.0 0.0 0.0) '(1 . "(defun c:test2 () (alert \"HALLO\"))")) ) ;(princ (cdr (assoc 1 (entget (car(entsel)))))) (princ (cdr (assoc 1 (entget (entlast))))) (eval(read(cdr (assoc 1 (entget (entlast)))))) (princ) )
erstmal test2 starten --> unbekanter Befehl dann test1 starten danach test2 starten ->> Hallo
Ok, es funktioniert aber nur weil du bei den Anführungszeichen, die den String definieren ein /" machst... Ist dieses nicht vorhanden wird das ganze nicht als String im String erkannt.
Ich persönlich hab für mich eine Lösung gefunden die funktioniert, auch wenn der String nur durch " " begrenzt wird... Vielleicht umständlich, vielleicht "falsch", vielleicht nicht optimal - aber es funktioniert. (weiter oben im Anhang) Die Sache mit dem Dictionary - hab mir die GC's von den Dingern angeschaut und muss sagen ich durchblick den Aufbau nicht. Gruppencode 3 scheint als Namensgeber zu fungieren, und 350 als Eigenschaft von GC 3 - right? jetzt ist GC 350 ein Entity name.
- und dann?? dieses Entity weiter zu "entget'en" - jo, auch nicht wirklich aufschlussreich. Wäre dankbar wenn mir wer den Aufbau eines solchen Dictionary-objekt beschreiben könnte - weil es anscheinend besser funktionieren würd als ein text-objekt. LG reltro
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 20. Jul. 2010 17:37 <-- editieren / zitieren --> Unities abgeben: Nur für aRakun
Zitat: Original erstellt von -reltro-: Die Sache mit dem Dictionary - hab mir die GC's von den Dingern angeschaut und muss sagen ich durchblick den Aufbau nicht. Gruppencode 3 scheint als Namensgeber zu fungieren, und 350 als Eigenschaft von GC 3 - right? jetzt ist GC 350 ein Entity name.- und dann?? dieses Entity weiter zu "entget'en" - jo, auch nicht wirklich aufschlussreich. Wäre dankbar wenn mir wer den Aufbau eines solchen Dictionary-objekt beschreiben könnte - weil es anscheinend besser funktionieren würd als ein text-objekt.
"hab mir die GC's von den Dingern angeschaut" auch in der Hilfe unter vlide?
hier mal was zum Thema oder vllt. hier ... die Links beachten und einfach mal weiter suchen ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |