Imports System.IO
Imports System.Runtime.InteropServices
Module Example
    <STAThread()> _
    Sub Main()
        Dim objFolder As DirectoryInfo
        Dim objFileInfo As FileInfo
        Dim objApplication As SolidEdgeFramework.Application = Nothing
        Dim objDocuments As SolidEdgeFramework.Documents = Nothing
        Dim objAssemblyDocument As SolidEdgeAssembly.AssemblyDocument = Nothing
        Dim objRelations3d As SolidEdgeAssembly.Relations3d = Nothing
        Dim objRelation As Object = Nothing
        Dim objElement1 As Object = Nothing
        Dim objElement2 As Object = Nothing
        Dim objOccurrence1 As SolidEdgeAssembly.Occurrence = Nothing
        Dim objOccurrence2 As SolidEdgeAssembly.Occurrence = Nothing
        Dim bTopologyReference1 As Boolean
        Dim bTopologyReference2 As Boolean
        Dim objTopologyReference1 As SolidEdgeAssembly.TopologyReference = Nothing
        Dim objTopologyReference2 As SolidEdgeAssembly.TopologyReference = Nothing
        Dim objReference1 As SolidEdgeFramework.Reference = Nothing
        Dim objReference2 As SolidEdgeFramework.Reference = Nothing
        Dim i As Integer
        Dim objTopOccurrence1 As Object = Nothing
        Dim objTopOccurrence2 As Object = Nothing
        Dim iSubOccurrencesInPath1 As Integer
        Dim iSubOccurrencesInPath2 As Integer
        Dim iBoundSubOccurrencesInPath1 As Integer
        Dim iBoundSubOccurrencesInPath2 As Integer
        Dim aSubOccurrencesInPath1 As Array
        Dim aSubOccurrencesInPath2 As Array
        Try
            OleMessageFilter.Register()
            objFolder = GetTrainingFolder()
            objFileInfo = New FileInfo(Path.Combine(objFolder.FullName, "Coffee Pot.asm"))
            ' Start Solid Edge
            objApplication = Activator.CreateInstance(Type.GetTypeFromProgID("SolidEdge.Application"))
            objApplication.Visible = True
            objDocuments = objApplication.Documents
            objAssemblyDocument = objDocuments.Open(objFileInfo.FullName)
            objRelations3d = objAssemblyDocument.Relations3d
            For i = 1 To objRelations3d.Count
                ' Refresh arrays
                aSubOccurrencesInPath1 = Array.CreateInstance(GetType(System.Object), 0)
                aSubOccurrencesInPath2 = Array.CreateInstance(GetType(System.Object), 0)
                ' Get current Relation
                objRelation = objRelations3d.Item(i)
                If (objRelation.Type <> SolidEdgeFramework.ObjectType.igGroundRelation3d) Then
                    objElement1 = objRelation.GetElement1(bTopologyReference1)
                    objElement2 = objRelation.GetElement2(bTopologyReference2)
                    objOccurrence1 = objRelation.Occurrence1
                    objOccurrence2 = objRelation.Occurrence2
                    If bTopologyReference1 Then
                        objTopologyReference1 = objElement1
                        objTopologyReference1.GetOccurrencesInPath(objTopOccurrence1, iSubOccurrencesInPath1, iBoundSubOccurrencesInPath1, aSubOccurrencesInPath1)
                    Else
                        objReference1 = objElement1
                        objReference1.GetOccurrencesInPath(objTopOccurrence1, iSubOccurrencesInPath1, iBoundSubOccurrencesInPath1, aSubOccurrencesInPath1)
                    End If
                    If bTopologyReference2 Then
                        objTopologyReference2 = objElement2
                        objTopologyReference2.GetOccurrencesInPath(objTopOccurrence2, iSubOccurrencesInPath2, iBoundSubOccurrencesInPath2, aSubOccurrencesInPath2)
                    Else
                        objReference2 = objElement2
                        objReference2.GetOccurrencesInPath(objTopOccurrence2, iSubOccurrencesInPath2, iBoundSubOccurrencesInPath2, aSubOccurrencesInPath2)
                    End If
                End If
            Next
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        Finally
            OleMessageFilter.Revoke()
        End Try
    End Sub
    Function GetTrainingFolder() As DirectoryInfo
        Dim objInstallData As SEInstallDataLib.SEInstallData = Nothing
        Dim objInstallFolder As DirectoryInfo = Nothing
        Dim objTrainingFolder As DirectoryInfo = Nothing
        Try
            objInstallData = New SEInstallDataLib.SEInstallData
            objInstallFolder = New DirectoryInfo(objInstallData.GetInstalledPath())
            objTrainingFolder = New DirectoryInfo(Path.Combine(objInstallFolder.Parent.FullName, "Training"))
        Catch
        Finally
            If Not (objInstallData Is Nothing) Then
                Marshal.FinalReleaseComObject(objInstallData)
                objInstallData = Nothing
            End If
        End Try
        Return objTrainingFolder
    End Function
End Module