| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Komponente ersetzen mit VBA (3702 mal gelesen)
|
SEHER Mitglied Systemanalytiker
Beiträge: 1203 Registriert: 13.03.2001 Inventor 2 bis 2022 häufig wechselnder Rechnerverkehr
|
erstellt am: 10. Jul. 2003 17:59 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum, ich möchte mehrere Komponenten in einer iam mit VBA austauschen Habe dieses zwar im Objektkatalog gefunden Sub Replace(FileName As String, ReplaceAll As Boolean) Element von Inventor.ComponentOccurrence Replaces this component occurrence with another component. aber wie handhabe ich es wenn ich Bauteil123.ipt durch Bauteilxyz.ipt ersetzen möchte? Bin für jeden Tipp dankbar Gruß SEHER Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Ehrenmitglied V.I.P. h.c. Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012 64Bi
|
erstellt am: 10. Jul. 2003 19:09 <-- editieren / zitieren --> Unities abgeben: Nur für SEHER
Code:
Private Sub Replace_files() Dim Teile As ComponentOccurrences Dim oAsm As AssemblyDocument On Error Resume Next Set oAsm = ThisApplication.ActiveDocument If Err.Number <> 0 Then MsgBox "Keine Baugruppe :/", vbCritical, "Dein Makro ;-)" End End If Set Teile = oAsm.ComponentDefinition.Occurrences Suche_die_Dateien Teile End Sub Private Sub Suche_die_Dateien(Teile As ComponentOccurrences) Dim oOcc As ComponentOccurrence Dim oPart As PartDocument For Each oOcc In Teile On Error Resume Next Set oPart = oOcc.Definition.Document If oPart.FullFileName = "C:\Temp\Bauteil123.ipt" Then Call oOcc.Replace("C:\Temp\Bauteilxyz.ipt", True) End If Call Suche_die_Dateien(oOcc.SubOccurrences) Next End Sub
Die Methode auf FullFileName zuzugreifen schien mir am Anfang zu langsam, aber die ist sicherer, da es viele Teile gibt die einen anderen Namen im Browser haben als den Pfad-Namen. Daher ist das hier viel sicherer, da es eindeutiger ist. PS: Um es testen zu können brauchst du eine Baugruppe die als Element "C:\Bauteil123.ipt" enthält, und natürlich sollte das Teil "C:\Temp\Bauteilxyz.ipt" auch vorhanden sein. ------------------ Grüße daywa1k3r 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: 11. Jul. 2003 08:53 <-- editieren / zitieren --> Unities abgeben:
|
SEHER Mitglied Systemanalytiker
Beiträge: 1203 Registriert: 13.03.2001 Inventor 2 bis 2022 häufig wechselnder Rechnerverkehr
|
erstellt am: 15. Jul. 2003 12:14 <-- editieren / zitieren --> Unities abgeben:
|
DerBrain87 Mitglied Mathematiker
Beiträge: 86 Registriert: 29.04.2015 Inventor 2014
|
erstellt am: 20. Jul. 2015 16:28 <-- editieren / zitieren --> Unities abgeben: Nur für SEHER
Hallo, erstmal vielen Dank für 95% der Lösung meines Problems:-) Dieses replace und wie man es verwendet löst schon einen großen Teils meines Problems. Ich hätte nun gern nicht Bauteil123.ipt ersetzt sondern eines, welches ich vorher mit der Pick-Funktion auswähle. Hierfür habe ich bereits: ThisApplication.CommandManager.Pick(kAssemblyOccurrenceFilter,"Komponente auswählen.") Leider scheint der gewählte Filter noch nicht 100% dies zu machen was ich möchte. Ich hätte gern den Auswahlfilter, welcher auch aktiv ist, wenn ich die Inventor-Funktion "Komponente Speichern und Ersetzen" verwende. Welchen Filter muss ich hierfür auswählen? Vielen Dank im Vorraus. Gruß DerBrain87 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 774 Registriert: 06.09.2012 Inventor 2021 WIN 10 (64bit), Dell Precision T1650, 16GB (Pro.File 8.7)
|
erstellt am: 21. Jul. 2015 08:15 <-- editieren / zitieren --> Unities abgeben: Nur für SEHER
Hi, der Filter sollte eigentlich schon passen. Anbei eine Funktion, dich ich für einen ähnlichen Fall nutze.... (Die Funktion PickPartCheck prüft dabei noch einige Sachen...) Grüße MB-Ing. ----------------------------------- ' Funktion wählt Bauteil aus und prüft ob es für die Platzierung geeignet ist Private Function PickPart(oAssyDoc As AssemblyDocument) As ComponentOccurrence On Error Resume Next Dim oOcc As ComponentOccurrence Dim iCheck As Integer 'Komponente auswählen durch Benutzer Set oOcc = ThisApplication.CommandManager.Pick(kAssemblyOccurrenceFilter, "Einfügeteil auswählen") If oOcc Is Nothing Then Set PickPart = Nothing Exit Function End If 'Eignung der Komponente prüfen iCheck = PickPartCheck(oOcc) Select Case iCheck Case vbRetry Set oOcc = PickPart(oAssyDoc) Case vbCancel Set PickPart = Nothing Exit Function End Select 'Zuweisung Komponente an die Funktion Set PickPart = oOcc End Function ------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DerBrain87 Mitglied Mathematiker
Beiträge: 86 Registriert: 29.04.2015 Inventor 2014
|
erstellt am: 21. Jul. 2015 13:09 <-- editieren / zitieren --> Unities abgeben: Nur für SEHER
Meine Hoffnung war, dass ich auf den kAssemblyOccurrenceFilter noch einen anderen Filter addieren kann/muss. Mein Problem ist nämlich, dass wenn ich die Inventor-Funktion verwende, Bauteile (ohne Ausnahme) direkt in der Baugruppe auswählen kann, über meine Pick jedoch nicht. Nutze ich meine Pick, kann ich zwar alle Bauteile über den Browser auswählen in der Baugruppe werden aber nur Baugruppen und direkt in der 'Main-Baugruppe' verbaute Bauteile gehighlightet nicht jedoch Baueile einer verbauten Baugruppe. Hoffe meine Schilderung war halbwegs verständlich:-) gruß derBrain87 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 774 Registriert: 06.09.2012 Inventor 2021 WIN 10 (64bit), Dell Precision T1650, 16GB (Pro.File 8.7)
|
erstellt am: 21. Jul. 2015 14:53 <-- editieren / zitieren --> Unities abgeben: Nur für SEHER
Hi, ich verstehe jetzt schon, was Du meinst... Denke ich Also willst Du auch ein Bauteil einer Unterbaugruppe auswählen können? Die Funktion PickPartCheck (siehe Code oben) könntest Du entsprechend modifizieren, so dass diese eine Unterbaugruppe erkennt.... Notfalls den Inventor-Befehl mit dem Command-Manager aufrufen? (Ausgabe der Befehle siehe unten) Grüße MB-Ing. -------------------------------------- 'Ausgabe aller Befehle des CommandManagers Private Sub AusgabeKommandos() ' Command Manager Objekt öffnen Dim oCommandMgr As CommandManager Set oCommandMgr = ThisApplication.CommandManager ' Auslesen der Befehle Dim oControlDefs As ControlDefinitions Set oControlDefs = oCommandMgr.ControlDefinitions ' Datei öffnen und ausgeben in C:\temp Dim oControlDef As ControlDefinition Open "C:\temp\CommandNames.txt" For Output As #1 Print #1, Tab(10); "Command Name"; Tab(75); _ "Description"; vbNewLine ' Iterationen For Each oControlDef In oControlDefs Print #1, oControlDef.InternalName; Tab(55); _ oControlDef.DescriptionText Next ' Schließen der Datei Close #1 End Sub ------------------ Wissen ist Macht. Nichts wissen macht auch nichts Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DerBrain87 Mitglied Mathematiker
Beiträge: 86 Registriert: 29.04.2015 Inventor 2014
|
erstellt am: 23. Jul. 2015 08:53 <-- editieren / zitieren --> Unities abgeben: Nur für SEHER
ich kam leider mit deinem letzten Post nicht ganz zurecht. Daher versuche ich es einfach mal anders: wie müsste der Filter von CommandManger.Pick heißen, damit ich nur Bauteile auswählen kann? Meine Idee: wenn ich die Pick wie folgt aufrufe bekomme ich genau das was ich möchte:-) oCM.Pick(kAssemblyOccurrenceFilter + kIrgendEinFilterDerNurBauteileAlsEingabeErlaubt,text) Mein Problem dabei: Inventor kennt die Konstante kIrgendEinFilterDerNurBauteileAlsEingabeErlaubt natürlich nicht^^ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mb-ing Mitglied F&E-Mangement, MB-Ing. (u)
Beiträge: 774 Registriert: 06.09.2012 Inventor 2021 WIN 10 (64bit), Dell Precision T1650, 16GB (Pro.File 8.7)
|
erstellt am: 23. Jul. 2015 09:14 <-- editieren / zitieren --> Unities abgeben: Nur für SEHER
Hi, notfalls implementiere einfach eine IF-Schleife, ob das gewählte Teil ein Bauteil ist. Ich versteh schon irgendwie, was Du willst. Aber wieso sollte man ein Bauteil einer Unterbaugruppe auswählen können? Ergibt für mich gerade keinen Sinn... Wenn Du das realisieren willst, musst du zig Sachen in Deinem Makro prüfen!!! (Habe ich die Rechte auf die Baugruppe und das ausgewählte Bauteil, Ist das Dokument im Speicher aktuell oder veraltet, Teileverwendung, Ersetze ich ein BT einer Unter-BG muss ich überprüfen, ob die Unter-BG veraltete Komponenten enthält, diese dann aktualisieren und austauschen, fehlerhafte Abhängigkeiten, und noch vieles mehr...) Oder verstehe ich Dich einfach verkehrt? ^^ Du hast von einer "Inventor-Funktion "Komponente Speichern und Ersetzen"" geschrieben, die das gewünschte kann. Kannst Du die auch über VBA ansprechen? Grüße MB-Ing ------------------ Wissen ist Macht. Nichts wissen macht auch nichts [Diese Nachricht wurde von mb-ing am 23. Jul. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DerBrain87 Mitglied Mathematiker
Beiträge: 86 Registriert: 29.04.2015 Inventor 2014
|
erstellt am: 23. Jul. 2015 09:19 <-- editieren / zitieren --> Unities abgeben: Nur für SEHER
ne, hast du schon richtig verstanden:-) Nur habe ich evtl. was falsch verstanden. Habe leider nicht zu viel Ahnung vom technischen Zeichnen, bin nur der Mathematiker der alles programmieren darf^^ Ich werde sobald mein Auftragssteller vom Urlaub zurück ist mal nachhacken was er gerne auswählen können will. Mein aktuelles vorgehen wäre ähnlich dem deinem gewesen: Ohne großen Filter auswählen und solange wiederholen bis nothing oder ein gewünschter Dateityp zurück kommt. gruß DerBrain87 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dilpschi Mitglied Ing. Verfahrenstechnik
Beiträge: 18 Registriert: 29.04.2013
|
erstellt am: 03. Nov. 2016 11:46 <-- editieren / zitieren --> Unities abgeben: Nur für SEHER
Hallo liebe Gemeinde, konnte aus diesem älteren thread und anderen schon einiges ableiten, komme aber irgendwie mit meinem Ansinnen nicht weiter Situation: Wir möchten, um Projekte schlanker zu machen, alle Unterbaugruppen als SAT speichern und diese Unterbaugruppen dann mit den erzeugten SAT Dateien ersetzen (SAT --> umgewandelte IPT's). Das mit dem Abspeichern klappt schon ganz gut, nur beim Ersetzen erzeugt er mir wieder eine Baugruppe aus der SAT, kein Bauteil IPT. Wenn ich im Inventor direkt per Hand die SAT importiere, wird es in eine einzelne IPT umgewandelt. Was mache ich falsch? Ich weiss nicht recht auf welches Object ich zugreifen muss. Anbei mal der Code Sub sat_ex_import() Dim strFile As String Dim strInputFolder As String Dim strOutputFolder As String Dim strOutputFile As String Dim oDoc As Inventor.Document Dim oDocPart As AssemblyDocument Dim oDataIO As DataIO Set oDoc = ThisApplication.ActiveDocument Set fs = CreateObject("Scripting.FileSystemObject") If oDoc.ReferencedFiles.Count > 0 Then strFile = oDoc.ReferencedFiles(1).FullDocumentName strInputFolder = Left(strFile, InStrRev(strFile, "\")) strOutputFolder = strInputFolder & "SAT\" If Not fs.FolderExists(strOutputFolder) Then MkDir strOutputFolder For i = 1 To oDoc.ReferencedFiles.Count If oDoc.ReferencedFiles(i).DocumentType = kAssemblyDocumentObject Then Set oDocPart = oDoc.ReferencedFiles(i) 'Abspeichern als SAT im Unterordner \SAT Set oDataIO = oDocPart.ComponentDefinition.DataIO strFile = oDoc.ReferencedFiles(i).FullDocumentName strFile = Right(strFile, Len(strFile) - InStrRev(strFile, "\")) strOutputFile = Left(strFile, InStrRev(strFile, ".") - 1) & ".SAT" oDataIO.WriteDataToFile "ACIS SAT", strOutputFolder & strOutputFile 'Ersetzen der Unter-IAM durch die SAT Set oDocPartOcc = oDoc.ComponentDefinition.Occurrences(i) Call oDocPartOcc.Replace(strOutputFolder & strOutputFile, True) 'Speichern der SAT-IPT End If Next End If End Sub Vielleicht geht das Ganze (die Vereinfachung zum "leichteren" Projekt) generell auch viel einfacher zu bewerkstelligen.....
------------------ Einfach mal rechts fahren....
[Diese Nachricht wurde von Dilpschi am 04. Nov. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bwr Mitglied Konstrukteur
Beiträge: 139 Registriert: 21.02.2007 Win10 64-bit NVIDIA T500 Inventor 2022 Catia V5-6R2020
|
erstellt am: 07. Nov. 2016 08:33 <-- editieren / zitieren --> Unities abgeben: Nur für SEHER
|