Загрузка данных


Option Explicit

' ============================================================
' ДИАГНОСТИКА ТЕЛ КОМПАС-3D
'
' Результат автоматически сохраняется во временный TXT
' и открывается в Блокноте.
'
' Ничего в модели КОМПАС-3D не изменяет.
' ============================================================

Public Sub ДиагностикаТелМеталлоконструкций()

    Dim App5 As Object
    Dim Doc3D As Object
    Dim Part5 As Object
    Dim Bodies As Object
    Dim Body As Object

    Dim CountBodies As Long
    Dim i As Long

    Dim Report As String
    Dim FilePath As String
    Dim FileNum As Integer

    Dim NameText As String
    Dim MarkingText As String
    Dim FileNameText As String
    Dim TypeText As String

    Dim ErrNum As Long
    Dim ErrDesc As String

    On Error GoTo FatalError


    ' ========================================================
    ' НАЧАЛО
    ' ========================================================

    Report = ""

    Report = Report & _
        "====================================================" & vbCrLf

    Report = Report & _
        " ДИАГНОСТИКА ТЕЛ КОМПАС-3D" & vbCrLf

    Report = Report & _
        "====================================================" & vbCrLf & vbCrLf


    ' ========================================================
    ' API 5
    ' ========================================================

    Set App5 = Nothing

    On Error Resume Next

    Err.Clear

    Set App5 = GetObject(, "Kompas.Application.5")

    ErrNum = Err.Number
    ErrDesc = Err.Description

    Err.Clear

    On Error GoTo FatalError


    If App5 Is Nothing Then

        Report = Report & _
            "API5: НЕ ПОЛУЧЕН" & vbCrLf

        Report = Report & _
            "Ошибка: " & ErrNum & vbCrLf

        Report = Report & _
            "Описание: " & ErrDesc & vbCrLf

        GoTo SaveReport

    Else

        Report = Report & _
            "API5: ОК" & vbCrLf

    End If


    ' ========================================================
    ' ACTIVE DOCUMENT 3D
    ' ========================================================

    Set Doc3D = Nothing

    On Error Resume Next

    Err.Clear

    Set Doc3D = App5.ActiveDocument3D

    ErrNum = Err.Number
    ErrDesc = Err.Description

    Err.Clear

    On Error GoTo FatalError


    If Doc3D Is Nothing Then

        Report = Report & _
            "ActiveDocument3D: НЕ ПОЛУЧЕН" & vbCrLf

        Report = Report & _
            "Ошибка: " & ErrNum & vbCrLf

        Report = Report & _
            "Описание: " & ErrDesc & vbCrLf

        GoTo SaveReport

    Else

        Report = Report & _
            "ActiveDocument3D: ОК" & vbCrLf

    End If


    ' ========================================================
    ' GETPART(-1)
    '
    ' -1 = головная часть активного документа
    ' ========================================================

    Set Part5 = Nothing

    On Error Resume Next

    Err.Clear

    Set Part5 = Doc3D.GetPart(-1)

    ErrNum = Err.Number
    ErrDesc = Err.Description

    Err.Clear

    On Error GoTo FatalError


    If Part5 Is Nothing Then

        Report = Report & _
            "GetPart(-1): НЕ ПОЛУЧЕН" & vbCrLf

        Report = Report & _
            "Ошибка: " & ErrNum & vbCrLf

        Report = Report & _
            "Описание: " & ErrDesc & vbCrLf

        GoTo SaveReport

    Else

        Report = Report & _
            "GetPart(-1): ОК" & vbCrLf

    End If


    ' ========================================================
    ' BODY COLLECTION
    ' ========================================================

    Set Bodies = Nothing

    On Error Resume Next

    Err.Clear

    Set Bodies = Part5.BodyCollection

    ErrNum = Err.Number
    ErrDesc = Err.Description

    Err.Clear

    On Error GoTo FatalError


    If Bodies Is Nothing Then

        Report = Report & _
            "ksBodyCollection: НЕ ПОЛУЧЕН" & vbCrLf

        Report = Report & _
            "Ошибка: " & ErrNum & vbCrLf

        Report = Report & _
            "Описание: " & ErrDesc & vbCrLf

        GoTo SaveReport

    Else

        Report = Report & _
            "ksBodyCollection: ОК" & vbCrLf

    End If


    ' ========================================================
    ' КОЛИЧЕСТВО ТЕЛ
    '
    ' Используем GetCount()
    ' ========================================================

    CountBodies = -1

    On Error Resume Next

    Err.Clear

    CountBodies = Bodies.GetCount

    ErrNum = Err.Number
    ErrDesc = Err.Description

    Err.Clear

    On Error GoTo FatalError


    If CountBodies < 0 Then

        Report = Report & _
            "GetCount: НЕ ПОЛУЧЕН" & vbCrLf

        Report = Report & _
            "Ошибка: " & ErrNum & vbCrLf

        Report = Report & _
            "Описание: " & ErrDesc & vbCrLf

        GoTo SaveReport

    Else

        Report = Report & _
            "GetCount: ОК" & vbCrLf

        Report = Report & _
            "Количество тел: " & CountBodies & vbCrLf

    End If


    ' ========================================================
    ' ЕСЛИ ТЕЛ НЕТ
    ' ========================================================

    If CountBodies = 0 Then

        Report = Report & vbCrLf

        Report = Report & _
            "В коллекции нет тел." & vbCrLf

        GoTo SaveReport

    End If


    ' ========================================================
    ' ЗАГОЛОВОК СПИСКА
    ' ========================================================

    Report = Report & vbCrLf

    Report = Report & _
        "====================================================" & vbCrLf

    Report = Report & _
        " СПИСОК ТЕЛ" & vbCrLf

    Report = Report & _
        "====================================================" & vbCrLf & vbCrLf


    ' ========================================================
    ' ПЕРЕБОР ВСЕХ ТЕЛ
    ' ========================================================

    For i = 0 To CountBodies - 1

        Set Body = Nothing

        NameText = "НЕ ПОЛУЧЕНО"
        MarkingText = "НЕ ПОЛУЧЕНО"
        FileNameText = "НЕ ПОЛУЧЕНО"
        TypeText = "НЕ ПОЛУЧЕН"


        Report = Report & _
            "----------------------------------------------------" & vbCrLf

        Report = Report & _
            "ТЕЛО № " & (i + 1) & vbCrLf

        Report = Report & _
            "Индекс: " & i & vbCrLf


        ' ====================================================
        ' GETBYINDEX
        ' ====================================================

        On Error Resume Next

        Err.Clear

        Set Body = Bodies.GetByIndex(i)

        ErrNum = Err.Number
        ErrDesc = Err.Description

        Err.Clear

        On Error GoTo FatalError


        If Body Is Nothing Then

            Report = Report & _
                "ksBody: НЕ ПОЛУЧЕН" & vbCrLf

            Report = Report & _
                "Ошибка GetByIndex: " & ErrNum & vbCrLf

            Report = Report & _
                "Описание: " & ErrDesc & vbCrLf & vbCrLf

            GoTo NextBody

        Else

            Report = Report & _
                "ksBody: ОК" & vbCrLf

        End If


        ' ====================================================
        ' ПРОВЕРЯЕМ NAME
        ' ====================================================

        On Error Resume Next

        Err.Clear

        NameText = CStr(Body.Name)

        If Err.Number <> 0 Then

            NameText = "НЕ ПОЛУЧЕНО"

            Err.Clear

        End If


        ' ====================================================
        ' ПРОВЕРЯЕМ MARKING
        ' ====================================================

        Err.Clear

        MarkingText = CStr(Body.Marking)

        If Err.Number <> 0 Then

            MarkingText = "НЕ ПОЛУЧЕНО"

            Err.Clear

        End If


        ' ====================================================
        ' ПРОВЕРЯЕМ FILENAME
        ' ====================================================

        Err.Clear

        FileNameText = CStr(Body.FileName)

        If Err.Number <> 0 Then

            FileNameText = "НЕ ПОЛУЧЕНО"

            Err.Clear

        End If


        ' ====================================================
        ' ПРОВЕРЯЕМ TYPE
        ' ====================================================

        Err.Clear

        TypeText = CStr(Body.Type)

        If Err.Number <> 0 Then

            TypeText = "НЕ ПОЛУЧЕН"

            Err.Clear

        End If

        On Error GoTo FatalError


        ' ====================================================
        ' ВЫВОД
        ' ====================================================

        Report = Report & _
            "Name: " & NameText & vbCrLf

        Report = Report & _
            "Marking: " & MarkingText & vbCrLf

        Report = Report & _
            "FileName: " & FileNameText & vbCrLf

        Report = Report & _
            "Type: " & TypeText & vbCrLf


NextBody:

        Report = Report & vbCrLf

    Next i


    ' ========================================================
    ' КОНЕЦ
    ' ========================================================

    Report = Report & _
        "====================================================" & vbCrLf

    Report = Report & _
        " КОНЕЦ ДИАГНОСТИКИ" & vbCrLf

    Report = Report & _
        "====================================================" & vbCrLf


' ============================================================
' СОХРАНЕНИЕ В TXT
' ============================================================

SaveReport:

    FilePath = Environ$("TEMP") & _
               "\Kompas_Bodies_Diagnostic.txt"

    FileNum = FreeFile

    Open FilePath For Output As #FileNum

    Print #FileNum, Report

    Close #FileNum


    ' ========================================================
    ' ОТКРЫВАЕМ БЛОКНОТ
    ' ========================================================

    Shell "notepad.exe " & Chr$(34) & FilePath & Chr$(34), _
          vbNormalFocus


    Exit Sub


' ============================================================
' КРИТИЧЕСКАЯ ОШИБКА
' ============================================================

FatalError:

    Report = Report & vbCrLf

    Report = Report & _
        "====================================================" & vbCrLf

    Report = Report & _
        " КРИТИЧЕСКАЯ ОШИБКА" & vbCrLf

    Report = Report & _
        "====================================================" & vbCrLf

    Report = Report & _
        "Номер: " & Err.Number & vbCrLf

    Report = Report & _
        "Описание: " & Err.Description & vbCrLf


    On Error Resume Next

    FilePath = Environ$("TEMP") & _
               "\Kompas_Bodies_Diagnostic.txt"

    FileNum = FreeFile

    Open FilePath For Output As #FileNum

    Print #FileNum, Report

    Close #FileNum

    Shell "notepad.exe " & Chr$(34) & FilePath & Chr$(34), _
          vbNormalFocus

End Sub