Browse Source

xls:关系信息处理

xls 6 năm trước cách đây
mục cha
commit
eef1cabbf5

+ 42 - 12
MBI/SAGA.GplotManage/GplotCommand.cs

@@ -1,14 +1,17 @@
 using System.Collections.Generic;
+using System.IO;
 using System.Threading;
 using Autodesk.Revit.Attributes;
 using Autodesk.Revit.DB;
 using Autodesk.Revit.UI;
+using Newtonsoft.Json;
 using SAGA.GplotDrawData;
 using SAGA.GplotDrawData.View;
 using SAGA.GplotManage.UploadRelated;
 using SAGA.GplotRelationComputerManage;
 using SAGA.MBI.Common;
 using SAGA.Models;
+using SAGA.RevitUtils;
 using SAGA.RevitUtils.Extends;
 
 namespace SAGA.GplotManage
@@ -123,22 +126,49 @@ namespace SAGA.GplotManage
         public override Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
         {
             //var graph = new ChillWaterLoop();
-            List<Gplot> gplots = new List<Gplot>();
-            gplots.Add(new ElementSpNeighborhood());
-            gplots.Add(new TrafficNetwork());
-            gplots.Add(new ConvectionNetwork());
-            gplots.Add(new RadiationNetwork());
-            foreach (var gplot in gplots)
-            {
-                var graph =gplot;//new ElementSpNeighborhood();
-                graph.Relationship = graph.ComputerEffectRelationShip;
-                graph.Upload();
+            //List<Gplot> gplots = new List<Gplot>();
+            //gplots.Add(new ElementSpNeighborhood());
+            //gplots.Add(new TrafficNetwork());
+            //gplots.Add(new ConvectionNetwork());
+            //gplots.Add(new RadiationNetwork());
+            //foreach (var gplot in gplots)
+            //{
+            //    var graph =gplot;//new ElementSpNeighborhood();
+            //    graph.Relationship = graph.ComputerEffectRelationShip;
+            //    graph.Upload();
 
-            }
-           
+            //}
+            var relationDatas = RelationDataUtil.BuildRelations("ChillWaterLoop");
+              Criteria Criterias= new Criteria
+              {
+                  criterias = relationDatas
+              };
+            var relation= ConvertJsonString(Criterias);
+            MessageShow.Infomation(relation);
             return Result.Succeeded;
         }
+        private string ConvertJsonString(object object1)
+        {
+            //格式化json字符串
+            JsonSerializer serializer = new JsonSerializer();
 
+            if (object1 != null)
+            {
+                StringWriter textWriter = new StringWriter();
+                JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)
+                {
+                    Formatting = Formatting.Indented,
+                    Indentation = 4,
+                    IndentChar = ' '
+                };
+                serializer.Serialize(jsonWriter, object1);
+                return textWriter.ToString();
+            }
+            else
+            {
+                return "";
+            }
+        }
         public override bool IsCommandAvailable(UIApplication applicationData, CategorySet selectedCategories)
         {
             return true;

+ 1 - 0
MBI/SAGA.GplotManage/SAGA.GplotManage.csproj

@@ -120,6 +120,7 @@
     <Compile Include="GplotManage\GplotView\GplotView.cs" />
     <Compile Include="Command\GplotUtil.cs" />
     <Compile Include="GraphTypeEnum.cs" />
+    <Compile Include="SystemRelation\RelationDataUtil.cs" />
     <Compile Include="UploadRelated\AirNetwork.cs" />
     <Compile Include="UploadRelated\ControlRelation.cs" />
     <Compile Include="UploadRelated\ConvectionNetwork.cs" />

+ 146 - 0
MBI/SAGA.GplotManage/SystemRelation/RelationDataUtil.cs

@@ -0,0 +1,146 @@
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using SAGA.GplotRelationComputerManage;
+
+namespace SAGA.GplotManage
+{
+    /// <summary>
+    /// 关系数据处理
+    /// </summary>
+    public class RelationDataUtil
+    {
+        /// <summary>
+        /// 上传关系数据
+        /// </summary>
+        /// <param name="relationData"></param>
+        /// <returns></returns>
+        public static List<ReleateData> BuildRelations(LoadRelationData relationData)
+        {
+            #region 说明
+            /*
+             * 数据关联项:
+             * 机房设备---特殊阀门
+             * 特殊阀门---立管
+             * 立管--立管
+             * 立管---平面设备;由此=》机房设备---平面设备
+             */
+            #endregion
+            List<ReleateData> result = new List<ReleateData>();
+            List<BinaryRelationItem> roomRelations = new List<BinaryRelationItem>();
+            List<BinaryRelationItem> floorRelations = new List<BinaryRelationItem>();
+            #region 机房关系数据
+            var machineRoomData = relationData.MachineRoomRelationRecords;
+            foreach (var machineRelation in machineRoomData)
+            {
+                foreach (var item in machineRelation.RelationItems)
+                {
+                    if (item.IsEquipmentLink())
+                    {
+                        result.Add(CreateRelationData(item));
+                    }
+                    else
+                    {
+                        roomRelations.Add(item);
+                    }
+                }
+            }
+            #endregion
+            #region 平面关系数据
+            foreach (var floorRelation in relationData.FloorRelationRecords)
+            {
+                foreach (var item in floorRelation.RelationItems)
+                {
+                    if (item.IsEquipmentLink())
+                    {
+                        result.Add(CreateRelationData(item));
+                    }
+                    else
+                    {
+                        roomRelations.Add(item);
+                    }
+                }
+            }
+            #endregion
+
+            var verticalSets = relationData.VerticalRelationRecords;
+
+            #region 机房和平面关联
+            /*
+             * 前提不是全设备
+             */
+            foreach (var roomRelation in roomRelations)
+            {
+                EquipmentNode equipmentNode, linkNode;
+                if(!roomRelation.From.IsRealEquipment&&!roomRelation.To.IsRealEquipment)
+                {
+                    continue;
+                }
+                if(roomRelation.From.IsRealEquipment)
+                {
+                    equipmentNode = roomRelation.From;
+                    linkNode = roomRelation.To;
+                }
+                else
+                {
+                    equipmentNode = roomRelation.To;
+                    linkNode = roomRelation.From;
+                }
+                List<string> useLinks = new List<string>();
+                var useSet = verticalSets.FirstOrDefault(s => s.RelationItems.Any(item => item == linkNode.BimId));
+                if(useSet==null)
+                {
+                    useLinks.Add(linkNode.BimId);
+                }
+                else
+                {
+                    useLinks.AddRange(useSet.RelationItems);
+                }
+                foreach (var useLink in useLinks)
+                {
+                   var floorRelation= floorRelations.FirstOrDefault(c => c.From.BimId == useLink || c.To.BimId == useLink);
+                    BinaryRelationItem newRelationItem = new BinaryRelationItem();
+                    newRelationItem.From = equipmentNode;
+                    newRelationItem.To = floorRelation.From.BimId != useLink ? floorRelation.From : floorRelation.To;
+                    newRelationItem.RelationType = floorRelation.RelationType;
+
+                    //加入关系数据
+                    result.Add(CreateRelationData(newRelationItem));
+                }
+
+            }
+            #endregion
+            return result;
+        }
+        /// <summary>
+        /// 创建上传关系数据
+        /// </summary>
+        /// <param name="relationType"></param>
+        /// <returns></returns>
+        public static List<ReleateData> BuildRelations(string  relationType)
+        {
+            LoadRelationData data = new LoadRelationData(relationType);
+            data.LoadData();
+            return BuildRelations(data);
+        }
+
+        #region 私有方法
+        /// <summary>
+        /// 创建上传关系数据
+        /// </summary>
+        /// <param name="relationItem"></param>
+        /// <returns></returns>
+        private static ReleateData CreateRelationData(BinaryRelationItem relationItem)
+        {
+            ReleateData relation = new ReleateData();
+            relation.from_id = relationItem.From.MbiId;
+            relation.to_id = relationItem.To.MbiId;
+            relation.rel_type = relationItem.RelationType;
+            return relation;
+        }
+        #endregion
+    }
+}

+ 47 - 0
MBI/SAGA.GplotRelationComputerManage/Common/MBIInfoUtil.cs

@@ -86,6 +86,53 @@ namespace SAGA.GplotRelationComputerManage
         }
 
         /// <summary>
+        /// 获取设备的分类
+        /// </summary>
+        /// <param name="element"></param>
+        /// <returns></returns>
+        public static bool TryGetEquipmentCategory(Element element,out string category)
+        {
+            category = null;
+            if (!(element is FamilyInstance))
+            {
+                return false;
+            }
+            List<BuiltInCategory> categories = new List<BuiltInCategory>();
+            categories.Add(BuiltInCategory.OST_PipeFitting);
+            categories.Add(BuiltInCategory.OST_DuctFitting);
+            if (categories.Any(c => element.Category.Id.IntegerValue == (int)c))
+            {
+                return false;
+            }
+            string familyName = element.GetFamily()?.Name ?? string.Empty;
+            var match = Regex.Match(familyName, @"^(?:((?:[A-Z][A-Z]){2,3})\s*-\s*\S*)");
+            if (match.Success)
+            {
+                category = match.Groups[1].ToString();
+            }
+            return match.Success;
+        }
+        /// <summary>
+        /// 获取设备的设备分类
+        /// </summary>
+        /// <param name="element"></param>
+        /// <returns></returns>
+        public static string GetEquipmentCategory(Element element)
+        {
+            string category = null;
+            if (!(element is FamilyInstance fi))
+            {
+                return category;
+            }
+            string familyName = fi.GetFamily()?.Name;
+            var match = Regex.Match(familyName, @"^(?:((?:[A-Z][A-Z]){2,3})\s*-\s*\S*)");
+            if (match.Success)
+            {
+                category = match.Groups[1].ToString();
+            }
+            return category;
+        }
+        /// <summary>
         /// 通过标高名称获取楼层名称
         /// </summary>
         /// <param name="levelName"></param>

+ 5 - 4
MBI/SAGA.GplotRelationComputerManage/SystemRelation/Common/SystemParseManager.cs

@@ -391,9 +391,11 @@ namespace SAGA.GplotRelationComputerManage
             }
             else if (element is FamilyInstance)
             {
-                if (MBIInfoUtil.IsEquipment(element))
+                string tempCategory;
+                if (MBIInfoUtil.TryGetEquipmentCategory(element,out tempCategory))
                 {
-                    node.Category = PointItemType.Equipment.ToString();
+                    node.Category = tempCategory;
+                    node.IsRealEquipment = true;
                 }
                 else if (SystemCalcUtil.IsStart(element))
                 {
@@ -405,7 +407,7 @@ namespace SAGA.GplotRelationComputerManage
             #region 确定返回之后进行后初始化处理
             if (outNode != null)
             {
-                outNode.RevitId = element.Id.IntegerValue.ToString();
+                outNode.RevitId = element.Id.ToString();
                 outNode.BimId = element.GetBimId();
             } 
             #endregion
@@ -547,7 +549,6 @@ namespace SAGA.GplotRelationComputerManage
     {
         /// <summary>
         ///  立管左右错开小于2Cm
-        /// 
         /// </summary>
         /// <param name="x"></param>
         /// <param name="y"></param>

+ 9 - 0
MBI/SAGA.GplotRelationComputerManage/SystemRelation/Data/BinaryRelationItem.cs

@@ -41,6 +41,15 @@ namespace SAGA.GplotRelationComputerManage
             From = temp;
         }
 
+        /// <summary>
+        /// 是否是设备连接
+        /// </summary>
+        /// <returns></returns>
+        public bool IsEquipmentLink()
+        {
+            return From.IsRealEquipment && To.IsRealEquipment;
+        }
+
        
     }
 }

+ 5 - 0
MBI/SAGA.GplotRelationComputerManage/SystemRelation/Data/EquipmentNode.cs

@@ -49,5 +49,10 @@ namespace SAGA.GplotRelationComputerManage
             node.Category = this.Category;
             return node;
         }
+        /// <summary>
+        /// 是否是真实设备
+        /// </summary>
+        public bool IsRealEquipment { get; set; }
+        
     }
 }

+ 48 - 7
MBI/SAGA.GplotRelationComputerManage/SystemRelation/FloorSystemItem.cs

@@ -12,6 +12,7 @@ using Autodesk.Revit.DB;
 using Autodesk.Revit.DB.Mechanical;
 using Autodesk.Revit.DB.Plumbing;
 using SAGA.DotNetUtils.Data;
+using SAGA.DotNetUtils.Extend;
 using SAGA.GplotRelationComputerManage.ColdRoom;
 using SAGA.Models;
 using SAGA.Models.GplotElement;
@@ -259,7 +260,7 @@ namespace SAGA.GplotRelationComputerManage
                     drawRecord.SystemName = startNode.Flag;
                     drawRecords.Add(drawRecord);
 
-                    var relationRecord = BuildFloorRelationRecord(relationSetting, useNode);
+                    var relationRecord = BuildFloorRelationRecord(relationSetting, useNode,context);
                     relationRecords.Add(relationRecord);
                 }
 
@@ -316,7 +317,7 @@ namespace SAGA.GplotRelationComputerManage
                     drawRecord.SystemName = systemTypeName;
                     drawRecords.Add(drawRecord);
 
-                    var relationRecord = BuildFloorRelationRecord(relationSetting, startNode);
+                    var relationRecord = BuildFloorRelationRecord(relationSetting, startNode,context);
                     relationRecords.Add(relationRecord);
 
                     #endregion
@@ -417,12 +418,32 @@ namespace SAGA.GplotRelationComputerManage
             return floorDraw;
         }
 
-        private FloorRelationRecord BuildFloorRelationRecord(RelationTypeShell relationShell, ElementTreeNode node)
+        private FloorRelationRecord BuildFloorRelationRecord(RelationTypeShell relationShell, ElementTreeNode node, SystemComputerContext context)
         {
             var floorRelation = new FloorRelationRecord();
             floorRelation.SetFloorLevel(UseLevel);
             floorRelation.RelationType = relationShell.RelationItem.Type;
-            floorRelation.RelationItems = SystemParseManager.CreateRelation(node) ?? new List<BinaryRelationItem>();
+            var records= SystemParseManager.CreateRelation(node) ?? new List<BinaryRelationItem>();
+            floorRelation.RelationItems = records;
+            var mathSystem=relationShell.GetFirstMatchSystem(node.PipeSystemTypeName);
+            var edgeType = mathSystem.ContainEdgeTypes.FirstOrDefault();
+            if(string.IsNullOrWhiteSpace(edgeType))
+            {
+                edgeType = "1";
+            }
+
+            //增加关联对象名称
+            records.ForEach(e => {
+                var nodes = new List<EquipmentNode>() { e.From, e.To };
+                nodes.ForEach(n => n.MbiId = context.EquipmentItems.GetItem(n.BimId)?.Id);
+                e.RelationType = edgeType;
+                if(mathSystem!=null&&mathSystem.FlowType==FlowType.Out)
+                {
+                    //根据流向反转关系
+                    e.Reverse();
+                }
+
+            });
             return floorRelation;
         }
 
@@ -520,7 +541,9 @@ namespace SAGA.GplotRelationComputerManage
             List<Element> useStartElements = new List<Element>(startElements);
             var arrays = parse.Execute(useStartElements);
             arrays.RemoveAll(c => c.GetAvailableVertexes(null).All(v => !v.IsRealEquipment()));
-            
+
+        
+
             #region 生成图形数据
             ColdRoomManager manager = new ColdRoomManager();
             var doc = manager.CreateDocument(new List<ElementEdgesArray>(arrays));
@@ -538,8 +561,8 @@ namespace SAGA.GplotRelationComputerManage
             foreach (var item in relations)
             {
                 var node = new BinaryRelationItem();
-                node.From = new EquipmentNode() { RevitId = item.EquipmentItem1.Id };
-                node.To = new EquipmentNode() { RevitId = item.EquipmentItem2.Id };
+                node.From = ConverEquipmentNode(item.EquipmentItem1, context);
+                node.To = ConverEquipmentNode(item.EquipmentItem2, context); 
                 node.RelationType = item.LinkType;
                 relationRecord.RelationItems.Add(node);
 
@@ -555,6 +578,24 @@ namespace SAGA.GplotRelationComputerManage
             return useEquipments;
 
         }
+
+        private EquipmentNode ConverEquipmentNode(EquipmentItem item, SystemComputerContext context)
+        {
+            EquipmentNode result = new EquipmentNode();
+            result.RevitId = item.Id;
+            result.BimId = CreateBimId(result.RevitId);
+            result.MbiId = context.EquipmentItems.GetItem(result.BimId)?.Id ?? string.Empty;
+            return result;
+        }
         #endregion 解析机房数据
+        /// <summary>
+        /// 根据revitId获取bimId
+        /// </summary>
+        /// <param name="revitId"></param>
+        /// <returns></returns>
+        private string CreateBimId(string revitId)
+        {
+            return string.Format($"{Document.PathName.GetFileName()}:{revitId}");
+        }
     }
 }