123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- /*-------------------------------------------------------------------------
- * 功能描述: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
- {
- /// <summary>
- /// 删除指定名称addIn文件
- /// </summary>
- /// <param name="product"></param>
- /// <param name="addInFileName"></param>
- public static void ClearFile(RevitProduct product, string addInFileName)
- {
- string currentUserAddInFolder = product.CurrentUserAddInFolder;
- string allUsersAddInFolder = product.AllUsersAddInFolder;
- List<string> paths = new List<string> { currentUserAddInFolder, allUsersAddInFolder };
- ClearFile(paths, addInFileName);
- }
- /// <summary>
- /// 删除指定名称addIn文件
- /// </summary>
- /// <param name="useFolders"></param>
- /// <param name="addInFileName"></param>
- public static void ClearFile(List<string> 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
- {
- }
- }
- }
- }
- }
- /// <summary>
- /// 增加启动文件
- /// </summary>
- /// <param name="product"></param>
- /// <param name="addInFileName"></param>
- /// <param name="addInContent"></param>
- public static void AddFile(RevitProduct product, string addInFileName, string addInContent)
- {
- AddFile(product.CurrentUserAddInFolder, addInFileName, addInContent);
- }
- /// <summary>
- /// 增加启动文件
- /// </summary>
- /// <param name="userAddInFolder"></param>
- /// <param name="addInFileName"></param>
- /// <param name="addInContent"></param>
- public static void AddFile(string userAddInFolder, string addInFileName,string addInContent)
- {
- //清除文件
- ClearFile(new List<string>(){ 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);
- }
- }
- }
- /// <summary>
- /// 增加指定名称的Addin文件
- /// </summary>
- /// <param name="product"></param>
- /// <param name="addInFileName"></param>
- /// <param name="application"></param>
- 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<string>() { 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 启动方式设置
- /// <summary>
- /// 获取临时目录位置
- /// </summary>
- /// <returns></returns>
- 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";
- /// <summary>
- /// 设置取消标记
- /// </summary>
- /// <param name="addinName"></param>
- private static void SetCancelFlag(string addinName)
- {
- var filePath = GetFilePath();
- File.WriteAllLines(filePath, new string[] { CancelFlag, addinName});
- }
- /// <summary>
- /// 获取需要取消application名称
- /// </summary>
- /// <returns></returns>
- 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<string>(){ 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);
- }
- /// <summary>
- /// 根据启动类型启动Revit
- /// </summary>
- /// <param name="type"></param>
- /// <param name="application"></param>
- 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
- }
- }
|