Revit SDK 介绍:PostCommandWorkflow
前言
这个例子介绍的是如何改变 Revit 的保存命令的行为。
内容
程序的步骤:
- 启动监测
- 修改文件,点击保存
- 选择 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
- Revit 的命令可以自己去触发
uiApp.PostCommand
- 命令绑定
application.CreateAddInCommandBinding
- 显示Revit对话框的时候有一个可操作时机
uiApp.DialogBoxShowing
Revit SDK 介绍:PostCommandWorkflow相关推荐
- Revit SDK 介绍:API Sketched Winder Stairs 创建扇形踏步楼梯
前言 SDK 里面一个复杂的创建楼梯的例子. 程序逻辑 选择模型线,如果是两条,这是L行的楼梯,如果选中三条,则是U行的楼梯: 将 UI 界面的参数转化为内部的参数 创建扇形踏步楼梯 选择模型线 入口 ...
- Revit SDK 介绍:ModelessForm_ExternalEvent ModelessForm_IdlingEvent
前言 ModelessForm_ExternalEvent,这个例子主要介绍的是 Revit External Event,用来生成非模态对话框.可以理解为,在不打断 Revit 正常操作的情况下,响 ...
- 系统SDK介绍-02
系统SDK介绍 打开相册选择图片 打开相册选择视频 打开相机拍摄图片 打开相机拍摄视频 配置权限: 在info.plist文件中添加需要的权限 相机权限:Privacy - Camera Usage ...
- iOS SDK 介绍及导入
iOS SDK 介绍 环信 SDK 为用户开发 IM 相关的应用提供的一套完善的开发框架.包括以下几个部分: SDK_Core: 为核心的消息同步协议实现,完成与服务器之间的信息交换. SDK: 是基 ...
- Revit SDK EXTENSIONS(软件开发工具包扩展)是什么
Revit SDK EXTENSIONS(软件开发工具包扩展)是什么 Extension SDK 是开发环境,以快速开发为目的,帮助开发者以Revit扩展技术为基础创建活动插件. Extension ...
- revit sdk java api,REVIT 2016二次开发环境的搭建
1.安装REVIT2016软件,这个直接在autodesk上就可以找到,找到直接安装就好了 2.安装VS环境. 3.安装REVIT 2016 SDK 下载地址在http://usa.autodesk. ...
- yocto Extensible SDK介绍
yocto Extensible SDK介绍 使用yocto Extensible SDK 1.1 为什么使用yocto Extensible SDK及其包含了什么 1.2 安装 Extensible ...
- 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 ...
- 叠幻AR SDK介绍
SDK介绍 叠幻AR SDK是北京叠幻三维科技有限公司拥有完全自主知识产权的增强现实AR核心算法软件套件.叠幻AR SDK在浏览器端(Web)和小程序端通过极致优化增强现实AR的核心算法,为企业客户提 ...
最新文章
- 使用wireshark工具获得直连设备的IP地址
- 20165201 实验五 网络编程与安全
- 伯努利分布方差_统计知识(4)——分布
- ext3文件系统反删除利器-ext3grep
- php tp 重加载页面,thinkPHP线上自动加载异常与修复方法实例分析
- [Android Studio] Android Studio如何查看branch列表及切换branch(转载)
- Spring 3.2矩阵变量是什么? –第2部分:代码
- 三重框架构建和威胁情报及时可达,山石网科发布StoneOS 5.5R9
- mysql查询php输出表格_MySql数据库查询结果用表格输出PHP代码示例_PHP教程
- Google Pixel 2拍照黑科技:单摄搞定背景虚化+内部潜伏神秘芯片
- SourceTree Win10 安装不成功解决过程记录
- 想要成为一名优秀的程序员?这8本书告诉你
- 【转】刘强东个人标签太明显,京东没有二号人物
- 串联四足机器人基础知识
- 关于自己看百度修改c盘下的用户名,更改了注册表里的profilelist文件,重启后恢复原始桌面并提示注销问题与解决方案。
- 用php表示掷骰子两次比大小,python学习之掷骰子游戏
- MySQL5.6建索引时遇到 Specified key was too long; max key length is 767 bytes错误提示解决办法
- Linux-QT5.9学习笔记——事件
- 【刘润】读刘润老师公众号笔记
- FDC2214/2114使用说明及资料分享