SolidWorks API删除修订表异常求助:多方法失效排查
SolidWorks API宏删除修订表的兼容性问题解决思路
问题背景
编写宏删除SolidWorks修订表时遇到兼容性问题:
- 部分图纸适用方法A,部分适用方法B,另有部分图纸两种方法均失效
- 怀疑问题与法国来源的图纸模板、表格位置有关
- 非专业程序员,依赖资料搜集、VB基础及录制宏编写代码,此前均能成功,此次卡壳
现有两种方法
方法A
' 获取表格的项目名称 sName = swTable.GetAnnotation.GetName & "@Sheet1" ' 删除表格 Set Part = swApp.ActiveDoc boolstatus = Part.Extension.SelectByID2(sName, "REVISIONTABLE", 0, 0, 0, False, 0, Nothing, 0) Part.EditDelete
已加入方法B的vSheetNames逻辑适配不同图纸名称(含法语名称),但仅对原始图纸格式有效,对法语版本图纸完全无效。
方法B(来源网络)
vSheetNames = swDraw.GetSheetNames For i = 0 To UBound(vSheetNames) swDraw.ActivateSheet vSheetNames(i) ' Debug.Print vSheetNames(i) Set swSheet = swDraw.GetCurrentSheet Set RevTableAnn = swSheet.RevisionTable If Not RevTableAnn Is Nothing Then ' Debug.Print "Revision Table is SOMETHING! Double check for revTableFeat now!" Set revTableFeat = RevTableAnn.RevisionTableFeature If revTableFeat Is Nothing Then ' Debug.Print "Revision table feature is nothing but a revision table exists!" Set swTableAnn = RevTableAnn Set swAnn = swTableAnn.GetAnnotation boolstatus = swAnn.Select3(False, swSelData) bRet = swModelDocExt.DeleteSelection2(swDeleteSelectionOptions_e.swDelete_Absorbed) Debug.Print "Revision table annotation deleted? " & bRet Else ' Debug.Print "Revision table feature is present! Delete it!" Set swFeat = RevTableAnn.RevisionTableFeature.GetFeature bRet = swFeat.Select2(False, 0) bRet = swModelDocExt.DeleteSelection2(swDeleteSelectionOptions_e.swDelete_Absorbed) End If Else ' Debug.Print "Revision Table is nothing! Sheet can be skipped!" End If Next
仅对部分图纸有效,其余仍失效。
可能原因分析
- 模板本地化差异:法国来源模板的修订表可能以**注解(Annotation)而非特征(Feature)**形式存在,或命名规则含法语特殊字符/本地化标识,导致方法A的名称匹配失效
- 表格位置差异:部分修订表可能嵌入在**图纸格式(Sheet Format)**中,而非图纸页(Sheet)本身,这会绕过
swSheet.RevisionTable的检索逻辑 - 硬编码依赖:方法A中硬编码的
@Sheet1在法语图纸中可能不适用(法语图纸页名通常为Feuille1),动态页名获取逻辑未完全覆盖
改进的综合解决方案
结合两种方法的逻辑,同时处理图纸页和图纸格式中的修订表,增加鲁棒性:
Dim swApp As SldWorks.SldWorks Dim swDraw As SldWorks.DrawingDoc Dim swSheet As SldWorks.Sheet Dim swSheetFormat As SldWorks.SheetFormat Dim vSheetNames As Variant Dim i As Integer Dim RevTableAnn As SldWorks.RevisionTableAnnotation Dim swModelDocExt As SldWorks.ModelDocExtension Dim swSelData As SldWorks.SelectionData Set swApp = Application.SldWorks Set swDraw = swApp.ActiveDoc Set swModelDocExt = swDraw.Extension Set swSelData = swApp.CreateSelectData vSheetNames = swDraw.GetSheetNames For i = 0 To UBound(vSheetNames) swDraw.ActivateSheet vSheetNames(i) Set swSheet = swDraw.GetCurrentSheet ' 处理图纸页上的修订表 Set RevTableAnn = swSheet.RevisionTable If Not RevTableAnn Is Nothing Then DeleteRevTable RevTableAnn, swModelDocExt, swSelData End If ' 处理图纸格式中的修订表(法国模板常见场景) Set swSheetFormat = swSheet.GetSheetFormat If Not swSheetFormat Is Nothing Then Set RevTableAnn = swSheetFormat.RevisionTable If Not RevTableAnn Is Nothing Then DeleteRevTable RevTableAnn, swModelDocExt, swSelData End If End If Next i ' 封装删除逻辑的子过程 Sub DeleteRevTable(revTableAnn As SldWorks.RevisionTableAnnotation, modelExt As SldWorks.ModelDocExtension, selData As SldWorks.SelectionData) Dim revTableFeat As SldWorks.RevisionTableFeature Dim swFeat As SldWorks.Feature Dim swAnn As SldWorks.Annotation Dim bRet As Boolean Set revTableFeat = revTableAnn.RevisionTableFeature If Not revTableFeat Is Nothing Then ' 以特征方式删除 Set swFeat = revTableFeat.GetFeature bRet = swFeat.Select2(False, 0) bRet = modelExt.DeleteSelection2(swDeleteSelectionOptions_e.swDelete_Absorbed) Debug.Print "特征式修订表删除状态: " & bRet Else ' 以注解方式删除 Set swAnn = revTableAnn.GetAnnotation bRet = swAnn.Select3(False, selData) bRet = modelExt.DeleteSelection2(swDeleteSelectionOptions_e.swDelete_Absorbed) Debug.Print "注解式修订表删除状态: " & bRet End If End Sub
额外排查建议
- 打开失效的法语图纸,右键修订表→属性,确认表格属于特征还是注解,以及是否位于图纸格式中
- 在代码中增加Debug输出:获取
RevTableAnn后,打印revTableAnn.GetAnnotation.GetName和TypeName(revTableAnn.RevisionTableFeature),排查本地化命名差异 - 方法A中替换硬编码的页名,用
swSheet.GetName动态获取,避免语言差异导致的名称拼接错误
内容的提问来源于stack exchange,提问作者demarcjp
相关产品推荐
相关产品推荐

