Imports System
Imports Microsoft
Imports SolidWorks.Interop
Imports SolidWorks
Module SWX

    'Subs und Functions zum Verbinden mit SolidWorks
    Public swApp As sldworks.SldWorks
    Public swDrw As sldworks.DrawingDoc
    Public swView As sldworks.View
    Public swPart As sldworks.ModelDoc2
    Public swModel As SldWorks.ModelDoc2
    Public swModelExt As SldWorks.ModelDocExtension

    Public swViewname As String = ""
    Public swPartname As String = ""
    Public swDrwname As String = ""

    Function ConnectToSW( _
             ByRef oSwApp As SldWorks.SldWorks) As Boolean

        'Return True
        Try
            'Messagebox Rückgabe
            Dim lDialogStatus As Windows.Forms.DialogResult
            Try
                'SolidWorks Objekt belegen
                oSwApp = CType(GetObject(, _
                        "SldWorks.Application"),  _
                        SldWorks.SldWorks)
            Catch ex As Exception
                'Fehler beim Belegen des SolidWorks Objekts
                'Evtl. ist SolidWorks nicht geöffnet
            End Try
            'Wenn das SolidWorks Objekt nicht belegt ist...
            If oSwApp Is Nothing Then
                '... in einer MessageBox nachfragen

                lDialogStatus = MessageBox.Show(My.Resources.msgNoSWXFound, _
                   Mainform.FormTitle, MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation)

                'Rückgabewert prüfen
                Select Case lDialogStatus
                    Case Windows.Forms.DialogResult.OK
                        'User hat SolidWorks geöffnet
                        'Funktion einfach nochmal aufrufen
                        Return ConnectToSW(oSwApp)
                    Case Windows.Forms.DialogResult.Cancel
                        'User möchte die Anwendung abbrechen
                        Return False
                End Select
                'SolidWorks anzeigen
                oSwApp.Visible = True
                oSwApp.UserControlBackground = True
            End If
            Return True
        Catch ex As Exception
            Debug.Assert(False)
            Trace.WriteLine("Fehler: Wo: " & _
                    ex.StackTrace & " Was: " & ex.Message)
            Return False
        End Try
    End Function

    Public Function ConnectToModelDoc( _
            ByRef oMod As SldWorks.ModelDoc2, ByVal oSwApp As SldWorks.SldWorks) As Boolean
        Dim boolstatus As Boolean = False

        'Messagebox Rückgabe
        Dim lDialogStatus As Windows.Forms.DialogResult
        'SolidWorks Objekt belegen
        Try
            oMod = oSwApp.ActiveDoc
        Catch ex As Exception
            'Fehler beim Belegen des oMod-Objekts
            oMod = Nothing
        End Try
        'Wenn das SolidWorks Objekt nicht belegt ist...
        If oMod Is Nothing Then
            '... in einer MessageBox nachfragen
            'MessageBox()
            lDialogStatus = MessageBox.Show(My.Resources.msgNoModelFound, _
              Mainform.FormTitle, MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation)
            'Rückgabewert prüfen
            Select Case lDialogStatus
                Case Windows.Forms.DialogResult.OK
                    'User hat SolidWorks geöffnet
                    'Funktion einfach nochmal aufrufen
                    Return ConnectToModelDoc(oMod, oSwApp)
                Case Windows.Forms.DialogResult.Cancel
                    'User möchte die Anwendung abbrechen
                    Return False
            End Select
            'SolidWorks(anzeigen)
            oSwApp.Visible = True
            oSwApp.UserControlBackground = True
        Else
            '...oMod ist nicht Nothing, also ist irgendwas geladen.
            'Wenn es ein Modell ist, sind wir fertig
            'Ansonsten muss das Modell aus der Drw extrahiert werden
            If oMod.GetType = _
                 SwConst.swDocumentTypes_e.swDocDRAWING Then
                'Zeichnung geladen
                swDrw = oMod
                swDrwname = oMod.GetPathName

                'If Not ConnectToView(swView, swDrw) Then Return True
                ''Zeichnung geladen und View gefunden, nun das Part dazu aktivieren:
                'If Not ConnectToPartFromView(swDrw, swView, swApp) Then Return True

                If ConnectToView(swView, swDrw) Then
                    'Zeichnung geladen und View gefunden, nun das Part dazu aktivieren:
                    boolstatus = ConnectToPartFromView(swDrw, swView, swApp)
                End If

            Else
                'Dokument ist Part oder Assembly
                swPart = oMod
                swPartname = oMod.GetPathName
            End If

        End If
        Return True
    End Function

    Public Function ConnectToView( _
      ByRef oView As SldWorks.View, ByVal oDrw As SldWorks.DrawingDoc) As Boolean
        'SolidWorks Objekte finden

        oView = Nothing

        oView = oDrw.GetFirstView
        'Suche nach der ersten View
        oView = oView.GetNextView

        'Wenn das SolidWorks Objekt nicht belegt ist...
        If oView Is Nothing Then
            MessageBox.Show(My.Resources.msgNoViewFound, _
            Mainform.FormTitle, MessageBoxButtons.OK, MessageBoxIcon.Stop)
            Return False
        End If
        swViewname = oView.GetName2
        Return True
    End Function

    Public Function ConnectToPartFromView( _
     ByRef oPart As SldWorks.ModelDoc2, ByVal oView As SldWorks.View, _
     ByVal oSwApp As SldWorks.SldWorks) As Boolean

        Dim PartName As String
        Dim ModelDocType As Long
        Dim Record As String()
        Dim lLoadError As Long
        Dim lLoadWarning As Long
        Dim n As Byte

        'SolidWorks Objekte finden

        PartName = oView.GetReferencedModelName

        If PartName = "" Then
            MessageBox.Show(My.Resources.msgNoPartInView, _
            Mainform.FormTitle, MessageBoxButtons.OK, MessageBoxIcon.Stop)
            Return False
        End If

        If UCase(Microsoft.VisualBasic.Right(PartName, 6)) = "SLDPRT" Then
            '            ModelDocType = swDocPART
            ModelDocType = SwConst.swDocumentTypes_e.swDocPART
            Debug.Print("GetPart: oPart " + PartName + " gefunden")
        Else
            '            ModelDocType = swDocASSEMBLY
            ModelDocType = SwConst.swDocumentTypes_e.swDocASSEMBLY
            Debug.Print("GetPart: Assembly " + PartName + " gefunden")
        End If

        ' Doppeltes \\ durch \ ersetzen:
        '    Replace PartName, "\\", "\", 1, , vbTextCompare ' geht nicht !!!

        Record = Split(PartName, "\\")
        If UBound(Record) > 0 Then
            PartName = ""
            For n = 0 To UBound(Record)
                If n > 0 Then PartName = PartName + "\"
                PartName = PartName + Record(n)
            Next n
        End If
        oPart = oSwApp.OpenDoc6(PartName, ModelDocType, _
                SwConst.swOpenDocOptions_e.swOpenDocOptions_Silent, _
                "", lLoadError, lLoadWarning)

        'Wenn das SolidWorks Objekt nicht belegt ist...
        If oPart Is Nothing Then
            MessageBox.Show(My.Resources.msgNoPartInDrawing, _
            Mainform.FormTitle, MessageBoxButtons.OK, MessageBoxIcon.Stop)
            Return False
        End If
        swPartname = oPart.GetPathName
        Return True
    End Function

 End Module

