/* ============================================================================== * 功能描述:启动revit时执行的Application * 创 建 者:SAGACLOUD * 创建日期:2017/8/30 * ==============================================================================*/ using System; using System.IO; using System.Windows; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB.Events; using Autodesk.Revit.UI; using Autodesk.Revit.DB; using Autodesk.Revit.UI.Events; using SAGA.DotNetUtils; using SAGA.DotNetUtils.Extend; using SAGA.DotNetUtils.Logger; using SAGA.RevitMenu.Configuration; using SAGA.RevitMenu.Dockpane; using SAGA.RevitUtils.ErrorSupports; using SAGA.RevitUtils.Extends; using SAGA.RevitUtils.Log; using System.Threading; using SAGA.RevitUtils; namespace SAGA.RevitMenu { [Transaction(TransactionMode.Manual), Regeneration(RegenerationOption.Manual)] public class MenuApp : ExternalApplication { public override Result OnShutdown(UIControlledApplication application) { ErrorHandlers.Stop(); RevitEventsBingding.RemoveEvents(application); base.OnShutdown(application); TszDocChanged -= App_DocumentChanged; application.ControlledApplication.DocumentClosing -= ControlledApplication_DocumentClosing; return Result.Succeeded; } public override Result OnStartup(UIControlledApplication application) { ErrorHandlers.Start(); base.OnStartup(application); StartSetting.RegiterPane(application); //使用快捷键自动创建空间,需要先设置快捷键 //ScreenMenuKeyBoardShortCut.SetKeyboardShortcuts(application.ControlledApplication.VersionName); //记录空间设备修改;Chang时仅保存到临时文件中;Save时保存到log文件中;关闭是清除临时文件 TszDocChanged += App_DocumentChanged; application.ControlledApplication.DocumentClosing += ControlledApplication_DocumentClosing; RevitEventsBingding.AddEvents(application); //将加载菜单逻辑后移 if (!MenuConfig.LoadMenus(application)) { return Result.Failed; } //删除Addin文件 MenuConfig.ClearAddInFile(application); return Result.Succeeded; } private void ControlledApplication_DocumentClosing(object sender, DocumentClosingEventArgs e) { DocumentChangedLog.DeleteTempLog(e.Document.PathName); } /// /// 记录操作日志 /// /// /// private void App_DocumentChanged(object sender, Autodesk.Revit.DB.Events.DocumentChangedEventArgs e) { var doc = e.GetDocument(); if (doc.IsFamilyDocument) return; var pathName = doc.PathName; //楼层文件名称,无后缀 var docName = pathName.GetFileName(); Func getTypeName = (elementId) => doc.GetElement(elementId).GetType().Name; Func getFamilyName = (elementId) => doc.GetElement(elementId).GetFamily()?.Name; Func getCategory = (elementId) => doc.GetElement(elementId).GetCategory().ToString(); //删除 var deletes = e.GetDeletedElementIds(); if (deletes.Count > 0) { foreach (var elementId in deletes) { DocumentChangedLogMode mode = new DocumentChangedLogMode(); mode.DataTime = DateTime.Now.ToString(); mode.DocPath = pathName; mode.DocName = docName; mode.Operator = DocumentChangedOperator.Delete.ToString(); mode.Id = elementId.ToString(); DocumentChangedLog.Log(mode.DocPath, mode.ToJson()); } } //增加 var adds = e.GetAddedElementIds(); if (adds.Count > 0) { foreach (var elementId in adds) { //if(!IsWatchType(doc,elementId))continue; DocumentChangedLogMode mode = new DocumentChangedLogMode(); mode.DataTime = DateTime.Now.ToString(); mode.DocPath = pathName; mode.DocName = docName; mode.Operator = DocumentChangedOperator.Add.ToString(); mode.Id = elementId.ToString(); mode.Type = getTypeName(elementId); mode.Family = getFamilyName(elementId); mode.Category = getCategory(elementId); DocumentChangedLog.Log(mode.DocPath, mode.ToJson()); } } //修改 var modifieds = e.GetModifiedElementIds(); if (modifieds.Count > 0) { foreach (var elementId in modifieds) { //if (!IsWatchType(doc, elementId)) continue; DocumentChangedLogMode mode = new DocumentChangedLogMode(); mode.DataTime = DateTime.Now.ToString(); mode.DocPath = pathName; mode.DocName = docName; mode.Operator = DocumentChangedOperator.Modified.ToString(); mode.Id = elementId.ToString(); mode.Type = getTypeName(elementId); mode.Family = getFamilyName(elementId); mode.Category = getCategory(elementId); DocumentChangedLog.Log(mode.DocPath, mode.ToJson()); } } } /// /// 是否为需要监视的类型 /// /// /// /// private bool IsWatchType(Document doc, ElementId elementId) { var type = doc.GetElement(elementId).GetType().Name; //族类型命名规则具有特殊性,不做有判定依据 var family = doc.GetElement(elementId).GetFamily()?.Name; bool result = false; switch (type) { case "SpaceTag": result = true; break; case "Space": result = true; break; case "FamilyInstance": result = true; break; } return result; } } }