AddInManager.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. /*-------------------------------------------------------------------------
  2. * 功能描述:AddInManager
  3. * 作者:xulisong
  4. * 创建时间: 2019/1/16 16:13:43
  5. * 版本号:v1.0
  6. * -------------------------------------------------------------------------*/
  7. using System;
  8. using System.Collections.Generic;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Security.Cryptography;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using Autodesk.RevitAddIns;
  15. namespace RevitVersion
  16. {
  17. public class AddInManager
  18. {
  19. /// <summary>
  20. /// 删除指定名称addIn文件
  21. /// </summary>
  22. /// <param name="product"></param>
  23. /// <param name="addInFileName"></param>
  24. public static void ClearFile(RevitProduct product, string addInFileName)
  25. {
  26. string currentUserAddInFolder = product.CurrentUserAddInFolder;
  27. string allUsersAddInFolder = product.AllUsersAddInFolder;
  28. List<string> paths = new List<string> { currentUserAddInFolder, allUsersAddInFolder };
  29. ClearFile(paths, addInFileName);
  30. }
  31. /// <summary>
  32. /// 删除指定名称addIn文件
  33. /// </summary>
  34. /// <param name="useFolders"></param>
  35. /// <param name="addInFileName"></param>
  36. public static void ClearFile(List<string> useFolders, string addInFileName)
  37. {
  38. string fileName = string.Format("{0}.addin", addInFileName);
  39. foreach (string addinPath in useFolders)
  40. {
  41. if (!string.IsNullOrWhiteSpace(addinPath))
  42. {
  43. string path = Path.Combine(addinPath, fileName);
  44. if (File.Exists(path))
  45. {
  46. try
  47. {
  48. File.Delete(path);
  49. }
  50. catch
  51. {
  52. }
  53. }
  54. }
  55. }
  56. }
  57. /// <summary>
  58. /// 增加启动文件
  59. /// </summary>
  60. /// <param name="product"></param>
  61. /// <param name="addInFileName"></param>
  62. /// <param name="addInContent"></param>
  63. public static void AddFile(RevitProduct product, string addInFileName, string addInContent)
  64. {
  65. AddFile(product.CurrentUserAddInFolder, addInFileName, addInContent);
  66. }
  67. /// <summary>
  68. /// 增加启动文件
  69. /// </summary>
  70. /// <param name="userAddInFolder"></param>
  71. /// <param name="addInFileName"></param>
  72. /// <param name="addInContent"></param>
  73. public static void AddFile(string userAddInFolder, string addInFileName,string addInContent)
  74. {
  75. //清除文件
  76. ClearFile(new List<string>(){ userAddInFolder }, addInFileName);
  77. string fileName = string.Format("{0}.addin", addInFileName);
  78. string currentUserAddInFolder = userAddInFolder;
  79. string path = Path.Combine(currentUserAddInFolder, fileName);
  80. using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
  81. {
  82. if (!string.IsNullOrEmpty(addInContent))
  83. {
  84. writer.Write(addInContent);
  85. }
  86. }
  87. }
  88. /// <summary>
  89. /// 增加指定名称的Addin文件
  90. /// </summary>
  91. /// <param name="product"></param>
  92. /// <param name="addInFileName"></param>
  93. /// <param name="application"></param>
  94. public static void AddFile(RevitProduct product, string addInFileName, RevitAddInApplication application)
  95. {
  96. //清除文件
  97. AddFile(product.CurrentUserAddInFolder, addInFileName, application);
  98. }
  99. public static void AddFile(string userAddInFolder, string addInFileName, RevitAddInApplication application)
  100. {
  101. //清除文件
  102. ClearFile(new List<string>() { userAddInFolder }, addInFileName);
  103. string fileName = string.Format("{0}.addin", addInFileName);
  104. RevitAddInManifest manifest = new RevitAddInManifest();
  105. manifest.AddInApplications.Add(application);
  106. string currentUserAddInFolder = userAddInFolder;
  107. string path = Path.Combine(currentUserAddInFolder, fileName);
  108. manifest.SaveAs(path);
  109. }
  110. #region 获取当前产品信息
  111. public static RevitProduct GetCurrentProduct()
  112. {
  113. return VersionManager.Current?.Product;
  114. }
  115. public static string GetAllUsersAddInFolder(Version version)
  116. {
  117. return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), @"Autodesk\Revit\AddIns", version.ToString().Replace("Revit", ""));
  118. }
  119. public static string GetCurrentUserAddInFolder(Version version)
  120. {
  121. return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Autodesk\Revit\AddIns", version.ToString().Replace("Revit", ""));
  122. }
  123. #endregion
  124. #region 启动方式设置
  125. /// <summary>
  126. /// 获取临时目录位置
  127. /// </summary>
  128. /// <returns></returns>
  129. private static string GetFilePath()
  130. {
  131. //以临时目录为目录,以类所在dll路径生成MD5值为一级,以类名为文件名
  132. var basePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
  133. var path = typeof(AddInManager).Assembly.Location;
  134. byte[] bytes = UTF8Encoding.UTF8.GetBytes(path);
  135. MD5 md5 = MD5.Create();
  136. var guid= new Guid(md5.ComputeHash(bytes));
  137. string fileName = "AddInManagerConfig.txt";
  138. var directory = Path.Combine(basePath, guid.ToString());
  139. var filePath= Path.Combine(directory, fileName);
  140. if (!Directory.Exists(directory))
  141. {
  142. Directory.CreateDirectory(directory);
  143. }
  144. if (!File.Exists(filePath))
  145. {
  146. //初始化文件
  147. File.WriteAllText(filePath,"");
  148. }
  149. return filePath;
  150. }
  151. private const string CancelFlag = "0";
  152. /// <summary>
  153. /// 设置取消标记
  154. /// </summary>
  155. /// <param name="addinName"></param>
  156. private static void SetCancelFlag(string addinName)
  157. {
  158. var filePath = GetFilePath();
  159. File.WriteAllLines(filePath, new string[] { CancelFlag, addinName});
  160. }
  161. /// <summary>
  162. /// 获取需要取消application名称
  163. /// </summary>
  164. /// <returns></returns>
  165. private static string GetCancelAddinName()
  166. {
  167. var filePath = GetFilePath();
  168. var results = File.ReadAllLines(filePath);
  169. if (results.Length == 0)
  170. {
  171. return null;
  172. }
  173. if (string.IsNullOrWhiteSpace(results[0])|| results[0].Trim() != CancelFlag)
  174. {
  175. return null;
  176. }
  177. if (results.Length > 1)
  178. {
  179. return results[1];
  180. }
  181. return null;
  182. }
  183. public static void CheckCancelAddin()
  184. {
  185. var addinName = GetCancelAddinName();
  186. if (string.IsNullOrWhiteSpace(addinName))
  187. {
  188. return;
  189. }
  190. var folder = GetCurrentUserAddInFolder(VersionManager.Current.Version);
  191. AddInManager.ClearFile(new List<string>(){ folder }, addinName);
  192. var filePath = GetFilePath();
  193. File.WriteAllText(filePath,"");
  194. }
  195. public static void Start(RevitAddInApplication application)
  196. {
  197. Attach(application);
  198. RevitShell.Start(VersionManager.Current.Product);
  199. //加一个标志,判断是否隐藏信息
  200. SetCancelFlag(application.Name);
  201. }
  202. public static void StartAuto(RevitAddInApplication application)
  203. {
  204. Attach(application);
  205. RevitShell.Start(VersionManager.Current.Product);
  206. }
  207. public static void Attach(RevitAddInApplication application)
  208. {
  209. AddInManager.AddFile(VersionManager.Current.Product, application.Name, application);
  210. }
  211. public static void Cancel(RevitAddInApplication application)
  212. {
  213. AddInManager.ClearFile(VersionManager.Current.Product, application.Name);
  214. }
  215. /// <summary>
  216. /// 根据启动类型启动Revit
  217. /// </summary>
  218. /// <param name="type"></param>
  219. /// <param name="application"></param>
  220. public static void StartRevit(StartType type, RevitAddInApplication application)
  221. {
  222. switch (type)
  223. {
  224. case StartType.Start:
  225. {
  226. Start(application);
  227. break;
  228. }
  229. case StartType.StartAuto:
  230. {
  231. StartAuto(application);
  232. break;
  233. }
  234. case StartType.Cancel:
  235. {
  236. Cancel(application);
  237. break;
  238. }
  239. case StartType.Attach:
  240. {
  241. Attach(application);
  242. break;
  243. }
  244. }
  245. }
  246. #endregion
  247. }
  248. }