| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Speichern-Befehl auslösen (7990 mal gelesen)
|
RolandW Mitglied Konstrukteur
Beiträge: 74 Registriert: 01.11.2004
|
erstellt am: 01. Nov. 2004 11:39 <-- editieren / zitieren --> Unities abgeben:
Hallo IV-ler Folgendes Problem: Ich möchte dem Speichern-Befehl noch eine Benutzerfunktion anhängen. Konkreter: Wenn der User auf den Speichenbutton klickt, soll nicht nur gespeichert sondern noch ein VB-Code abgearbeitet werden. Dazu werde ich den Norm-Button durch einen Benutzerspez. Button ersetzen. Nun mein Problem. Kann ich aus VB den Klick auf den Speichern-Button simulieren. Da die .save - Funktion ja nicht identisch mit dem klick auf den Button ist. Danke für eure Hilfe im Voraus Roland W
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PaulSchuepbach Moderator Programmierer
Beiträge: 1005 Registriert: 01.10.2003
|
erstellt am: 01. Nov. 2004 15:44 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo Roland, ich wuerde Dir empfehelen, den Speichern-Button zu belassen. Beim Druecken der Buttons fuer 'Neu' , 'Oeffnen' , 'Speichern' usw. feuert Inventor einen entsprechenden Event - z.B. 'OnSave' ab. Diesen Event kannst Du abfangen und mittels EventTimingEnum 'BeforeOrAfter' eben VOR oder NACH dem Speichern irgendwelche Aktionen ausfuehren. Gruesse,
Paul www.morecam.ch/cad.htm Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RolandW Mitglied Konstrukteur
Beiträge: 74 Registriert: 01.11.2004
|
erstellt am: 02. Nov. 2004 08:24 <-- editieren / zitieren --> Unities abgeben:
Hi Paul. Danke für deine Antwort, hört sich gut an. Nur bin ich ein wenig überfordert. Wäre es möglich, dass Du mir ein kleines Bsp. mit einem EVENT (muss nicht zwingend onsave sein) zukommen lassen könntest. Gruss Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PaulSchuepbach Moderator Programmierer
Beiträge: 1005 Registriert: 01.10.2003
|
erstellt am: 02. Nov. 2004 09:05 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo Roland, Ein paar Verhaltensregeln fuer das Forum: 1. ein Neuer stellt sich erst mal vor (die Anderen interessiert es, wer Du bist und was Du machst) - bist Du ueberhaupt neu oder hast Du nur einen neuen Login ? 2. RTFM 3. 'Suchen'-Funktion benutzen 4. Falls nichts gefunden, Beitrag verfassen 5. Falls die Antwort gut was, Unities vergeben Hier ein VBA-Beispiel (einfach ein neues Part-Doc oeffnen und den code in das Document-Project kopieren, dann Skizze verlassen und Sub catchEvent laufen lassen):
Private WithEvents oAppEvents As ApplicationEvents Public Sub catchEvent() Dim oApp As Inventor.Application Set oApp = ThisApplication Set oAppEvents = oApp.ApplicationEvents Call oApp.ActiveDocument.Save End Sub
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
Gruesse, Paul www.morecam.ch/cad.htm Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RolandW Mitglied Konstrukteur
Beiträge: 74 Registriert: 01.11.2004
|
erstellt am: 02. Nov. 2004 09:40 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von PaulSchuepbach: Hallo Roland,Ein paar Verhaltensregeln fuer das Forum: 1. ein Neuer stellt sich erst mal vor (die Anderen interessiert es, wer Du bist und was Du machst) - bist Du ueberhaupt neu oder hast Du nur einen neuen Login ? 2. RTFM 3. 'Suchen'-Funktion benutzen 4. Falls nichts gefunden, Beitrag verfassen 5. Falls die Antwort gut was, Unities vergeben
Erst mal Danke für das Bsp. Werde es sobald ich Zeit habe unter die Lupe nehmen. Ich bekenne mich auch in allen aufgeführten Punkten schuldig, nur ein paar Anmerkungen hätte ich schon noch:
1) Ich bin neu in diesem Forum. Jedoch habe ich bis zum heutigen Zeitpunkt noch in keinem Forum mein Lebenslauf gepostet :-) Wenn das gewünscht wird mache ich das doch gerne. In den meisten Foren werden jedoch so wenig Themas wie möglich verlangt. 2) Ich habe zwischen deiner Antwort und meiner Frage ca. 1.5 Stunden im Manual gelesen. Nur ist mein API Manual nun mal in Englich, und für einen Neuling in VBA-INV nicht ganz so einfach zu verstehen. 3)Du hast recht, nach "WithEvents" habe ich in diesem Forum nicht gesucht. Das kommt daher das ich sehr lange nach DWF-erstellen gesucht habe (und auch gefunden), und mir mein Hirn nun vorgegeaukelt hat, ich hätte schon nach dem neuen Problem gesucht. Sei mir nicht böse, ich werde mich in Zukunft bessern. 5) Mach ich. Schönen Tach .. Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PaulSchuepbach Moderator Programmierer
Beiträge: 1005 Registriert: 01.10.2003
|
erstellt am: 02. Nov. 2004 10:03 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo Roland, Du brauchst Dich nicht schuldig zu fuehlen - alles was ich Dir damit sagen wollte ist: man weiss gerne mit wem man es zu tun hat. Lebenslauf posten waere uebertrieben. Der Punkt ist einfach der, dass es Leute gibt, die nur nehmen wollen - nicht aber geben. Ein Forum lebt aber nun mal 'geben UND nehmen' - und wenn einer nur nimmt, dann kriegt er eben irgendwann keine Antworten mehr. Dann gibts solche, die sich einen neuen Login zulegen... Also ich gehe davon aus, dass Du nicht so einer bist. Deshalb ein herziche Hallo im WBF. Gruesse,
Paul www.morecam.ch/cad.htm
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RolandW Mitglied Konstrukteur
Beiträge: 74 Registriert: 01.11.2004
|
erstellt am: 02. Nov. 2004 10:55 <-- editieren / zitieren --> Unities abgeben:
Habe gerade in der API -Help was gefunden. AutoOpen This macro is run automatically when the document it is contained within is opened. AutoNew This macro is run automatically when a new document is created from a template. For this macro to be used, it must exist within the template file. AutoSave This macro is run automatically whenever the document it is contained within is saved. AutoClose This macro is run automatically whenever the document it is contained within is closed. AutoEdit This macro is run when parts/sub-assemblies are opened or edited. Damit wird das ganze sehr einfach: Sub AutoSave() MsgBox "Function beim speichern" End Sub Deine Version könnte man noch optimieren wenn man die Function "catchEvent" in "AutoOpen" umbennenen würde. Gruss Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PaulSchuepbach Moderator Programmierer
Beiträge: 1005 Registriert: 01.10.2003
|
erstellt am: 02. Nov. 2004 11:01 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo Roland, grundsaetzlich richtig - stellt sich noch die Frage, ob Du das 'mach irgend was sinnvolles' vor oder nach dem speichern IMMER anwenden willst. Vielleicht umschreibst Du mal etwas genauer, was Du ueberhaupt vor hast - vielleicht hat ja schon mal jemand sowas gemacht. Gruesse,
Paul www.morecam.ch/cad.htm Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RolandW Mitglied Konstrukteur
Beiträge: 74 Registriert: 01.11.2004
|
erstellt am: 02. Nov. 2004 13:34 <-- editieren / zitieren --> Unities abgeben:
Eigentlich ist mein Problem damit schon gelöst. Ich möchte auf einem Netzlaufwerk eine DWF-Datei speichern, und zwar jedesmal wenn die Datei gespeichert wird. Somit kann ich meine INV-Daten lokal speichern und bearbeiten, und den anderen Usern DWF-Dateien im Netz zur Verfügung stellen. Ich werde den ganzen Code dann mal posten wenn ich ihn fertig habe. (der Pfad sollte aus einem Textfile eingelesen werden, etc.) Aber die wichtigsten Punkte sind geklärt (dank Dir). Gruss und einen schönen Tach Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SHP Mitglied Konstrukteur
Beiträge: 1331 Registriert: 17.07.2003 IV9-SP3 IV10-Sp3a IV11
|
erstellt am: 19. Jan. 2006 18:45 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Zitat: Original erstellt von PaulSchuepbach:
Hier ein VBA-Beispiel (einfach ein neues Part-Doc oeffnen und den code in das Document-Project kopieren, dann Skizze verlassen und Sub catchEvent laufen lassen): Private WithEvents oAppEvents As ApplicationEvents Public Sub catchEvent() Dim oApp As Inventor.Application Set oApp = ThisApplication Set oAppEvents = oApp.ApplicationEvents Call oApp.ActiveDocument.Save End Sub
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
Gruesse, Paul www.morecam.ch/cad.htm
Hallo Paul, möchte mir obigen Code zu nutze machen. Ich möchte bei jedem Speichern einer Datei den Inhalt des Property "Part Number" prüfen, und zwar soll immer der Dateiname drinnen stehen. Leider komm ich nicht ganz klar. Den Event muß ich wohl in ein neues Klassemodul schreiben, oder?
------------------ Gruß Hans-Peter Der Wahnsinn in Sachen Musik. Das Saxregister Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SHP Mitglied Konstrukteur
Beiträge: 1331 Registriert: 17.07.2003 IV9-SP3 IV10-Sp3a IV11
|
erstellt am: 24. Jan. 2006 18:11 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
|
PaulSchuepbach Moderator Programmierer
Beiträge: 1005 Registriert: 01.10.2003
|
erstellt am: 24. Jan. 2006 19:19 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo Hans-Peter, das kannst Du in diesem Konstrukt des Codes oben machen: 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 ... oder eben mit einem Auto-Makro.
Grüsse, Paul www.morecam.ch www.thinkcad.de
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SHP Mitglied Konstrukteur
Beiträge: 1331 Registriert: 17.07.2003 IV9-SP3 IV10-Sp3a IV11
|
erstellt am: 28. Jan. 2006 16:19 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo Paul, ich hab mir folgenden Code in ein Klassenmodul geschrieben, das ich OnSave benannt habe. ________________________ Private WithEvents oAppEvents As ApplicationEvents 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 ___________________ Irgendwas versteh ich da nicht so recht.
------------------ Gruß Hans-Peter Der Wahnsinn in Sachen Musik.
Das Saxregister [Diese Nachricht wurde von SHP am 28. Jan. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SHP Mitglied Konstrukteur
Beiträge: 1331 Registriert: 17.07.2003 IV9-SP3 IV10-Sp3a IV11
|
erstellt am: 01. Feb. 2006 21:51 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo nochmal, ich habe den folgenden Code in das Dokumentprojekt eines Parts geschrieben. Nach dem öffnen dieses Parts ist nun der OnSave Event aktiv. Jetzt möchte ich aber die Subs "mach_vorher" und "mach_nachher" in die Default.ivb verlegen, die sowieso geladen wird. Nur wie kann ich die Subs dann aufrufen? Geht das überhaupt? _________________________________________________ Private WithEvents oAppEvents As ApplicationEvents Public Sub Autoopen() Dim oApp As Inventor.Application Set oApp = ThisApplication Set oAppEvents = oApp.ApplicationEvents 'Call oApp.ActiveDocument.Save End Sub Private Sub oAppEvents_OnSaveDocument(ByVal DocumentObject As Document, ByVal BeforeOrAfter As EventTimingEnum, ByVal Context As NameValueMap, HandlingCode As HandlingCodeEnum) If BeforeOrAfter = kBefore Then mach_vorher End If If BeforeOrAfter = kAfter Then mach_nachher End If End Sub
Private Sub mach_vorher() MsgBox "VOR dem Speichern: irgendetwas machen", vbInformation, "AppEvent" End Sub
Private Sub mach_nachher() MsgBox "NACH dem Speichern: irgendetwas anderes machen", vbInformation, "AppEvent" End Sub _____________________________________________
------------------ Gruß Hans-Peter Der Wahnsinn in Sachen Musik. Das Saxregister Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SHP Mitglied Konstrukteur
Beiträge: 1331 Registriert: 17.07.2003 IV9-SP3 IV10-Sp3a IV11
|
erstellt am: 02. Feb. 2006 22:28 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo, jetzt hab ich noch ein Problem. Ich hab in 2 Bauteidateien den Code aus der Datei "OnSaveDocumentEvent.txt" reingeschrieben. Die Datei "OnSaveDocumentEvent_do.ivb" enthält die Anweisungen die beim Speichern ausgeführt werden sollen. Diese Datei muß im Standard-VBA Ordner liegen. Wenn ich nun beide Parts offen habe und den Speichern-Button drücke, werden die Anweisungen 2x ausgeführt. Wie kann ich das unterbinden?
------------------ Gruß Hans-Peter Der Wahnsinn in Sachen Musik. Das Saxregister Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
.Andi Mitglied Konstrukteur
Beiträge: 15 Registriert: 22.07.2008 HP xw 4600 Workstation Intel(R) Core 2 Duo CPU 4GB RAM NVIDIA Quadro FX 370 Treiber 6.14.11.6947 Windows XP, SP3 AutoCAD Inventor 2008 SP2
|
erstellt am: 23. Okt. 2008 10:26 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo Hans-Peter Ich hatte die gleichen Probleme : Wenn ich nun beide Parts offen habe und den Speichern-Button drücke, werden die Anweisungen 2x ausgeführt. Wie kann ich das unterbinden? Konntest du in der Zwischenzeit eine Lösung finden ?? wenn ja, kannst du mir die Lösung dieses Problems auch bitte mitteilen ??? Danke zum Voraus ... ------------------ Gruss Andi .... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rtend12 Mitglied Dipl.-Ing. (FH) Maschinenbau / Konstrukteur
Beiträge: 436 Registriert: 21.07.2004 Catia V5 (R16SP5, B18SP5) VB.Net 2003
|
erstellt am: 23. Okt. 2008 21:07 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo Andi, was wird zweimal ausgeführt? Wenn du das Private Sub oAppEvents_OnSaveDocument im ganzen meinst, dann ist das ok. Um zu steuern ob etwas vor oder nach speichern gemacht werden soll gibt es kBefore unf kAfter. Der Event wird allerdings vor und nach dem Speichern ausgelöst, weil sonst kannst du ja kBefore und kAfter nicht auswerten. Gruß Reinhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
.Andi Mitglied Konstrukteur
Beiträge: 15 Registriert: 22.07.2008 HP xw 4600 Workstation Intel(R) Core 2 Duo CPU 4GB RAM NVIDIA Quadro FX 370 Treiber 6.14.11.6947 Windows XP, SP3 AutoCAD Inventor 2008 SP2
|
erstellt am: 03. Nov. 2008 10:08 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo Reinhard Entschuldige, hab Deine Antwort erst jetzt gesehen! Eigentlich ist das ok. wenn bei allen geöffneten Dokumenten beim Speichern der Event ausgelöst wird. Was sehr schlecht an der ganzen Sache ist : Private Sub oAppEvents ist in jedem Dokument enthalten, also nicht irgendwo zentral gespeichert. Was ist wenn Programmänderungen in den Subs gemacht werden müssen ? Siehst Du da vielleicht eine Möglichkeit ?? Gruss Andi
------------------ Gruss Andi .... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rtend12 Mitglied Dipl.-Ing. (FH) Maschinenbau / Konstrukteur
Beiträge: 436 Registriert: 21.07.2004 Catia V5 (R16SP5, B18SP5) VB.Net 2003
|
erstellt am: 03. Nov. 2008 20:58 <-- editieren / zitieren --> Unities abgeben: Nur für RolandW
Hallo Andi, hab beim Lesen übersehen, dass der Event im Dokumentenprojket steht. Das ist auf jeden Fall zu vermeiden, wie Du ja auch schon festgestellt hast. Es fängt beim Ändern an und hört bei Problemen beim Migrieren auf, weil der Code beim Abspeichern ja ausgeführt wird. Die Lösung ist ein AddIn oder ein Klassenmodul. AddIn kann nicht in VBA realisiert werden ist dafür aber automatisch geladen aktiv und deutlich sicherer in der Ausführung. Klassenmodul kann man in VBA realisieren muß allerdings einmal manuell gestartet werden und wird beim Abbrechen des Debuggers beendet. Gruß Reinhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |