You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

仅对部分图纸有效,其余仍失效。

可能原因分析

  1. 模板本地化差异:法国来源模板的修订表可能以**注解(Annotation)而非特征(Feature)**形式存在,或命名规则含法语特殊字符/本地化标识,导致方法A的名称匹配失效
  2. 表格位置差异:部分修订表可能嵌入在**图纸格式(Sheet Format)**中,而非图纸页(Sheet)本身,这会绕过swSheet.RevisionTable的检索逻辑
  3. 硬编码依赖:方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:53:14