Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Object-Reactor - :vlr-modified - Endlosschleife??

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Object-Reactor - :vlr-modified - Endlosschleife?? (980 / mal gelesen)
joern bosse
Ehrenmitglied
Dipl.-Ing. Vermessung


Sehen Sie sich das Profil von joern bosse an!   Senden Sie eine Private Message an joern bosse  Schreiben Sie einen Gästebucheintrag für joern bosse

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 23. Feb. 2016 15:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von CADwiesel an!   Senden Sie eine Private Message an CADwiesel  Schreiben Sie einen Gästebucheintrag für CADwiesel

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 24. Feb. 2016 10:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für joern bosse 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von joern bosse an!   Senden Sie eine Private Message an joern bosse  Schreiben Sie einen Gästebucheintrag für joern bosse

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 24. Feb. 2016 11:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Martin,
schö das ich nicht alleine bin mit meinen Problemen, werden dann wohl den Plan B umsetzen.

Das mit den "singel Step durch den Editor laufen lassen", wie meinst Du denn das? Ich habe Einzelschritte im VLIDE verwendet, aber sofort nach Beendung der alert-Meldung wird wieder die Reactor-Funktion aufgerufen, und dann immer wieder :-(

------------------
viele Grüße

Jörn
http://www.bosse-engineering.com

Liniensignaturen Youtube

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archtools
Mitglied



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 25. Feb. 2016 21:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für joern bosse 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von joern bosse an!   Senden Sie eine Private Message an joern bosse  Schreiben Sie einen Gästebucheintrag für joern bosse

Beiträge: 1734
Registriert: 11.10.2004

Window 10
ACAD 2021
CIVIL 2021
BricsCAD V14-V22
Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz
16.0GB RAM
NVIDIA GeForce GTX 1050<P>

erstellt am: 26. Feb. 2016 15:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von archtools an!   Senden Sie eine Private Message an archtools  Schreiben Sie einen Gästebucheintrag für archtools

Beiträge: 823
Registriert: 09.10.2004

Entwickler für AutoCAD, BricsCAD u.a., alle Systeme

erstellt am: 26. Feb. 2016 18:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für joern bosse 10 Unities + Antwort hilfreich

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz