DalUploadFloor.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. /* ==============================================================================
  2. * 功能描述:上传或下载楼层文件
  3. * 创 建 者:Garrett
  4. * 创建日期:2018/3/30 18:16:55
  5. * ==============================================================================*/
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Collections.ObjectModel;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Reflection;
  12. using Autodesk.Revit.DB;
  13. using Autodesk.Revit.DB.Mechanical;
  14. using SAGA.DotNetUtils;
  15. using SAGA.DotNetUtils.Extend;
  16. using SAGA.DotNetUtils.Logger;
  17. using SAGA.DotNetUtils.Others;
  18. using SAGA.MBI.Calc;
  19. using SAGA.MBI.Common;
  20. using SAGA.MBI.Extend;
  21. using SAGA.MBI.FileStream;
  22. using SAGA.MBI.Interaction;
  23. using SAGA.MBI.JsonConvert;
  24. using SAGA.MBI.Model;
  25. using SAGA.MBI.RequestData;
  26. using SAGA.MBI.Tools;
  27. using SAGA.MBI.WinView.Upload;
  28. using SAGA.RevitUtils;
  29. using SAGA.RevitUtils.Extends;
  30. namespace SAGA.MBI.DataArrange
  31. {
  32. /// <summary>
  33. /// DalUploadFloor
  34. /// </summary>
  35. public class DalUploadFloor
  36. {
  37. /// <summary>
  38. /// 检测是否需要下载模型,如果需要下载
  39. /// 下载前关闭打开的模型;
  40. /// 开始下载
  41. /// </summary>
  42. public static void CheckAndBeginDownLoadFile()
  43. {
  44. Log4Net.Debug("开始:检测是否需要下载模型,如果需要下载");
  45. if (!IsAllFloorClosed()) return;
  46. Log4Net.Debug("中间:检测下载模型,如果需要下载");
  47. BeginDownLoadFile();
  48. Log4Net.Debug("结束:检测是否需要下载模型,如果需要下载");
  49. }
  50. /// <summary>
  51. /// 对比文件,开始下载
  52. /// </summary>
  53. public static bool BeginDownLoadFile()
  54. {
  55. List<Tuple<string, int, string>> tuples = DalVisionOperate.GetNeedDownLoadFiles();
  56. int i = 0, j = 0;
  57. int count = tuples.Count;
  58. foreach (var tuple in tuples)
  59. {
  60. i++;
  61. if (UpLoadFileRequest.DownLoadFileAsync(tuple, count, i))
  62. {
  63. //下载成功-更新LocalFileVision文件
  64. string floorid = tuple.Item1.GetFileName();
  65. DalVisionOperate.SaveLocalVision(floorid, DalVisionOperate.GetCloudFileVision(floorid));
  66. //下载成功清除本机本层的日志数据,其它用户的日志上传成功的时候才清除日志
  67. ProjectLogManager.ClearFile(tuple.Item1);
  68. j++;
  69. }
  70. else
  71. {
  72. break;
  73. }
  74. }
  75. if (count >= 1)
  76. //下载完成提示窗体;文件服务器缺少文件,会出现进度条无法关闭的情况;
  77. UpLoadFileRequest.CloseDownloadWin(count == j, hasTip: true);
  78. return i == j;
  79. }
  80. /// <summary>
  81. /// 重新下载模型文件
  82. /// </summary>
  83. /// <param name="floor"></param>
  84. /// <returns></returns>
  85. public static bool? ReDownLoadFile(MFloor floor, ref string msg)
  86. {
  87. string fullPath = floor.FullPath;
  88. bool? downloadstate;
  89. if (DalVisionOperate.IsFileChanged(fullPath, floor.ToString()))
  90. {
  91. Tuple<string, int, string> tuple = new Tuple<string, int, string>(fullPath, 2, floor.ToString());
  92. //模型文件有改动,备份并下载
  93. downloadstate = UpLoadFileRequest.DownLoadFileAsync(tuple, 1, 1);
  94. msg = downloadstate == true ? "模型文件更新成功" : "模型文件更新失败";
  95. string floorid = floor.Id;
  96. DalVisionOperate.SaveLocalVision(floorid, DalVisionOperate.GetCloudFileVision(floorid));
  97. //下载成功清除本机本层的日志数据,其它用户的日志上传成功的时候才清除日志
  98. ProjectLogManager.ClearFile(tuple.Item1);
  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. string currentFloor = string.Empty;
  223. try
  224. {
  225. VMUploadModeManage vm = new VMUploadModeManage();
  226. //获取有模型文件的楼层
  227. var allFloors = GetHasFileFloors();
  228. //获取MD5改变的文件
  229. var modifyFloors = new ObservableCollection<UploadFloor>(allFloors
  230. .Where(t => DalVisionOperate.IsFileChanged(t.MFloor.FullPath, t.MFloor.ToString())).ToList());
  231. //获取所有的拓扑图类型
  232. var topologyGriphs = GetAllTopologyGriphs();
  233. foreach (UploadFloor uploadFloor in modifyFloors)
  234. {
  235. if (uploadFloor == null) continue;
  236. //检测到自己加锁 才读取日志
  237. if (uploadFloor.MFloor.FloorLock.LockState != MFloorLockState.LockBySelf)
  238. continue;
  239. currentFloor = uploadFloor.MFloor.ToString();
  240. Document document = null;
  241. try
  242. {
  243. #region 同步空间名称
  244. document = ExternalDataWrapper.Current.App.OpenDocumentFile(uploadFloor.MFloor.FullPath);
  245. MBIModelInfoManager.SyncPlatformToRevit(document);
  246. #endregion
  247. #region 跟据日志整理跟要上传的数据
  248. //检测有日志文件,才上传
  249. var logs = DalLogOperate.GetLogs(uploadFloor.MFloor.Id);
  250. if (!logs.Any()) continue;
  251. uploadFloor.CalcContext = DalCommon.DownLoadCouldData(uploadFloor.MFloor);
  252. CalcContext context = uploadFloor.CalcContext;
  253. //按id分组后的日志
  254. var floorLogsGroupByBimId = logs.GroupBy(t => t.Id);
  255. //所有的拓扑图类型
  256. var tempGriphs = new List<MTopologyGriph>(topologyGriphs);
  257. foreach (IGrouping<string, DocumentChangedLogMode> logGroup in floorLogsGroupByBimId)
  258. {
  259. DocumentChangedLogMode log = logGroup.LastOrDefault();
  260. if (log == null) continue;
  261. var bimId = CommonTool.GetCloudBIMId(log.DocName, log.Id);
  262. var elem = document.GetElement(log.Id.ToInt());
  263. //日志影响构件
  264. var operate =
  265. (DocumentChangedOperator)Enum.Parse(typeof(DocumentChangedOperator), log.Operator);
  266. var mode = context.FindItem(bimId);
  267. //模型和物理世界都找不到这条数据,Next
  268. if (mode == null && elem == null) continue;
  269. switch (operate)
  270. {
  271. case DocumentChangedOperator.Add:
  272. case DocumentChangedOperator.Modified:
  273. case DocumentChangedOperator.Delete:
  274. OperateModifyLog(mode, elem, context);
  275. break;
  276. case DocumentChangedOperator.DeleteSaveDuty:
  277. OperateDelSaveDutyLog(mode);
  278. break;
  279. }
  280. #region 日志影响拓扑图
  281. //日志影响拓扑图,影响则标记,从所有中移除
  282. var useGriphs = new List<MTopologyGriph>(topologyGriphs);
  283. foreach (var topologyGriph in tempGriphs)
  284. {
  285. if (topologyGriph.IsAffectGriph(log))
  286. {
  287. useGriphs.Add(topologyGriph);
  288. uploadFloor.ReferGriphs.Add(topologyGriph);
  289. }
  290. }
  291. tempGriphs.RemoveAll(t => useGriphs.Contains(t));
  292. #endregion
  293. }
  294. #endregion
  295. //处理设备所在空间
  296. CheckEquipSpaceRlt(context);
  297. uploadFloor.IsUpload = true;
  298. }
  299. catch (Exception e)
  300. {
  301. throw;
  302. }
  303. finally
  304. {
  305. document?.CloseDoc();
  306. }
  307. }
  308. vm.UploadFloors = modifyFloors;
  309. vm.MTopologyGriphs = PrepareMTopologyGriphs(modifyFloors);
  310. return vm;
  311. }
  312. catch (Exception e)
  313. {
  314. MessageShow.Show(e, strMessage: $"楼层 { currentFloor ?? string.Empty} 打开异常或网络异常,请检查后再进行操作!\r\n");
  315. return null;
  316. }
  317. }
  318. /// <summary>
  319. /// 对 删除并保留岗位日志 进行的操作
  320. /// </summary>
  321. /// <param name="mode"></param>
  322. private static void OperateDelSaveDutyLog(MRevitEquipBase mode)
  323. {
  324. if (mode != null)
  325. {
  326. mode.Operator = DocumentChangedOperator.DeleteSaveDuty;
  327. }
  328. }
  329. /// <summary>
  330. /// 处理增加日志
  331. /// </summary>
  332. private static void OperateModifyLog(MRevitEquipBase mode, Element elem, CalcContext context)
  333. {
  334. //如果为空间并且周长为零,删除云平台的空间数据
  335. if (JudgeDeleteOperate(mode, elem)) return;
  336. var revitmode = DalCommon.GetEquipmentBase(elem);
  337. //不知什么原因,日志就显示add,但物理世界存在这条信息
  338. if (mode != null)
  339. {
  340. IsEquipClassCodeChanged(mode,elem, revitmode, context);
  341. }
  342. else
  343. {
  344. if (revitmode.IsNullOrDefaultEquip())
  345. {//不能识别的设备,部件,信标,空间
  346. }
  347. else
  348. {
  349. //请求Duty,Bim数据库中的id
  350. var dutyId = revitmode.GetDutyBIMRelationByBIM()?.DutyId;
  351. if (dutyId.IsNullOrEmpty())
  352. {//本地数据库不存在此岗位
  353. revitmode.Operator = DocumentChangedOperator.Add;
  354. context.Add(revitmode);
  355. }
  356. else
  357. {
  358. var cloudmode = CommonConvert.QueryObjectById(dutyId);
  359. if (cloudmode == null)
  360. {
  361. revitmode.Operator = DocumentChangedOperator.Add;
  362. context.Add(revitmode);
  363. }
  364. else
  365. {
  366. //待建模型清单新建的设备
  367. cloudmode.BimID = revitmode.BimID;
  368. IsEquipClassCodeChanged(cloudmode,elem, revitmode, context);
  369. context.Add(cloudmode);
  370. }
  371. }
  372. }
  373. }
  374. }
  375. /// <summary>
  376. /// 判断设备类编码是否更改
  377. /// 如果发生更改,把之前的删除。
  378. /// 重建岗位。
  379. /// </summary>
  380. /// <param name="mode"></param>
  381. /// <param name="tempmode"></param>
  382. /// <param name="context"></param>
  383. /// <returns></returns>
  384. private static bool IsEquipClassCodeChanged(MRevitEquipBase mode,Element elem, MRevitEquipBase tempmode, CalcContext context)
  385. {
  386. bool result = false;
  387. if (tempmode.IsNullOrDefaultEquip())
  388. {
  389. //本地编码不可识别,删除服务器数据
  390. //xls 新编码和旧编码一致,则不处理数据
  391. if (EquipmentCodeMap.GetOriginCode(mode.EquipClassCode) == EquipmentCodeMap.GetOriginCode(tempmode.EquipClassCode))
  392. {
  393. mode.Operator = DocumentChangedOperator.Modified;
  394. mode.ReadRevitParamter(elem);
  395. }
  396. else
  397. {
  398. mode.Operator = DocumentChangedOperator.Delete;
  399. }
  400. }
  401. else
  402. {
  403. //如果设备族四位或六位改了,需要将岗位删除,重建岗位
  404. //string code1 = EquipmentCodeMap.GetOriginCode(mode.EquipClassCode);
  405. //(tempmode.EquipClassCode 这个的取法上上一个不一样
  406. // string code2 = EquipmentCodeMap.GetOriginCode(tempmode.EquipClassCode);
  407. if (EquipmentCodeMap.GetOriginCode(mode.EquipClassCode) != EquipmentCodeMap.GetOriginCode(tempmode.EquipClassCode))
  408. {
  409. SetSavePropertyValue(tempmode, mode);
  410. mode.Operator = DocumentChangedOperator.Delete;
  411. tempmode.Operator = DocumentChangedOperator.Add;
  412. context.Add(tempmode);
  413. result = true;
  414. }
  415. else
  416. {
  417. mode.Operator = DocumentChangedOperator.Modified;
  418. mode.ReadRevitParamter(elem);
  419. }
  420. }
  421. return result;
  422. }
  423. /// <summary>
  424. /// 编码更改时保留的信息点
  425. /// </summary>
  426. /// <param name="mode"></param>
  427. /// <param name="oldmode"></param>
  428. public static void SetSavePropertyValue(MRevitEquipBase mode, MRevitEquipBase oldmode)
  429. {
  430. string[] saveProperties = new[] { "LocalId", "LocalName" };
  431. var oldProperties = oldmode.GetType().GetProperties();
  432. foreach (PropertyInfo property in oldProperties)
  433. {
  434. string name = property.Name;
  435. if (saveProperties.Contains(name))
  436. {
  437. object value = property.GetValue(oldmode);
  438. if (value != null)
  439. {
  440. property.SetValue(mode, value);
  441. }
  442. }
  443. }
  444. }
  445. /// <summary>
  446. /// 1,处理是无用的空间,周长为零
  447. /// 2,对象被删除
  448. /// </summary>
  449. /// <param name="elem"></param>
  450. /// <returns></returns>
  451. private static bool JudgeDeleteOperate(MRevitEquipBase mode, Element elem)
  452. {
  453. bool result = false;
  454. if (mode != null)
  455. {
  456. if (elem == null)
  457. {
  458. mode.Operator = DocumentChangedOperator.Delete;
  459. result = true;
  460. }
  461. else if (elem is Space space)
  462. {
  463. if (space.IsDeleteSpace())
  464. {
  465. //如果是无用空间,直接删除云平台对应数据
  466. mode.Operator = DocumentChangedOperator.Delete;
  467. result = true;
  468. }
  469. }
  470. }
  471. return result;
  472. }
  473. /// <summary>
  474. /// 准备需要显示的拓扑图(全集)
  475. /// </summary>
  476. /// <param name="uploadFloors"></param>
  477. /// <returns></returns>
  478. public static ObservableCollection<MTopologyGriph> PrepareMTopologyGriphs(ObservableCollection<UploadFloor> uploadFloors)
  479. {
  480. ObservableCollection<MTopologyGriph> list = new ObservableCollection<MTopologyGriph>();
  481. foreach (var uploadFloor in uploadFloors)
  482. {
  483. foreach (MTopologyGriph griph in uploadFloor.ReferGriphs)
  484. {
  485. var tempgriph = list.FirstOrDefault(t => t.Name == griph.Name);
  486. if (tempgriph == null)
  487. list.Add(griph);
  488. }
  489. }
  490. return list;
  491. }
  492. /// <summary>
  493. /// 关闭revit文件
  494. /// </summary>
  495. /// <param name="uploadFloors"></param>
  496. /// <returns></returns>
  497. public static ObservableCollection<MTopologyGriph> CloseFloorDoc(ObservableCollection<UploadFloor> uploadFloors)
  498. {
  499. ObservableCollection<MTopologyGriph> list = new ObservableCollection<MTopologyGriph>();
  500. foreach (var uploadFloor in uploadFloors)
  501. {
  502. uploadFloor.CalcContext?.RevitDoc.CloseDoc();
  503. }
  504. return list;
  505. }
  506. /// <summary>
  507. /// 处理设备所在空间
  508. /// </summary>
  509. /// <param name="context"></param>
  510. private static void CheckEquipSpaceRlt(CalcContext context)
  511. {
  512. //设备
  513. foreach (MEquipment equip in context.MEquipments)
  514. {
  515. OperateEquipInSpace(equip, context);
  516. }
  517. //部件
  518. foreach (MEquipmentPart equip in context.MEquipmentParts)
  519. {
  520. OperateEquipInSpace(equip, context);
  521. }
  522. //信标
  523. foreach (MBeacon mode in context.MBeacons)
  524. {
  525. OperateRltBeaconinElementSp(mode, context);
  526. }
  527. }
  528. /// <summary>
  529. /// 处理设备所在空间
  530. /// </summary>
  531. /// <param name="mode"></param>
  532. /// <param name="context"></param>
  533. private static void OperateEquipInSpace(MRevitEquipBase mode, CalcContext context)
  534. {
  535. //if (mode.Operator == DocumentChangedOperator.None) return;
  536. var revitId = mode.BimID.GetBIMID();
  537. if (revitId == 0) return;
  538. var fi = context.RevitDoc.GetElement(revitId) as FamilyInstance;
  539. Autodesk.Revit.DB.Mechanical.Space space = fi?.GetReferenceSpace();
  540. if (space == null) return;
  541. //查询有没有Space对象
  542. string spaceId = space.GetCloudBIMId();
  543. var mspace = context.MSpaces.FirstOrDefault(t => t.BimID == spaceId);
  544. if (mspace == null) return;
  545. switch (mode.Operator)
  546. {
  547. case DocumentChangedOperator.Add:
  548. context.RltEquipInSpaces.Add(new RltEquipInSpace(mspace, mode) { Operator = DocumentChangedOperator.Add });
  549. break;
  550. case DocumentChangedOperator.Delete:
  551. context.RltEquipInSpaces.Add(new RltEquipInSpace(null, mode) { Operator = DocumentChangedOperator.Delete });
  552. break;
  553. case DocumentChangedOperator.Modified:
  554. //修改为,先删除,再新建
  555. context.RltEquipInSpaces.Add(new RltEquipInSpace(null, mode) { Operator = DocumentChangedOperator.Delete });
  556. context.RltEquipInSpaces.Add(new RltEquipInSpace(mspace, mode) { Operator = DocumentChangedOperator.Add });
  557. break;
  558. case DocumentChangedOperator.None:
  559. //空间更改可能不引起设备修改,所以设备所在元空间关系跟据元空间状态重新计算。
  560. if (mspace.Operator == DocumentChangedOperator.Add ||
  561. mspace.Operator == DocumentChangedOperator.Modified)
  562. {
  563. context.RltEquipInSpaces.Add(new RltEquipInSpace(null, mode) { Operator = DocumentChangedOperator.Delete });
  564. context.RltEquipInSpaces.Add(new RltEquipInSpace(mspace, mode) { Operator = DocumentChangedOperator.Add });
  565. }
  566. else if (mspace.Operator == DocumentChangedOperator.Delete)
  567. {
  568. context.RltEquipInSpaces.Add(new RltEquipInSpace(null, mode) { Operator = DocumentChangedOperator.Delete });
  569. }
  570. break;
  571. }
  572. }
  573. /// <summary>
  574. /// 信标所在元空间
  575. /// </summary>
  576. /// <param name="mode"></param>
  577. /// <param name="context"></param>
  578. private static void OperateRltBeaconinElementSp(MRevitEquipBase mode, CalcContext context)
  579. {
  580. if (mode.Operator == DocumentChangedOperator.None) return;
  581. var revitId = mode.BimID.GetBIMID();
  582. var fi = context.RevitDoc.GetElement(revitId) as FamilyInstance;
  583. Autodesk.Revit.DB.Mechanical.Space space = fi?.Space;
  584. if (space == null) return;
  585. //查询有没有Space对象
  586. string spaceId = space.GetCloudBIMId();
  587. var mspace = context.MSpaces.FirstOrDefault(t => t.BimID == spaceId);
  588. if (mspace == null) return;
  589. switch (mode.Operator)
  590. {
  591. case DocumentChangedOperator.Add:
  592. context.RltBeaconinElementSps.Add(new RltBeaconinElementSp(mspace, mode) { Operator = DocumentChangedOperator.Add });
  593. break;
  594. case DocumentChangedOperator.Modified:
  595. //修改为,先删除,再新建
  596. context.RltBeaconinElementSps.Add(new RltBeaconinElementSp(null, mode) { Operator = DocumentChangedOperator.Delete });
  597. context.RltBeaconinElementSps.Add(new RltBeaconinElementSp(mspace, mode) { Operator = DocumentChangedOperator.Add });
  598. break;
  599. case DocumentChangedOperator.Delete:
  600. context.RltBeaconinElementSps.Add(new RltBeaconinElementSp(null, mode) { Operator = DocumentChangedOperator.Delete });
  601. break;
  602. }
  603. }
  604. /// <summary>
  605. /// 上传
  606. /// </summary>
  607. public static void Upload()
  608. {
  609. //常规计算
  610. //常规上传
  611. //拓扑计算
  612. //拓扑上传
  613. }
  614. /// <summary>
  615. /// 获取所有的拓扑图类型
  616. /// </summary>
  617. /// <returns></returns>
  618. public static List<MTopologyGriph> GetAllTopologyGriphs()
  619. {
  620. List<MTopologyGriph> list = new List<MTopologyGriph>();
  621. list.Add(new MTopologyGriph() { Name = "空调冷冻水环路" });
  622. list.Add(new MTopologyGriph() { Name = "空调冷却水环路" });
  623. list.Add(new MTopologyGriph() { Name = "新风管网" });
  624. list.Add(new MTopologyGriph() { Name = "空调风管网" });
  625. list.Add(new MTopologyGriph() { Name = "光照辐射关系" });
  626. list.Add(new MTopologyGriph() { Name = "空间邻接关系" });
  627. list.Add(new MTopologyGriph() { Name = "建筑交通关系" });
  628. list.Add(new MTopologyGriph() { Name = "空间流通网络" });
  629. return list;
  630. }
  631. }
  632. public enum UploadType
  633. {
  634. //文件模型修正
  635. ModeModify,
  636. //更新模型文件
  637. FileReplace
  638. }
  639. }