这里再对 Revit 通过 API 打开和关闭文件的操作做一些总结。

打开文件

有两种方式:

在UI上显示,可以用 Autodesk.Revit.UI::UIApplication 下面的OpenAndActivateDocument;

不在UI上显示,可以用Autodesk.Revit.ApplicationServices::Application下面的Application.OpenDocumentFile。

可以参考:Revit API 开发 (11): 不在UI上打开文件,获取文件中的信息 - BasicFileInfo & Application.OpenDocumentFile

然而,很多时候打开文件的时候,我们还想做一些其它的操作,那么该怎么办呢?

在打开文件之前和之后做操作

通常有时候需要在文件打开之前和之后做一些操作,比如做一些记录,亦或者有简单文件检验和效验功能。那么,就需要用到相关的事件:ControlledApplication::DocumentOpening 和 ControlledApplication::DocumentOpened。

通常,如果用到了这些事件,那么说明你的应用已经相当复杂了,很可能实现的方式采用的是IExternalApplication。

// OnShutdown 和 OnStartup 是 IExternalApplication 仅有的两个接口,都需要实现。
// application.ControlledApplication.DocumentOpened
// 在 OnStartup 的时候添加,处理函数,在 OnShutdown 的时候去掉自己添加的处理函数。
// 在事件处理函数中,可以通过 e.Document 来获得对应的 Document。
// 这里是 DocumentOpened,那么是文档已经被打开了,所以它的内容应该是有效的。
// 如果是 DocumentOpening,最好自己判断一下。
namespace A {
public class ExternalApp : IExternalApplication
{
public Result OnShutdown(UIControlledApplication application)
{
application.ControlledApplication.DocumentOpened -= ControlledApplication_DocumentOpened;
return Result.Succeeded;
}
public Result OnStartup(UIControlledApplication application)
{
application.ControlledApplication.DocumentOpened += ControlledApplication_DocumentOpened;
return Result.Succeeded;
}
private void ControlledApplication_DocumentOpened(object sender, Autodesk.Revit.DB.Events.DocumentOpenedEventArgs e)
{
e.Document;

关闭和保存文件

文件的关闭和保存,本质上是连在一起的。可以直接调用 Document::Close 这个方法,不传参数,那么就是保存并且关闭。如果传参数,是一个 布尔变量,真则保存关闭,假则不保存关闭。

**如果是最后一个打开的文件,那么,它是不能被关闭的。**这个时候,你有两种选择,第一个就是你去打开另外一个文件,然后把这个关掉。另外一个就是调用UIApplication::PostCommand:

// 如果是在 IExternalCommand 中调用,那么它会在命令结束之后被调用。

// 如果你想对被关闭的文件做什么操作,那么你需要借助 DocumentClosed 这个事件了。

// (事件的使用方式和上面类似)

uiApplication.PostCommand(RevitCommandId.LookupPostableCommandId(PostableCommand.Close));

1

2

3

4

如果仅仅想要保存,那么可以调用,Document::Save。同理,也有另存为Document::SaveAs。

————————————————