FloorSpaceContext.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /*-------------------------------------------------------------------------
  2. * 功能描述:FloorSpaceContext
  3. * 作者:xulisong
  4. * 创建时间: 2018/12/17 10:18:02
  5. * 版本号:v1.0
  6. * -------------------------------------------------------------------------*/
  7. using System;
  8. using System.Collections.Generic;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using Autodesk.Revit.DB;
  14. using SAGA.MBI.JsonConvert;
  15. using SAGA.MBI.Model;
  16. using SAGA.RevitUtils;
  17. using SAGA.RevitUtils.Extends;
  18. namespace SAGA.MBI.WinView
  19. {
  20. /// <summary>
  21. /// 楼层空间上下文
  22. /// </summary>
  23. public class FloorSpaceContext
  24. {
  25. public FloorSpaceContext(MFloor floor)
  26. {
  27. this.Floor = floor;
  28. }
  29. /// <summary>
  30. /// 关联楼层信息
  31. /// </summary>
  32. public MFloor Floor { get;private set; }
  33. #region 关联楼层项目获取
  34. private Document m_Document;
  35. public Document Document
  36. {
  37. get
  38. {
  39. if (m_Document == null)
  40. {
  41. var filePath = this.Floor?.FullPath;
  42. if (!File.Exists(filePath))
  43. {
  44. throw new Exception("无法找到相关模型文件!");
  45. }
  46. //var uiDoc = ExternalDataWrapper.Current.UiApp.OpenAndActivateDocument(filePath);
  47. //var uiDoc = ExternalDataWrapper.Current.UiApp.OpenAndActivateDocument(filePath);
  48. m_Document = ExternalDataWrapper.Current.App.OpenDocumentFile(filePath);//uiDoc.Document;
  49. }
  50. return m_Document;
  51. }
  52. }
  53. #endregion
  54. #region 物理世界空间缓存
  55. /// <summary>
  56. /// 物理世界存在元空间
  57. /// </summary>
  58. public List<MSpace> ServerSpaces { get;private set; }
  59. public List<MSpace> GetPhysicalSpaces(List<string> elementIds)
  60. {
  61. if (ServerSpaces == null)
  62. {
  63. ServerSpaces = SpaceConvert.GetFloorSpaceInfos(this.Floor?.Id).OfType<MSpace>().ToList();
  64. }
  65. var spaces= ServerSpaces.Where(s => elementIds.Exists(id => id.ToString() == s.BimID.Split(':')[1])).ToList();
  66. return spaces;
  67. }
  68. #endregion
  69. #region 初始化空间
  70. /// <summary>
  71. /// 创建空间
  72. /// </summary>
  73. public bool CreateSpaces()
  74. {
  75. bool flag = true;
  76. #region 描述
  77. /*
  78. * 创建空间分两步:
  79. * 1、创建空间
  80. * 2、处理冲突
  81. */
  82. #endregion
  83. var spacePreprocessor = new SpaceFailuresPreprocessor();
  84. var document = Document;
  85. using (Transaction tran = new Transaction(document, "创建空间"))
  86. {
  87. try
  88. {
  89. FailureHandlingOptions fho = tran.GetFailureHandlingOptions();
  90. fho.SetFailuresPreprocessor(spacePreprocessor);
  91. tran.SetFailureHandlingOptions(fho);
  92. #region 创建空间
  93. spacePreprocessor.SetOperate(true);
  94. tran.Start();
  95. SpaceManager.CreateSpace(document);
  96. tran.Commit(); //提交获取冲突代码
  97. #endregion
  98. #region 冲突处理代码
  99. FailureHandlingOptions fhoDe = tran.GetFailureHandlingOptions();
  100. fhoDe.SetFailuresPreprocessor(new SpaceFailuresPreprocessor(false) );
  101. tran.SetFailureHandlingOptions(fhoDe);
  102. //spacePreprocessor.SetOperate(false);
  103. tran.Start();
  104. //返回值临时使用
  105. flag=SpaceManager.DealSpaceFailuresPreprocessor(document,spacePreprocessor.Items,this);
  106. tran.Commit();
  107. #endregion
  108. }
  109. catch (Exception ex)
  110. {
  111. tran.RollBack();
  112. flag = false;
  113. MessageShow.Show(ex);
  114. }
  115. }
  116. return flag;
  117. }
  118. #endregion
  119. public void UpdateSpaceSeqaration(List<SpaceSeparation> separations,List<int> deletedIds)
  120. {
  121. SpaceManager.UpdateSpaceSequaration(Document, separations, deletedIds);
  122. }
  123. }
  124. }