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


Option Explicit

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

    Dim App5 As Object
    Dim Doc3D As Object
    Dim Part5 As Object
    Dim Part7 As Object

    Dim Bodies As Object
    Dim Body As Object
    Dim Body7 As Object

    Dim CountBodies As Long
    Dim i As Long

    Dim Report As String

    Dim NameText As String
    Dim MarkingText As String
    Dim IdText As String

    On Error GoTo FatalError

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

    Set App5 = Nothing

    On Error Resume Next
    Set App5 = GetObject(, "Kompas.Application.5")
    On Error GoTo FatalError

    If App5 Is Nothing Then

        MsgBox _
            "API 5 НЕ ПОЛУЧЕН.", _
            vbCritical, _
            "Диагностика тел"

        Exit Sub

    End If

    Report = "API 5: ОК" & vbCrLf


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

    Set Doc3D = Nothing

    On Error Resume Next
    Set Doc3D = App5.ActiveDocument3D
    On Error GoTo FatalError

    If Doc3D Is Nothing Then

        MsgBox _
            Report & vbCrLf & _
            "ActiveDocument3D: НЕ ПОЛУЧЕН", _
            vbCritical, _
            "Диагностика тел"

        Exit Sub

    End If

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


    ' ========================================================
    ' GETPART(-1)
    ' ========================================================

    Set Part5 = Nothing

    On Error Resume Next
    Set Part5 = Doc3D.GetPart(-1)
    On Error GoTo FatalError

    If Part5 Is Nothing Then

        MsgBox _
            Report & vbCrLf & _
            "GetPart(-1): НЕ ПОЛУЧЕН", _
            vbCritical, _
            "Диагностика тел"

        Exit Sub

    End If

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


    ' ========================================================
    ' API 7 PART
    ' ========================================================

    Set Part7 = Nothing

    On Error Resume Next
    Set Part7 = Part5
    On Error GoTo FatalError

    If Part7 Is Nothing Then

        MsgBox _
            Report & vbCrLf & _
            "IPart7: НЕ ПОЛУЧЕН", _
            vbCritical, _
            "Диагностика тел"

        Exit Sub

    End If

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


    ' ========================================================
    ' KS BODY COLLECTION
    '
    ' ВАЖНО:
    ' здесь получаем именно API5 ksBodyCollection
    ' через BodyCollection()
    ' ========================================================

    Set Bodies = Nothing

    On Error Resume Next

    Set Bodies = Part5.BodyCollection

    On Error GoTo FatalError

    If Bodies Is Nothing Then

        MsgBox _
            Report & vbCrLf & _
            "ksBodyCollection: НЕ ПОЛУЧЕН", _
            vbCritical, _
            "Диагностика тел"

        Exit Sub

    End If

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


    ' ========================================================
    ' ПОЛУЧАЕМ КОЛИЧЕСТВО
    '
    ' НЕ Count !!!
    ' Используем GetCount()
    ' ========================================================

    CountBodies = -1

    On Error Resume Next

    Err.Clear

    CountBodies = Bodies.GetCount

    If Err.Number <> 0 Then

        Report = Report & _
                 "GetCount: ОШИБКА " & _
                 Err.Number & _
                 " - " & _
                 Err.Description & vbCrLf

        Err.Clear

    Else

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

    End If

    On Error GoTo FatalError


    If CountBodies <= 0 Then

        MsgBox _
            Report & vbCrLf & _
            "Тел не найдено.", _
            vbExclamation, _
            "Диагностика тел"

        Exit Sub

    End If


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


    ' ========================================================
    ' ПЕРЕБОР ТЕЛ
    '
    ' В API5 пример использует GetByIndex()
    ' ========================================================

    For i = 0 To CountBodies - 1

        Set Body = Nothing
        Set Body7 = Nothing

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


        ' ----------------------------------------------------
        ' ksBody
        ' ----------------------------------------------------

        On Error Resume Next

        Err.Clear

        Set Body = Bodies.GetByIndex(i)

        If Err.Number <> 0 Then

            Report = Report & _
                     "ТЕЛО №" & (i + 1) & _
                     ": GetByIndex ОШИБКА " & _
                     Err.Number & vbCrLf & vbCrLf

            Err.Clear

            GoTo NextBody

        End If

        On Error GoTo FatalError


        If Body Is Nothing Then

            Report = Report & _
                     "ТЕЛО №" & (i + 1) & _
                     ": ksBody НЕ ПОЛУЧЕН" & _
                     vbCrLf & vbCrLf

            GoTo NextBody

        End If


        ' ----------------------------------------------------
        ' Получаем IBody7
        '
        ' Здесь пока пробуем прямое приведение.
        ' Если не сработает — следующим шагом сделаем
        ' правильный TransferInterface через API5.
        ' ----------------------------------------------------

        On Error Resume Next

        Set Body7 = Body

        On Error GoTo FatalError


        If Body7 Is Nothing Then

            Report = Report & _
                     "ТЕЛО №" & (i + 1) & _
                     ": ksBody ОК" & vbCrLf & _
                     "  IBody7: НЕ ПОЛУЧЕН" & _
                     vbCrLf & vbCrLf

            GoTo NextBody

        End If


        ' ----------------------------------------------------
        ' NAME
        ' ----------------------------------------------------

        On Error Resume Next

        Err.Clear

        NameText = CStr(Body7.Name)

        If Err.Number <> 0 Then

            NameText = "НЕ ПОЛУЧЕНО"
            Err.Clear

        End If


        ' ----------------------------------------------------
        ' MARKING
        ' ----------------------------------------------------

        Err.Clear

        MarkingText = CStr(Body7.Marking)

        If Err.Number <> 0 Then

            MarkingText = "НЕ ПОЛУЧЕНО"
            Err.Clear

        End If


        ' ----------------------------------------------------
        ' BODY ID
        ' ----------------------------------------------------

        Err.Clear

        IdText = CStr(Body7.BodyId)

        If Err.Number <> 0 Then

            IdText = "НЕ ПОЛУЧЕН"
            Err.Clear

        End If

        On Error GoTo FatalError


        ' ----------------------------------------------------
        ' РЕЗУЛЬТАТ
        ' ----------------------------------------------------

        Report = Report & _
                 "ТЕЛО №" & (i + 1) & vbCrLf & _
                 "  ksBody: ОК" & vbCrLf & _
                 "  IBody7: ОК" & vbCrLf & _
                 "  Name: " & NameText & vbCrLf & _
                 "  Marking: " & MarkingText & vbCrLf & _
                 "  BodyId: " & IdText & _
                 vbCrLf & vbCrLf


NextBody:

    Next i


    ' ========================================================
    ' ПОКАЗ ОТЧЁТА
    ' ========================================================

    ПоказатьОтчетТел _
        "ДИАГНОСТИКА ТЕЛ КОМПАС-3D", _
        Report

    Exit Sub


FatalError:

    MsgBox _
        "Критическая ошибка:" & vbCrLf & vbCrLf & _
        "№ " & Err.Number & vbCrLf & _
        Err.Description, _
        vbCritical, _
        "Диагностика тел"

End Sub


' ============================================================
' ОКНО ОТЧЁТА
' ============================================================

Private Sub ПоказатьОтчетТел( _
    ByVal Заголовок As String, _
    ByVal Текст As String)

    Dim F As Object
    Dim T As Object

    Set F = CreateObject("Forms.UserForm.1")

    F.Caption = Заголовок

    F.Width = 750
    F.Height = 620


    Set T = F.Controls.Add( _
        "Forms.TextBox.1", _
        "txtReport", _
        True)


    With T

        .Left = 10
        .Top = 10

        .Width = 710
        .Height = 550

        .MultiLine = True

        .ScrollBars = 3

        .WordWrap = False

        .Locked = True

        .Font.Name = "Consolas"

        .Font.Size = 9

        .Text = Текст

    End With


    F.Show

End Sub