| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: OnSave Event (4990 mal gelesen)
|
TobiM4 Mitglied
Beiträge: 86 Registriert: 22.03.2005
|
erstellt am: 20. Okt. 2005 12:59 <-- editieren / zitieren --> Unities abgeben:
Hi VBA Spezies Ich habe zum erstemal für Inventor ein Makro geschrieben. hat auch soweit ganz gut geklappt, mit ein wenig Nachlesen hier im Forum. Jetzt möchte ich das Makro immer beim Speichern des bauteils aufrufen. Mit dem OnSave Event komme ich aber nicht ganz klar. Ich habe folgendes probiert: OnSaveDocument(DocumentObject As Document,BeforeOrAfter As EventTimingEnum,Context As NameValueMap, HandlingCode As HandlingCodeEnum) If BeforeorAfter = kBefore then call Makro end if Das funktioniert aber irgendwie nicht. Vielleicht kann mir ja jemand den Code umstricken und posten. Aus den Andren fragen zum ähnlichen Thema werde ich leider nicht schlau. Kommt wohl daher, dass ich bis jetzt nur in Excel programmiert habe Schöne Grüsse TobiM4 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Emick Mitglied Programmierer
Beiträge: 22 Registriert: 18.09.2005 Inventor VBA
|
erstellt am: 20. Okt. 2005 13:18 <-- editieren / zitieren --> Unities abgeben: Nur für TobiM4
Hi TobiM4 Ich glaube du suchst sowas. Private Sub oAppEvents_OnSaveDocument(ByVal DocumentObject As Document, ByVal BeforeOrAfter As EventTimingEnum, ByVal Context As NameValueMap, HandlingCode As HandlingCodeEnum) If BeforeOrAfter = kBefore Then MsgBox "VOR dem Speichern: irgendetwas machen", vbInformation, "AppEvent" End If If BeforeOrAfter = kAfter Then MsgBox "NACH dem Speichern: irgendetwas anderes machen", vbInformation, "AppEvent" End If End Sub
Gruss Emick
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TobiM4 Mitglied
Beiträge: 86 Registriert: 22.03.2005
|
erstellt am: 20. Okt. 2005 13:35 <-- editieren / zitieren --> Unities abgeben:
Hi Emick Ja so etwas suche ich wohl. Aber fuktionieren tut das leider nicht. Ich habe ja so den Verdacht, dass mein Inventor diese AppEvents noch gar nicht kennt. Vielleicht muß man die ja zusätzlich laden oder erstmal global setzen. Habe aber auch leider keine Ahnung, wo und wie ich das machen soll. aber schon mal vielen Dank Gru0 TobiM4 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PaulSchuepbach Moderator Programmierer
Beiträge: 1005 Registriert: 01.10.2003
|
erstellt am: 20. Okt. 2005 13:41 <-- editieren / zitieren --> Unities abgeben: Nur für TobiM4
|
TobiM4 Mitglied
Beiträge: 86 Registriert: 22.03.2005 Ing++ 2009
|
erstellt am: 20. Okt. 2005 13:57 <-- editieren / zitieren --> Unities abgeben:
|
Emick Mitglied Programmierer
Beiträge: 22 Registriert: 18.09.2005 Inventor VBA
|
erstellt am: 20. Okt. 2005 14:00 <-- editieren / zitieren --> Unities abgeben: Nur für TobiM4
|
TobiM4 Mitglied
Beiträge: 86 Registriert: 22.03.2005
|
erstellt am: 21. Okt. 2005 08:05 <-- editieren / zitieren --> Unities abgeben:
Hi Emick Da Habe ich mich wohl zu früh gefreut :-((( Mein Makro funktioniert leider nur im Bauteil. Wenn ich jetzt meine Baugruppe aufrufe und speichern will, dann gibt es eine Fehlermeldung. Und zwar liegt das daran, dass ich im Makro eine Variable in der Baugruppe wie folgt setze Dim oDoc As Inventor.PartDocument Set oDoc = ThisApplication.ActiveDocument Jetzt ist ja aber in meiner Baugruppe, wenn ich speicher das aktive Document leider nicht mein Bauteil sondern natürlich meine Baugruppe. Wie kann kann ich dann jetzt meine Variable deklarieren ??? Ich müsste ja immer genau "oDoc" auf genau das Document setzen, was gerade gespeichert werden soll. Aber wie ich das auslesen soll weiß ich überhaupt nicht. Vieleicht weiß ja jemand Rat. Gruß TobiM4 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Frank_Schalla Ehrenmitglied CAD_SYSTEMBETREUER
Beiträge: 1731 Registriert: 06.04.2002 DELL M6800 Cad Admin Methodikentwickler 3D
|
erstellt am: 23. Okt. 2005 09:53 <-- editieren / zitieren --> Unities abgeben: Nur für TobiM4
Also wie sagts mann nun ohne falsch verstanden zu werden ??? Also mit dem Schreiben von Software ist es ein wenig wie mit dem Technischen Zeichnen. Entweder eine solide Ausbildung oder die bereitschaft den Hoischen zu lesen. Will heissen: Du must eine vernünftige Grundlage an Wissen schaffen und diese ist in der Inventor API Hilfe enthalten. Bei mir ist meistens so das 20 Prozent Innovation und 80% Handwerkszeug ein Projekt bestimmen. Ok nun zu deinem Problem. Du solltest vorher den Dokuemnt Typ feststellen und dann gezielt darauf reagieren. ******************************************************* Option Explicit Public Sub react_on_doctype() Dim oDoc As Inventor.Document Set oDoc = ThisApplication.ActiveDocument On Error GoTo Err Select Case oDoc.DocumentType Case Is = kAssemblyDocumentObject Debug.Print " mach was für IAM" Case Is = kPartDocumentObject Debug.Print " mach was für IPT" Case Is = kDrawingDocumentObject Debug.Print " mach was für IDW" Case Is = kPresentationDocumentObject Debug.Print " mach was für IPN" End Select Set oDoc = Nothing On Error GoTo 0 Exit Sub Err: Set oDoc = Nothing MsgBox "Kein Dokument geladen " On Error GoTo 0 End Sub ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TobiM4 Mitglied
Beiträge: 86 Registriert: 22.03.2005
|
erstellt am: 24. Okt. 2005 08:49 <-- editieren / zitieren --> Unities abgeben:
Hi Frank Hm da hast du wohl nicht ganz unrecht, dass das mit meinem Wissen in VBA-Inventor wohl nicht so weit her ist. Dafür gibt es ja aber dieses super Forum. Nun zu deiner Antwort. Wie ich den Documententyp auslese hätte ich wohl noch gerade hin bekommen, aber leider hilft es mir nicht wirklich weiter. Ich könnte das jetzt zwar einbauen und ich wäre die Fehlermeldung los, aber mein Problem ist nicht gelöst. Ich werde noch mal beschreiben, was ich nach meiner Anfängermeinung nach eigentlich bräuchte. Immer wenn das OnSave Event in meinem Bauteil eintritt (egal ob manuell oder indirekt über das Speichern der Baugruppe) möchte ich meine oDoc Variable genau auf das Document setzen, was gerade gespeichert wird. Ich habe es ja bis jetzt mit oDoc = aktiveDocument gemacht aber das funktioniert ja leider nicht mehr, da das ja beim Speichern aus der Baugruppe heraus die Baugruppendatei ist. Vielleicht kann ja noch mal jemand helfen. Gruß TobiM4 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SEHER Mitglied Systemanalytiker
Beiträge: 1203 Registriert: 13.03.2001 Inventor 2 bis 2022 häufig wechselnder Rechnerverkehr
|
erstellt am: 24. Okt. 2005 11:34 <-- editieren / zitieren --> Unities abgeben: Nur für TobiM4
|
TobiM4 Mitglied
Beiträge: 86 Registriert: 22.03.2005
|
erstellt am: 24. Okt. 2005 11:57 <-- editieren / zitieren --> Unities abgeben:
Ich glaube ja so langsam, dass meine Kenntnisse nicht einmal ausreichen, um mein Problem zu schildern. Also hier noch einmal mein letzter Versuch. Ich habe ein Makro in einem Bauteil geschrieben, dass immer ausgeführt wird, wenn ich dieses Bauteil speichere. So weit so gut. Jetzt habe ich dieses Bauteil in einer Baugruppe verbaut. Dann gibt es eine Fehlermeldung beim Speichern dieser Baugruppe. Das liegt daran, dass ich blöderweise in meinem Makro eine Variable mit "oDoc = ThisApplication.ActiveDocument" fülle. Da aber beim Speichern der Baugruppe das aktive Document die Baugruppe ist, kann mein Makro im Bauteil damit nichts mehr anfangen, weil da eigentlich der Verweis auf das Bauteil drin stehen müsste, weil ich ja Eigenschaften des Bauteils bearbeiten möchte. Ich müsste also einen Weg finden, dass mir das Ereignis "OnSave" den Bezug zu dem Document zurückgibt, das das Ereignis ausgelöst hat. TobiM4 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SEHER Mitglied Systemanalytiker
Beiträge: 1203 Registriert: 13.03.2001 Inventor 2 bis 2022 häufig wechselnder Rechnerverkehr
|
erstellt am: 24. Okt. 2005 12:02 <-- editieren / zitieren --> Unities abgeben: Nur für TobiM4
|
TobiM4 Mitglied
Beiträge: 86 Registriert: 22.03.2005
|
erstellt am: 24. Okt. 2005 13:37 <-- editieren / zitieren --> Unities abgeben:
Hi SEHER Vielleicht stelle ich mich ja ein wenig an, aber ich benötige wohl noch mehr deine Hilfe. Aber die Eigenschaft "ActiveEditDocument" kennt mein Inventor leider nicht. Oder muß ich da vorher noch wieder etwas aktivieren so wie bei den Event Ereignissen. ??? Ich habe jetzt mal meine Makro's angehängt. Vielleicht kann da ja mal einer dran rum basteln. Es ist zwar nicht alles, sondern nur der Teil, der nicht funktioniert. Das erste Makro ruft noch weitere Makro's auf da funktioniert alles. Gruß TobiM4 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SEHER Mitglied Systemanalytiker
Beiträge: 1203 Registriert: 13.03.2001 Inventor 2 bis 2022 häufig wechselnder Rechnerverkehr
|
erstellt am: 24. Okt. 2005 22:19 <-- editieren / zitieren --> Unities abgeben: Nur für TobiM4
Hallo, erstmal sorry ich meinte activeEditObject. Aber mit der Source hast Du mich jetzt noch mehr verwirrt. In welchem Dokument hast Du diese vba-Geschichte? Nur in einem oder in allen bei denen was gelöscht werden soll? Dies mit dem auto-save funktioniert in vba glaub ich nur in dem Dokument wo das Makro drin ist. Seher Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TobiM4 Mitglied
Beiträge: 86 Registriert: 22.03.2005
|
erstellt am: 25. Okt. 2005 08:50 <-- editieren / zitieren --> Unities abgeben:
Hi SEHER Also das Makro ist schon in jedem Bauteil gespeichert. Aber leider komme ich mit "ActiveEditObject" nicht weiter, da es das editierende Objekt bezeichnet (die Baugruppe) ich muß aber das Objekt ansprechen, was editiert wird, sprich das Bauteil. TobiM4 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 25. Okt. 2005 09:31 <-- editieren / zitieren --> Unities abgeben: Nur für TobiM4
Hallo TobiM4, du bekommst sehr bald viele Probleme mit deinen Makros. Dein Vorgehen ist völlig falsch. Du sollst ein Programm schreiben, das dir die kompletten Baugruppen bearbeitet, und so weit ich richtig verstanden habe, geht es dir nur um das Löschen von Properties, und das ist sogar auf der Basis von ApprenticeServer möglich. Das heißt, du musst nicht einmal die Baugruppe / Inventor offen haben um die Daten zu bearbeiten, und es geht alles in Sekundenschnelle. Es ist nicht immer gut alles alleine machen zu wollen, vor allem wenn die Kenntnisse sehr mager sind. Nichts für ungut...
------------------ Grüße daywa1k3r FX64 Software Solutions Mold&More Software Solutions Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TobiM4 Mitglied
Beiträge: 86 Registriert: 22.03.2005
|
erstellt am: 25. Okt. 2005 09:40 <-- editieren / zitieren --> Unities abgeben:
Hi daywa1k3r Also gegen deine Kritik habe ich gar nichts, zumal sie wohl noch völlig zutrifft. Kannst du mir denn vielleicht mal einen Code posten, aus dem ich erkennen kann, wie ich in der Baugruppe auf die einzelnen Poperties der Bauteile zugreifen kann, damit ich nicht alles allein machen muß. ;-) Gruß TobiM4 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 25. Okt. 2005 10:23 <-- editieren / zitieren --> Unities abgeben: Nur für TobiM4
Da du wahrscheinlich kein VisualStudio hast, vergessen wir das mit Apprentice. Hier eine VBA Lösung. Löscht alle Benutzer Properties aus der Baugruppe. Code:
Sub TobiM4() If ThisApplication.Documents.Count = 0 Then MsgBox "Kein Dokument geöffnet.", vbCritical, "Dokumente :-/" Exit Sub End If If ThisApplication.ActiveDocumentType <> kAssemblyDocumentObject Then MsgBox "Das Dokument ist keine Baugruppe. Das Programm wird beendet.", vbCritical, "Dokumentyp :-/" Exit Sub End If Dim oAsm As AssemblyDocument Set oAsm = ThisApplication.ActiveDocument Check_All_Occs oAsm.ComponentDefinition.Occurrences End SubSub Check_All_Occs(oOccs As ComponentOccurrences) Dim oOcc As ComponentOccurrence Dim oProperty As Inventor.Property For Each oOcc In oOccs ThisApplication.StatusBarText = oOcc.Name For Each oProperty In oOcc.Definition.Document.PropertySets("{D5CDD505-2E9C-101B-9397-08002B2CF9AE}") oProperty.Delete Next Call Check_All_Occs(oOcc.SubOccurrences) Next End Sub
------------------ Grüße daywa1k3r FX64 Software Solutions Mold&More Software Solutions Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TobiM4 Mitglied
Beiträge: 86 Registriert: 22.03.2005
|
erstellt am: 25. Okt. 2005 11:42 <-- editieren / zitieren --> Unities abgeben:
Hi daywa1k3r Vielen Dank für den Code. habe mein Makro auch mittlerweile zum laufen gebracht. Mein Code, wo ich die Eigenschaft lösche war nur ein Teil meines Makros. Eigentlich wollte ich noch etwas mehr machen. Ich hatte nur diesen Teil gepostet, damit man mich versteht. Konnte also dein code nicht direkt verwenden, aber mir die etscheidenden Teile abgucken und umstricken, so dass es jetzt läuft und meine Fragerei ein Ende hat. Vielen Dank noch mal auch alle anderen TobiM4 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TobiM4 Mitglied
Beiträge: 86 Registriert: 22.03.2005 Ing++ 2009
|
erstellt am: 25. Okt. 2005 15:19 <-- editieren / zitieren --> Unities abgeben:
|