| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: Elemente miteinander Verknüpfen (3254 mal gelesen)
|
glocker Mitglied CAD-Systemadministrator
Beiträge: 73 Registriert: 24.06.2004 AutoCAD-Mechanical2007 auf WindowsXP
|
erstellt am: 07. Mrz. 2006 13:27 <-- editieren / zitieren --> Unities abgeben:
Hallo, kann mir jemand erklären, wie man 2 eigentlich unabhängige Elemente miteinander verknüpfen kann um diese dann gemeinsam auszuwerten? Bei uns werden in Prüfzeichnungen Bemassungen optisch mit Markierungsblöcken markiert (numeriert). Diese beiden Elemente können nun nicht automatisch ausgewertet werden, da zwischen Bemassung und Markierungsblock keine Beziehung besteht. Wie kann man soetwas in AutoLisp lösen? Vielen Dank Helmut Glocker Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004
|
erstellt am: 07. Mrz. 2006 13:55 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
Hallo Helmut, nach meinem Verständnis möchtest Du sowas ähnliches wie "Positionsnummer" - "Bemaßungstext (Länge o.ä.)"?! Wie soll es danach weitergehen? Als Liste weiterverarbeiten oder als Text einfügen oder exportieren? Die Markierungen sind Blöcke, an deren Inhalt man mit lisp durchaus rankommen kann, ebenso ist es - soweit ich weiß - mit den Maßzahlen. Auslesen und verknüpfen ist wohl prinzipiell möglich; Positionsnummer wählen, Bemaßung wählen, und dann mach-irgendwas-damit... Wie steht es denn um Deine Kenntnisse in AutoLISP? Ich weiß nicht, ob Du in diesem Forum ein "fertiges" Programm geliefert bekommst :-( Meine eigenen Kenntnisse sind auf Anfängerniveau, habe sowas noch nicht gemacht. Mal sehen, ich probiere mal ein bißchen herum. Freddy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 18.1, LibreOffice 5+
|
erstellt am: 07. Mrz. 2006 14:31 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
So, nach einer kurzen Spielerei die ersten Denkanstöße. 1. An den Bemaßungstext - eine Realzahl - kommst Du so Code: (cdr (assoc 42 (entget (car (entsel "\nBemaßung anwählen: ")))))
heran - einfach mal in der ACAD-Befehlszeile einfügen. 2. Der Inhalt der Positionsnummern ist - auf die Schnelle - nur auf einem etwas weniger eleganten Weg auszulesen. Ich löse zunächst den Block auf, lese die Nummer des Textes aus und mache dann die Auflösung rückgängig. Nicht elegant, aber wirkungsvoll )-; Also: Auflösen mit "_.explode" (Positionsblock anwählen), Nummer auslesen mit
Code: (cdr (assoc 1 (entget (car (entsel "\nPositionsnummer picken: ")))))
dann rückgängig machen. Die Sache in Lisp eingebaut mit ordentlicher Benutzerführung wäre ein denkbarer Lösungsvorschlag.[Edit] Natürlich sollten PosNr. und Maßzahl noch irgendwie miteinander verschachtelt werden - kommt darauf an, was Du nachher damit vorhast? [/Edit] Freddy [Diese Nachricht wurde von Paulchen am 07. Mrz. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 07. Mrz. 2006 14:35 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
für solche Daten werden in der Regel ( z.B. bei Mechanical ... das das Schriftfeld weiß, das es zum Rahmen gehört u.ä.) XDATA verwendet, womit dir gleich das Stichwort gegeben ist... ------------------ - Thomas - "Du bist einen uns unbekannten Weg in eine andere Form des Seins gegangen. - Wir sehen uns wieder in deinem Paradies! - Tschüß Axel.." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
glocker Mitglied CAD-Systemadministrator
Beiträge: 73 Registriert: 24.06.2004 AutoCAD-Mechanical2007 auf WindowsXP
|
erstellt am: 07. Mrz. 2006 16:29 <-- editieren / zitieren --> Unities abgeben:
Das auslesend der Informationen aus Bemassung und Insert ist kein Problem. Die Idee mit der Erweiterung der Datensätze via XDATA ist mir auch schon gekommen - leider haben wir sowas noch nie realisiert und der Aufwand mit allem Drum und Dran (Verknüpfen, Paare finden, verlorene XDATAs finden und wiederherstellen usw...) erscheint uns für unsere beschränkten Programmierkünste etwas zu aufwendig... Es sei denn... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 07. Mrz. 2006 20:18 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
Hallo Die Lösung mit XDTATA ist eigentlich nicht so kompliziert. Am besten speicherst auf dem Insert das Handle (GC 5) der Bemassung und umgekehrt. Das Handle, weil dies ein String ist. Ein Sting lässt sich nämlich problemlos als XDATA speichern. Mit (HANDENT) erhältst Du dann den Ename zurück. Alle Verknüpften Objekte kannst Du mit (SSGET) ermitteln. -> siehe Hilfe "Filtering for Extend Data" Eine ähnliche Lösung wäre, die Handle-Paare in einem Dictionary speichen. (Ebenfalls als XDATA oder XRECORD) Problematisch kann es werden, wenn die Elemente in eine andere Zeichung eingefügt werden. Dann ändern sich die Handle's der Objekte. Schau mal unter "Handles in Extend Data" nach... Grüße Andi
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: 07. Mrz. 2006 21:14 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
Hallo, die Lösung mit den Dictionaries und den XDatas kann ich nur befürworten. Momentan arbeite ich an einem Projekt wo im Grundsatz die gleiche Problemstellung gegeben ist. Du solltest dir ein Dictionary anlegen, indem die Markierungsblöcke als Schlüssel enthalten sind und dann die Handle der zugehörigen Bemaßungen als Werte (XDatas des Dictionary enthalten sind. Ist in meinen Augen eine Datenbank innerhalb einer Zeichnung. Bei Fragen ... Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 07. Mrz. 2006 22:50 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
|
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: 08. Mrz. 2006 08:18 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
Hallo Helmut, ich bin mit der ganzen XData Listen noch ein bißchen unsicher, aber mit folgendem Code kann man Xdata-Listen an vorhandene Objekte anhängen. Diese Listen enthalten dann z.B. das Handle eines anderen Objektes. Also, der folgende Code zum probieren, vielleicht kann man das ja auch noch besser lösen. starten mit "TEST1" und "TEST2" Code:
;;;XDaten anhängen (defun JBf_xdaten_append (appname obj liste /) (if (not (tblsearch "appid" appname)) (regapp appname)) (entmod (append (entget obj) (list (list -3 (cons appname liste)))))) ;;;Xdaten lesen (defun JBf_xdaten_read (appname obj nr /) (setq liste (cdr (assoc appname (cdr (assoc -3 (entget obj (list appname))))))) (if nr (cdr (assoc nr liste)) liste)) ;;;Testfunktion XDaten anhängen (defun c:test1 (/ obj appname liste) (setq obj (car (entsel "\nBitte wählen Sie ein Objekt:")) appname "TEST" liste (list (cons 1005 (cdr (assoc 5 (entget (car (entsel "\nBitte wählen Sie das Handle-Objekt:")))))))) (JBf_xdaten_append appname obj liste)) ;;;Testfunktion XDaten lesen (defun c:test2 (/ appname obj liste) (setq obj (car (entsel "\nBitte wählen Sie ein Objekt:")) appname "TEST" nr 5) (JBf_xdaten_read appname obj 1005))
------------------ viele Grüße Jörn 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: 08. Mrz. 2006 08:29 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
Hallo Jörn, das mit den reinem Anhängen von XDatas hat den Nachteil, dass die Applikation registriert werden muss .. dass führt dann zu Proxy-Meldungen. Da bin ich kein Freund von. Das kann man umgehen, wenn man das in einem Dictionary speichert, da hier keine Applikation registriert werden muss. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. 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: 08. Mrz. 2006 09:03 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 08. Mrz. 2006 10:09 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
Zitat: Original erstellt von joern bosse: Hallo Holger, mmh, wann genau würde denn die Proxy-Meldung erscheinen? Ich habe damit ein bißchen rumprobiert, und habe nie eine Proxymeldung bekommen.
ohh sorry, klar, das sind ja noch keine eigenständigen Objekte. Da war ich zu unüberlegt und zu schnell im Posting. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 08. Mrz. 2006 14:12 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 09. Mrz. 2006 14:46 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
Zitat: Original erstellt von andi2050: HalloDie Lösung mit XDTATA ist eigentlich nicht so kompliziert. Am besten speicherst auf dem Insert das Handle (GC 5) der Bemassung und umgekehrt. Das Handle, weil dies ein String ist. Ein Sting lässt sich nämlich problemlos als XDATA speichern. Mit (HANDENT) erhältst Du dann den Ename zurück. Alle Verknüpften Objekte kannst Du mit (SSGET) ermitteln. -> siehe Hilfe "Filtering for Extend Data" Eine ähnliche Lösung wäre, die Handle-Paare in einem Dictionary speichen. (Ebenfalls als XDATA oder XRECORD) Problematisch kann es werden, wenn die Elemente in eine andere Zeichung eingefügt werden. Dann ändern sich die Handle's der Objekte. Schau mal unter "Handles in Extend Data" nach... Grüße Andi
Auf die ObjectHandle würde ich mich nicht verlassen - besser ist es IMO, eigene, eindeutige Handles dafür zu generieren und diese als Applikationsname zu verwenden, die kommen auch in anderen Zeichnungen nur mit äußerst geringer Wahrscheinlichkeit vor. Ich schreibe ziemlich häufig Applikationen, bei denen in der im OP beschriebenen auf mehr oder weniger komplexe Weise Entities voneinander abhängen. Als Handle verwende ich ein STRCAT aus einem String (z.B. "MyApp-") und der Uhrzeit (für die Fälle, dass in derselben Nanosekunde noch ein anderes Handle erzeugt werden soll, wird das nochmals abgesichert). Jedes der beiden Objekte erhält dann eine eindeutige Handle und jedes erhält zwei XDATA mit zwei verschiedenen Applikationen. Ich habe mir natürlich passende Bibliotheksfunktionen geschrieben wie z.B.
Code:
(xdata-put <ename> <application> <data> ) (xdata-get <ename> <application>
Das erste Objekt en1 mit der Handle handle1 bekommt folgende zwei XDATA-Sätze:
Code:
(xdata-put en1 "MYAPP" (list "HANDLE" handle1)) (xdata-put en1 (strcat "MYAPP-" handle1) (list "DEPENDEND" (list handle2)))
In der Liste unter "DEPENDEND" können so beliebig viele abhängige Elemente eingtragen werden. Der Vorteil dieser Methode ist, dass man erstens unter "MYAPP" immer die Applikationshandle jedes Objekts vorfindet, und dass man über den Applikationsnamen mit der Handle jedes abhängige Element sofort selektieren kann. Das geht hiermit
Code:
(ssget "X" (reverse (cons (list -3 (list appname)))))
Das zweite Objekt erhält zwei entsprechende XDATA-Sätze, wobei die Handle des dominanten ersten Objekts (falls es eine Art Master-Slave-Beziehung zwischen den beiden Objekten gibt), dann z.B. unter dem Assoc-Begriff "MASTER" gespeichert werden kann. Auf diese Weise lassen sich sehr komplexe Beziehungen zwischen vielen Objekten sauber herstellen und auch von Reaktoren sauber bearbeiten. Tom
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 09. Mrz. 2006 16:00 <-- editieren / zitieren --> Unities abgeben: Nur für glocker
|
glocker Mitglied CAD-Systemadministrator
Beiträge: 73 Registriert: 24.06.2004 AutoCAD-Mechanical2007 auf WindowsXP
|
erstellt am: 10. Jul. 2006 14:46 <-- editieren / zitieren --> Unities abgeben:
Aha - hier scheinen sich 2 Experten mit Insiderinformationen gegenseitig befruchtet zu haben. Leider kann ich nun nicht mehr folgen... Wäre es möglich, das endgültige Ergebnis von marc.scherer zu erfahren - das würde mir sehr viel Programmieraufwand ersparen, zumal ich noch keine Erfahrung in eben dieser "höheren" Programmierebene habe... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |