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


Option Explicit

' ============================================================
' ДИАГНОСТИКА ТЕЛ КОМПАС-3D
' Отдельный макрос для запуска через Alt+F8
' ============================================================

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

    Dim App5 As Object
    Dim Doc3D As Object
    Dim Part5 As Object
    Dim Part7 As Object
    Dim BodyCollection As Object
    Dim Body5 As Object
    Dim Body7 As Object

    Dim i As Long
    Dim CountBodies As Long

    Dim Report As String
    Dim NameText As String
    Dim MarkingText As String
    Dim BodyIdText As String
    Dim SolidText As String

    On Error GoTo FatalError

    Report = ""

    ' ========================================================
    ' 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 не получен." & vbCrLf & vbCrLf & _
            "Запусти КОМПАС-3D и открой нужную сборку.", _
            vbCritical, _
            "Диагностика тел"

        Exit Sub

    End If


    Report = Report & _
        "API 5: OK" & 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: OK" & 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): OK" & vbCrLf


    ' ========================================================
    ' ПОЛУЧАЕМ IPart7
    ' ========================================================

    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: OK" & vbCrLf


    ' ========================================================
    ' ПОЛУЧАЕМ КОЛЛЕКЦИЮ ТЕЛ
    ' ========================================================

    Set BodyCollection = Nothing

    On Error Resume Next

    Set BodyCollection = Part7.Bodies

    If BodyCollection Is Nothing Then

        Set BodyCollection = Part7.ModelContainer

    End If

    On Error GoTo FatalError


    If BodyCollection Is Nothing Then

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

        Exit Sub

    End If


    Report = Report & _
        "Коллекция тел: OK" & vbCrLf


    ' ========================================================
    ' КОЛИЧЕСТВО
    ' ========================================================

    CountBodies = 0

    On Error Resume Next

    CountBodies = BodyCollection.Count

    On Error GoTo FatalError


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


    If CountBodies = 0 Then

        MsgBox _
            Report & _
            "Тел в коллекции нет.", _
            vbInformation, _
            "Диагностика тел"

        Exit Sub

    End If


    ' ========================================================
    ' ПЕРЕБИРАЕМ ТЕЛА
    ' ========================================================

    For i = 0 To CountBodies - 1

        Set Body5 = Nothing
        Set Body7 = Nothing

        NameText = ""
        MarkingText = ""
        BodyIdText = ""
        SolidText = ""


        ' ----------------------------------------------------
        ' Получаем тело
        ' ----------------------------------------------------

        On Error Resume Next

        Set Body5 = BodyCollection.Item(i)

        If Body5 Is Nothing Then

            Set Body5 = BodyCollection.Item(i + 1)

        End If

        On Error GoTo 0


        If Body5 Is Nothing Then

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

            GoTo NextBody

        End If


        ' ----------------------------------------------------
        ' Получаем IBody7
        ' ----------------------------------------------------

        On Error Resume Next

        Set Body7 = Body5

        On Error GoTo 0


        If Body7 Is Nothing Then

            Report = Report & _
                "ТЕЛО №" & (i + 1) & _
                ": 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

        BodyIdText = CStr(Body7.BodyId)

        If Err.Number <> 0 Then

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

            Err.Clear

        End If


        ' ----------------------------------------------------
        ' IS SOLID
        ' ----------------------------------------------------

        Err.Clear

        If Body7.IsSolid Then

            SolidText = "Твердое тело"

        Else

            SolidText = "Оболочка"

        End If

        If Err.Number <> 0 Then

            SolidText = "НЕ ОПРЕДЕЛЕНО"

            Err.Clear

        End If

        On Error GoTo FatalError


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

        Report = Report & _
            "ТЕЛО №" & (i + 1) & vbCrLf & _
            "  Name: " & NameText & vbCrLf & _
            "  Marking: " & MarkingText & vbCrLf & _
            "  BodyId: " & BodyIdText & vbCrLf & _
            "  Тип: " & SolidText & vbCrLf & _
            vbCrLf


NextBody:

    Next i


    ' ========================================================
    ' ПОКАЗЫВАЕМ РЕЗУЛЬТАТ
    ' ========================================================

    Call ПоказатьБольшойОтчет( _
        "ДИАГНОСТИКА ТЕЛ КОМПАС-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 = 700
    F.Height = 600


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


    With T

        .Left = 10
        .Top = 10

        .Width = 660
        .Height = 520

        .MultiLine = True

        .ScrollBars = 3

        .WordWrap = False

        .Locked = True

        .Font.Name = "Consolas"

        .Font.Size = 9

        .Text = Текст

    End With


    F.Show

End Sub