/*------------------------------------------------------------------------- * 功能描述:AddInManager * 作者:xulisong * 创建时间: 2019/1/16 16:13:43 * 版本号:v1.0 * -------------------------------------------------------------------------*/ using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Autodesk.RevitAddIns; namespace RevitVersion { public class AddInManager { /// /// 删除指定名称addIn文件 /// /// /// public static void ClearFile(RevitProduct product, string addInFileName) { string currentUserAddInFolder = product.CurrentUserAddInFolder; string allUsersAddInFolder = product.AllUsersAddInFolder; List paths = new List { currentUserAddInFolder, allUsersAddInFolder }; ClearFile(paths, addInFileName); } /// /// 删除指定名称addIn文件 /// /// /// public static void ClearFile(List useFolders, string addInFileName) { string fileName = string.Format("{0}.addin", addInFileName); foreach (string addinPath in useFolders) { if (!string.IsNullOrWhiteSpace(addinPath)) { string path = Path.Combine(addinPath, fileName); if (File.Exists(path)) { try { File.Delete(path); } catch { } } } } } /// /// 增加启动文件 /// /// /// /// public static void AddFile(RevitProduct product, string addInFileName, string addInContent) { AddFile(product.CurrentUserAddInFolder, addInFileName, addInContent); } /// /// 增加启动文件 /// /// /// /// public static void AddFile(string userAddInFolder, string addInFileName,string addInContent) { //清除文件 ClearFile(new List(){ userAddInFolder }, addInFileName); string fileName = string.Format("{0}.addin", addInFileName); string currentUserAddInFolder = userAddInFolder; string path = Path.Combine(currentUserAddInFolder, fileName); using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8)) { if (!string.IsNullOrEmpty(addInContent)) { writer.Write(addInContent); } } } /// /// 增加指定名称的Addin文件 /// /// /// /// public static void AddFile(RevitProduct product, string addInFileName, RevitAddInApplication application) { //清除文件 AddFile(product.CurrentUserAddInFolder, addInFileName, application); } public static void AddFile(string userAddInFolder, string addInFileName, RevitAddInApplication application) { //清除文件 ClearFile(new List() { userAddInFolder }, addInFileName); string fileName = string.Format("{0}.addin", addInFileName); RevitAddInManifest manifest = new RevitAddInManifest(); manifest.AddInApplications.Add(application); string currentUserAddInFolder = userAddInFolder; string path = Path.Combine(currentUserAddInFolder, fileName); manifest.SaveAs(path); } #region 获取当前产品信息 public static RevitProduct GetCurrentProduct() { return VersionManager.Current?.Product; } public static string GetAllUsersAddInFolder(Version version) { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), @"Autodesk\Revit\AddIns", version.ToString().Replace("Revit", "")); } public static string GetCurrentUserAddInFolder(Version version) { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Autodesk\Revit\AddIns", version.ToString().Replace("Revit", "")); } #endregion #region 启动方式设置 /// /// 获取临时目录位置 /// /// private static string GetFilePath() { //以临时目录为目录,以类所在dll路径生成MD5值为一级,以类名为文件名 var basePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var path = typeof(AddInManager).Assembly.Location; byte[] bytes = UTF8Encoding.UTF8.GetBytes(path); MD5 md5 = MD5.Create(); var guid= new Guid(md5.ComputeHash(bytes)); string fileName = "AddInManagerConfig.txt"; var directory = Path.Combine(basePath, guid.ToString()); var filePath= Path.Combine(directory, fileName); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } if (!File.Exists(filePath)) { //初始化文件 File.WriteAllText(filePath,""); } return filePath; } private const string CancelFlag = "0"; /// /// 设置取消标记 /// /// private static void SetCancelFlag(string addinName) { var filePath = GetFilePath(); File.WriteAllLines(filePath, new string[] { CancelFlag, addinName}); } /// /// 获取需要取消application名称 /// /// private static string GetCancelAddinName() { var filePath = GetFilePath(); var results = File.ReadAllLines(filePath); if (results.Length == 0) { return null; } if (string.IsNullOrWhiteSpace(results[0])|| results[0].Trim() != CancelFlag) { return null; } if (results.Length > 1) { return results[1]; } return null; } public static void CheckCancelAddin() { var addinName = GetCancelAddinName(); if (string.IsNullOrWhiteSpace(addinName)) { return; } var folder = GetCurrentUserAddInFolder(VersionManager.Current.Version); AddInManager.ClearFile(new List(){ folder }, addinName); var filePath = GetFilePath(); File.WriteAllText(filePath,""); } public static void Start(RevitAddInApplication application) { Attach(application); RevitShell.Start(VersionManager.Current.Product); //加一个标志,判断是否隐藏信息 SetCancelFlag(application.Name); } public static void StartAuto(RevitAddInApplication application) { Attach(application); RevitShell.Start(VersionManager.Current.Product); } public static void Attach(RevitAddInApplication application) { AddInManager.AddFile(VersionManager.Current.Product, application.Name, application); } public static void Cancel(RevitAddInApplication application) { AddInManager.ClearFile(VersionManager.Current.Product, application.Name); } /// /// 根据启动类型启动Revit /// /// /// public static void StartRevit(StartType type, RevitAddInApplication application) { switch (type) { case StartType.Start: { Start(application); break; } case StartType.StartAuto: { StartAuto(application); break; } case StartType.Cancel: { Cancel(application); break; } case StartType.Attach: { Attach(application); break; } } } #endregion } }