Загрузка данных
Private Sub ДиагностикаТел()
Dim App5 As Object
Dim Doc3D As Object
Dim TopPart As Object
Dim Bodies As Object
Dim Body As Object
Dim Body7 As Object
Dim i As Long
Dim CountBodies As Long
Dim Msg As String
Dim Marking As String
Dim BodyName As String
On Error GoTo FatalError
Msg = "ДИАГНОСТИКА ТЕЛ" & vbCrLf
Msg = Msg & String(60, "-") & vbCrLf
' =========================================================
' API 5
' =========================================================
On Error Resume Next
Set App5 = CreateObject("Kompas.Application.5")
If App5 Is Nothing Then
Set App5 = GetObject(, "Kompas.Application.5")
End If
On Error GoTo FatalError
If App5 Is Nothing Then
Msg = Msg & "API5: НЕ ПОЛУЧЕН" & vbCrLf
MsgBox Msg, vbCritical, "Диагностика"
Exit Sub
End If
Msg = Msg & "API5: 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
Msg = Msg & "ActiveDocument3D: НЕ ПОЛУЧЕН" & vbCrLf
MsgBox Msg, vbCritical, "Диагностика"
Exit Sub
End If
Msg = Msg & "ActiveDocument3D: OK" & vbCrLf
' =========================================================
' TOP PART
' =========================================================
Set TopPart = Nothing
On Error Resume Next
Set TopPart = Doc3D.TopPart
On Error GoTo FatalError
If TopPart Is Nothing Then
Msg = Msg & "TopPart: НЕ ПОЛУЧЕН" & vbCrLf
MsgBox Msg, vbCritical, "Диагностика"
Exit Sub
End If
Msg = Msg & "TopPart: OK" & vbCrLf
' =========================================================
' BODY COLLECTION
' =========================================================
Set Bodies = Nothing
On Error Resume Next
Set Bodies = TopPart.BodyCollection
On Error GoTo FatalError
If Bodies Is Nothing Then
Msg = Msg & "BodyCollection: НЕ ПОЛУЧЕН" & vbCrLf
MsgBox Msg, vbCritical, "Диагностика"
Exit Sub
End If
Msg = Msg & "BodyCollection: OK" & vbCrLf
' =========================================================
' КОЛИЧЕСТВО
' =========================================================
CountBodies = 0
On Error Resume Next
CountBodies = Bodies.GetCount
If Err.Number <> 0 Then
Err.Clear
CountBodies = Bodies.Count
End If
On Error GoTo FatalError
Msg = Msg & "Количество тел: " & CountBodies & vbCrLf
Msg = Msg & String(60, "-") & vbCrLf
' =========================================================
' ОБХОД ТЕЛ
' =========================================================
For i = 0 To CountBodies - 1
Set Body = Nothing
Set Body7 = Nothing
Marking = ""
BodyName = ""
' -----------------------------------------------------
' ksBody
' -----------------------------------------------------
On Error Resume Next
Set Body = Bodies.GetByIndex(i)
On Error GoTo FatalError
Msg = Msg & vbCrLf
Msg = Msg & "ТЕЛО №" & (i + 1) & vbCrLf
If Body Is Nothing Then
Msg = Msg & " ksBody: НЕ ПОЛУЧЕН" & vbCrLf
GoTo NextBody
Else
Msg = Msg & " ksBody: OK" & vbCrLf
End If
' =====================================================
' ПОЛУЧЕНИЕ IBody7 ЧЕРЕЗ TransferInterface
' =====================================================
On Error Resume Next
Set Body7 = App5.TransferInterface( _
Body, _
7, _
0)
On Error GoTo FatalError
If Body7 Is Nothing Then
Msg = Msg & " IBody7: НЕ ПОЛУЧЕН" & vbCrLf
' Попробуем получить через IUnknown/COM
On Error Resume Next
Set Body7 = Body
On Error GoTo FatalError
End If
If Body7 Is Nothing Then
Msg = Msg & " IBody7 через Body: НЕ ПОЛУЧЕН" & vbCrLf
GoTo NextBody
Else
Msg = Msg & " IBody7: OK" & vbCrLf
End If
' =====================================================
' NAME
' =====================================================
On Error Resume Next
Err.Clear
BodyName = CStr(Body7.Name)
If Err.Number <> 0 Then
Err.Clear
BodyName = ""
End If
On Error GoTo FatalError
If Len(BodyName) > 0 Then
Msg = Msg & _
" Name: " & BodyName & vbCrLf
Else
Msg = Msg & _
" Name: НЕ ПОЛУЧЕН" & vbCrLf
End If
' =====================================================
' MARKING
' =====================================================
On Error Resume Next
Err.Clear
Marking = CStr(Body7.Marking)
If Err.Number <> 0 Then
Err.Clear
Marking = ""
End If
On Error GoTo FatalError
If Len(Marking) > 0 Then
Msg = Msg & _
" Marking: " & Marking & vbCrLf
Else
Msg = Msg & _
" Marking: ПУСТО" & vbCrLf
End If
NextBody:
' -----------------------------------------------------
' Ограничение окна
' -----------------------------------------------------
If Len(Msg) > 12000 Then
Msg = Msg & vbCrLf
Msg = Msg & _
"Показаны первые тела. " & _
"Всего найдено: " & CountBodies
Exit For
End If
Next i
' =========================================================
' РЕЗУЛЬТАТ
' =========================================================
MsgBox _
Msg, _
vbInformation, _
"Диагностика тел КОМПАС-3D"
Exit Sub
FatalError:
Msg = Msg & vbCrLf & _
"КРИТИЧЕСКАЯ ОШИБКА" & vbCrLf & _
"№ " & Err.Number & vbCrLf & _
Err.Description
MsgBox _
Msg, _
vbCritical, _
"Диагностика"
End Sub