SharedParameterExtend.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using Autodesk.Revit.DB;
  5. using Autodesk.Revit.UI;
  6. using SAGA.DotNetUtils;
  7. namespace SAGA.RevitUtils.Extends
  8. {
  9. public static class SharedParameterExtend
  10. {
  11. //默认共享参数文件名称
  12. private const string Sharedfile = "SAGASharedParameters.txt";
  13. //默认共享参数创建分组
  14. private const string Sharedgroup = "SAGAParameters";
  15. /// <summary>
  16. /// 获取共享参数文件定义
  17. /// </summary>
  18. /// <param name="uiApp"></param>
  19. /// <param name="strFileName"></param>
  20. /// <returns></returns>
  21. public static DefinitionFile GetSharedParameterFile(this UIApplication uiApp, string strFileName)
  22. {
  23. string sharedParameterFile;
  24. if (strFileName.IndexOf("\\") >= 0)
  25. {
  26. sharedParameterFile = strFileName;
  27. }
  28. else
  29. {
  30. sharedParameterFile = Path.Combine(AppBaseInfo.AppRunPath, strFileName);
  31. }
  32. //Method's return
  33. DefinitionFile informationFile = null;
  34. // Check if the file is exit
  35. FileInfo documentMessage = new FileInfo(sharedParameterFile);
  36. bool fileExist = documentMessage.Exists;
  37. // Create file for external shared parameter since it does not exist
  38. if (!fileExist)
  39. {
  40. FileStream fileFlow = File.Create(sharedParameterFile);
  41. fileFlow.Close();
  42. }
  43. // Set ourselves file to the externalSharedParameterFile
  44. uiApp.Application.SharedParametersFilename = sharedParameterFile;
  45. informationFile = uiApp.Application.OpenSharedParameterFile();
  46. return informationFile;
  47. }
  48. /// <summary>
  49. /// 新建共享参数
  50. /// </summary>
  51. /// <param name="uiApp">文档对象</param>
  52. /// <param name="strParaName">唯一参数名</param>
  53. /// <param name="paramType">参数类型</param>
  54. /// <param name="strFileName">共享参数文件名</param>
  55. /// <param name="strGroupName">组名</param>
  56. /// <param name="blnVisible">是否在属性中可见</param>
  57. /// <returns></returns>
  58. public static Definition GetSharedParameter(this UIApplication uiApp, string strParaName,
  59. ParameterType paramType, string strGroupName = Sharedgroup, string strFileName = Sharedfile,
  60. bool blnVisible = true)
  61. {
  62. //Open the shared parameters file
  63. DefinitionFile informationFile = uiApp.GetSharedParameterFile(strFileName);
  64. if (null == informationFile)
  65. {
  66. return null;
  67. }
  68. // Access an existing or create a new group in the shared parameters file
  69. DefinitionGroups informationCollections = informationFile.Groups;
  70. DefinitionGroup informationCollection = null;
  71. informationCollection = informationCollections.get_Item(strGroupName);
  72. if (null == informationCollection)
  73. {
  74. informationCollections.Create(strGroupName);
  75. informationCollection = informationCollections.get_Item(strGroupName);
  76. }
  77. // Access an existing or create a new external parameter definition
  78. // belongs to a specific group
  79. Definition information = informationCollection.Definitions.get_Item(strParaName);
  80. if (null == information)
  81. {
  82. ExternalDefinitionCreationOptions optrions = new ExternalDefinitionCreationOptions(strParaName, paramType) { Visible = blnVisible };
  83. information = informationCollection.Definitions.Create(optrions);
  84. }
  85. return information;
  86. }
  87. /// <summary>
  88. /// 查找自定义的共享参数文件中是否含有指定名称的参数
  89. /// </summary>
  90. /// <param name="uiApp"></param>
  91. /// <param name="strParaName"></param>
  92. /// <param name="definiton"></param>
  93. /// <returns></returns>
  94. public static bool ExistDefinition(this UIApplication uiApp, string strParaName, ref Definition definiton)
  95. {
  96. string strFileName = Sharedfile;
  97. string strGroupName = Sharedgroup;
  98. DefinitionFile informationFile = uiApp.GetSharedParameterFile(strFileName);
  99. if (null == informationFile)
  100. {
  101. return false;
  102. }
  103. // Access an existing or create a new group in the shared parameters file
  104. DefinitionGroups informationCollections = informationFile.Groups;
  105. DefinitionGroup informationCollection = null;
  106. informationCollection = informationCollections.get_Item(strGroupName);
  107. if (null == informationCollection)
  108. {
  109. return false;
  110. }
  111. // Access an existing or create a new external parameter definition
  112. // belongs to a specific group
  113. definiton = informationCollection.Definitions.get_Item(strParaName);
  114. if (null == definiton)
  115. {
  116. return false;
  117. }
  118. return true;
  119. }
  120. /// <summary>
  121. /// 新建共享参数(默认共享参数文件名为revit程序目录下SAGASharedParameters.txt,组名为SAGAParameters,类型为text)
  122. /// </summary>
  123. /// <param name="uiApp">文档对象</param>
  124. /// <param name="strParaName">唯一参数名</param>
  125. /// <param name="cat">要设置参数的类型</param>
  126. /// <param name="paramType">参数类型</param>
  127. /// <param name="strFileName">共享参数文件名称</param>
  128. /// <param name="strGroupName">默认共享参数创建分组</param>
  129. /// <param name="blnBindType">类型参数true、实例参数false</param>
  130. /// <returns></returns>
  131. public static void BindSharedParameter(this UIApplication uiApp, string strParaName, BuiltInCategory cat,
  132. ParameterType paramType = ParameterType.Text, string strGroupName = Sharedgroup,
  133. string strFileName = Sharedfile,
  134. bool blnBindType = false)
  135. {
  136. List<BuiltInCategory> lstCategorie = new List<BuiltInCategory>();
  137. lstCategorie.Add(cat);
  138. uiApp.BindSharedParameter(strParaName, lstCategorie, paramType, strFileName, strGroupName,
  139. blnBindType);
  140. }
  141. /// <summary>
  142. /// 新建共享参数(默认共享参数文件名为revit程序目录下SAGASharedParameters.txt,组名为SAGAParameters)
  143. /// </summary>
  144. /// <param name="uiApp">文档对象</param>
  145. /// <param name="strParaName">唯一参数名</param>
  146. /// <param name="paramType">参数类型</param>
  147. /// <param name="lstCategorie"></param>
  148. /// <param name="blnBindType">类型参数、实例参数</param>
  149. /// <param name="blnVisible">参数是否显示在属性栏</param>
  150. /// <param name="strFileName"></param>
  151. /// <param name="strGroupName">共享参数组名</param>
  152. /// <returns></returns>
  153. public static void BindSharedParameter(this UIApplication uiApp, string strParaName,
  154. List<BuiltInCategory> lstCategorie, ParameterType paramType = ParameterType.Text,
  155. string strGroupName = Sharedgroup, string strFileName = Sharedfile, bool blnBindType = false,
  156. bool blnVisible = true)
  157. {
  158. Definition paraDef = uiApp.GetSharedParameter(strParaName, paramType, strGroupName, strFileName,
  159. blnVisible: blnVisible);
  160. uiApp.BindSharedParameter(paraDef, lstCategorie, blnBindType);
  161. }
  162. /// <summary>
  163. /// 创建共享参数
  164. /// </summary>
  165. /// <param name="uiApp"></param>
  166. /// <param name="paraDef"></param>
  167. /// <param name="lstCategorie"></param>
  168. /// <param name="blnBindType"></param>
  169. /// <returns></returns>
  170. public static void BindSharedParameter(this UIApplication uiApp, Definition paraDef,
  171. List<BuiltInCategory> lstCategorie, bool blnBindType = false)
  172. {
  173. // Create a new Binding object with the categories to which the parameter will be bound
  174. CategorySet categories = uiApp.Application.Create.NewCategorySet();
  175. foreach (BuiltInCategory catType in lstCategorie)
  176. {
  177. Category cat = uiApp.ActiveUIDocument.Document.Settings.Categories.get_Item(catType);
  178. categories.Insert(cat);
  179. }
  180. //检查共享参数是否已经存在
  181. bool isContains = IsContains(uiApp, paraDef, categories);
  182. //绑定类型
  183. Binding caseTying;
  184. if (blnBindType)
  185. {
  186. //为类型参数
  187. caseTying = uiApp.Application.Create.NewTypeBinding(categories);
  188. }
  189. else
  190. {
  191. //为实例参数
  192. caseTying = uiApp.Application.Create.NewInstanceBinding(categories);
  193. }
  194. //指定参数名已被绑定需要使用ReInsert进行刷新
  195. if (isContains)
  196. {
  197. uiApp.ActiveUIDocument.Document.ParameterBindings.ReInsert(paraDef, caseTying);
  198. }
  199. else
  200. {
  201. uiApp.ActiveUIDocument.Document.ParameterBindings.Insert(paraDef, caseTying);
  202. }
  203. }
  204. /// <summary>
  205. /// 移除共享参数
  206. /// </summary>
  207. /// <param name="uiApp"></param>
  208. /// <param name="defList">参数定义</param>
  209. /// <param name="categoryList">所绑定类别</param>
  210. /// <param name="typeParameter">是否是类型参数</param>
  211. public static void RemoveSharedParameter(this UIApplication uiApp, List<Definition> defList,
  212. List<BuiltInCategory> categoryList, bool typeParameter = false)
  213. {
  214. CategorySet categorySet = uiApp.Application.Create.NewCategorySet();
  215. foreach (BuiltInCategory builtCategory in categoryList)
  216. {
  217. Category category = uiApp.ActiveUIDocument.Document.Settings.Categories.get_Item(builtCategory);
  218. categorySet.Insert(category);
  219. }
  220. Binding categoryBinding = uiApp.Application.Create.NewInstanceBinding(categorySet);
  221. if (typeParameter)
  222. {
  223. categoryBinding = uiApp.Application.Create.NewTypeBinding(categorySet);
  224. }
  225. foreach (Definition def in defList)
  226. {
  227. uiApp.ActiveUIDocument.Document.ParameterBindings.Remove(def);
  228. }
  229. }
  230. /// <summary>
  231. /// 检查是否包含要定义的类型,若已包含,则将已绑定的类型添加到新类型列表中
  232. /// </summary>
  233. /// <param name="uiApp"></param>
  234. /// <param name="paraDef"></param>
  235. /// <param name="category">需要绑定的类型集合</param>
  236. /// <returns></returns>
  237. private static bool IsContains(UIApplication uiApp, Definition paraDef, CategorySet category)
  238. {
  239. //遍历所有绑定定义
  240. DefinitionBindingMapIterator iterator = uiApp.ActiveUIDocument.Document.ParameterBindings.ForwardIterator();
  241. while (iterator.MoveNext())
  242. {
  243. Definition def = iterator.Key;
  244. ElementBinding elemBind = (ElementBinding)iterator.Current;
  245. //判断共享参数是否已经被绑定
  246. if (paraDef.Name.Equals(def.Name, StringComparison.CurrentCultureIgnoreCase))
  247. {
  248. //判断指定的类型是否已经绑定了指定类型
  249. foreach (Category c in elemBind.Categories)
  250. {
  251. if (!category.Contains(c))
  252. {
  253. //将已绑定的类型加入新类别列表中
  254. category.Insert(c);
  255. }
  256. }
  257. return true;
  258. }
  259. }
  260. return false;
  261. }
  262. }
  263. }