| | | 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 - erased (1675 mal gelesen)
|
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: 06. Jun. 2012 13:10 <-- editieren / zitieren --> Unities abgeben:
Hello liebe Menschen, Gibs denn eine möglichkeit im CallBack von :vlr-erased an das gelöschte Object ranzukommen, bzw. die Xdata oder entget-Liste auszulesen? Habe versucht das ganze über ein Undo im CallBack zu lösen um zunächst die Dinge die ich brauche auszulesen, um danach dann wieder ein redo zu senden. funktioniert nicht wirklich. Gibt es irgendwie die möglichkeit das erased-Flag eines VLA-Object's auf "unerased" sprich 'nil zu setzen bzw. danach dann wieder auf 'T? Lg Reltro Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 06. Jun. 2012 13:28 <-- editieren / zitieren --> Unities abgeben: Nur für reltro
|
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: 06. Jun. 2012 14:38 <-- editieren / zitieren --> Unities abgeben:
hm, ok danke, werd ich testen... Der Hintergrund des Ganzen ist es Objekte miteinander zu verknüpfen, wobei eines der Objekte die Basis darstellt und ich eben rausfinden muss um welches Objekt es sich beim Gelöschten handelt, um im weiteren das zu tun was zu tun ist Aso, es können mehrere BasisObjekte vorhanden sein. Identifiziert werden sie über die XData's Und weil ich nicht für jedes Objekt bzw. BasisObjekt einen anderen Reactor anlegen will, möchte ich versuchen das ganz so zu lösen. Sprich, dass das Ganze in einer abgeschlossenen Umgebung eines einzelnen Reactors stattfinden kann. ------------------------------------------------------ Bin grad dabei ein Object-Reactor-Template zu erstellen, in welches lambda-expressions eingelagert werden. Das Ganze hab ich für die einfachsten Reaktionen bereits geregelt. So zb. :VLR-modified... wo es zunächst eine lambda-expr gibt die zum überprüfen da ist, ob die Änderung relevant ist, und eine andere lambda-expr um gegebenfalls die Änderung rückgängig zu machen oder was auch immer; wobei die 2te lambda-expr in einem :vlr-commandEnded bzw. :vlr-lispEnded abgehandelt wird, dessen CallBack aus dem CallBack des ObjectReactors erstellt wird, und der zu erwartende Ended-Reactor erstellt oder wenn schon als Object vorhanden, aktiviert wird. Das Callback des Ended-reaktors wirdnach ablauf seiner selbst auf den ürsprünglichen Wert der Variable mit dessen Namen zurückgesetzt. ------------------------------------------------------ Zb.: ich sag dem Ding dass die Objekte auf Layer "0" bleiben müssen, und die Farbe "byLayer" -> funktioniert... und das Ganze mit einem Aufruf der Template-Funktion ohne die einzelnen Reaktoren direkt/manuell zu implementieren. Nun möchte ich das ganze eben auf die gesamte Palette der Object-reactoren erwetern. Lg reltro
Ps.: Ergebnisse des Test's werden nachgereicht bis dahin danke Cadmium 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: 08. Jun. 2012 22:06 <-- editieren / zitieren --> Unities abgeben:
So, hab nun einen dezenten Test des ganzen durchgeführt, wobei das Ergebniss nicht wirklich zufriedenstellend ist, weil es in einem Fehler ended. Ich habe nun einfach mal alle object-reactoren geladen und mit einem Callback versorgt, um mal zu sehn wie und wann welcher reaktor gefeuert wird. Zudem hab ich im :vlr-openedForModify versucht den Layer des Owners auszulesen, welcher bei einer Linie hoffentlich vorhanden ist Folgender Error: ----------------------------------------------------------- ; error: Automation Error. Object was open for write ----------------------------------------------------------- Und der Code der diesen produziert:
Code:
(vl-load-com)(vlr-object-reactor (list (vlax-ename->vla-object (car (entsel))) ) "test" '( (:vlr-cancelled . cancelled) (:vlr-copied . copied) (:vlr-erased . erased) (:vlr-unerased . unerased) (:vlr-goodbye . goodbye) (:vlr-openedForModify . openedForModify) (:vlr-modified . modified) (:vlr-subObjModified . subObjModified) ;(:vlr-modifiedUndone . modifiedUndone) (:vlr-modifiedXData . modifiedXData) (:vlr-unappended . unappended) (:vlr-reappended . reappended) (:vlr-objectClosed . objectClosed) ) ) ;------------------------------------------------------ (defun cancelled (a b c / ) (princ "\ncancelld") ) ;------------------------------------------------------ (defun copied (a b c / ) (princ "\ncopied") (princ "---") (princ c) ) ;------------------------------------------------------ (defun erased (a b c / ) (princ "\nerased") ) ;------------------------------------------------------ (defun unerased (a b c / ) (princ "\nunerased") ) ;------------------------------------------------------ (defun goodbye (a b c / ) (princ "\ngoodbye") ) ;------------------------------------------------------ (defun openedForModify (a b c / ) (princ "\nopenedForModify") (princ " - ") (princ (vla-get-layer a)) ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ) ;------------------------------------------------------ (defun modified (a b c / ) (princ "\nmodified") ) ;------------------------------------------------------ (defun subObjModified (a b c / ) (princ "\nsubObjModified") ) ;------------------------------------------------------ (defun undoneMod (a b c / ) (princ "\nundoneMod") ) ;------------------------------------------------------ (defun modifiedXData (a b c / ) (princ "\modifiedXData") ) ;------------------------------------------------------ (defun unappended (a b c / ) (princ "\nunappended") ) ;------------------------------------------------------ (defun reappended (a b c / ) (princ "\nreappended") ) ;------------------------------------------------------ (defun objectClosed (a b c / ) (princ "\nobjectClosed") (princ " - ") (princ (vla-get-layer a)) )
Hm, also programmier-technischen Fehler kann es wohl keiner sein, wenn dann wohl eher ein jener im DenkVorgang. Hab auch versucht den Reactor vor dem auslesen des Layers zu deaktivieren -> ohne Erfolg, was mich auch nicht wirklich verwundert. Zudem: (entget (vlax-VLA-Object->Ename Owner)) -> 'nil Nun, wie nun? Hat jemand einen Vorschlag? Es sollte, hoffentlich, irgendwie möglich sein.
Ich weiß nicht ob es von einem Reactor zu viel verlangt ist, Ursprungs- und End-Object vergleichen zu können. ...................................................................... Ich meine ich wüsste einen Weg: Vlr-editor-reactor mit LispWillStart und CommandWillStart und das Auslesen der gewünschten Daten aller Owner des ObjectReactor und speichern in einer globalen Variable. Nur kann ich mir fast nicht vorstellen dass es das sein soll, weil wohl eher RechenIntensiv. Auserdem, dieses Konstrukt, so wie ich es bemerkt habe, nicht feuert, wenn die Eigenschaften aus den Properties geändert werden. Also auch ein eher unnötiger Weg. VLR-Object-Reactor vs. VLR-acdb-Reactor <--- Ein Weg?
Lg reltro
[Diese Nachricht wurde von reltro am 08. Jun. 2012 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: 09. Jun. 2012 11:58 <-- editieren / zitieren --> Unities abgeben:
hmmm... habe nun einen Weg gefunden das Erase-Flag von 'T auf 'nil und umgekehrt zu setzen, nähmlich mit: (entdel <ename> ) !!! [EDIT] Funktioniert im Reactor iregendwie nicht Ist zwar in einer gewissen Art und weise das was ich gesucht habe, aber leider nicht unbedingt das was sich in der weiteren Überlegung herausgestellt hat, nähmlich: ------------------------------------------------------------ Dass es schon schön wäre, egal welcher reactor nun dann gefeuert wird, bei :VLR-openedForModify bereits die Daten auslesen zu können und dann bei :VLR-ObjectClosed die gesammelten Infos zu vergleichen, weil dadurch wohl einige der Reaktoren (außer wohl :VLR-copied) an überfluss gewinnt. Man möge mich Tot-schlagen, weil diese Aussage natürlich nicht immer zutrifft. Ich Will mal behaupten dass zumindest der :VLR-Modified, :VLR-Erased, :VLR-Unerased überflüssig werden können. Die anderen kann ich nicht beurteilen, weil ich noch nicht herausgefunden habe wann diese feuern, wie zb. :VLR-Goodbye ------------------------------------------------------------ Desshalb wär ich dankbar um einen Denkanstoss zur Möglichkeit Daten im :VLR-openedForModify auszulesen. Das eizigste was ich bis jetzt ohne Fehler geschafft habe ist das Auslesen des ENAME's was für (entdel ...) wichtig ist, um gegebenfalls das erased-Flag von 'T auf 'nil zu setzen. Lg reltro [EDIT] Wie sich herausgestellt hat, funktioniert (entdel <Ename> ) im reaktor nicht um das erased-Flag zu ändern... Also wieder von vorn :| [Diese Nachricht wurde von reltro am 09. Jun. 2012 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: 11. Jun. 2012 12:34 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 11. Jun. 2012 12:57 <-- editieren / zitieren --> Unities abgeben: Nur für reltro
|
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: 11. Jun. 2012 13:15 <-- editieren / zitieren --> Unities abgeben:
Hello Thomas, sehr schönes Zitat... und so wahr Naja, jetzt, nachdem du zitierst, weiß ich auch, dass ich das arme Pferd totgeritten habe/war/ist. Hab auf jeden Fall wieder mal was gelernt. Werd mich an eine andere Art der Lösung machen. Lg und Danke - U's 4 u Reltro Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|