WinCreateSpaceWeb.xaml.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows;
  8. using System.Windows.Controls;
  9. using Autodesk.Revit.DB;
  10. using Autodesk.Revit.UI;
  11. using Newtonsoft.Json.Linq;
  12. using SAGA.DotNetUtils;
  13. using SAGA.MBI.DataArrange;
  14. using SAGA.MBI.Model;
  15. using SAGA.MBI.RevitExport;
  16. using SAGA.MBI.WinView.ModeInfoMaintenance;
  17. using SAGA.RevitUtils;
  18. using SAGA.RevitUtils.Extends;
  19. using SAGA.RevitUtils.Windows;
  20. using Visibility = System.Windows.Visibility;
  21. namespace SAGA.MBI.WinView.Space
  22. {
  23. /// <summary>
  24. /// WinCreateSpaceWeb.xaml 的交互逻辑
  25. /// </summary>
  26. public partial class WinCreateSpaceWeb : WinBase
  27. {
  28. public WinCreateSpaceWeb()
  29. {
  30. InitializeComponent();
  31. ucShowElement.RegisterJsObject("wpfEvent", this);
  32. this.Loaded += WinCreateSpaceWeb_Loaded;
  33. }
  34. private void WinCreateSpaceWeb_Loaded(object sender, RoutedEventArgs e)
  35. {
  36. InitData();
  37. ucShowElement.Show(" http://192.168.20.86:8091/#/demo");
  38. }
  39. private void InitData()
  40. {
  41. tv.ItemsSource = new ObservableCollection<TreeNodeItem>(DalModeFileManange.GetMissFileFloors(false));
  42. }
  43. #region 条目切换事件
  44. private void Tv_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
  45. {
  46. try
  47. {
  48. #region 核心代码
  49. //检测是否有未保存的数据,数据分两部分:新建的空间分隔符,删除的空间分隔符
  50. //删除空间分割的id和新建空间分割的线
  51. var editData = GetEditData();
  52. List<int> deletedIds = editData.DeletedIds;
  53. var newDatas = editData.NewDatas;
  54. #region 切换前节点处理
  55. if (deletedIds.Count > 0 || newDatas.Any())
  56. {
  57. WinConfirm confirm = CreateSaveConfirm();
  58. var result = confirm.ShowDialog();
  59. if (result == true)
  60. {
  61. SaveFloor(editData);
  62. // return;
  63. }
  64. }
  65. #endregion
  66. //异步造成执行顺序混乱的情况,所以使用idling排队
  67. ExecuteCmd.ExecuteCommandOnce(() =>
  68. {
  69. if (tv.SelectedItem is TreeNodeItem item && item.Item is MFloor floor)
  70. {
  71. InitFloor(floor);
  72. }
  73. return Result.Succeeded;
  74. }, () => { return Result.Succeeded; });
  75. #endregion
  76. }
  77. catch (Exception ex)
  78. {
  79. MessageShow.Show(ex);
  80. }
  81. }
  82. /// <summary>
  83. /// 切换空间,亮显空间
  84. /// </summary>
  85. /// <param name="sender"></param>
  86. /// <param name="e"></param>
  87. private void lbSpaces_SelectionChanged(object sender, SelectionChangedEventArgs e)
  88. {
  89. try
  90. {
  91. if (lbSpaces.SelectedItems.Count == 0) return;
  92. var space = lbSpaces.SelectedItems[0] as MISpace;
  93. var bimId = space.BimID.Split(':')[1];
  94. //发送js填充命令
  95. var strJs = $"getData('{bimId.ToString()}')";
  96. ucShowElement.ExecuteJsFun(strJs);
  97. #region 显示属性窗格
  98. var doc = CurrentContext.Document;
  99. if (doc == null)
  100. return;
  101. var revitSpace = doc.GetElement(new ElementId(bimId.ToInt()));
  102. if (revitSpace == null)
  103. return;
  104. MRevitEquipBase equipment = DalCommon.GetEquipmentQueryId(revitSpace);
  105. if (equipment != null)
  106. {
  107. var win = WinModeInfoMaintenanceForSpace.GetWindow();
  108. win.Topmost = true;
  109. win.Show(equipment);
  110. win.Visibility = Visibility.Visible;
  111. }
  112. #endregion
  113. }
  114. catch (Exception ex)
  115. {
  116. MessageShow.Show(ex);
  117. }
  118. }
  119. #endregion
  120. #region 确认窗口初始化
  121. /// <summary>
  122. /// 创建保存确认提示框
  123. /// </summary>
  124. /// <returns></returns>
  125. private WinConfirm CreateSaveConfirm()
  126. {
  127. WinConfirm confirm = new WinConfirm()
  128. {
  129. ShowMessage = "尚未保存空间变化,确认放弃修改?",
  130. TTitle = "空间修改确认",
  131. BtnSure = "保存并更改模型",
  132. BtnCancel = "放弃修改",
  133. Owner = this
  134. };
  135. return confirm;
  136. }
  137. /// <summary>
  138. /// 获取上传确认窗口
  139. /// </summary>
  140. /// <returns></returns>
  141. private Window CreateUploadConfirm()
  142. {
  143. WinConfirm confirm = new WinConfirm()
  144. {
  145. ShowMessage = "空间已发生变化,是否现在就上传模型并计算空间?",
  146. TTitle = "空间计算确认",
  147. BtnSure = "上传模型并计算空间",
  148. BtnCancel = "暂不计算",
  149. Owner = this,
  150. };
  151. return confirm;
  152. }
  153. #endregion
  154. #region 界面信息相关处理
  155. /// <summary>
  156. /// 清理窗口显示的楼层相关数据
  157. /// </summary>
  158. private void ClearFloorData()
  159. {
  160. WinModeInfoMaintenance.GetWindow().Hide();
  161. this.lbSpaces.ItemsSource = new ObservableCollection<MISpace>(); ;
  162. }
  163. /// <summary>
  164. /// 设置窗口楼层相关数据
  165. /// </summary>
  166. public void SetFloorData(Document document)
  167. {
  168. var spaces = CurrentContext.Document.GetElements<SpatialElement>().Where(s => s is Autodesk.Revit.DB.Mechanical.Space && s.Area > 0).ToList();
  169. var datas = CurrentContext.GetPhysicalSpaces(spaces.Select(t => t.Id.IntegerValue.ToString()).ToList());
  170. var localSpace = spaces.Where(t => !datas.Any(s => s.BimID.Split(':')[1] == t.Id.ToString()))
  171. .Select(t => new MISpace("", $"{Guid.NewGuid()}:{t.Id.ToString()}") { Name = t.Name});
  172. datas.AddRange(localSpace);
  173. lbSpaces.ItemsSource = new ObservableCollection<MISpace>(datas);
  174. }
  175. #endregion
  176. #region 空间管理相关逻辑
  177. public FloorSpaceContext CurrentContext;
  178. public void InitFloor(MFloor floor)
  179. {
  180. try
  181. {
  182. ClearFloorData();
  183. #region 数据整理
  184. FloorSpaceContext context = new FloorSpaceContext(floor);
  185. CurrentContext = context;
  186. var doc = context.Document;
  187. var view = doc.GetUseView();
  188. if (view == null)
  189. {
  190. MessageBox.Show("无法找到名称以-saga结尾的视图!");
  191. return;
  192. }
  193. ExecuteCmd.ExecuteCommand(() =>
  194. {
  195. context.CreateSpaces();
  196. #region 初始化界面
  197. SetCanvasShow();
  198. #endregion
  199. SetFloorData(doc);
  200. return Result.Succeeded;
  201. });
  202. #endregion
  203. }
  204. catch (Exception ex)
  205. {
  206. MessageBox.Show(ex.Message);
  207. }
  208. }
  209. private void SaveFloor(EditData editData)
  210. {
  211. //禁用界面,防止重复提交
  212. this.IsEnabled = false;
  213. var deletedIds = editData.DeletedIds;
  214. List<PointPair> saveDatas = editData.NewDatas;
  215. bool flagExecuteSuccess = true;//本应在回调函数里传值,目前代码不支持
  216. ExecuteCmd.ExecuteCommandOnce(() =>
  217. {
  218. #region 创建空间
  219. var seqs = saveDatas.Select(points => new SpaceSeparation(points.RPoint[0], points.RPoint[1])).ToList();
  220. using (TransactionGroup group = new TransactionGroup(CurrentContext.Document, "保存空间修改"))
  221. {
  222. group.Start();
  223. CurrentContext.UpdateSpaceSeqaration(seqs, deletedIds);
  224. var createSuccess = CurrentContext.CreateSpaces();
  225. if (!createSuccess)
  226. {
  227. flagExecuteSuccess = false;
  228. group.RollBack();
  229. MessageShow.Infomation("保存楼层空间失败");
  230. return Result.Succeeded;
  231. }
  232. group.Assimilate();
  233. }
  234. #endregion
  235. #region 初始化界面
  236. SetCanvasShow();
  237. #endregion
  238. #region 上传模型选择
  239. Window confirm = CreateUploadConfirm();
  240. var result = confirm.ShowDialog();
  241. //选择以后界面可用
  242. this.IsEnabled = true;
  243. if (result == true)
  244. {
  245. //添加默认提示
  246. SetEmptyTip();
  247. ClearFloorData();
  248. }
  249. else
  250. {
  251. flagExecuteSuccess = false;
  252. }
  253. #endregion
  254. return Result.Succeeded;
  255. }, () =>
  256. {
  257. try
  258. {
  259. var document = CurrentContext.Document;
  260. document.Save();
  261. if (!flagExecuteSuccess)
  262. {
  263. return Result.Succeeded;
  264. }
  265. SpaceManager.UploadModel(document);
  266. }
  267. catch (Exception ex)
  268. {
  269. MessageShow.Show(ex);
  270. }
  271. return Result.Succeeded;
  272. });
  273. }
  274. #endregion
  275. #region 界面交互
  276. public EditData GetEditData()
  277. {
  278. EditData data = new EditData();
  279. return data;
  280. }
  281. public void SetEmptyTip()
  282. {
  283. //清空空间,提示相关信息
  284. string tips = "请选择一个需要进行空间管理的楼层";
  285. }
  286. public void SetCanvasShow()
  287. {
  288. var jobject = GetModelDrawing();
  289. }
  290. #endregion
  291. #region js调用命令
  292. public void Save()
  293. {
  294. var editData = GetEditData();
  295. SaveFloor(editData);
  296. ExecuteCmd.ExecuteCommandOnce(() =>
  297. {
  298. if (tv.SelectedItem is TreeNodeItem item && item.Item is MFloor floor)
  299. {
  300. InitFloor(floor);
  301. }
  302. return Result.Succeeded;
  303. }, () => { return Result.Succeeded; });
  304. MessageBox.Show("Save");
  305. }
  306. #endregion
  307. /// <summary>
  308. /// 获取模型绘图数据
  309. /// </summary>
  310. /// <returns></returns>
  311. private JObject GetModelDrawing()
  312. {
  313. //柱子,墙,虚拟墙,空间
  314. Document linkDoc = CurrentContext.Document;
  315. MbiElementManager manager = new MbiElementManager();
  316. var exportDb = manager.ExportMbiEelemntDB(ExportDataBuilder.CreateExportData(linkDoc));
  317. return exportDb.ToJsonObject();
  318. }
  319. private void Button_Click(object sender, RoutedEventArgs e)
  320. {
  321. //var strJs = Js.Text;
  322. StringBuilder builder = new StringBuilder();
  323. for (int i = 0; i < 1024 * 1024 * 10; i++)
  324. {
  325. builder.Append("a");
  326. }
  327. var strJs = $"getData('{builder.ToString()}')";
  328. ucShowElement.ExecuteJsFun(strJs);
  329. }
  330. public void SaveStr(string path)
  331. {
  332. MessageBox.Show(path??"没有数据");
  333. }
  334. public void SaveObj(object obj)
  335. {
  336. if (obj != null)
  337. {
  338. MessageBox.Show(obj.ToString());
  339. }
  340. }
  341. private void Button_Click_1(object sender, RoutedEventArgs e)
  342. {
  343. ucShowElement.Show(" http://192.168.20.86:8091/#/demo");
  344. }
  345. }
  346. public class EditData
  347. {
  348. public EditData()
  349. {
  350. DeletedIds = new List<int>();
  351. NewDatas = new List<PointPair>();
  352. }
  353. public List<int> DeletedIds { get; set; }
  354. public List<PointPair> NewDatas { get; set; }
  355. }
  356. }