CATIA VBA从选择项获取Part Number时遇“Catastrophic failure”错误求助
解决CATIA VBA从Enovia关联对象获取PartNumber的问题
问题分析
从Enovia5导入的CATIA对象,选择项的类型存在两种差异场景:
- 直接选中已打开的Part文档(
TypeName返回Document,实际为PartDocument) - 选中Product结构中的Part实例(属于
Product对象,可通过LeafProduct访问属性)
部分Enovia代理对象会导致访问LeafProduct时抛出“Catastrophic failure”错误,而直接声明Part或PartDocument会出现类型不匹配,根源是Selection的Value类型不固定。
解决方案代码
Dim selItem As Object Dim partNum As String Set selItem = CATIA.ActiveDocument.Selection.Item(1).Value ' 分场景处理不同类型的选择对象 Select Case TypeName(selItem) Case "PartDocument" ' 直接获取Part文档的PartNumber partNum = selItem.Part.PartNumber Case "Product" ' 处理Product结构中的Part实例,增加错误捕获规避Enovia代理对象异常 On Error Resume Next partNum = selItem.LeafProduct.PartNumber If Err.Number <> 0 Then ' 尝试从关联的ReferenceProduct获取 If Not selItem.ReferenceProduct Is Nothing Then partNum = selItem.ReferenceProduct.PartNumber End If End If On Error GoTo 0 Case "Document" ' 兼容TypeName返回Document但实际为PartDocument的情况 If TypeOf selItem Is PartDocument Then partNum = selItem.Part.PartNumber End If End Select ' 输出结果 If partNum <> "" Then MsgBox "Part Number: " & partNum Else MsgBox "无法获取Part Number" End If
关键要点
- 用
Object类型接收选择对象,避免提前固定类型声明导致的类型不匹配 - 结合
TypeName和TypeOf做类型判断,覆盖直接打开的Part文档、Product结构中的Part实例两种场景 - 针对Enovia代理对象的异常情况,增加错误捕获机制,同时尝试从
ReferenceProduct属性获取PartNumber(部分Enovia关联对象的PartNumber存储在此处) - 不要无防护直接访问
LeafProduct,否则容易触发“Catastrophic failure”错误中断程序
内容的提问来源于stack exchange,提问作者N.TW12
相关产品推荐
相关产品推荐

