| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SolidEdge | | | | What's new in Solid Edge 2025, ein Webinar am 23.01.2025
|
Autor
|
Thema: Ersetzen von selektierten Bauteilen mittels VBA (1749 mal gelesen)
|
Sandro12 Mitglied Konstrukteur
Beiträge: 3 Registriert: 12.08.2014
|
erstellt am: 12. Aug. 2014 09:03 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Ich sitze nun mittlerweile doch schon eine Weile an diesem Problem. Ich bin neu in der (VBA-)Programmierung, ignoriert also die evt. etwas unschöne Programmstruktur/Namensgebung ;-) Zur Aufgabe... Ich möchte ein Makro programmieren, welches selektierte Bauteile in einem ASM mit einer neuen, höheren Version ersetzt. Nun funktioniert das generell auch gar nicht so schlecht. Mein Problem aber ist, dass sich Bauteile in einem Subassembly nur ersetzen lassen, wenn sie nicht mehr als einmal vorkommen. Beispiel: geöffnete Baugruppe ASM1 mit Bauteilen part1, part2, par2, asm2. Im asm2 sind zb wieder 3 bauteile par 3, par 4, par4. Nun kann vom geöffneten ASM1 aus alles ausser par 4 ersetzt werden, weil es eben 2 mal in ASM2 vorkommt. par2 aber z.B. in der obersten Ebene ist kein Problem. Ich sehe nicht, wo der Unterschied zwischen par3 und par4 sein soll, beide sind in der gleichen Unterbaugruppe und müssten gleich abgearbeitet werden. Zum Code: stark zusammengekürzt auf das notwendigste, hoffe ich habe alles erwischt...
Code:
Private Sub BtnIncrementerAssembly_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnIncrementerAssembly.Click Dim seApp As SolidEdgeFramework.Application = GetObject(, "SolidEdge.Application") Dim activeStart As SolidEdgeFramework.SolidEdgeDocument = seApp.ActiveDocument Dim strStart As String = activeStart.FullName Dim selSet As SolidEdgeFramework.SelectSet = seApp.ActiveSelectSet 'max ein Bauteil selektiert If selSet.Count > 1 Then MsgBox("Mehr als ein Bauteil ausgewählt!") Exit Sub ElseIf selSet.Count < 1 Then MsgBox("Kein Bauteil ausgewählt!") Exit Sub End If Dim actItem As Object = selSet.Item(1) Dim oOcc As SolidEdgeAssembly.Occurrence Dim selFilePath As String Dim typeTest As Boolean = True Dim selItemType As Integer = actItem.GetType.InvokeMember("Type", Reflection.BindingFlags.GetProperty, Nothing, actItem, Nothing) If selItemType = SolidEdgeConstants.ObjectType.igReference Then oOcc = actItem.Object selFilePath = oOcc.OccurrenceFileName typeTest = True Else selFilePath = actItem.OccurrenceFileName typeTest = False End If Dim selLength = Len(selFilePath) Dim Version As Boolean = False Dim strVal As String = "" If selFilePath(selLength - 8) = "_" And selFilePath(selLength - 7) = "V" Then Version = True End If If selFilePath.ToLower.Contains(".par") Then If Version = True Then Dim strFilePath2 As String = selFilePath.Substring(0, selLength - 6) + strVal + ".par" If Dir(strFilePath2) <> "" Then Dim a = MsgBox("Es gibt bereits eine Datei mit der Version " + strVal + "! Datei ersetzen?", vbYesNo) If a = vbNo Then Else If typeTest = True Then oOcc = actItem.Object Call oOcc.Replace(strFilePath2, False) Else Call actItem.Replace(strFilePath2, False) End If End If Exit Sub End If FileCopy(selFilePath, strFilePath2) If typeTest = True Then oOcc = actItem.Object Call oOcc.Replace(strFilePath2, False) Else Call actItem.Replace(strFilePath2, False) End If Else
In den Zeilen mit den Smileys taucht der Fehler auf (falls part mehrfach vorhanden). COMException wurde nicht behandelt. Die Methode oder der Vorgang sind nicht implementiert. Falls noch irgendetwas benötigt/genauer erläutert werden soll helfe ich gerne weiter. Vielen Dank schonmal... Sandro Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
wolha Moderator CAD - Consultant
Beiträge: 5689 Registriert: 30.01.2002 Win 11 Pro Solid Edge 2023 CAMWorks Primus PDM FEMAP Dynamic Designer Teamcenter
|
erstellt am: 12. Aug. 2014 10:02 <-- editieren / zitieren --> Unities abgeben: Nur für Sandro12
Hi Sandro, ich habe jetzt kein VB zur Hand, kann mich aber errinnern, dass es beim Ersetzen einen Handler gibt, ob Du nur ein gewähltes oder alle Vorkommnisse ersetzen willst. Kann es sein, dass dies das False in Deinem Call ist. Und ein True hier de Antwort wäre. ------------------ mfg Wolfgang Hackl CAD/CAM - Consult http://www.cadcam-consult.com Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sandro12 Mitglied Konstrukteur
Beiträge: 3 Registriert: 12.08.2014
|
erstellt am: 12. Aug. 2014 10:24 <-- editieren / zitieren --> Unities abgeben:
Hi Wolfgang Ich möchte nur das selektierte Bauteil ersetzen und nicht beide, trotzdem kommt aber die Fehlermeldung. Es ist richtig, dass es bei True alle ersetzen müsste, funktioniert in dem Fall aber auch nicht -> der selbe Fehler. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matthias Leemann Mitglied Masch. Ing HTL
Beiträge: 394 Registriert: 03.10.2003 Windows 11 Pro Solid Edge 2022
|
erstellt am: 13. Aug. 2014 10:47 <-- editieren / zitieren --> Unities abgeben: Nur für Sandro12
Hoi Sandro beim durchlesen von deinem Code ist mir aufgefallen, dass du ein Exit Sub drin hast. Du solltest vorher die Variablen sauber freigeben/zurücksetzen. Und noch eine andere Frage: Warum kopierst du (FileCopy) erst nach dem ersetzen? Ich mache das jeweils vor dem ersetzen. Gruss Matthias ------------------ SE ST4 SePropManager.NET und SeDimPro2 von www.leemann-software.net Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Sandro12 Mitglied Konstrukteur
Beiträge: 3 Registriert: 12.08.2014
|
erstellt am: 18. Aug. 2014 07:43 <-- editieren / zitieren --> Unities abgeben:
Hi Matthias Vielen Dank für den Tipp. Was das FileCopy / Replace angeht...ich nehme an, du hast das eine Exit Sub übersehen? Im ersten Fall existiert bereits eine Datei mit dieser Versionsnummer -> nur Replace und Exit Sub. Falls keine Datei mit dieser Version besteht -> FileCopy, Replace. Das Programm kann vom ersten Replace unter keinen Umständen ins FileCopy wechseln. Von daher sollte die Reihenfolge eigentlich stimmen. Ausser du hast etwas anderes gemeint... Ich habe das Problem nun "gelöst", indem ich kein Ersetzen unterhalb der ersten Ebene erlaube. Unschön und vor allem nur ein umgehen des Problems. Bin also über jede weitere Idee froh ;-) Gruss Sandro Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pablo Mitglied Techniker
Beiträge: 453 Registriert: 23.01.2002 Win10 Office 365 SE 2019
|
erstellt am: 18. Aug. 2014 08:32 <-- editieren / zitieren --> Unities abgeben: Nur für Sandro12
Sandro12, If selItemType = SolidEdgeConstants.ObjectType.igReference Then oOcc = actItem.Object Hier liegt das Problem, oOcc ist zwar ein Occurrence-Objekt, dir fehlt aber das übergeordnete Dokument. Parentobject = actItem.ImmediateParent.object.OccurrenceDocument bzw. Parentobject = actItem.ImmediateParent.OccurrenceDocument (igReference überprüfen) gibt dir das übergeordnete Assembly-Dokument, mit oOcc = Parentobject.Occurrences.Item(actItem.object.Name) erhältst du ein geeignetes Occurrence-Objekt. Eventuell ist noch ein MakeWriteable für ImmediateParent erforderlich. pablo [Diese Nachricht wurde von pablo am 18. Aug. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|