|
@@ -1,15 +1,22 @@
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
using System.IO;
|
|
|
+using System.Linq;
|
|
|
using Autodesk.Revit.Attributes;
|
|
|
using Autodesk.Revit.DB;
|
|
|
using Autodesk.Revit.UI;
|
|
|
using Newtonsoft.Json;
|
|
|
+using Newtonsoft.Json.Linq;
|
|
|
+using NPOI.SS.UserModel;
|
|
|
+using NPOI.XSSF.UserModel;
|
|
|
+using SAGA.DotNetUtils.Data;
|
|
|
using SAGA.GplotDrawData;
|
|
|
using SAGA.GplotDrawData.View;
|
|
|
using SAGA.GplotManage.RelationManager;
|
|
|
using SAGA.GplotRelationComputerManage;
|
|
|
+using SAGA.MBI.RequestData;
|
|
|
using SAGA.Models;
|
|
|
+using SAGA.RevitUtils;
|
|
|
using SAGA.RevitUtils.Extends;
|
|
|
|
|
|
namespace SAGA.GplotManage
|
|
@@ -195,5 +202,250 @@ namespace SAGA.GplotManage
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 竖井查找
|
|
|
+ /// </summary>
|
|
|
+ [Transaction(TransactionMode.Manual)]
|
|
|
+ [Regeneration(RegenerationOption.Manual)]
|
|
|
+ public class SearchShaftCommand : ExternalCommand
|
|
|
+ {
|
|
|
+ public override bool IsCommandAvailable(UIApplication applicationData, CategorySet selectedCategories)
|
|
|
+ {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ public override Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
|
|
|
+ {
|
|
|
+ //按计算结果计算 2019年4月10日10:17:23
|
|
|
+
|
|
|
+ /*1、加载所有空间信息
|
|
|
+ *2、加载关系数据,确定关系信息;
|
|
|
+ *3、找到相关关系,和给定基准空间不同的关系
|
|
|
+ */
|
|
|
+ string relationType = "ElementSpNeighborhood";
|
|
|
+ string graphId = RelationRequest.GetCurrentGraphId(relationType);
|
|
|
+ List<string> baseSpaceIds = new List<string>();
|
|
|
+ Dictionary<string, List<SpaceInfo>> dicGroup = new Dictionary<string, List<SpaceInfo>>();
|
|
|
+ foreach (var baseSpaceId in baseSpaceIds)
|
|
|
+ {
|
|
|
+ List<RoomItem> singleItems = new List<RoomItem>();
|
|
|
+
|
|
|
+ var roomItem = GetRoomItem(baseSpaceId);
|
|
|
+ if (roomItem == null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ singleItems.Add(roomItem);
|
|
|
+ //找到楼层下的,空间对
|
|
|
+ for (int i = 0; i < singleItems.Count; i++)
|
|
|
+ {
|
|
|
+ var currentItem = singleItems[i];
|
|
|
+ var currentFloorId = currentItem.FloorId;
|
|
|
+ var relationsItems = QueryRelations(currentItem.Id, graphId);
|
|
|
+ foreach (var relationsItem in relationsItems)
|
|
|
+ {
|
|
|
+ if (singleItems.Any(room => room.Id == relationsItem))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ var tempRoomItem = GetRoomItem(relationsItem);
|
|
|
+ if (tempRoomItem == null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (tempRoomItem.FloorId != currentFloorId)
|
|
|
+ {
|
|
|
+ singleItems.Add(tempRoomItem);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ dicGroup[baseSpaceId] = singleItems.Select(r =>
|
|
|
+ {
|
|
|
+ var tempRoom = SpaceInfo.Parse(r);
|
|
|
+ tempRoom.FloorName = GetFloorItem(r.FloorId)?.LocalName ?? string.Empty;
|
|
|
+ return tempRoom;
|
|
|
+ }).ToList();
|
|
|
+ }
|
|
|
+
|
|
|
+ ExportExcel(@"C:\Users\sagacloud\Desktop\亚心电梯井BIMID统计.xlsx", dicGroup);
|
|
|
+ MessageShow.Infomation("导出成功");
|
|
|
+ return Result.Succeeded;
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 缓存空间对象
|
|
|
+ /// </summary>
|
|
|
+ private Dictionary<string, RoomItem> m_Rooms = null;
|
|
|
+ /// <summary>
|
|
|
+ /// 获取根据指定bimId,获取空间信息
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="siId"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public RoomItem GetRoomItem(string siId)
|
|
|
+ {
|
|
|
+ if (m_Rooms == null)
|
|
|
+ {
|
|
|
+ m_Rooms = new Dictionary<string, RoomItem>();
|
|
|
+ var str = new string[] { MBIBuiltInCategory.Si };//元空间为Si
|
|
|
+ List<JObject> datas = CommonConvert.QueryObjectInfoByTypes(str);
|
|
|
+ foreach (var data in datas)
|
|
|
+ {
|
|
|
+ var roomItem = MBIItemFactory.Create<RoomItem>(data);
|
|
|
+ m_Rooms[roomItem.Id] = roomItem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ m_Rooms.TryGetValue(siId, out RoomItem resultItem);
|
|
|
+ return resultItem;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 缓存空间对象
|
|
|
+ /// </summary>
|
|
|
+ private Dictionary<string, FloorItem> m_Floors = null;
|
|
|
+ /// <summary>
|
|
|
+ /// 获取根据指定bimId,获取空间信息
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="floorId"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public FloorItem GetFloorItem(string floorId)
|
|
|
+ {
|
|
|
+ if (m_Floors == null)
|
|
|
+ {
|
|
|
+ m_Floors = new Dictionary<string, FloorItem>();
|
|
|
+ var str = new string[] { MBIBuiltInCategory.Fl };//元空间为Si
|
|
|
+ List<JObject> datas = CommonConvert.QueryObjectInfoByTypes(str);
|
|
|
+ foreach (var data in datas)
|
|
|
+ {
|
|
|
+ var floorItem = MBIItemFactory.Create<FloorItem>(data);
|
|
|
+ m_Floors[floorItem.Id] = floorItem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ m_Floors.TryGetValue(floorId, out FloorItem resultItem);
|
|
|
+ return resultItem;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Dictionary<string, SimpleGraph<string, string>> m_DicGraph =
|
|
|
+ new Dictionary<string, SimpleGraph<string, string>>();
|
|
|
+ public List<string> QueryRelations(string itemId, string graphId)
|
|
|
+ {
|
|
|
+ string useKey = graphId;
|
|
|
+ if(!m_DicGraph.TryGetValue(useKey,out SimpleGraph<string, string> graph))
|
|
|
+ {
|
|
|
+ var tuples = RelationRequest.QueryRelations(graphId, null);
|
|
|
+ var tempGraph = new SimpleGraph<string, string>();
|
|
|
+ foreach (var tuple in tuples)
|
|
|
+ {
|
|
|
+ tempGraph.AddVertex(new SimpleVertex<string>() {Id = tuple.Item1});
|
|
|
+ tempGraph.AddVertex(new SimpleVertex<string>() { Id = tuple.Item2 });
|
|
|
+ tempGraph.AddEdge(new SimpleEdge<string>(tuple.Item1, tuple.Item2));
|
|
|
+ }
|
|
|
+
|
|
|
+ m_DicGraph[useKey] = tempGraph;
|
|
|
+ graph = tempGraph;
|
|
|
+ }
|
|
|
+
|
|
|
+ var vertexes=graph.GetOutVertexes(itemId)??new List<SimpleVertex<string>>();
|
|
|
+ return vertexes.Select(v => v.Id).ToList();
|
|
|
+ }
|
|
|
+ public class SpaceInfo
|
|
|
+ {
|
|
|
+ /// <summary>
|
|
|
+ /// 元空间Id
|
|
|
+ /// </summary>
|
|
|
+ public string Id { get; set; }
|
|
|
+ /// <summary>
|
|
|
+ /// BimId
|
|
|
+ /// </summary>
|
|
|
+ public string BimId { get; set; }
|
|
|
+ /// <summary>
|
|
|
+ /// 楼层Id
|
|
|
+ /// </summary>
|
|
|
+ public string FloorId { get; set; }
|
|
|
+ /// <summary>
|
|
|
+ /// 楼层名称
|
|
|
+ /// </summary>
|
|
|
+ public string FloorName { get; set; }
|
|
|
+ /// <summary>
|
|
|
+ /// 本地名称
|
|
|
+ /// </summary>
|
|
|
+ public string Name { get; set; }
|
|
|
+
|
|
|
+ public static SpaceInfo Parse(RoomItem roomItem)
|
|
|
+ {
|
|
|
+ SpaceInfo info = new SpaceInfo();
|
|
|
+ info.Id = roomItem.Id;
|
|
|
+ info.FloorId = roomItem.FloorId;
|
|
|
+ info.Name = roomItem.GetDisplay();
|
|
|
+ info.BimId = roomItem.RevitId.ToString();
|
|
|
+ return info;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void ExportExcel(string path, Dictionary<string, List<SpaceInfo>> dicSpaces)
|
|
|
+ {
|
|
|
+ IWorkbook book = new XSSFWorkbook(path);
|
|
|
+ ISheet sheet = book.GetSheet("Sheet1");
|
|
|
+ Dictionary<string, int> dicCoulmnIndexs = new Dictionary<string, int>();
|
|
|
+ Dictionary<string, int> dicRowIndexs = new Dictionary<string, int>();
|
|
|
+ for (int i = 0; i < 45; i++)
|
|
|
+ {
|
|
|
+ var tempValue = sheet.GetRow(6).GetCell(i).StringCellValue;
|
|
|
+ if (tempValue != null&& tempValue.Contains("Si"))
|
|
|
+ {
|
|
|
+ dicCoulmnIndexs[tempValue] = i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (int i = 0; i < 30; i++)
|
|
|
+ {
|
|
|
+ var tempValue = sheet.GetRow(i).GetCell(1).StringCellValue;
|
|
|
+ if (tempValue != null && tempValue.Contains("F"))
|
|
|
+ {
|
|
|
+ dicRowIndexs[tempValue] = i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ foreach (var dicSpace in dicSpaces)
|
|
|
+ {
|
|
|
+ var key = dicSpace.Key;
|
|
|
+ if (!dicCoulmnIndexs.TryGetValue(key, out int tempColumnIndex))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ var columnIndex = tempColumnIndex;
|
|
|
+ foreach (var spaceInfo in dicSpace.Value)
|
|
|
+ {
|
|
|
+ if (!dicRowIndexs.TryGetValue(key, out int temprRowIndex))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ var rowIndex = temprRowIndex;
|
|
|
+ var cell = sheet.GetRow(rowIndex).GetCell(columnIndex);
|
|
|
+ if (cell != null)
|
|
|
+ {
|
|
|
+ string oldValue = cell.StringCellValue??string.Empty;
|
|
|
+ cell.SetCellValue(oldValue + "\r" + spaceInfo.Id);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #region 写入excel
|
|
|
+
|
|
|
+ book.Close();
|
|
|
+ //MemoryStream ms = new MemoryStream();
|
|
|
+ //book.Write(ms);
|
|
|
+ //book = null;
|
|
|
+ //using (System.IO.FileStream fs = new System.IO.FileStream(path, FileMode.Open, FileAccess.Write))
|
|
|
+ //{
|
|
|
+ // byte[] data = ms.ToArray();
|
|
|
+ // fs.Write(data, 0, data.Length);
|
|
|
+ // fs.Flush();
|
|
|
+ //}
|
|
|
+ //ms.Close();
|
|
|
+ //ms.Dispose();
|
|
|
+
|
|
|
+ #endregion
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|