Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Solid Edge
  Ersetzen von selektierten Bauteilen mittels VBA

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:   Ersetzen von selektierten Bauteilen mittels VBA (1212 mal gelesen)
Sandro12
Mitglied
Konstrukteur

Sehen Sie sich das Profil von Sandro12 an!   Senden Sie eine Private Message an Sandro12  Schreiben Sie einen Gästebucheintrag für Sandro12

Beiträge: 3
Registriert: 12.08.2014

erstellt am: 12. Aug. 2014 09:03    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von wolha an!   Senden Sie eine Private Message an wolha  Schreiben Sie einen Gästebucheintrag für wolha

Beiträge: 4829
Registriert: 30.01.2002

Solid Edge 2019 win10
CAMWorks
Primus PDM
FEMAP
Dynamic Designer

erstellt am: 12. Aug. 2014 10:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sandro12 10 Unities + Antwort hilfreich

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

Sehen Sie sich das Profil von Sandro12 an!   Senden Sie eine Private Message an Sandro12  Schreiben Sie einen Gästebucheintrag für Sandro12

Beiträge: 3
Registriert: 12.08.2014

erstellt am: 12. Aug. 2014 10:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von Matthias Leemann an!   Senden Sie eine Private Message an Matthias Leemann  Schreiben Sie einen Gästebucheintrag für Matthias Leemann

Beiträge: 361
Registriert: 03.10.2003

Windows 10 Pro
Solid Edge 2019

erstellt am: 13. Aug. 2014 10:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sandro12 10 Unities + Antwort hilfreich

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

Sehen Sie sich das Profil von Sandro12 an!   Senden Sie eine Private Message an Sandro12  Schreiben Sie einen Gästebucheintrag für Sandro12

Beiträge: 3
Registriert: 12.08.2014

erstellt am: 18. Aug. 2014 07:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von pablo an!   Senden Sie eine Private Message an pablo  Schreiben Sie einen Gästebucheintrag für pablo

Beiträge: 429
Registriert: 23.01.2002

Win7
Office 2010
ST6 64bit

erstellt am: 18. Aug. 2014 08:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Sandro12 10 Unities + Antwort hilfreich

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2019 CAD.de | Impressum | Datenschutz