DalUploadFloor.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. /* ==============================================================================
  2. * 功能描述:上传或下载楼层文件
  3. * 创 建 者:Garrett
  4. * 创建日期:2018/3/30 18:16:55
  5. * ==============================================================================*/
  6. using Autodesk.Revit.DB;
  7. using Autodesk.Revit.DB.Mechanical;
  8. using SAGA.DotNetUtils;
  9. using SAGA.DotNetUtils.Extend;
  10. using SAGA.DotNetUtils.Logger;
  11. using SAGA.MBI.Calc;
  12. using SAGA.MBI.Common;
  13. using SAGA.MBI.Extend;
  14. using SAGA.MBI.Model;
  15. using SAGA.MBI.RequestData;
  16. using SAGA.MBI.Tools;
  17. using SAGA.MBI.WinView.Upload;
  18. using SAGA.RevitUtils;
  19. using SAGA.RevitUtils.Extends;
  20. using System;
  21. using System.Collections.Generic;
  22. using System.Collections.ObjectModel;
  23. using System.IO;
  24. using System.Linq;
  25. using System.Reflection;
  26. using SAGA.RevitUtils.MEP;
  27. namespace SAGA.MBI.DataArrange
  28. {
  29. /// <summary>
  30. /// DalUploadFloor
  31. /// </summary>
  32. public class DalUploadFloor
  33. {
  34. /// <summary>
  35. /// 检测是否需要下载模型,如果需要下载
  36. /// 下载前关闭打开的模型;
  37. /// 开始下载
  38. /// </summary>
  39. public static void CheckAndBeginDownLoadFile()
  40. {
  41. Log4Net.Debug("开始:检测是否需要下载模型,如果需要下载");
  42. if (!IsAllFloorClosed()) return;
  43. Log4Net.Debug("中间:检测下载模型,如果需要下载");
  44. BeginDownLoadFile();
  45. Log4Net.Debug("结束:检测是否需要下载模型,如果需要下载");
  46. }
  47. /// <summary>
  48. /// 对比文件,开始下载
  49. /// </summary>
  50. public static bool BeginDownLoadFile()
  51. {
  52. List<Tuple<string, int, string>> tuples = DalVisionOperate.GetNeedDownLoadFiles();
  53. int i = 0, j = 0;
  54. int count = tuples.Count;
  55. foreach (var tuple in tuples)
  56. {
  57. i++;
  58. if (UpLoadFileRequest.DownLoadFileAsync(tuple, count, i))
  59. {
  60. //下载成功-更新LocalFileVision文件
  61. string floorid = tuple.Item1.GetFileName();
  62. DalVisionOperate.SaveLocalVision(floorid, DalVisionOperate.GetCloudFileVision(floorid));
  63. //下载成功清除本机本层的日志数据,其它用户的日志上传成功的时候才清除日志
  64. ProjectLogManager.ClearFile(tuple.Item1);
  65. //更新拓扑计算结果版本
  66. GplotWatch.RefreshAll(DateTime.Now);
  67. j++;
  68. }
  69. else
  70. {
  71. break;
  72. }
  73. }
  74. if (count >= 1)
  75. //下载完成提示窗体;文件服务器缺少文件,会出现进度条无法关闭的情况;
  76. UpLoadFileRequest.CloseDownloadWin(count == j, hasTip: true);
  77. return i == j;
  78. }
  79. /// <summary>
  80. /// 重新下载模型文件
  81. /// </summary>
  82. /// <param name="floor"></param>
  83. /// <returns></returns>
  84. public static bool? ReDownLoadFile(MFloor floor, ref string msg)
  85. {
  86. string fullPath = floor.FullPath;
  87. bool? downloadstate;
  88. if (DalVisionOperate.IsFileChanged(fullPath, floor.ToString()))
  89. {
  90. Tuple<string, int, string> tuple = new Tuple<string, int, string>(fullPath, 2, floor.ToString());
  91. //模型文件有改动,备份并下载
  92. downloadstate = UpLoadFileRequest.DownLoadFileAsync(tuple, 1, 1);
  93. msg = downloadstate == true ? "模型文件更新成功" : "模型文件更新失败";
  94. string floorid = floor.Id;
  95. DalVisionOperate.SaveLocalVision(floorid, DalVisionOperate.GetCloudFileVision(floorid));
  96. //下载成功清除本机本层的日志数据,其它用户的日志上传成功的时候才清除日志
  97. ProjectLogManager.ClearFile(tuple.Item1);
  98. GplotWatch.RefreshAll(DateTime.Now);
  99. }
  100. else
  101. {
  102. //模型文件没有改动
  103. msg = "本地已是最新模型文件,无需更新;";
  104. downloadstate = null;
  105. }
  106. return downloadstate;
  107. }
  108. /// <summary>
  109. /// 获取有模型文件的楼层
  110. /// </summary>
  111. /// <param name="type"></param>
  112. /// <returns></returns>
  113. public static ObservableCollection<UploadFloor> GetHasFileFloors()
  114. {
  115. ObservableCollection<UploadFloor> ufloors = new ObservableCollection<UploadFloor>();
  116. List<MFloor> mfloors = DalProjectTree.GetAllFloors();
  117. foreach (var mFloor in mfloors)
  118. {
  119. UploadFloor ufloor = new UploadFloor();
  120. ufloor.BuildingName = mFloor.BuildingId;
  121. ufloor.FloorName = mFloor.ToString();
  122. ufloor.FloorPath = Path.Combine(mFloor.RelativePath, mFloor.RevitName + ".rvt");
  123. if (!mFloor.IsMissFile)
  124. {
  125. ufloor.MFloor = mFloor;
  126. ufloors.Add(ufloor);
  127. }
  128. }
  129. return ufloors;
  130. }
  131. /// <summary>
  132. /// 检查是否可以上传楼层
  133. /// 上传模型之前需要关闭所有模型文件
  134. /// </summary>
  135. public static bool IsAllFloorClosed()
  136. {
  137. //打开空文件并激活
  138. var placeholderFile = MBIConst.EmptyFilePath;
  139. var uiApp = ExternalDataWrapper.Current.UiApp;
  140. var docs = uiApp.Application.Documents;
  141. if (docs.IsEmpty) return true;
  142. var allFloors = GetHasFileFloors();
  143. //首先判断ActiveUIDocument是否为当前项目下的楼层
  144. if (uiApp.ActiveUIDocument == null) return true;
  145. Action replaceActiveDoc = () =>
  146. {
  147. string activeName = uiApp.ActiveUIDocument.Document.PathName;
  148. var floor = allFloors.FirstOrDefault(t => t.MFloor.FullPath == activeName);
  149. if (floor == null)
  150. {
  151. //不用打开空模型
  152. }
  153. else
  154. {
  155. //打开空模型
  156. uiApp.OpenAndActivateDocument(placeholderFile);
  157. }
  158. };
  159. List<Document> modifyFloors = new List<Document>();
  160. List<Document> nomodifyFloors = new List<Document>();
  161. //获取没有更改的楼层,同时获取更改的楼层
  162. foreach (Document doc in docs)
  163. {
  164. string activeName = doc.PathName;
  165. var floor = allFloors.FirstOrDefault(t => t.MFloor.FullPath == activeName);
  166. if (floor != null)
  167. {
  168. if (doc.IsModified)
  169. modifyFloors.Add(doc);
  170. else
  171. {
  172. nomodifyFloors.Add(doc);
  173. }
  174. }
  175. }
  176. //如果有更改的楼层,弹出确认框,待用户确认后,保存
  177. if (modifyFloors.Count > 0)
  178. {
  179. //弹出保存提示框
  180. WinUploadSaveFileConfirm win = new WinUploadSaveFileConfirm();
  181. if (win.ShowDialog() != true) return false;
  182. replaceActiveDoc();
  183. foreach (Document doc in modifyFloors)
  184. {
  185. doc.Close(true);
  186. }
  187. }
  188. {
  189. replaceActiveDoc();
  190. //关闭没有更改的楼层,
  191. foreach (Document doc in nomodifyFloors)
  192. {
  193. doc.Close(false);
  194. }
  195. }
  196. return true;
  197. }
  198. /// <summary>
  199. /// 是否需要更新模型文件
  200. /// </summary>
  201. /// <returns></returns>
  202. public static bool IsNeedUpdataFile()
  203. {
  204. bool result = true;
  205. var allFloors = GetHasFileFloors();
  206. //获取MD5改变的文件
  207. var modifyFloors = new ObservableCollection<UploadFloor>(allFloors
  208. .Where(t => DalVisionOperate.IsModifyFileOverdue(t.MFloor.FullPath, t.MFloor.ToString())).ToList());
  209. if (modifyFloors.Count > 0)
  210. {
  211. WinUploadTipFileOverdue win = new WinUploadTipFileOverdue();
  212. win.UploadFloors = modifyFloors;
  213. win.ShowDialog();
  214. }
  215. return modifyFloors.Count > 0;
  216. }
  217. /// <summary>
  218. /// 准备需要上传的楼层及拓扑关系
  219. /// </summary>
  220. public static VMUploadModeManage PrepareUploadFloors()
  221. {
  222. Log4Net.Info("PrepareUpload Start");
  223. string currentFloor = string.Empty;
  224. VMUploadModeManage vm = new VMUploadModeManage();
  225. try
  226. {
  227. //获取有模型文件的楼层
  228. var allFloors = GetHasFileFloors();
  229. //获取MD5改变的文件
  230. var modifyFloors = new ObservableCollection<UploadFloor>(allFloors
  231. .Where(t => DalVisionOperate.IsFileChanged(t.MFloor.FullPath, t.MFloor.ToString())).ToList());
  232. //获取所有的拓扑图类型
  233. var topologyGriphs = GetAllTopologyGriphs();
  234. foreach (UploadFloor uploadFloor in modifyFloors)
  235. {
  236. if (uploadFloor == null) continue;
  237. currentFloor = uploadFloor.MFloor.ToString();
  238. try
  239. {
  240. #region 日志影响拓扑图
  241. foreach (var topologyGriph in topologyGriphs)
  242. {
  243. uploadFloor.ReferGriphs.Add(topologyGriph);
  244. }
  245. #endregion
  246. uploadFloor.IsUpload = true;
  247. }
  248. catch (Exception e)
  249. {
  250. throw;
  251. }
  252. finally
  253. {
  254. }
  255. }
  256. vm.UploadFloors = modifyFloors;
  257. vm.MTopologyGriphs = PrepareMTopologyGriphs(modifyFloors);
  258. }
  259. catch (Exception e)
  260. {
  261. MessageShow.Show(e, strMessage: $"楼层 { currentFloor ?? string.Empty} 打开异常或网络异常,请检查后再进行操作!\r\n");
  262. vm = null;
  263. }
  264. Log4Net.Info("PrepareUpload Start");
  265. return vm;
  266. }
  267. /// <summary>
  268. /// 对 删除并保留岗位日志 进行的操作
  269. /// </summary>
  270. /// <param name="mode"></param>
  271. private static void OperateDelSaveDutyLog(MRevitEquipBase mode)
  272. {
  273. if (mode != null)
  274. {
  275. mode.Operator = DocumentChangedOperator.DeleteSaveDuty;
  276. }
  277. }
  278. /// <summary>
  279. /// 处理增加日志
  280. /// </summary>
  281. private static void OperateModifyLog(MRevitEquipBase mode, Element elem, CalcContext context)
  282. {
  283. //如果为空间并且周长为零,删除云平台的空间数据
  284. if (JudgeDeleteOperate(mode, elem)) return;
  285. var revitmode = DalCommon.GetEquipmentBase(elem);
  286. //不知什么原因,日志就显示add,但物理世界存在这条信息
  287. if (mode != null)
  288. {
  289. IsEquipClassCodeChanged(mode, elem, revitmode, context);
  290. }
  291. else
  292. {
  293. if (revitmode.IsNullOrDefaultEquip())
  294. {//不能识别的设备,部件,信标,空间
  295. }
  296. else
  297. {
  298. //请求Duty,Bim数据库中的id
  299. var dutyId = revitmode.GetDutyBIMRelationByBIM()?.DutyId;
  300. if (dutyId.IsNullOrEmpty())
  301. {//本地数据库不存在此岗位
  302. revitmode.Operator = DocumentChangedOperator.Add;
  303. context.Add(revitmode);
  304. }
  305. else
  306. {
  307. var cloudmode = CommonConvert.QueryObjectById(dutyId);
  308. if (cloudmode == null)
  309. {
  310. revitmode.Operator = DocumentChangedOperator.Add;
  311. context.Add(revitmode);
  312. }
  313. else
  314. {
  315. //待建模型清单新建的设备
  316. cloudmode.BimID = revitmode.BimID;
  317. IsEquipClassCodeChanged(cloudmode, elem, revitmode, context);
  318. context.Add(cloudmode);
  319. }
  320. }
  321. }
  322. }
  323. }
  324. /// <summary>
  325. /// 判断设备类编码是否更改
  326. /// 如果发生更改,把之前的删除。
  327. /// 重建岗位。
  328. /// </summary>
  329. /// <param name="mode"></param>
  330. /// <param name="tempmode"></param>
  331. /// <param name="context"></param>
  332. /// <returns></returns>
  333. private static bool IsEquipClassCodeChanged(MRevitEquipBase mode, Element elem, MRevitEquipBase tempmode, CalcContext context)
  334. {
  335. bool result = false;
  336. if (tempmode.IsNullOrDefaultEquip())
  337. {
  338. //本地编码不可识别,删除服务器数据
  339. //xls 新编码和旧编码一致,则不处理数据
  340. if (EquipmentCodeMap.GetOriginCode(mode.EquipClassCode) == EquipmentCodeMap.GetOriginCode(tempmode.EquipClassCode))
  341. {
  342. mode.Operator = DocumentChangedOperator.Modified;
  343. mode.ReadRevitParamter(elem);
  344. }
  345. else
  346. {
  347. mode.Operator = DocumentChangedOperator.Delete;
  348. }
  349. }
  350. else
  351. {
  352. //如果设备族四位或六位改了,需要将岗位删除,重建岗位
  353. //string code1 = EquipmentCodeMap.GetOriginCode(mode.EquipClassCode);
  354. //(tempmode.EquipClassCode 这个的取法上上一个不一样
  355. // string code2 = EquipmentCodeMap.GetOriginCode(tempmode.EquipClassCode);
  356. if (EquipmentCodeMap.GetOriginCode(mode.EquipClassCode) != EquipmentCodeMap.GetOriginCode(tempmode.EquipClassCode))
  357. {
  358. SetSavePropertyValue(tempmode, mode);
  359. mode.Operator = DocumentChangedOperator.Delete;
  360. tempmode.Operator = DocumentChangedOperator.Add;
  361. context.Add(tempmode);
  362. result = true;
  363. }
  364. else
  365. {
  366. mode.Operator = DocumentChangedOperator.Modified;
  367. mode.ReadRevitParamter(elem);
  368. }
  369. }
  370. return result;
  371. }
  372. /// <summary>
  373. /// 编码更改时保留的信息点
  374. /// </summary>
  375. /// <param name="mode"></param>
  376. /// <param name="oldmode"></param>
  377. public static void SetSavePropertyValue(MRevitEquipBase mode, MRevitEquipBase oldmode)
  378. {
  379. string[] saveProperties = new[] { "LocalId", "LocalName" };
  380. var oldProperties = oldmode.GetType().GetProperties();
  381. foreach (PropertyInfo property in oldProperties)
  382. {
  383. string name = property.Name;
  384. if (saveProperties.Contains(name))
  385. {
  386. object value = property.GetValue(oldmode);
  387. if (value != null)
  388. {
  389. property.SetValue(mode, value);
  390. }
  391. }
  392. }
  393. }
  394. /// <summary>
  395. /// 1,处理是无用的空间,周长为零
  396. /// 2,对象被删除
  397. /// </summary>
  398. /// <param name="elem"></param>
  399. /// <returns></returns>
  400. private static bool JudgeDeleteOperate(MRevitEquipBase mode, Element elem)
  401. {
  402. bool result = false;
  403. if (mode != null)
  404. {
  405. if (elem == null)
  406. {
  407. mode.Operator = DocumentChangedOperator.Delete;
  408. result = true;
  409. }
  410. else if (elem is Space space)
  411. {
  412. if (space.IsDeleteSpace())
  413. {
  414. //如果是无用空间,直接删除云平台对应数据
  415. mode.Operator = DocumentChangedOperator.Delete;
  416. result = true;
  417. }
  418. }
  419. }
  420. return result;
  421. }
  422. /// <summary>
  423. /// 准备需要显示的拓扑图(全集)
  424. /// </summary>
  425. /// <param name="uploadFloors"></param>
  426. /// <returns></returns>
  427. public static ObservableCollection<MTopologyGriph> PrepareMTopologyGriphs(ObservableCollection<UploadFloor> uploadFloors)
  428. {
  429. ObservableCollection<MTopologyGriph> list = new ObservableCollection<MTopologyGriph>();
  430. foreach (var uploadFloor in uploadFloors)
  431. {
  432. foreach (MTopologyGriph griph in uploadFloor.ReferGriphs)
  433. {
  434. var tempgriph = list.FirstOrDefault(t => t.Name == griph.Name);
  435. if (tempgriph == null)
  436. list.Add(griph);
  437. }
  438. }
  439. return list;
  440. }
  441. /// <summary>
  442. /// 上传
  443. /// </summary>
  444. public static void Upload()
  445. {
  446. //常规计算
  447. //常规上传
  448. //拓扑计算
  449. //拓扑上传
  450. }
  451. /// <summary>
  452. /// 获取所有的拓扑图类型
  453. /// </summary>
  454. /// <returns></returns>
  455. public static List<MTopologyGriph> GetAllTopologyGriphs()
  456. {
  457. List<MTopologyGriph> list = new List<MTopologyGriph>();
  458. list.Add(new MTopologyGriph() { Name = "空调冷冻水环路" });
  459. list.Add(new MTopologyGriph() { Name = "空调冷却水环路" });
  460. list.Add(new MTopologyGriph() { Name = "新风管网" });
  461. list.Add(new MTopologyGriph() { Name = "空调风管网" });
  462. list.Add(new MTopologyGriph() { Name = "光照辐射关系" });
  463. list.Add(new MTopologyGriph() { Name = "空间邻接关系" });
  464. list.Add(new MTopologyGriph() { Name = "建筑交通关系" });
  465. list.Add(new MTopologyGriph() { Name = "空间流通网络" });
  466. return list;
  467. }
  468. /// <summary>
  469. /// 新旧文件对比过后,需要添加的数据
  470. /// </summary>
  471. public static void WrapperContext(CalcContext cloudContext, CalcContext localContext)
  472. {
  473. CalcContext addContext = null;
  474. CalcContext delContext = null;
  475. CalcContext modifyContext = null;
  476. var cloudDutys = cloudContext.GetAllDutys();
  477. var localDutys = localContext.GetAllDutys();
  478. //设置初始状态
  479. cloudContext.SetState(DocumentChangedOperator.None);
  480. localContext.SetState(DocumentChangedOperator.None);
  481. #region Modify Add
  482. foreach (var lduty in localContext.GetAllDutys())
  483. {
  484. string bimId = lduty.BimID;
  485. var cdutys = cloudDutys.Where(t => t.BimID == bimId).ToList();
  486. MRevitEquipBase cduty = null;
  487. //如果对应多个岗位,仅保留信息点多的岗位,删除其它岗位
  488. if (cdutys.Any())
  489. {
  490. if (cdutys.Count() > 1)
  491. {//信息点的个数从大到小排序
  492. cdutys.Sort((x, y) => { return -x.CloundJObject.Count.CompareTo(y.CloundJObject.Count); });
  493. //删除多余的岗位
  494. for (int i = 1; i < cdutys.Count; i++)
  495. {
  496. cdutys[i].Operator = DocumentChangedOperator.Delete;
  497. }
  498. }
  499. cduty = cdutys.FirstOrDefault();
  500. }
  501. if (cduty == null)
  502. {//找不到物理世界对应的岗位,即为添加
  503. lduty.Operator = DocumentChangedOperator.Add;
  504. }
  505. else
  506. {
  507. //判断族编码是否更改
  508. if (EquipmentCodeMap.GetOriginCode(lduty.EquipClassCode) !=
  509. EquipmentCodeMap.GetOriginCode(cduty.EquipClassCode))
  510. {
  511. //族编码更改。删除旧岗位,创建新岗位
  512. cduty.Operator = DocumentChangedOperator.Delete;
  513. lduty.Operator = DocumentChangedOperator.Add;
  514. }
  515. else
  516. {
  517. lduty.Id = cduty.Id;
  518. lduty.Operator = DocumentChangedOperator.Modified;
  519. //后续物理世界Modified转化为None
  520. cduty.Operator = DocumentChangedOperator.Modified;
  521. }
  522. }
  523. //处理设备所在空间的关系
  524. OperateBaseRelation(localContext, lduty);
  525. }
  526. #endregion
  527. #region Delete
  528. //CloudDuty,有两种操作,更新和删除。更新等价于None
  529. foreach (var duty in cloudDutys)
  530. {
  531. //物理世界修改,不做处理
  532. if (duty.Operator == DocumentChangedOperator.Modified)
  533. {
  534. duty.Operator = DocumentChangedOperator.None;
  535. continue;
  536. }
  537. duty.Operator = DocumentChangedOperator.Delete;
  538. DelServiceRelation(cloudContext, duty);
  539. //删除时,会删除所在空间和所在楼层的关系
  540. }
  541. #endregion
  542. }
  543. /// <summary>
  544. /// 处理基本关系
  545. /// </summary>
  546. private static void DelServiceRelation(CalcContext localContext, MRevitEquipBase mode)
  547. {
  548. if (mode.Operator != DocumentChangedOperator.Delete) return;
  549. #region EquipInSpace,Beacon
  550. var equiprelations = localContext.RltEquipInSpaces;
  551. var beaconrelations = localContext.RltBeaconinElementSps;
  552. if (mode is MBSpace)
  553. {
  554. var equipRelation=new RltEquipInSpace(null,mode.Id){Operator = DocumentChangedOperator.Delete};
  555. equiprelations.Add(equipRelation);
  556. var beaconRelation = new RltBeaconinElementSp(null, mode.Id) { Operator = DocumentChangedOperator.Delete };
  557. beaconrelations.Add(beaconRelation);
  558. }
  559. else if (mode is MBeacon)
  560. {
  561. var beaconRelation = new RltBeaconinElementSp(mode.Id, null) { Operator = DocumentChangedOperator.Delete };
  562. beaconrelations.Add(beaconRelation);
  563. }
  564. else
  565. {
  566. var equipRelation = new RltEquipInSpace(mode.Id, null) { Operator = DocumentChangedOperator.Delete };
  567. equiprelations.Add(equipRelation);
  568. }
  569. #endregion
  570. }
  571. /// <summary>
  572. /// 处理基本关系
  573. /// </summary>
  574. private static void OperateBaseRelation(CalcContext localContext, MRevitEquipBase mode)
  575. {
  576. string bimid = mode.BimID;
  577. #region EquipInSpace,Beacon
  578. var equiprelations = localContext.RltEquipInSpaces;
  579. var beaconrelations = localContext.RltBeaconinElementSps;
  580. List<RltEquipInSpace> tempEquipRelations = new List<RltEquipInSpace>();
  581. List<RltBeaconinElementSp> tempBeaconRelations = new List<RltBeaconinElementSp>();
  582. if (mode is MBSpace)
  583. {
  584. tempEquipRelations = equiprelations.Where(t => t.MSpace.BimID == bimid).ToList();
  585. tempBeaconRelations = beaconrelations.Where(t => t.MSpace.BimID == bimid).ToList();
  586. }
  587. else if (mode is MBeacon)
  588. {
  589. tempBeaconRelations = beaconrelations.Where(t => t.MBeacon.BimID == bimid).ToList();
  590. }
  591. else
  592. {
  593. tempEquipRelations = equiprelations.Where(t => t.MEquipment.BimID == bimid).ToList();
  594. }
  595. switch (mode.Operator)
  596. {
  597. case DocumentChangedOperator.Add:
  598. tempEquipRelations.ForEach(t => t.Operator = DocumentChangedOperator.Add);
  599. tempBeaconRelations.ForEach(t => t.Operator = DocumentChangedOperator.Add);
  600. break;
  601. case DocumentChangedOperator.Delete:
  602. tempEquipRelations.ForEach(t => t.Operator = DocumentChangedOperator.Delete);
  603. tempBeaconRelations.ForEach(t => t.Operator = DocumentChangedOperator.Delete);
  604. break;
  605. case DocumentChangedOperator.Modified:
  606. tempEquipRelations.ForEach(t => t.Operator = DocumentChangedOperator.Delete);
  607. tempEquipRelations.ForEach(t => equiprelations.Add(new RltEquipInSpace(t.MSpace, t.MEquipment) { Operator = DocumentChangedOperator.Add }));
  608. tempBeaconRelations.ForEach(t => t.Operator = DocumentChangedOperator.Delete);
  609. tempBeaconRelations.ForEach(t => beaconrelations.Add(new RltBeaconinElementSp(t.MSpace, t.MBeacon) { Operator = DocumentChangedOperator.Add }));
  610. break;
  611. default:
  612. break;
  613. }
  614. #endregion
  615. }
  616. }
  617. }