| | | 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: Object-Reactor - :vlr-modified - Endlosschleife?? (1026 / mal gelesen)
|
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. Feb. 2016 15:33 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich möchte per Objekt-Reactor eine Polylinie auf Änderung jeglicher Art überwachen. Also habe ich mir einen ganz einfachen Beispielcode geschrieben, mit der Funktion c:test wird der Objekt-Reactor an das zu pickende Objekt gehängt. Wenn ich dann das Objekt ändere, egal ob Eigenschaften, oder Position oder sonst was, dann funktioniert das z.B. mit einem Kreis. Wenn ich aber einens Stützpunkt einer Polylinie mit einem Griff ändere, dann lande ich in einer Endlosschleife, ich weiß bloß nicht warum?? Hat einer von Euch eine Idee was ich falsch mache? Anmerkung 1:In ACAD 2012 und 2016 ist die Endlosschleife aufgetreten, in BricsCAD V16 ist alles in Ordnung. Anmerkung 2: Vor dem Testen des Codes alles vorher speichern, wenn das so ist wie bei mir, dann müßt Ihr ACAD mit Alt+Strg+Entf abwürgen. Code:
(defun R:JB:OBJECT_MODIFIED(notifier reactor parameter / ) (alert "Ich ändere mich gerade.") ) ;;;;;;Objekt-Reactor an Objekt (defun R:JB:OBJECT_MODIFIED:Obj (obj / ) (vlr-object-reactor (list (vlax-ename->vla-object obj)) (vla-get-handle (vlax-ename->vla-object obj)) '((:vlr-modified . R:JB:OBJECT_MODIFIED))) ) (defun c:TEST( / ) (R:JB:OBJECT_MODIFIED:Obj(car(entsel "\nObjekt auswählen."))) )
------------------ viele Grüße Jörn http://www.bosse-engineering.com Liniensignaturen Youtube [Diese Nachricht wurde von joern bosse am 23. Feb. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 24. Feb. 2016 10:51 <-- editieren / zitieren --> Unities abgeben: Nur für joern bosse
ich hatte letztens das gleiche Problem. Ich habe daher genau für diese Änderungen den Editor Reactor mit der commandEndet Funktion genutzt. das 2 Argument, was der Funktion beim 'Feuern' übergeben wird ist ja der Befehl - in dem Falle eben "GRIP_STRETCH" Abgesehen davon kannst du die Reaktoffunktion auch per singel Step durch den Editor laufen lassen, dann musst du deine Sesion nicht abwürgen und siehst, was da für Aktionen anspringen.
------------------ Gruß CADwiesel Besucht uns im CHAT
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: 24. Feb. 2016 11:56 <-- editieren / zitieren --> Unities abgeben:
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 25. Feb. 2016 21:25 <-- editieren / zitieren --> Unities abgeben: Nur für joern bosse
Zitat: Original erstellt von joern bosse: Hallo, ich möchte per Objekt-Reactor eine Polylinie auf Änderung jeglicher Art überwachen. Also habe ich mir einen ganz einfachen Beispielcode geschrieben, mit der Funktion c:test wird der Objekt-Reactor an das zu pickende Objekt gehängt.Wenn ich dann das Objekt ändere, egal ob Eigenschaften, oder Position oder sonst was, dann funktioniert das z.B. mit einem Kreis. Wenn ich aber einens Stützpunkt einer Polylinie mit einem Griff ändere, dann lande ich in einer Endlosschleife, ich weiß bloß nicht warum?? Hat einer von Euch eine Idee was ich falsch mache? Anmerkung 1:In ACAD 2012 und 2016 ist die Endlosschleife aufgetreten, in BricsCAD V16 ist alles in Ordnung. Anmerkung 2: Vor dem Testen des Codes alles vorher speichern, wenn das so ist wie bei mir, dann müßt Ihr ACAD mit Alt+Strg+Entf abwürgen. Code:
(defun R:JB:OBJECT_MODIFIED(notifier reactor parameter / ) (alert "Ich ändere mich gerade.") ) ;;;;;;Objekt-Reactor an Objekt (defun R:JB:OBJECT_MODIFIED:Obj (obj / ) (vlr-object-reactor (list (vlax-ename->vla-object obj)) (vla-get-handle (vlax-ename->vla-object obj)) '((:vlr-modified . R:JB:OBJECT_MODIFIED))) ) (defun c:TEST( / ) (R:JB:OBJECT_MODIFIED:Obj(car(entsel "\nObjekt auswählen."))) )
Ganz spontan und ohne Prüfung: Du hängst bei jedem Aufruf von C:TEST einen neuen, zusätzlichen Reaktor an das Objekt, ohne den alten Reaktor zu löschen. Normal ist es, EINMAL (in Ziffern: 1) einen Reaktor an ein Objekt zu binden. Bei einem normalen Reaktor wird die Reaktorfunktion dann während der Zeichnungssitzung immer wieder bei Eintreten des Ereignisses ausgeführt, bei einem persistenten Reaktor (davon rate ich mit Nachdruck ab!) wird der Reaktor mit der DWG gespeichert. Speichere Deinen Reaktor, den Du mit vlr-object-reactor erzeugst, in einer globalen Variablen ab. Bei jedem Aufruf von C:TEST prüfst Du dann, ob der schon existiert, und ob der Reaktor Owner Deines ausgewählten Objekts ist. Falls der Reaktor noch nicht existiert, erzeugst Du ihn als Owner des ausgewählten Objekts, falls er schon existiert und Dein Objekt noch nicht als Owner hat, nimmst Du ds Objekt nur in die Ownerliste auf. Ein Zeichnungsobjekt kann beliebig vielen Reaktoren mit völlig verschiedenen Funktionen zugehören. 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: 26. Feb. 2016 15:21 <-- editieren / zitieren --> Unities abgeben:
Hallo Tom, erstmal 10 Points für Dich, habe eine Menge dazu gelernt, das Zauberwort war OWNER :-)))) Hier jetzt meine Vorgehensweise, ich bin der Meinung, das ist jetzt so korrekt, korrigier mich, wenn ich falsch liege. Ich erstellen EINEN Objekt-Reaktor, wenn dieser in der Zeichnung noch nicht existiert, und übergebe im gleichen Zuge den ersten OWNER. Und dann kann ich jedes weitere Objekt als OWNER an diesen einen Objekt-Reactor anhängen. Was mich noch ein bisschen ins Grübeln gebracht ist, wenn ich das Objekt lösche, dann bleibt es in der Owner-Liste bestehen, wenn ich mit REDO das löschen rückgängig mache ist es dann auch wieder in Ordnung. Dasselbe habe ich mit vla-delete und entdel getestet, funktioniert so weit. Ich bin der Meinung, weil die Reactoren nicht persistent sind, hinterlasse ich von gelöschten Objekten auch keinen Datenschrott, denn wenn die Zeichnung geschlossen wird, dann werden die Reaktoren automatisch entfernt. Die eigentliche Frage, die ich hatte, warum bei der ersten Variante bei Griff-Aktionen an einer Polylinie es zu der Endlos-Schleife gekommen ist kann ich trotzdem nicht beantworten. Eigentlich hätte es trotzden funktionieren müssen, auch wenn es ziemlicher Blödsinn ist, für jedes Objekte einen Reaktor zu erstellen. Egal, in der neuen Variante funktioniert es. Code:
(defun c:test1 ( / OBJ REACTOR X) (vl-load-com) (if(setq obj (car (nentsel "\nObjekt auswählen: "))) ;;;wenn bereits Object-Reactor "JB_TestOBjectReactor" vorhanden (if(setq reactor (car(vl-remove-if 'not (mapcar '(lambda (X) (if(= "JB_TestOBjectReactor" (vlr-data X)) X)) (cdr(car(vlr-reactors :vlr-object-reactor))))))) ;;;dann das Objekt in OwnerList hinzufügen (vlr-owner-add reactor (vlax-ename->vla-object obj)) ;;;sonst neuen Objekt-Reactor "JB_TestOBjectReactor" für das Objekt (vlr-object-reactor (list (vlax-ename->vla-object obj)) "JB_TestOBjectReactor" '((:vlr-modified . JB_ObjectReactorCallback))))) ) ;;;Geöffnete Objekte bei REDO (defun JB_ObjectReactorCallback:ObjectNotOpen? (object / ) (and object (vlax-vla-object->ename object) (entget(vlax-vla-object->ename object)))) (defun JB_ObjectReactorCallback (object reactor parameters / Handle OpenFlag) (vl-load-com)
(if (not(vlax-erased-p object)) ;;;wenn gültiges Objekt (princ (apply 'strcat (apply 'append (list (list (strcat "Objekt wurde geändert: " (if(setq OpenFlag(JB_ObjectReactorCallback:ObjectNotOpen? object)) (vla-get-Handle object) "##REDO##(Objekt ist geöffnet, kann nicht gelesen werden)." ))) (list "\n\nFolgende Objekt-Reactoren sind derzeit vorhanden:\n") (apply 'append (mapcar '(lambda(X) (apply 'append (list (list (strcat "\n- " (vlr-data X))) (list "\n Folgende Owner:") (mapcar '(lambda(owner) (strcat "\n - " (if OpenFlag(vla-get-Handle owner) "##REDO##(Objekt ist geöffnet, kann nicht gelesen werden).")) ) (vlr-owners X)))) ) (cdr(car(vlr-reactors :vlr-object-reactor))))))))) (princ "Objekt wurde gelöscht. ") ) )
PS: die ALERT-Meldungen sehen eine wenig verwirrend aus, ich habe mir für Prüfzwecke damit den Handles der OWNER des Reaktors angezeigt. Geändert: habe die ALERT-Meldungen gegen PRINC ausgetauscht. Wenn die ALERT-Meldung den Focus an sich zieht, dann gibt es bei Griffbearbeitung sonst wieder eine Endloschleife. Und wenn ich schon dabei bin, damit hat sich auch meine ursprüngliche Endlos-Schleife erklärt, es war die ALERT-Meldung. Und was sagt mit das? Am Ende hat der Rechner immer recht ------------------ viele Grüße Jörn http://www.bosse-engineering.com Liniensignaturen Youtube [Diese Nachricht wurde von joern bosse am 26. Feb. 2016 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: 26. Feb. 2016 18:08 <-- editieren / zitieren --> Unities abgeben: Nur für joern bosse
Zitat: Original erstellt von joern bosse: Hallo Tom, erstmal 10 Points für Dich, habe eine Menge dazu gelernt, das Zauberwort war OWNER :-)))) Hier jetzt meine Vorgehensweise, ich bin der Meinung, das ist jetzt so korrekt, korrigier mich, wenn ich falsch liege.Ich erstellen EINEN Objekt-Reaktor, wenn dieser in der Zeichnung noch nicht existiert, und übergebe im gleichen Zuge den ersten OWNER. Und dann kann ich jedes weitere Objekt als OWNER an diesen einen Objekt-Reactor anhängen. Was mich noch ein bisschen ins Grübeln gebracht ist, wenn ich das Objekt lösche, dann bleibt es in der Owner-Liste bestehen, wenn ich mit REDO das löschen rückgängig mache ist es dann auch wieder in Ordnung. Dasselbe habe ich mit vla-delete und entdel getestet, funktioniert so weit. Ich bin der Meinung, weil die Reactoren nicht persistent sind, hinterlasse ich von gelöschten Objekten auch keinen Datenschrott, denn wenn die Zeichnung geschlossen wird, dann werden die Reaktoren automatisch entfernt. Die eigentliche Frage, die ich hatte, warum bei der ersten Variante bei Griff-Aktionen an einer Polylinie es zu der Endlos-Schleife gekommen ist kann ich trotzdem nicht beantworten.
Hallo, hab' mir Deinen Code nicht angeguckt. Wenn der funktioniert, dass wird's schon OK sein. Das mit der Endlosschleife hat mich auch grübeln lassen. Da hab' ich keine schlüssige Antwort drauf und müsste mir das auch erst mal im Debugger ansehen. Aber das überlass' ich lieber Dir :-) Gruß Tom
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|