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 ...
随机推荐
- D - Balanced Ternary String (贪心)
题目链接:http://codeforces.com/contest/1102/problem/D 题目大意:给你一个字符串,这个字符串是由0,1,2构成的,然后让你替换字符,使得在替换的次数最少的前 ...
- 20165230 《Java程序设计》实验二(Java面向对象程序设计)实验报告
20165230 <Java程序设计>实验二(Java面向对象程序设计)实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: ...
- 【划水闲谈】Terraria 1.3.5更新
我知道这本应是一个算法博客,但又有谁规定了不能发点其他内容呢? Terraria,一个有趣的沙盒游戏.在这里,你可以建造,挖掘,开始一次又一次新的冒险. 4月19日,Re-Logic承诺的官方中文版终 ...
- IIS错误:在唯一密钥属性“fileExtension”设置为“.mp4”时,无法添加类型为“mimeMap”的重复集合项
之前的IIS配置中,.mp4类型的文件默认无法访问,所以个人在IIS7.5的mime类型中增加了.mp4的类型的支持,但问题是需要每台机器中增加这些设置,不利于团队协作,于是,只好将这些修改体现在代码 ...
- python基础--random模块
python使用random生成随机数 下面是主要函数random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0random.randint(a, b)生成的 ...
- Python列表(list)
序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 此外,Python已经内置确定序列的长度以及确定最大和最小的元素 ...
- FTRL算法
稀疏解的作用:内存和时间啊 实际的互联网广告应用需要的是快速地进行model的更新.为了保证快速的更新,训练样本是一条一条地过来的,每来一个样本,model的参数对这个样本进行一次迭代,从而保证了mo ...
- mongod 一些命令汇总
1. 导出数据库: mongoexport -d master -c reports -o no.json --type json -f "title,name" -q '{&qu ...
- 奇妙的CSS之伪类与伪元素
我们都知道,在CSS中有很多选择器,例如id(#), class(.),属性[attr],这些虽然可以满足一些需要,但有时候还力有未逮.伪类和伪元素就提供了一个有益的补充,可以使我们更高效编码.伪类和 ...
- 使用dos命令创建多模块Maven项目
好吧,咱们接着上一篇博客继续用另一种方式来创建Maven项目.不过在创建之前我们应该先熟悉一些相关dos命令. 创建web项目命令: mvn archetype:generate -DgroupId= ...