| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: TransactionEvent.OnCommit wie abfangen? (800 mal gelesen)
|
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 30. Nov. 2020 14:10 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, Ralf hatte mir in diesem Beitrag schmackhaft gemacht das TransactionElement "Bauteilliste erstellen" abzufangen. Mangels Beispielen in der API-Hilfe und da ich im Netz kein übertragbares Beispiel fand, scheitere ich leider daran. Vielleicht hat jemand ein Beispiel wie man TransactionEvent.OnCommit abfängt?
Vielen Dank schon einmal für eure Hilfe und Grüße
EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 30. Nov. 2020 16:31 <-- editieren / zitieren --> Unities abgeben: Nur für EIBe 3D
|
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 01. Dez. 2020 13:27 <-- editieren / zitieren --> Unities abgeben:
Hallo KraBBy, darüber bin ich tatsächlich schon gestolpert bekomme es aber nicht ans laufen. Irgendwie stelle ich mich gerade zu blöd an, was vielleicht an meinem Grippevernebelten Hirn liegt. Könntest du kurz erklären wie ich den Kram ans laufen bekomme? Danke und Grüße
EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 01. Dez. 2020 15:40 <-- editieren / zitieren --> Unities abgeben: Nur für EIBe 3D
hatte mir eine UserForm (UF) angelegt. Darauf ein Button "clear" (Element so benannt) und eine Listbox "List". Wichtig war noch .ShowModal der UF auf auf False. Dann den Code in den "Code-Bereich" (heißt der so?) der UF kopiert und z.B. bei Sub UserForm_Initialize ausgeführt. Dann läuft zumindest das Beispiel. Edit: bzgl. Grippe natürlich gute Besserung! ------------------ Gruß KraBBy [Diese Nachricht wurde von KraBBy am 01. Dez. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 01. Dez. 2020 16:39 <-- editieren / zitieren --> Unities abgeben:
Hallo KraBBy, danke für die Erklärung und Besserungswünsche. Damit habe ich es folgendermaßen rudimentär zum Laufen gebracht: In ein Klassenmodul "clsTxnEnvents": Code:
Public WithEvents oTxnEvents As TransactionEventsPrivate Sub Class_Initialize() Dim oTxnMgr As TransactionManager Set oTxnMgr = ThisApplication.TransactionManager Set oTxnEvents = oTxnMgr.TransactionEvents End Sub Private Sub oTxnEvents_OnCommit(ByVal TransactionObject As Transaction, ByVal Context As NameValueMap, ByVal BeforeOrAfter As EventTimingEnum, HandlingCode As HandlingCodeEnum) If BeforeOrAfter = kBefore Then Debug.Print "Transaction: " & TransactionObject.DisplayName Debug.Print "Transaction: " & TransactionObject.Id & " will be committed" ElseIf BeforeOrAfter = kAfter Then Debug.Print "Transaction: " & TransactionObject.DisplayName Debug.Print "Transaction: " & TransactionObject.Id & " has been committed" End If End Sub
In ein allgemeines Modul z.B. "EventHandler": Code:
Private oTxnEvent As clsTxnEventsPublic Sub TxnEventStart() Set oTxnEvent = New clsTxnEvents End Sub
Starte ich nun die Sub im allgemeinen Modul, wirft er mir einmalig die Debug.Print Lines in die Ausgabe. Passt soweit wie vorgesehen. Füge ich eine erneut eine Bauteilliste wird der Eventhandler nicht mehr befeuert. Nun müsste ich allerdings jede Aktion die ich nach dem Event anstossen will dies ja auch innerhalb des Klassenmoduls tun, da ich scheinbar nur dort die Events abfangen kann? Sehe ich das soweit richtig?
Grüße
EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 01. Dez. 2020 18:33 <-- editieren / zitieren --> Unities abgeben: Nur für EIBe 3D
(jetzt werde ich in diese Sache gezogen, wobei ich nicht mehr geschafft hab, als das Beispiel aus der Hilfe zu starten. Hab bisher noch sehr wenig mit Klassen und Events gespielt. Das wieder als Warnung und um meine Aussagen besser einordnen zu können.) Ja, deine Aktionen nach dem Event müssen im jeweiligen Eventhandler gestartet werden. Vorher noch checken, ob der Name der transaction passt. Wird dann ein Aufruf eines anderen sub sein, oder? Das mit dem Modul weiß ich nicht so recht. Das müsste lange genug am laufen bleiben, bis das Event eingetreten ist. So läuft das Makro ja durch und am Ende werden alle Objekte gekillt. Kann man sehen, wenn eine msgbox in die Class_Terminate() gesetzt wird. Das ist der Witz bei der UF, denk ich. Die bleibt so lange aktiv (und damit die eventhandler), bis sie geschlossen wird. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 03. Dez. 2020 08:39 <-- editieren / zitieren --> Unities abgeben:
Hallo KraBBy, ich zieh dich nirgendwo rein, das machst du schon selbst Nach erneuten Versuchen habe ich festgestellt, dass die Klasse weiter aktiv bleibt und wiederholt die Events ausgibt. Warum das bei meinen ersten Tests nicht so war kann ich nicht sagen. Weitere Recherche hat ergeben, dass in VB.net scheinbar Events auch ausserhalb von Klassenmodulen unterstützt werden. Zeit für Tests hatte ich noch nicht. Insgesamt ergibt sich für mich erstmal die ernüchternde Vermutung, möchte ich unterschiedliche Aktionen (z.B. Aufruf einer anderen Sub) bei Eintreten des gleichen Events ausführen, brauche ich dafür jeweils eine eigene Klasse in VBA. Grüße EIBe 3D Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 03. Dez. 2020 12:19 <-- editieren / zitieren --> Unities abgeben: Nur für EIBe 3D
bei VB.net und Addin muss ich leider passen. Das unbedingt verschiedenen Klassen nötig sind, sehe ich nicht so. Du könntest Deine Klasse ja so gestalten, dass sie von außen die nötigen Infos bekommt. z.B. den gesuchten DisplayName der Transaction und die auszuführende Aktion als Property (im einfachsten Fall als Public Variable auf Class-Ebene). z.B. ein Sub in der Klasse (falls auch nicht nur das _OnCommit was zu tun bekommt) Private Sub chose_Action() Select Case public_auszuf_Aktion Case "A" Call Sub_was_auch_immer() Case "B" Call Sub_was_anderes() '... Case Else 'Fehlermeldung oder Warnung End Select End Sub Im Eventhandler nach der Prüfung auf DisplayName, dann nur der Aufruf der chose_Action(). Vielleicht bietet sich ein Enumerator an, um die "auszuführende Aktion" besser in den Griff zubekommen. Könnte im Code besser lesbar/verständlich sein, als mein "A" u. "B" oben. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 04. Dez. 2020 09:00 <-- editieren / zitieren --> Unities abgeben:
Danke für den Tipp. Jetzt wo ich wieder halbwegs klar denken kann hab ich es auch gerafft Sobald ich Zeit habe werd ich mich drum kümmern. Ist gerade nur ein untergeordnetes Problem da es ja funktioniert. Wenn ich das Ganze ändere muss ich es eh in VBA und VB.net tun. Anzumerken wäre noch, dass die Abfrage nach dem Displaynamen der Transaction zu Fehlern führen kann. Nicht alle Transactions haben diesen. Ich glaube nur Tansactions die per undo oder redo behandelt werden können. Habe ich aber noch nicht genau geprüft. Geht man über die Transaction ID ist man jedenfalls auf der sicheren Seite.
Sobald ich das ausgetüftelt habe stell ichs hier rein. Grüße EIBe 3D Edit: Schwachsinn korrigiert [Diese Nachricht wurde von EIBe 3D am 04. Dez. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KraBBy Mitglied Maschinenbau-Ingenieur
Beiträge: 601 Registriert: 19.09.2007 Inventor Professional 2020 WinX
|
erstellt am: 04. Dez. 2020 09:27 <-- editieren / zitieren --> Unities abgeben: Nur für EIBe 3D
Zitat: Original erstellt von EIBe 3D: Anzumerken wäre noch, dass die Abfrage nach dem Displaynamen der Transaction zu Fehlern führen kann. Nicht alle Transactions haben diesen. Ich glaube nur Tansactions die per undo oder redo behandelt werden können. Habe ich aber noch nicht genau geprüft. Geht man über die Transaction ID ist man jedenfalls auf der sicheren Seite.
Das raffe ich jetzt nicht. Was hilft die ID? Das ist doch mehr oder weniger nur ein Zähler, mit dem die Transactions durchnummeriert werden. Selbst gleiche Aktionen bekommen verschiedene IDs. ------------------ Gruß KraBBy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EIBe 3D Mitglied Dipl. - Ing. (FH)
Beiträge: 267 Registriert: 24.01.2020 HP Z4 G4 Workstation Xeon 3,6 32GB Nvidia P2000 WIN10 SW2015 SP5.0 SW2017 ************* Inv2018 akt.SP
|
erstellt am: 04. Dez. 2020 09:58 <-- editieren / zitieren --> Unities abgeben:
|