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


Option Explicit

Public Sub ДиагностикаТел2()

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

    Dim i As Long
    Dim Cnt As Long

    Dim S As String
    Dim V As Variant

    On Error GoTo ErrHandler

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


    ' =========================================================
    ' API5
    ' =========================================================

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

    If App5 Is Nothing Then
        MsgBox "API5 не получен.", vbCritical
        Exit Sub
    End If

    S = S & "API5: OK" & vbCrLf


    ' =========================================================
    ' DOCUMENT
    ' =========================================================

    Set Doc3D = App5.ActiveDocument3D

    If Doc3D Is Nothing Then
        MsgBox S & vbCrLf & _
               "ActiveDocument3D не получен.", _
               vbCritical
        Exit Sub
    End If

    S = S & "ActiveDocument3D: OK" & vbCrLf


    ' =========================================================
    ' ROOT PART
    ' =========================================================

    Set Part5 = Doc3D.GetPart(-1)

    If Part5 Is Nothing Then
        MsgBox S & vbCrLf & _
               "GetPart(-1) не получен.", _
               vbCritical
        Exit Sub
    End If

    S = S & "Root Part: OK" & vbCrLf


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

    Set Bodies = Part5.BodyCollection

    If Bodies Is Nothing Then

        MsgBox S & vbCrLf & _
               "BodyCollection не получен.", _
               vbCritical

        Exit Sub

    End If

    S = S & "BodyCollection: OK" & vbCrLf


    ' =========================================================
    ' COUNT
    ' =========================================================

    Cnt = Bodies.GetCount

    S = S & _
        "Количество тел: " & Cnt & _
        vbCrLf & vbCrLf


    ' =========================================================
    ' ПЕРЕБОР
    ' =========================================================

    For i = 0 To Cnt - 1

        Set Body = Nothing

        On Error Resume Next

        Set Body = Bodies.GetByIndex(i)

        On Error GoTo ErrHandler


        S = S & _
            "------------------------------" & vbCrLf

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


        If Body Is Nothing Then

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

        Else

            S = S & _
                "ksBody: OK" & vbCrLf


            ' =================================================
            ' ПРОБУЕМ РАЗНЫЕ СВОЙСТВА ksBody
            ' =================================================

            V = Empty

            On Error Resume Next
            Err.Clear

            V = Body.Name

            If Err.Number = 0 Then

                S = S & _
                    "Name: " & Безопасно(V) & _
                    vbCrLf

            Else

                Err.Clear

                S = S & _
                    "Name: НЕТ" & vbCrLf

            End If


            ' -------------------------------------------------
            ' ID
            ' -------------------------------------------------

            V = Empty

            Err.Clear

            V = Body.Id

            If Err.Number = 0 Then

                S = S & _
                    "Id: " & Безопасно(V) & _
                    vbCrLf

            Else

                Err.Clear

                S = S & _
                    "Id: НЕТ" & vbCrLf

            End If


            ' -------------------------------------------------
            ' NUMBER
            ' -------------------------------------------------

            V = Empty

            Err.Clear

            V = Body.Number

            If Err.Number = 0 Then

                S = S & _
                    "Number: " & Безопасно(V) & _
                    vbCrLf

            Else

                Err.Clear

                S = S & _
                    "Number: НЕТ" & vbCrLf

            End If


            ' -------------------------------------------------
            ' TYPE
            ' -------------------------------------------------

            V = Empty

            Err.Clear

            V = Body.Type

            If Err.Number = 0 Then

                S = S & _
                    "Type: " & Безопасно(V) & _
                    vbCrLf

            Else

                Err.Clear

                S = S & _
                    "Type: НЕТ" & vbCrLf

            End If


            ' -------------------------------------------------
            ' OWNER
            ' -------------------------------------------------

            V = Empty

            Err.Clear

            Set V = Nothing

            Set V = Body.Owner

            If Err.Number = 0 Then

                If Not V Is Nothing Then

                    S = S & _
                        "Owner: OK" & vbCrLf

                Else

                    S = S & _
                        "Owner: Nothing" & vbCrLf

                End If

            Else

                Err.Clear

                S = S & _
                    "Owner: НЕТ" & vbCrLf

            End If


            ' -------------------------------------------------
            ' SOURCE
            ' -------------------------------------------------

            V = Empty

            Err.Clear

            V = Body.Source

            If Err.Number = 0 Then

                S = S & _
                    "Source: " & Безопасно(V) & _
                    vbCrLf

            Else

                Err.Clear

                S = S & _
                    "Source: НЕТ" & vbCrLf

            End If


            ' -------------------------------------------------
            ' DOCUMENT
            ' -------------------------------------------------

            V = Empty

            Err.Clear

            Set V = Nothing

            Set V = Body.Document

            If Err.Number = 0 Then

                If Not V Is Nothing Then

                    S = S & _
                        "Document: OK" & vbCrLf

                Else

                    S = S & _
                        "Document: Nothing" & vbCrLf

                End If

            Else

                Err.Clear

                S = S & _
                    "Document: НЕТ" & vbCrLf

            End If

        End If


        ' Чтобы окно не стало гигантским,
        ' первые 31 тела всё равно покажем,
        ' но без лишнего текста.

    Next i


    S = S & vbCrLf & _
        "============================" & vbCrLf & _
        "ДИАГНОСТИКА ЗАВЕРШЕНА"


    MsgBox S, _
           vbInformation, _
           "Диагностика тел"


    Exit Sub


ErrHandler:

    MsgBox _
        S & vbCrLf & vbCrLf & _
        "ОШИБКА:" & vbCrLf & _
        Err.Number & vbCrLf & _
        Err.Description, _
        vbCritical, _
        "Диагностика"

End Sub


Private Function Безопасно(ByVal V As Variant) As String

    On Error GoTo ErrHandler

    If IsObject(V) Then

        Безопасно = "[OBJECT]"

    ElseIf IsNull(V) Then

        Безопасно = ""

    ElseIf IsEmpty(V) Then

        Безопасно = ""

    Else

        Безопасно = CStr(V)

    End If

    Exit Function

ErrHandler:

    Безопасно = "[ошибка]"

End Function