CreateFacilityRevitUtils.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /* ==============================================================================
  2. * 功能描述:CreateFacilityRevitUtils
  3. * 创 建 者:Garrett
  4. * 创建日期:2019/10/23 10:24:09
  5. * ==============================================================================*/
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Text.RegularExpressions;
  11. using System.Threading.Tasks;
  12. using Autodesk.Revit.DB;
  13. using Autodesk.Revit.UI;
  14. using Autodesk.Revit.DB.Structure;
  15. using Saga.PlugIn.ModelCheck;
  16. using SAGA.DotNetUtils.Others;
  17. using SAGA.RevitUtils.Extends;
  18. using SAGA.RevitUtils.Windows;
  19. using FWindSoft.Revit;
  20. using SAGA.DotNetUtils;
  21. namespace Saga.PlugIn.CreateFacility
  22. {
  23. /// <summary>
  24. /// CreateFacilityRevitUtils
  25. /// </summary>
  26. public class CreateFacilityRevitUtils
  27. {
  28. /// <summary>
  29. /// 由资产id查找模型中的设备
  30. /// </summary>
  31. /// <param name="code"></param>
  32. /// <param name="propertyId"></param>
  33. /// <returns></returns>
  34. public static string FindFacility(Document doc,string code, string propertyId)
  35. {
  36. var facilities = DocumentExtension.GetElements<FamilyInstance>(doc);
  37. string id = null;
  38. foreach (FamilyInstance facility in facilities)
  39. {
  40. var familyName = facility.GetFamilyName();
  41. if (familyName.StartsWith(code))
  42. {
  43. var parameter = ParameterExtend.GetParameterString(facility, CreateFacilityConst.PropertyID);
  44. if (parameter == propertyId)
  45. {
  46. id = facility.Id.ToString();
  47. break;
  48. }
  49. }
  50. }
  51. return id;
  52. }
  53. /// <summary>
  54. /// 定位模型
  55. /// </summary>
  56. /// <param name="id"></param>
  57. public static void FocusFacility(string id)
  58. {
  59. RevitCore.UIApp.SetShowElements(new ElementId(id.ToInt()));
  60. }
  61. /// <summary>
  62. /// 自动创建设备
  63. /// </summary>
  64. /// <param name="doc"></param>
  65. /// <param name="code"></param>
  66. /// <param name="location"></param>
  67. /// <param name="propertyId"></param>
  68. /// <returns></returns>
  69. public static string CreateFacility(Document doc, MFacilityClass facilityClass, MXYZ location, string propertyId)
  70. {
  71. FamilyInstance fi = null;
  72. using (Transaction trans = new Transaction(doc, "自动创建模型"))
  73. {
  74. trans.Start();
  75. try
  76. {
  77. FamilySymbol fs = GetFamilySymbol(doc, facilityClass.code);
  78. if (fs == null)
  79. {
  80. WinTipMissFamily win=new WinTipMissFamily($"{facilityClass.code}-{facilityClass.name}");
  81. win.ShowDialog();
  82. return null;
  83. }
  84. if (IsBasePointFamily(fs))
  85. {
  86. //使用BIMLocation中的坐标,mm转为英寸
  87. XYZ xyz = new XYZ(location.X.ToDouble().ToApi(), location.Y.ToDouble().ToApi(),
  88. location.Z.ToDouble().ToApi());
  89. xyz = xyz == null ? XYZ.Zero : xyz.ConvertToApi();
  90. var level = GetCurFloorLevel(doc);
  91. //传标高,z值设置为零
  92. xyz = xyz.NewZ(0);
  93. fi = doc.Create.NewFamilyInstance(xyz, fs, level, StructuralType.NonStructural);
  94. //假如定位点和中心点不一致,平移设备,将设备中心点移到定位点上
  95. doc.Regenerate();
  96. fi.SetSharedParameter(CreateFacilityConst.PropertyID, propertyId);
  97. XYZ centerXyz = FWindSoft.Revit.ElementExtension.GetLocationPoint(fi).NewZ(0);
  98. if (!centerXyz.IsEqual2(xyz))
  99. {
  100. XYZ vector = xyz - centerXyz;
  101. doc.MoveElement(fi.Id, vector);
  102. }
  103. trans.Commit();
  104. }
  105. else
  106. {
  107. MessageShowBase.Infomation("自动创建只能创建基于点的族,请查看族类型");
  108. }
  109. }
  110. catch (Exception e)
  111. {
  112. trans.RollBack();
  113. }
  114. }
  115. return fi?.Id.ToString();
  116. }
  117. /// <summary>
  118. /// 判断是否为基于点的设备
  119. /// </summary>
  120. /// <param name="fs"></param>
  121. /// <returns></returns>
  122. private static bool IsBasePointFamily(FamilySymbol fs)
  123. {
  124. bool result = false;
  125. Family fa = fs?.Family;
  126. if (fa == null) return result;
  127. result = fa.FamilyPlacementType == FamilyPlacementType.OneLevelBased;
  128. return result;
  129. }
  130. private static Level GetCurFloorLevel(Document doc)
  131. {
  132. var view = DocumentExtension.GetElements<ViewPlan>(doc).FirstOrDefault(t => t.GenLevel?.Name != null && t.Name?.IndexOf("-saga") > -1 && t.ViewType == ViewType.FloorPlan);
  133. Level level = view?.GenLevel ?? doc.GetLevels().FirstOrDefault();
  134. return level;
  135. }
  136. /// <summary>
  137. /// 由code获取FamilySymbol
  138. /// </summary>
  139. /// <param name="doc"></param>
  140. /// <param name="code"></param>
  141. /// <returns></returns>
  142. public static FamilySymbol GetFamilySymbol(Document doc,string code)
  143. {
  144. Func<string, bool> filterFamily = (t) =>
  145. {
  146. return Regex.IsMatch(t, $@"{code}{ModelCheckConst.IsFamilyCode}");
  147. };
  148. List<Family> listFamily = doc.GetFamilys();
  149. var fa = listFamily.FirstOrDefault(t => filterFamily(t.Name));
  150. if (fa == null) return null;
  151. List<FamilySymbol> symbolList = FamilyExtension.GetFamilySymbols(fa);
  152. var fs = symbolList?.FirstOrDefault();
  153. if (fs != null && !fs.IsActive)
  154. fs.Activate();
  155. return fs;
  156. }
  157. }
  158. }