前言

这个例子介绍的是如何改变 Revit 的保存命令的行为。

内容

程序的步骤:

  1. 启动监测
  2. 修改文件,点击保存
  3. 选择 Add revision now

程序逻辑

菜单的创建与菜单文字的切换

IExternalApplication中创建菜单,并将按钮传给 PostCommandRevisionMonitorCommand,方便后续文字的修改。

namespace Revit.SDK.Samples.PostCommandWorkflow.CS
{[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)][Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]public class Application : IExternalApplication{public Result OnStartup(UIControlledApplication application){CreateUIPanel(application);return Result.Succeeded;}/// 在 addin 面板上创建菜单private void CreateUIPanel(UIControlledApplication application){RibbonPanel rp = application.CreateRibbonPanel("UI");PushButtonData setupMonitor = new PushButtonData("Setup_Revision_Monitor", "Setup Revision Monitor",addAssemblyPath,typeof(Revit.SDK.Samples.PostCommandWorkflow.CS.PostCommandRevisionMonitorCommand).FullName);PushButton setupMonitorPB = rp.AddItem(setupMonitor) as PushButton;SetIconsForPushButton(setupMonitorPB, Revit.SDK.Samples.PostCommandWorkflow.CS.Properties.Resources.RevisionIcon);// 把 setupMonitorPB 传给 PostCommandRevisionMonitorCommand,方便后续切换文字PostCommandRevisionMonitorCommand.SetPushButton(setupMonitorPB);}}
}

文字切换的逻辑:

// PostCommandRevisionMonitorCommand
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{Document doc = commandData.Application.ActiveUIDocument.Document;if (monitor == null){monitor = new PostCommandRevisionMonitor(doc);monitor.Activate();commandButton.ItemText = "Remove Revision Monitor";}else{ monitor.Deactivate();monitor = null;commandButton.ItemText = "Setup Revision Monitor";}return Result.Succeeded;
}

改变保存命令的行为

从上面的 PostCommandRevisionMonitorCommand.Execute 可知,第一次启动命令,打开监测:

monitor = new PostCommandRevisionMonitor(doc);
monitor.Activate();
commandButton.ItemText = "Remove Revision Monitor";

注册 DocumentSaving 事件:

public void Activate()
{// 保存修订的次数,用于后续的判断storedRevisionCount = GetRevisionCount(document);// 注册事件document.DocumentSaving += OnSavingPromptForRevisions;
}

定义 DocumentSaving 事件行为:

private void OnSavingPromptForRevisions(object sender, DocumentSavingEventArgs args)
{Document doc = (Document)sender;UIApplication uiApp = new UIDocument(doc).Application;// 如果文件被修改了if (doc.IsModified){// 判断修订的次数和保存的修订次数的差异int revisionCount = GetRevisionCount(doc);if (revisionCount <= storedRevisionCount){// 显示上图的对话框TaskDialog td = new TaskDialog("Revisions not created.");td.MainIcon = TaskDialogIcon.TaskDialogIconWarning;td.MainInstruction = "Changes have been made to this document, but no new revision has been created.";td.ExpandedContent = "Because the document has been released, it is typically required to issue a new " +"revision number with any change.";td.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, "Add revision now");td.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, "Cancel save");td.AddCommandLink(TaskDialogCommandLinkId.CommandLink3, "Proceed with save (not recommended).");td.TitleAutoPrefix = false;td.AllowCancellation = false;TaskDialogResult result = td.Show();switch (result){case TaskDialogResult.CommandLink1:  // Add revision now{// 如果选择 Add revision now,则取消保存,隐藏默认的"Document not saved" 对话框,弹出修订对话框args.Cancel();uiApp.DialogBoxShowing += HideDocumentNotSaved;PromptToEditRevisionsAndResave(uiApp);break;}case TaskDialogResult.CommandLink2:  // Cancel save{// cancel saving onlyargs.Cancel();break;}case TaskDialogResult.CommandLink3:  // Proceed with save{// do nothingbreak;}}}else{storedRevisionCount = revisionCount;}}
}

隐藏默认的文件未保存对话框,uiApp.DialogBoxShowing += HideDocumentNotSaved

private void HideDocumentNotSaved(object sender, DialogBoxShowingEventArgs args)
{TaskDialogShowingEventArgs tdArgs = args as TaskDialogShowingEventArgs;// "Document not saved" 对话框,Revit 没有提供一个对应的 id,这里直接通过查找文本来查找。if (tdArgs != null && tdArgs.Message.Contains("not saved"))args.OverrideResult(0x0008);
}

弹出修订对话框:

private void PromptToEditRevisionsAndResave(UIApplication application)
{// 设置外部事件,在 ReactToRevisionsAndSchedulesCommand 中被触发。externalEvent = ExternalEvent.Create(new PostCommandRevisionMonitorEvent(this));// 查找和绑定命令,设置命令触发前事件RevitCommandId id = RevitCommandId.LookupPostableCommandId(PostableCommand.SheetIssuesOrRevisions);if (binding == null){binding = application.CreateAddInCommandBinding(id);}binding.BeforeExecuted += ReactToRevisionsAndSchedulesCommand;// Post the revision editing commandapplication.PostCommand(id);
}

设置修订命令被执行之后的一系列动作:

/// 设置修订命令被执行之后的一系列动作
private void ReactToRevisionsAndSchedulesCommand(object sender, BeforeExecutedEventArgs args)
{if (externalEvent != null)externalEvent.Raise();
}
// PostCommandRevisionMonitorEvent : IExternalEventHandler
public void Execute(UIApplication app)
{monitor.CleanupAfterRevisionEdit(app);
}// class PostCommandRevisionMonitor
private void CleanupAfterRevisionEdit(UIApplication uiApp)
{// Remove dialog box showinguiApp.DialogBoxShowing -= HideDocumentNotSaved;if (binding != null)binding.BeforeExecuted -= ReactToRevisionsAndSchedulesCommand;externalEvent = null;// Repost the save command,保存文件uiApp.PostCommand(RevitCommandId.LookupPostableCommandId(PostableCommand.Save));
}

Notes

  1. Revit 的命令可以自己去触发 uiApp.PostCommand
  2. 命令绑定 application.CreateAddInCommandBinding
  3. 显示Revit对话框的时候有一个可操作时机 uiApp.DialogBoxShowing

Revit SDK 介绍:PostCommandWorkflow相关推荐

  1. Revit SDK 介绍:API Sketched Winder Stairs 创建扇形踏步楼梯

    前言 SDK 里面一个复杂的创建楼梯的例子. 程序逻辑 选择模型线,如果是两条,这是L行的楼梯,如果选中三条,则是U行的楼梯: 将 UI 界面的参数转化为内部的参数 创建扇形踏步楼梯 选择模型线 入口 ...

  2. Revit SDK 介绍:ModelessForm_ExternalEvent ModelessForm_IdlingEvent

    前言 ModelessForm_ExternalEvent,这个例子主要介绍的是 Revit External Event,用来生成非模态对话框.可以理解为,在不打断 Revit 正常操作的情况下,响 ...

  3. 系统SDK介绍-02

    系统SDK介绍 打开相册选择图片 打开相册选择视频 打开相机拍摄图片 打开相机拍摄视频 配置权限: 在info.plist文件中添加需要的权限 相机权限:Privacy - Camera Usage ...

  4. iOS SDK 介绍及导入

    iOS SDK 介绍 环信 SDK 为用户开发 IM 相关的应用提供的一套完善的开发框架.包括以下几个部分: SDK_Core: 为核心的消息同步协议实现,完成与服务器之间的信息交换. SDK: 是基 ...

  5. Revit SDK EXTENSIONS(软件开发工具包扩展)是什么

    Revit SDK EXTENSIONS(软件开发工具包扩展)是什么 Extension SDK 是开发环境,以快速开发为目的,帮助开发者以Revit扩展技术为基础创建活动插件. Extension ...

  6. revit sdk java api,REVIT 2016二次开发环境的搭建

    1.安装REVIT2016软件,这个直接在autodesk上就可以找到,找到直接安装就好了 2.安装VS环境. 3.安装REVIT 2016 SDK 下载地址在http://usa.autodesk. ...

  7. yocto Extensible SDK介绍

    yocto Extensible SDK介绍 使用yocto Extensible SDK 1.1 为什么使用yocto Extensible SDK及其包含了什么 1.2 安装 Extensible ...

  8. ST17H66 低功耗蓝牙SOC开发(1)—— SDK介绍

    目录 1.资料获取 2.开发环境 3.ST17H66开发SDK获取 4.SDK介绍 4.1 components 4.2 example 4.3 lib 4.4 misc 1.资料获取 伦茨17Hxx ...

  9. 叠幻AR SDK介绍

    SDK介绍 叠幻AR SDK是北京叠幻三维科技有限公司拥有完全自主知识产权的增强现实AR核心算法软件套件.叠幻AR SDK在浏览器端(Web)和小程序端通过极致优化增强现实AR的核心算法,为企业客户提 ...

最新文章

  1. 使用wireshark工具获得直连设备的IP地址
  2. 20165201 实验五 网络编程与安全
  3. 伯努利分布方差_统计知识(4)——分布
  4. ext3文件系统反删除利器-ext3grep
  5. php tp 重加载页面,thinkPHP线上自动加载异常与修复方法实例分析
  6. [Android Studio] Android Studio如何查看branch列表及切换branch(转载)
  7. Spring 3.2矩阵变量是什么? –第2部分:代码
  8. 三重框架构建和威胁情报及时可达,山石网科发布StoneOS 5.5R9
  9. mysql查询php输出表格_MySql数据库查询结果用表格输出PHP代码示例_PHP教程
  10. Google Pixel 2拍照黑科技:单摄搞定背景虚化+内部潜伏神秘芯片
  11. SourceTree Win10 安装不成功解决过程记录
  12. 想要成为一名优秀的程序员?这8本书告诉你
  13. 【转】刘强东个人标签太明显,京东没有二号人物
  14. 串联四足机器人基础知识
  15. 关于自己看百度修改c盘下的用户名,更改了注册表里的profilelist文件,重启后恢复原始桌面并提示注销问题与解决方案。
  16. 用php表示掷骰子两次比大小,python学习之掷骰子游戏
  17. MySQL5.6建索引时遇到 Specified key was too long; max key length is 767 bytes错误提示解决办法
  18. Linux-QT5.9学习笔记——事件
  19. 【刘润】读刘润老师公众号笔记
  20. FDC2214/2114使用说明及资料分享

热门文章

  1. tftp协议 服务器怎么返回错误信息,tftp协议的实现
  2. ROM PROM EPROM EERROM FLSAH区别
  3. OpenHarmony-Hi3518EV300挂载烧写
  4. 1,3,4,6-四-O-乙酰基-2-叠氮-2-脱氧-α-D-吡喃半乳糖/cas:67817-30-5
  5. “水果”:哪种水果最有营养
  6. CAN FD 协议联网和测试
  7. vue 给数组的每一个对象加一个新字段
  8. 逆战Vue自定义事件
  9. IAST技术进阶系列(三):高并发高可用场景支持
  10. 棋盘覆盖问题——分治法——代码清晰易懂