Загрузка данных
Option Explicit
' ============================================================
' ДИАГНОСТИКА ТЕЛ КОМПАС-3D
'
' Цель:
' ksBody
' ↓
' ksEntity
' ↓
' ksFeature
' ↓
' GetObject
' ↓
' IBody7
' ↓
' BodyId / Name / Marking
'
' ============================================================
Public Sub ДиагностикаТелМеталлоконструкций()
Dim App5 As Object
Dim Doc3D As Object
Dim Part5 As Object
Dim Bodies As Object
Dim Body5 As Object
Dim Entity As Object
Dim Feature As Object
Dim ObjFromFeature As Object
Dim Body7 As Object
Dim CountBodies As Long
Dim i As Long
Dim Report As String
Dim FilePath As String
Dim F As Integer
On Error GoTo FatalError
Report = ""
Report = Report & _
"==================================================" & vbCrLf & _
"ДИАГНОСТИКА ТЕЛ КОМПАС-3D" & vbCrLf & _
"==================================================" & vbCrLf & vbCrLf
' ========================================================
' API 5
' ========================================================
Set App5 = Nothing
On Error Resume Next
Err.Clear
Set App5 = GetObject(, "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
Report = Report & _
"API5: НЕ ПОЛУЧЕН" & vbCrLf
GoTo SaveReport
End If
Report = Report & _
"API5: ОК" & vbCrLf
' ========================================================
' ACTIVE DOCUMENT 3D
' ========================================================
Set Doc3D = Nothing
On Error Resume Next
Err.Clear
Set Doc3D = App5.ActiveDocument3D
On Error GoTo FatalError
If Doc3D Is Nothing Then
Report = Report & _
"ActiveDocument3D: НЕ ПОЛУЧЕН" & vbCrLf
GoTo SaveReport
End If
Report = Report & _
"ActiveDocument3D: ОК" & vbCrLf
' ========================================================
' ROOT PART
' ========================================================
Set Part5 = Nothing
On Error Resume Next
Err.Clear
Set Part5 = Doc3D.GetPart(-1)
On Error GoTo FatalError
If Part5 Is Nothing Then
Report = Report & _
"GetPart(-1): НЕ ПОЛУЧЕН" & vbCrLf
GoTo SaveReport
End If
Report = Report & _
"GetPart(-1): ОК" & vbCrLf
' ========================================================
' BODY COLLECTION
' ========================================================
Set Bodies = Nothing
On Error Resume Next
Err.Clear
Set Bodies = Part5.BodyCollection
On Error GoTo FatalError
If Bodies Is Nothing Then
Report = Report & _
"BodyCollection: НЕ ПОЛУЧЕН" & vbCrLf
GoTo SaveReport
End If
Report = Report & _
"BodyCollection: ОК" & vbCrLf
' ========================================================
' COUNT
' ========================================================
CountBodies = -1
On Error Resume Next
Err.Clear
CountBodies = Bodies.GetCount
On Error GoTo FatalError
If CountBodies < 0 Then
Report = Report & _
"Количество тел: НЕ ПОЛУЧЕНО" & vbCrLf
GoTo SaveReport
End If
Report = Report & _
"Количество тел: " & CountBodies & _
vbCrLf & vbCrLf
' ========================================================
' ПЕРЕБОР ТЕЛ
' ========================================================
For i = 0 To CountBodies - 1
Set Body5 = Nothing
Set Entity = Nothing
Set Feature = Nothing
Set ObjFromFeature = Nothing
Set Body7 = Nothing
Report = Report & _
"--------------------------------------------------" & vbCrLf
Report = Report & _
"ТЕЛО № " & (i + 1) & vbCrLf
Report = Report & _
"--------------------------------------------------" & vbCrLf
' ====================================================
' ksBody
' ====================================================
On Error Resume Next
Err.Clear
Set Body5 = Bodies.GetByIndex(i)
If Err.Number <> 0 Then
Report = Report & _
"GetByIndex: ОШИБКА " & _
Err.Number & _
" / " & _
Err.Description & vbCrLf
Err.Clear
End If
On Error GoTo FatalError
If Body5 Is Nothing Then
Report = Report & _
"ksBody: НЕ ПОЛУЧЕН" & vbCrLf
GoTo NextBody
End If
Report = Report & _
"ksBody: ОК" & vbCrLf
' ====================================================
' ksEntity
' ====================================================
On Error Resume Next
Err.Clear
Set Entity = Body5
On Error GoTo FatalError
If Entity Is Nothing Then
Report = Report & _
"ksEntity: НЕ ПОЛУЧЕН" & vbCrLf
GoTo NextBody
End If
Report = Report & _
"ksEntity: ОК" & vbCrLf
' ====================================================
' IsIt(o3d_body)
' ====================================================
On Error Resume Next
Err.Clear
If Entity.IsIt(115) Then
Report = Report & _
"IsIt(o3d_body=115): TRUE" & vbCrLf
Else
Report = Report & _
"IsIt(o3d_body=115): FALSE" & vbCrLf
End If
If Err.Number <> 0 Then
Report = Report & _
"IsIt: ОШИБКА " & _
Err.Number & _
" / " & _
Err.Description & vbCrLf
Err.Clear
End If
On Error GoTo FatalError
' ====================================================
' GetFeature
' ====================================================
On Error Resume Next
Err.Clear
Set Feature = Entity.GetFeature
If Err.Number <> 0 Then
Report = Report & _
"GetFeature: ОШИБКА " & _
Err.Number & _
" / " & _
Err.Description & vbCrLf
Err.Clear
End If
On Error GoTo FatalError
If Feature Is Nothing Then
Report = Report & _
"GetFeature: НЕ ПОЛУЧЕН" & vbCrLf
GoTo NextBody
End If
Report = Report & _
"GetFeature: ОК" & vbCrLf
Report = Report & _
"Feature TypeName: " & _
TypeName(Feature) & vbCrLf
' ====================================================
' GetObject У ksFeature
'
' ВОТ ЭТО СЕЙЧАС ГЛАВНАЯ ПРОВЕРКА
' ====================================================
On Error Resume Next
Err.Clear
Set ObjFromFeature = Feature.GetObject
If Err.Number <> 0 Then
Report = Report & _
"Feature.GetObject: ОШИБКА " & _
Err.Number & _
" / " & _
Err.Description & vbCrLf
Err.Clear
End If
On Error GoTo FatalError
If ObjFromFeature Is Nothing Then
Report = Report & _
"Feature.GetObject: НЕ ПОЛУЧЕН" & vbCrLf
Else
Report = Report & _
"Feature.GetObject: ОК" & vbCrLf
Report = Report & _
"Object TypeName: " & _
TypeName(ObjFromFeature) & vbCrLf
' =================================================
' ПРОБУЕМ ПОЛУЧИТЬ IBody7
'
' Через присваивание COM-объекта.
' =================================================
On Error Resume Next
Err.Clear
Set Body7 = ObjFromFeature
If Err.Number <> 0 Then
Report = Report & _
"IBody7 через GetObject: НЕ ПОЛУЧЕН" & vbCrLf
Report = Report & _
"Ошибка: " & _
Err.Number & _
" / " & _
Err.Description & vbCrLf
Err.Clear
Else
If Body7 Is Nothing Then
Report = Report & _
"IBody7: Nothing" & vbCrLf
Else
Report = Report & _
"IBody7: ОК" & vbCrLf
' =========================================
' BodyId
' =========================================
Report = Report & _
"BodyId: " & _
ПрочитатьСвойство(Body7, "BodyId") & _
vbCrLf
' =========================================
' Name
' =========================================
Report = Report & _
"Name: " & _
ПрочитатьСвойство(Body7, "Name") & _
vbCrLf
' =========================================
' Marking
' =========================================
Report = Report & _
"Marking: " & _
ПрочитатьСвойство(Body7, "Marking") & _
vbCrLf
' =========================================
' FileName
' =========================================
Report = Report & _
"FileName: " & _
ПрочитатьСвойство(Body7, "FileName") & _
vbCrLf
End If
End If
On Error GoTo FatalError
End If
' ====================================================
' ДОПОЛНИТЕЛЬНО:
' пробуем свойства самого ksBody
' ====================================================
Report = Report & vbCrLf & _
"Свойства ksBody:" & vbCrLf
Report = Report & _
" Name: " & _
ПрочитатьСвойство(Body5, "Name") & _
vbCrLf
Report = Report & _
" Marking: " & _
ПрочитатьСвойство(Body5, "Marking") & _
vbCrLf
Report = Report & _
" FileName: " & _
ПрочитатьСвойство(Body5, "FileName") & _
vbCrLf
NextBody:
Set Body5 = Nothing
Set Entity = Nothing
Set Feature = Nothing
Set ObjFromFeature = Nothing
Set Body7 = Nothing
DoEvents
Next i
Report = Report & vbCrLf & _
"==================================================" & vbCrLf & _
"КОНЕЦ ДИАГНОСТИКИ" & vbCrLf & _
"==================================================" & vbCrLf
SaveReport:
FilePath = _
Environ$("TEMP") & _
"\Kompas_Body_Diagnostic.txt"
F = FreeFile
Open FilePath For Output As #F
Print #F, Report
Close #F
Shell _
"notepad.exe " & _
Chr$(34) & _
FilePath & _
Chr$(34), _
vbNormalFocus
Exit Sub
FatalError:
Report = Report & vbCrLf & _
"==================================================" & vbCrLf & _
"КРИТИЧЕСКАЯ ОШИБКА" & vbCrLf & _
"Номер: " & Err.Number & vbCrLf & _
"Описание: " & Err.Description & vbCrLf
On Error Resume Next
FilePath = _
Environ$("TEMP") & _
"\Kompas_Body_Diagnostic.txt"
F = FreeFile
Open FilePath For Output As #F
Print #F, Report
Close #F
Shell _
"notepad.exe " & _
Chr$(34) & _
FilePath & _
Chr$(34), _
vbNormalFocus
End Sub
' ============================================================
' БЕЗОПАСНОЕ ЧТЕНИЕ СВОЙСТВА
' ============================================================
Private Function ПрочитатьСвойство( _
ByVal Obj As Object, _
ByVal PropertyName As String) As String
Dim V As Variant
ПрочитатьСвойство = "НЕ ПОЛУЧЕНО"
If Obj Is Nothing Then Exit Function
On Error Resume Next
Err.Clear
V = CallByName( _
Obj, _
PropertyName, _
VbGet)
If Err.Number <> 0 Then
ПрочитатьСвойство = _
"НЕ ПОЛУЧЕНО (" & _
Err.Number & _
")"
Err.Clear
On Error GoTo 0
Exit Function
End If
If IsNull(V) Then
ПрочитатьСвойство = "NULL"
ElseIf IsEmpty(V) Then
ПрочитатьСвойство = "EMPTY"
ElseIf IsObject(V) Then
ПрочитатьСвойство = _
"[OBJECT " & _
TypeName(V) & _
"]"
Else
ПрочитатьСвойство = CStr(V)
End If
On Error GoTo 0
End Function