当前位置: 首页 > news >正文

【CATIA的二次开发24】抽象对象Document涉及文档生命周期的方法

在CATIA VBA开发中,Document对象是最核心、最基础的对象之一。它代表了当前在CATIA会话中打开的一个文档(文件)。
几乎所有与文件操作、模型访问相关的操作都始于获取一个Document对象。Document对象包含多种方法和属性,以下介绍Document对象方法和属性

一、Document对象方法

1、方法和属性列表

2、方法分类

分类方法功能描述适用文档类型示例代码
文档激活控制Activate激活文档使其成为当前活动文档所有文档类型targetDoc.Activate
NewWindow为文档创建新窗口所有文档类型doc.NewWindow
文档生命周期Close关闭文档所有文档类型doc.Close catSaveChanges
Save保存文档所有文档类型If Not doc.Saved Then doc.Save
SaveAs文档另存为所有文档类型doc.SaveAs “C:\NewName.CATPart”
数据交换ExportData导出文档为其他格式所有文档类型doc.ExportData “C:\export.stp”, “stp”
交互选择Indicate2D在2D环境(工程图)中交互选择元素DrawingDocumentSet elem = doc.Indicate2D(“选择元素”, catSelectionFilterDimension)
Indicate3D在3D环境(零件/装配)中交互选择元素PartDocument
ProductDocument
Set face = doc.Indicate3D(“选择面”, catSelectionFilterFace)
对象引用CreateReferenceFromName通过名称创建对象引用所有文档类型Set ref = doc.CreateReferenceFromName(“Part1\Sketch.1”)
GetItem通过名称获取文档中的项目(参数、关系等)所有文档类型Set param = doc.GetItem(“LengthParam”)
工作环境控制GetWorkbench获取指定工作台对象所有文档类型Set pdWB = doc.GetWorkbench(“PartDesignWorkbench”)
选择过滤CreateFilter创建选择过滤器所有文档类型Set filter = doc.CreateFilter(“FaceFilter”)
RemoveFilter移除选择过滤器所有文档类型doc.RemoveFilter filter

二、方法~文档生命周期(Close方法、Save方法和SaveAs方法)

1、Close方法

在 CATIA VBA 开发中,Document 对象的 Close 方法 用于关闭当前文档。
这是管理文档生命周期的重要方法,允许开发者以编程方式控制文档的关闭行为,特别是处理未保存的更改时。

  • 方法功能
    • 关闭当前文档,释放系统资源
    • 可选择保存或不保存更改
    • 关闭后文档对象引用失效
  • 方法语法
    Sub Close([SaveChanges As CatSaveStatus])
    
    • SaveChanges (可选参数):
      指定关闭时如何处理未保存的更改,使用 CatSaveStatus 枚举值:

      • catSaveForClosing (默认值):提示用户保存(如果有未保存更改)
      • catDoNotSaveChanges:不保存直接关闭
      • catSaveChanges:保存更改后关闭
      参数值常量行为
      保存更改catSaveChanges1保存更改后关闭
      不保存更改catDoNotSaveChanges2不保存直接关闭
      未指定参数--对未保存文档弹出保存提示框
  • 使用示例
    1、完成操作后清理资源;2、批量处理多个文档;3、实现文档自动清理机制;4、关闭不需要的临时文档。

场景一:默认关闭(提示保存)

Dim doc As Document
Set doc = CATIA.ActiveDocument
doc.Close  ' 等同于 doc.Close catSaveForClosing

场景二:强制不保存关闭

doc.Close catDoNotSaveChanges  ' 放弃所有未保存的更改

场景三:保存后关闭

doc.Close catSaveChanges  ' 自动保存后关闭文档

场景四:关闭所有打开文档

Dim docs As Documents
Set docs = CATIA.Documents' 必须从后向前遍历(关闭后集合会变化)
For i = docs.Count To 1 Step -1docs.Item(i).Close catDoNotSaveChanges  ' 不保存关闭所有
Next i
  • 关键特性与注意事项
    1. 未保存文档处理
      新建未保存文档使用 catSaveChanges 会触发"另存为"对话框
    Dim newDoc As Document
    Set newDoc = CATIA.Documents.Add("Part")
    newDoc.Close catSaveChanges  ' 弹出保存对话框
    
    1. 关闭后对象状态
      关闭后文档对象即失效,继续访问会引发运行时错误
    doc.Close
    Debug.Print doc.Name  ' 错误 424: 对象已释放!
    
    1. 只读文档行为
    Set doc = CATIA.Documents.Open("C:\ReadOnly.Part", True) ' 以只读打开
    doc.Close catSaveChanges  ' 忽略保存请求直接关闭
    
    1. 与保存状态的关系
    If doc.Saved = False Then' 有未保存更改时的特殊处理doc.Close catSaveChanges
    Elsedoc.Close catDoNotSaveChanges
    End If
    
    1. 错误处理
    On Error Resume Next
    doc.Close
    If Err.Number = -2147220698 ThenMsgBox "文档已被其他进程锁定"
    ElseIf Err.Number <> 0 ThenMsgBox "关闭错误: " & Err.Description
    End If
    
    1. ⚠️ 重要提示:关闭文档后,所有关联对象(如 Part、Product 等)都会失效。
      继续使用这些对象引用将导致"对象已释放"错误(Error 424)。
  • 最佳实践
    1. 安全关闭函数
    Sub SafeCloseDocument(targetDoc As Document, Optional saveOption As CatSaveStatus = catSaveForClosing)On Error Resume Next' 检查文档是否有效If targetDoc Is Nothing Then Exit Sub' 检查文档是否已关闭Dim testName As StringtestName = targetDoc.Name  ' 尝试访问属性If Err.Number = 0 ThentargetDoc.Close saveOptionElseErr.Clear  ' 清除错误End If
    End Sub
    
    1. 关闭前保存检查
    Sub CloseWithBackup(doc As Document)If Not doc.Saved ThenDim backupPath As StringbackupPath = "C:\Backups\" & Format(Now, "yyyymmdd_hhmmss_") & doc.Namedoc.SaveAs backupPath  ' 创建备份MsgBox "已创建备份: " & backupPathEnd Ifdoc.Close catDoNotSaveChanges
    End Sub
    

2、Save方法

在 CATIA VBA 开发中,Document.Save 方法 是文档持久化的核心操作,用于将当前文档的修改保存到其关联文件。
这个方法在自动化工作流中至关重要,确保设计变更被正确持久化,避免数据丢失。

  • 方法功能
    • 将文档保存到当前关联文件
    • 对新建文档会触发"另存为"对话框
    • 更新文件修改时间和版本信息
    • 清除"未保存"状态标志
    • 新建文档:弹出"另存为"对话框
    • 只读文档:保存失败,返回错误
    • 未更改文档:无操作,直接返回
  • 方法语法
    Sub Save()
    
    • 对已保存过的文档:覆盖原文件
    • 对新文档:触发"另存为"对话框(等同于 SaveAs)
  • 关键特性与行为
    1、定期自动保存;2、关键操作后保存进度;3、文档修改后持久化存储;4、准备导出或共享前的保存。

场景一:保存状态管理

Dim doc As Document
Set doc = CATIA.ActiveDocument' 检查文档是否需要保存
If Not doc.Saved Then' 执行保存操作doc.SaveMsgBox "文档已保存: " & doc.FullName
ElseMsgBox "文档无修改,无需保存"
End If

场景二:新文档处理

' 创建新文档
Dim newDoc As Document
Set newDoc = CATIA.Documents.Add("Part")' 添加内容...
newDoc.Part.HybridBodies.Add' 首次保存会触发另存为行为
newDoc.Save  ' 将弹出保存对话框

场景三:只读文档处理

If doc.ReadOnly Then' 只读文档需要另存为doc.SaveAs "C:\Modified_" & doc.Name
Elsedoc.Save
End If
  • 高级应用场景

场景一: 批量保存所有修改文档

Sub SaveAllModifiedDocuments()Dim docs As DocumentsSet docs = CATIA.DocumentsDim doc As DocumentFor Each doc In docsIf Not doc.Saved And Not doc.ReadOnly ThenOn Error Resume Next ' 错误处理doc.SaveIf Err.Number = 0 ThenLogAction "已保存: " & doc.NameElseLogAction "保存失败: " & doc.Name & " - " & Err.DescriptionEnd IfOn Error GoTo 0End IfNext
End Sub

场景二: 带版本控制的自动保存

Sub AutoSaveWithVersioning()Dim doc As DocumentSet doc = CATIA.ActiveDocumentDim version As Integer' 获取当前版本号version = GetDocumentVersion(doc)' 生成版本化文件名Dim newPath As StringnewPath = "C:\Versions\" & GetBaseName(doc.Name) & "_v" & version + 1 & ".CATPart"' 执行版本保存doc.SaveAs newPathUpdateVersionMetadata(doc, version + 1)
End SubFunction GetDocumentVersion(doc As Document) As Integer' 从自定义属性获取版本号On Error Resume NextGetDocumentVersion = doc.Part.UserRefProperties.Item("Version").ValueIf Err.Number <> 0 ThenGetDocumentVersion = 1 ' 默认版本End If
End Function

场景三: 保存前自动清理

Sub CleanAndSave()Dim doc As DocumentSet doc = CATIA.ActiveDocument' 仅零件文档需要清理If doc.Type = "Part" Then' 压缩历史记录doc.Part.CompressHistory' 删除空几何图形集Dim hybridBody As HybridBodyFor Each hybridBody In doc.Part.HybridBodiesIf hybridBody.HybridShapes.Count = 0 ThenhybridBody.DeleteEnd IfNextEnd If' 执行保存doc.Save
End Sub

场景四:保存到云存储

Sub SaveToCloudStorage()Dim doc As DocumentSet doc = CATIA.ActiveDocument' 本地临时保存Dim tempPath As StringtempPath = Environ("TEMP"
http://www.xdnf.cn/news/957691.html

相关文章:

  • Python文本序列的类型
  • IDC 观察:一体化数据库如何支撑 GenAI 的数据需求
  • WebGL与Three.js:从基础到应用的关系与原理解析
  • MybatisPlus枚举类的应用与转换
  • L1和L2核心区别 !!--part 2
  • 基于人工智能的闸机人脸识别门禁系统
  • 昇腾CANN集合通信技术解读——细粒度分级流水算法
  • CMake 从 GitHub 下载第三方库并使用
  • 高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
  • ABAP设计模式之---“童子军法则(The Boy Scout Rule)”
  • animate.css详解:轻松实现网页动画效果
  • 制作一款打飞机游戏68:地面敌人
  • CopyOnWriteArrayList和CopyOnWriteArraySet :并发安全的写时复制机制
  • 新手指南:如何轻松将文件压缩为RAR格式
  • Android多媒体——音/视频数据播放(十八)
  • 如何实现高可用评论服务
  • gtxe2_channel内部参数和寄存器配置-CPLL超频设计,超过6.6Gbps的最高速率
  • OpenHarmony按键分发流程(60%)
  • 4.redis集群
  • rk3568的data分区修改
  • 以太网PHY布局布线指南
  • Houdini POP入门学习07 - 分组
  • 热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
  • 论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
  • 游戏开发中常见的战斗数值英文缩写对照表
  • ubuntu中安装conda的后遗症
  • 3439. 重新安排会议得到最多空余时间 I
  • vue3 报错Missing semicolon
  • Yolov8 目标检测蒸馏学习记录
  • 【2025】pycharm 安装