Revit二次开发示例:CancelSave
在Revit程序中注册文件操作事件,保存新建或打开文件的信息。当保存时,如果当前文件内容和之前的一致时,则弹出对话框提示并取消保存。对话框中有一个功能链接,点击可打开插件所在目录。
- #region Namespaces
- using System;
- using System.Collections.Generic;
- using System.IO;
- using Autodesk.Revit.ApplicationServices;
- using Autodesk.Revit.Attributes;
- using Autodesk.Revit.DB;
- using Autodesk.Revit.DB.Events;
- using Autodesk.Revit.UI;
- using Autodesk.RevitAddIns;
- #endregion
- namespace CancelSave
- {
- [Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
- [Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
- [Autodesk.Revit.Attributes.Journaling(JournalingMode.NoCommandData)]
- class App : IExternalApplication
- {
- const string thisAddinFileName = "CancelSave.addin";
- Dictionary<int, string> documentOriginalStatusDic = new Dictionary<int, string>();
- int hashcodeofCurrentClosingDoc;
- public Result OnStartup(UIControlledApplication a)
- {
- a.ControlledApplication.DocumentOpened += new EventHandler<DocumentOpenedEventArgs>(ReserveProjectOriginalStatus);
- a.ControlledApplication.DocumentCreated += new EventHandler<DocumentCreatedEventArgs>(ReserveProjectOriginalStatus);
- a.ControlledApplication.DocumentSaving += new EventHandler<DocumentSavingEventArgs>(CheckProjectStatusUpdate);
- a.ControlledApplication.DocumentSavingAs += new EventHandler<DocumentSavingAsEventArgs>(CheckProjectStatusUpdate);
- a.ControlledApplication.DocumentClosing += new EventHandler<DocumentClosingEventArgs>(MemClosingDocumentHashCode);
- a.ControlledApplication.DocumentClosed += new EventHandler<DocumentClosedEventArgs>(RemoveStatusofClosedDocument);
- return Result.Succeeded;
- }
- public Result OnShutdown(UIControlledApplication a)
- {
- a.ControlledApplication.DocumentOpened -= new EventHandler<DocumentOpenedEventArgs>(ReserveProjectOriginalStatus);
- a.ControlledApplication.DocumentCreated -= new EventHandler<DocumentCreatedEventArgs>(ReserveProjectOriginalStatus);
- a.ControlledApplication.DocumentSaving -= new EventHandler<DocumentSavingEventArgs>(CheckProjectStatusUpdate);
- a.ControlledApplication.DocumentSavingAs -= new EventHandler<DocumentSavingAsEventArgs>(CheckProjectStatusUpdate);
- LogManager.LogFinalize();
- return Result.Succeeded;
- }
- private void ReserveProjectOriginalStatus(Object sender, RevitAPIPostDocEventArgs args)
- {
- Document doc = args.Document;
- if (doc.IsFamilyDocument)
- {
- return;
- }
- LogManager.WriteLog(args, doc);
- int docHashCode = doc.GetHashCode();
- string currentProjectStatus = RetrieveProjectCurrentStatus(doc);
- documentOriginalStatusDic.Add(docHashCode, currentProjectStatus);
- LogManager.WriteLog(" Current Project Status: " + currentProjectStatus);
- }
- private void CheckProjectStatusUpdate(Object sender, RevitAPIPreDocEventArgs args)
- {
- Document doc = args.Document;
- if (doc.IsFamilyDocument)
- {
- return;
- }
- LogManager.WriteLog(args, doc);
- string currentProjectStatus = RetrieveProjectCurrentStatus(args.Document);
- string originalProjectStatus = documentOriginalStatusDic[doc.GetHashCode()];
- LogManager.WriteLog(" Current Project Status: " + currentProjectStatus + "; Orignial Project Status: " + originalProjectStatus);
- if ((string.IsNullOrEmpty(currentProjectStatus) && string.IsNullOrEmpty(originalProjectStatus)) ||
- (0 == string.Compare(currentProjectStatus, originalProjectStatus, true)))
- {
- DealNotUpdate(args);
- return;
- }
- documentOriginalStatusDic.Remove(doc.GetHashCode());
- documentOriginalStatusDic.Add(doc.GetHashCode(), currentProjectStatus);
- }
- private void MemClosingDocumentHashCode(Object sender, DocumentClosingEventArgs args)
- {
- hashcodeofCurrentClosingDoc = args.Document.GetHashCode();
- }
- private void RemoveStatusofClosedDocument(Object sender, DocumentClosedEventArgs args)
- {
- if (args.Status.Equals(RevitAPIEventStatus.Succeeded) && (documentOriginalStatusDic.ContainsKey(hashcodeofCurrentClosingDoc)))
- {
- documentOriginalStatusDic.Remove(hashcodeofCurrentClosingDoc);
- }
- }
- private static void DealNotUpdate(RevitAPIPreDocEventArgs args)
- {
- string mainMessage;
- string additionalText;
- TaskDialog taskDialog = new TaskDialog("CancelSave Sample");
- if (args.Cancellable)
- {
- args.Cancel();
- mainMessage = "CancelSave sample detected that the Project Status parameter on Project Info has not been updated. The file will not be saved."; // prompt to user.
- }
- else
- {
- // will not cancel this event since it isn't cancellable.
- mainMessage = "The file is about to save. But CancelSave sample detected that the Project Status parameter on Project Info has not been updated."; // prompt to user.
- }
- if (!LogManager.RegressionTestNow)
- {
- additionalText = "You can disable this permanently by uninstaling the CancelSave sample from Revit. Remove or rename CancelSave.addin from the addins directory.";
- taskDialog.MainInstruction = mainMessage;
- taskDialog.MainContent = additionalText;
- taskDialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, "Open the addins directory");
- taskDialog.CommonButtons = TaskDialogCommonButtons.Close;
- taskDialog.DefaultButton = TaskDialogResult.Close;
- TaskDialogResult tResult = taskDialog.Show();
- if (TaskDialogResult.CommandLink1 == tResult)
- {
- System.Diagnostics.Process.Start("explorer.exe", DetectAddinFileLocation(args.Document.Application));
- }
- }
- LogManager.WriteLog(" Project Status is not updated, taskDialog informs user: " + mainMessage);
- }
- private static string RetrieveProjectCurrentStatus(Document doc)
- {
- if (doc.IsFamilyDocument)
- {
- return null;
- }
- return doc.ProjectInformation.Status;
- }
- private static string DetectAddinFileLocation(Autodesk.Revit.ApplicationServices.Application application)
- {
- string addinFileFolderLocation = null;
- IList<RevitProduct> installedRevitList = RevitProductUtility.GetAllInstalledRevitProducts();
- foreach (RevitProduct revit in installedRevitList)
- {
- if (revit.Version.ToString().Contains(application.VersionNumber))
- {
- string allUsersAddInFolder = revit.AllUsersAddInFolder;
- string currentUserAddInFolder = revit.CurrentUserAddInFolder;
- if (File.Exists(Path.Combine(allUsersAddInFolder, thisAddinFileName)))
- {
- addinFileFolderLocation = allUsersAddInFolder;
- }
- else if (File.Exists(Path.Combine(currentUserAddInFolder, thisAddinFileName)))
- {
- addinFileFolderLocation = currentUserAddInFolder;
- }
- break;
- }
- }
- return addinFileFolderLocation;
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Text;
- using Autodesk.Revit.DB;
- namespace CancelSave
- {
- class LogManager
- {
- private static TextWriterTraceListener TxtListener;
- private static string AssemblyLocation = Path.GetDirectoryName(
- System.Reflection.Assembly.GetExecutingAssembly().Location);
- public static bool RegressionTestNow
- {
- get
- {
- string expectedLogFile = Path.Combine(AssemblyLocation, "ExpectedOutput.log");
- if (File.Exists(expectedLogFile))
- {
- return true;
- }
- return false;
- }
- }
- static LogManager()
- {
- string actullyLogFile = Path.Combine(AssemblyLocation, "CancelSave.log");
- if (File.Exists(actullyLogFile))
- {
- File.Delete(actullyLogFile);
- }
- TxtListener = new TextWriterTraceListener(actullyLogFile);
- Trace.Listeners.Add(TxtListener);
- Trace.AutoFlush = true;
- }
- public static void LogFinalize()
- {
- Trace.Flush();
- TxtListener.Close();
- Trace.Close();
- Trace.Listeners.Remove(TxtListener);
- }
- public static void WriteLog(EventArgs args, Document doc)
- {
- Trace.WriteLine("");
- Trace.WriteLine("[Event] " + GetEventName(args.GetType()) + ": " + TitleNoExt(doc.Title));
- }
- public static void WriteLog(string message)
- {
- Trace.WriteLine(message);
- }
- private static string GetEventName(Type type)
- {
- string argName = type.ToString();
- string tail = "EventArgs";
- string head = "Autodesk.Revit.DB.Events.";
- int firstIndex = head.Length;
- int length = argName.Length - head.Length - tail.Length;
- string eventName = argName.Substring(firstIndex, length);
- return eventName;
- }
- private static string TitleNoExt(string orgTitle)
- {
- if (string.IsNullOrEmpty(orgTitle))
- {
- return "";
- }
- int pos = orgTitle.LastIndexOf('.');
- if (-1 != pos)
- {
- return orgTitle.Remove(pos);
- }
- else
- {
- return orgTitle;
- }
- }
- }
- }
Revit二次开发示例:CancelSave的更多相关文章
- Revit二次开发示例:HelloRevit
本示例实现Revit和Revit打开的文件的相关信息. #region Namespaces using System; using System.Collections.Generic; using ...
- Revit二次开发示例:EventsMonitor
在该示例中,插件在Revit启动时弹出事件监控选择界面,供用户设置,也可在添加的Ribbon界面完成设置.当Revit进行相应操作时,弹出窗体会记录事件时间和名称. #region Namespace ...
- Revit二次开发示例:ErrorHandling
本示例介绍了Revit的错误处理. #region Namespaces using System; using System.Collections.Generic; using Autodes ...
- Revit二次开发示例:ChangesMonitor
在本示例中,程序监控Revit打开文件事件,并在创建的窗体中更新文件信息. #region Namespaces using System; using System.Collections.Ge ...
- Revit二次开发示例:AutoStamp
该示例中,在Revit启动时添加打印事件,在打印时向模型添加水印,打印完成后删除该水印. #region Namespaces using System; using System.Collect ...
- Revit二次开发示例:ModelessForm_ExternalEvent
使用Idling事件处理插件任务. #region Namespaces using System; using System.Collections.Generic; using Autodesk. ...
- Revit二次开发示例:Journaling
关于Revit Journal读写的例子. #region Namespaces using System; using System.Collections.Generic; using Sys ...
- Revit二次开发示例:DisableCommand
Revit API 不支持调用Revit内部命令,但可以用RevitCommandId重写它们(包含任意选项卡,菜单和右键命令).使用RevitCommandId.LookupCommandId()可 ...
- Revit二次开发示例:DesignOptions
本例只要演示Revit的类过滤器的用法,在对话框中显示DesignOption元素. #region Namespaces using System; using System.Collections ...
随机推荐
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛:Frequent Subsets Problem (状态压缩)
题目链接 题目翻译: 给出一个数n,和一个浮点数a,数n代表全集U = {1,2,...,n},然后给出 M个U的子集,如果一个集合B(是U的子集),M个集合中有至少M*a个集合包含B, 则B这个集合 ...
- 最大团 HDU-1530
传送门: 洛谷 Vjudge (题目略有不同) 题目描述 • 给定一个图 tt = (V, E) • 求一个点集 S ,使得对于任意 x ≠ y ∈ S ,x 和 y 都有一条边 • |V | ...
- Django框架下的小人物--Cookie
1. 什么是Cookie,它的用途是什么? Cookies是一些存储在用户电脑上的小文件.它是被设计用来保存一些站点的用户数据,这样能够让服务器为这样的用户定制内容,后者页面代码能够获取到Cookie ...
- 【译】第五篇 Integration Services:增量加载-Deleting Rows
本篇文章是Integration Services系列的第五篇,详细内容请参考原文. 在上一篇你学习了如何将更新从源传送到目标.你同样学习了使用基于集合的更新优化这项功能.回顾增量加载记住,在SSIS ...
- spring-boog-测试打桩-Mockito
Mockito用于测试时进行打桩处理:通过它可以指定某个类的某个方法在什么情况下返回什么样的值. 例如:测试 controller时,依赖 service,这个时候就可以假设当调用 service 某 ...
- 41 - 数据库-pymysql41 - 数据库-pymysql-DBUtils
目录 1 Python操作数据库 2 安装模块 3 基本使用 3.1 创建一个连接 3.2 连接数据库 3.3 游标 3.3.1 利用游标操作数据库 3.3.2 事务管理 3.3.3 执行SQL语句 ...
- aarch64_m3
mrpt-stereo-camera-calibration-1.4.0-1.fc26.aarch64.rpm 2017-03-17 10:02 143K fedora Mirroring Proje ...
- 缓存数据库-redis(管道)
一:Redis 管道技术 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常 ...
- python基础-类的起源
Python中一切事物都是对象. class Foo(object): def __init__(self,name): self.name = name f = Foo("alex&quo ...
- java基础37 集合框架工具类Collections和数组操作工具类Arrays
一.集合框架工具类:Collections 1.1.Collections类的特点 该工具类中所有的方法都是静态的 1.2.Collections类的常用方法 binarySearch(List< ...