123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using SAGA.DotNetUtils;
- using SAGA.DotNetUtils.NPOI;
- using SAGA.Models;
- namespace SAGA.GplotRelationComputerManage
- {
- /// <summary>
- /// 关联类型管理
- /// </summary>
- public class RelationTypeManager
- {
- //暂时不用字典
- public static List<RelationItem> Items { get; private set; }
- static RelationTypeManager()
- {
- try
- {
- InitItems();
- }
- catch (Exception ex)
- {
- }
- }
- #region 私有方法
- private static void InitItems()
- {
- List<RelationItem> items = new List<RelationItem>();
- string file = StaticData.GdRelationship;
- var relationInfos = NPOIHelper.ConvertExcelSheetToModel<RelationRow>(file);
- var useRelationInfos = relationInfos.Where(c => !string.IsNullOrEmpty(c.RelationshipType));
- var group = useRelationInfos.GroupBy(c => c.RelationshipType);
- foreach (var item in group)
- {
- var relationItem = new RelationItem();
- relationItem.Type = item.Key;
- var childItems = item.ToList();
- var firstItem = childItems[0];
- relationItem.Name = firstItem.RelationName;
- #region 遍历边类型
- foreach (var child in childItems)
- {
- EdgeItem edgeItem = new EdgeItem();
- edgeItem.Type = child.EdgeType;
- edgeItem.Name = child.EdgeName;
- edgeItem.IsDirected = "1".Equals(child.EdgeDirection);
- relationItem.EdgeTypes.Add(edgeItem);
- }
- #endregion
- #region 对象相关处理
- var strObjects = firstItem.Objects;
- ParseObjects(relationItem, strObjects);
- #endregion
- #region 系统相关处理
- var strSystem = firstItem.Systems;
- ParseSystems(relationItem, strSystem);
- #endregion
- if (firstItem.SystemType == "0")
- {
- relationItem.SystemType = SystemType.Pipe;
- }
- else if (firstItem.SystemType == "1")
- {
- relationItem.SystemType = SystemType.Duct;
- }
- items.Add(relationItem);
- }
- Items = items;
- }
- /// <summary>
- /// 解析对象数据
- /// </summary>
- /// <param name="item"></param>
- /// <param name="strObject"></param>
- private static void ParseObjects(RelationItem item, string strObject)
- {
- #region 描述
- /*
- * 1,object以;或->分割
- * 2,对象类型与名称以 -划分
- * 3,如果两个对象之间是→,则表示对象关系中,应该是描述的关系
- *例子:高压开关柜-TDHS→直流屏-TDDS;
- */
- #endregion
- if (string.IsNullOrEmpty(strObject))
- {
- return;
- }
- List<ObjectItem> objectIems = new List<ObjectItem>();
- List<BinaryItem<ObjectItem>> relationItems = new List<BinaryItem<ObjectItem>>();
- #region 核心解析
- var objectArrays = strObject.Split(';');
- foreach (var objectArray in objectArrays)
- {
- List<ObjectItem> useObjects = new List<ObjectItem>();
- List<BinaryItem<ObjectItem>> useRelations = new List<BinaryItem<ObjectItem>>();
- var singleObjects = objectArray.Split('→');
- foreach (var singleObject in singleObjects)
- {
- ObjectItem objectIem = new ObjectItem();
- var propertyArray = singleObject.Split('-');
- if (propertyArray.Length == 1)
- {
- objectIem.Type = propertyArray[0].Trim();
- objectIem.Name = propertyArray[0].Trim();
- }
- else if (propertyArray.Length == 2)
- {
- objectIem.Type = propertyArray[1].Trim();
- objectIem.Name = propertyArray[0].Trim();
- }
- useObjects.Add(objectIem);
- }
- for (int i = 1; i < useObjects.Count; i++)
- {
- BinaryItem<ObjectItem> relationItem = new BinaryItem<ObjectItem>(useObjects[i - 1], useObjects[i]);
- useRelations.Add(relationItem);
- }
- objectIems.AddRange(useObjects);
- relationItems.AddRange(useRelations);
- }
- #endregion
- item.Objects.AddRange(objectIems);
- item.ObjectRelations.AddRange(relationItems);
- }
- /// <summary>
- /// 解析对象系统类型
- /// </summary>
- /// <param name="item"></param>
- /// <param name="strSystem">系统字符串</param>
- private static void ParseSystems(RelationItem item, string strSystem)
- {
- #region 描述
- /*
- * 1,系统对象使用;分割
- * 2,系统以标志信息开始的流向,1,0,-1;
- * 3,系统关联的边类型子集
- * 例子:系统名称1|1|1,2,3
- */
- #endregion
- if (string.IsNullOrEmpty(strSystem))
- {
- return;
- }
- #region 核心解析
- List<SystemItem> systemIems = new List<SystemItem>();
- var objectArrays = strSystem.Split(';');
- foreach (var objectArray in objectArrays)
- {
- SystemItem useSystem = new SystemItem();
- var systemProperties = objectArray.Split('|');
- for (int i = 0; i < systemProperties.Length; i++)
- {
- SetSystemProperty(useSystem, i, systemProperties[i]);
- }
- systemIems.Add(useSystem);
- }
- #endregion
- item.Systems.AddRange(systemIems);
- }
- private static void SetSystemProperty(SystemItem system, int index, string useValue)
- {
- switch (index)
- {
- case 0:
- system.Name = useValue.Trim();
- break;
- case 1:
- #region 动态解析枚举
- system.FlowType = FlowType.Undefine;
- if ("-1" == useValue)
- {
- system.FlowType = FlowType.Out;
- }
- else if ("1" == useValue)
- {
- system.FlowType = FlowType.In;
- }
- #endregion
- break;
- case 2:
- system.ContainEdgeTypes.AddRange(useValue.Split(',').Select(c => c.Trim()));
- break;
- }
- }
- #endregion
- /// <summary>
- /// 获取指定名称图类型
- /// </summary>
- /// <param name="relationType"></param>
- /// <returns></returns>
- public static RelationItem GetRelationTypeItem(string relationType)
- {
- return Items.FirstOrDefault(c => c.Type == relationType);
- }
- /// <summary>
- /// 获取全部系统的关系类型
- /// </summary>
- /// <returns></returns>
- public static List<RelationItem> GetSystemRelationTypes()
- {
- return Items.Where(r => r.SystemType!=SystemType.Unknown).ToList();
- }
- /// <summary>
- /// 获取全部系统的关系类型
- /// </summary>
- /// <returns></returns>
- public static List<string> GetSystemRelationTypeNames()
- {
- return new List<string>() { "ChillWaterLoop" };
- return GetSystemRelationTypes().Select(r => r.Type).ToList() ;
- }
- }
- }
|