SharedParameterUtil.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*-------------------------------------------------------------------------
  2. * 功能描述:SharedParameterUtil
  3. * 作者:xulisong
  4. * 创建时间: 2019/3/7 10:49:42
  5. * 版本号:v1.0
  6. * -------------------------------------------------------------------------*/
  7. using Autodesk.Revit.ApplicationServices;
  8. using Autodesk.Revit.DB;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.IO;
  12. using System.Linq;
  13. using System.Reflection;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. using FWindSoft.Common;
  17. namespace FWindSoft.Revit
  18. {
  19. public class SharedParameterUtil
  20. {
  21. /// <summary>
  22. /// 创建共享参数文件样式
  23. /// </summary>
  24. /// <returns></returns>
  25. public static StringBuilder CreateSharedFileSchema()
  26. {
  27. StringBuilder contents = new StringBuilder();
  28. contents.AppendLine("# This is a Revit shared parameter file.");
  29. contents.AppendLine("# Do not edit manually.");
  30. contents.AppendLine("*META VERSION MINVERSION");
  31. contents.AppendLine("META 2 1");
  32. contents.AppendLine("*GROUP ID NAME");
  33. contents.AppendLine("*PARAM GUID NAME DATATYPE DATACATEGORY GROUP VISIBLE");
  34. return contents;
  35. }
  36. /// <summary>
  37. /// 获取共享参数定义文件
  38. /// </summary>
  39. /// <param name="revitApp"></param>
  40. /// <returns></returns>
  41. public static DefinitionFile GetSharedParameterFile(Application revitApp)
  42. {
  43. DefinitionFile file = null;
  44. int count = 0;
  45. while (null == file && count < 100)
  46. {
  47. file = revitApp.OpenSharedParameterFile();
  48. if (file == null)
  49. {
  50. string shapeFile = Path.Combine(App.AppDataPath, "RevitShared", "tempSharedFile.txt");
  51. var schema = CreateSharedFileSchema();
  52. File.WriteAllText(shapeFile, schema.ToString());
  53. revitApp.SharedParametersFilename = shapeFile;
  54. }
  55. ++count;
  56. }
  57. return file;
  58. }
  59. public static ExternalDefinitionCreationOptions NewDefinitionCreationOptions(string paraName, ParameterType paraType, bool visible = true, bool userModifiable = true)
  60. {
  61. ExternalDefinitionCreationOptions options = new ExternalDefinitionCreationOptions(paraName, paraType);
  62. options.Visible = visible;
  63. options.UserModifiable = userModifiable;
  64. return options;
  65. }
  66. public static Definition NewDefinition(DefinitionGroup group, ExternalDefinitionCreationOptions options)
  67. {
  68. return group.Definitions.Create(options);
  69. }
  70. public static bool BindingParameter(Document document, List<Category> categories,bool bingdingType, Definition definition)
  71. {
  72. var useCategories = categories.Where(c => c.AllowsBoundParameters).ToList();
  73. if (!useCategories.Any())
  74. return false;
  75. bool flag = false;
  76. #region 查找已经存在定义
  77. ElementBinding instanceBinding = document.ParameterBindings.get_Item(definition) as ElementBinding;
  78. if (bingdingType)
  79. {
  80. instanceBinding = instanceBinding as TypeBinding;
  81. }
  82. else
  83. {
  84. instanceBinding = instanceBinding as InstanceBinding;
  85. }
  86. #endregion
  87. if (null != instanceBinding)
  88. {
  89. foreach (var useCategory in useCategories)
  90. {
  91. if (!instanceBinding.Categories.Contains(useCategory))
  92. {
  93. instanceBinding.Categories.Insert(useCategory);
  94. }
  95. }
  96. flag=document.ParameterBindings.ReInsert(definition, instanceBinding);
  97. }
  98. else
  99. {
  100. var app = document.Application;
  101. CategorySet categorySet = app.Create.NewCategorySet();
  102. useCategories.ForEach(c=>categorySet.Insert(c));
  103. if (bingdingType)
  104. {
  105. instanceBinding = app.Create.NewTypeBinding(categorySet);
  106. }
  107. else
  108. {
  109. instanceBinding = app.Create.NewInstanceBinding(categorySet);
  110. }
  111. flag=document.ParameterBindings.Insert(definition, instanceBinding);
  112. }
  113. return flag;
  114. }
  115. public static bool BindingParameter(Document document, Category category, bool bingdingType,
  116. Definition definition)
  117. {
  118. return BindingParameter(document, new List<Category>() {category}, bingdingType, definition);
  119. }
  120. }
  121. }