private FiderGraph GetFiderGraph(TMP.DWRES.Objects.Fider fider) { // получаем схему фидера _graphScheme = _dwh.GetFiderLines(fider); // строим граф фидера return(MakeGraph(_graphScheme.GraphVertities, _graphScheme.GraphEdges)); }
/// <summary> /// Возвращает список участков схемы фидера /// </summary> /// <param name="fider">Фидер</param> /// <returns>Список участков схемы, список вершин графа схемы</returns> public FiderScheme GetFiderLines(Model.Fider fider) { FiderScheme result = new FiderScheme(); string query; int id_fider = fider.ID; int id_sect_nn = fider.ID_Sect_NN; // словарь вершин ИД вершин схемы фидера ICollection <Model.LineVertex> linesVertities = GetLinesVertities(id_fider); // список вершин графа схемы фидера List <Graph.FiderGraphVertex> vertitiesList = new List <Graph.FiderGraphVertex>(linesVertities.Count); // словарь вершин графа схемы фидера Dictionary <int, Graph.FiderGraphVertex> vertities = new Dictionary <int, Graph.FiderGraphVertex>(linesVertities.Count); // список ребер графа схемы фидера List <Graph.FiderGraphEdge> edges = new List <Graph.FiderGraphEdge>(); // заполняем словарь вершин foreach (Model.LineVertex item in linesVertities) { Graph.FiderGraphVertex vertex = new Graph.FiderGraphVertex(item.ID); vertitiesList.Add(vertex); vertities.Add(item.ID, vertex); } // список ребер графа схемы фидера // список участков схемы фидера (узел задан ИД и названием) List <Model.Line> linesWithNodeNameList = new List <Model.Line>(); #region Таблица для поиска названия узла ТП по его ИД Dictionary <int, string> dictionaryNodeTPNames = new Dictionary <int, string>(); query = String.Format( @"SELECT NODELINKS.ID, CAST((TP.NAME||'/'||SECTTP.NAME) AS CHAR(100)) NODE_NAME FROM TP INNER JOIN SECTTP ON (SECTTP.ID_PST = TP.ID) INNER JOIN NODELINKS ON (SECTTP.ID_NODELINKS = NODELINKS.ID) WHERE NODELINKS.NODE_TYPE=1", id_fider); try { using (var command = new FbCommand(query, fbConnection)) { if (fbConnection.State == System.Data.ConnectionState.Closed) { fbConnection.Open(); } FbDataReader reader = command.ExecuteReader(); if (reader.HasRows) { try { while (reader.Read()) { int key = reader[0] != DBNull.Value ? (int)reader[0] : default(int); string value = reader[1] != DBNull.Value ? (string)reader[1] : default(string); dictionaryNodeTPNames.Add(key, value); } } finally { reader.Close(); } } } } catch (Exception ex) { HasError = true; LastException = ex; return(result); } #endregion Таблица для поиска названия узла ТП по его ИД #region Таблица для поиска названия узла по его ИД Dictionary <int, string> dictionaryNodeNames = new Dictionary <int, string>(); query = String.Format( @"SELECT NODELINKS.ID, NODE.NAME NODE_NAME FROM NODE INNER JOIN NODELINKS ON (NODE.ID_NODELINKS = NODELINKS.ID) WHERE NODELINKS.NODE_TYPE=2 AND NODELINKS.ID IN ( SELECT LINE.ID_NODE1 NODEID FROM LINE WHERE LINE.ID_FIDER = {0} UNION SELECT LINE.ID_NODE2 NODEID FROM LINE WHERE LINE.ID_FIDER = {0} )", id_fider); try { using (var command = new FbCommand(query, fbConnection)) { if (fbConnection.State == System.Data.ConnectionState.Closed) { fbConnection.Open(); } FbDataReader reader = command.ExecuteReader(); if (reader.HasRows) { try { while (reader.Read()) { int key = reader[0] != DBNull.Value ? (int)reader[0] : default(int); string value = reader[1] != DBNull.Value ? (string)reader[1] : default(string); if (dictionaryNodeNames.ContainsKey(key) == false) { dictionaryNodeNames.Add(key, value); } } } finally { reader.Close(); } } } } catch (Exception ex) { HasError = true; LastException = ex; return(result); } #endregion Таблица для поиска названия узла по его ИД #region Таблица для поиска названия узла подстанции по его ИД Dictionary <int, string> dictionaryNodePSTName = new Dictionary <int, string>(); query = String.Format( @"SELECT NODELINKS.ID, CAST(('[ЦП] - '||PST.NAME||'/'||SECTPST.NAME) AS CHAR(100)) NODE_NAME FROM PST INNER JOIN SECTPST ON (SECTPST.ID_PST = PST.ID) INNER JOIN NODELINKS ON (SECTPST.ID_NODELINKS = NODELINKS.ID) WHERE NODELINKS.NODE_TYPE=3 AND SECTPST.ID = {0}", id_sect_nn); try { using (var command = new FbCommand(query, fbConnection)) { if (fbConnection.State == System.Data.ConnectionState.Closed) { fbConnection.Open(); } FbDataReader reader = command.ExecuteReader(); if (reader.HasRows) { try { while (reader.Read()) { int key = reader[0] != DBNull.Value ? (int)reader[0] : default(int); string value = reader[1] != DBNull.Value ? (string)reader[1] : default(string); dictionaryNodePSTName.Add(key, value); } } finally { reader.Close(); } } } } catch (Exception ex) { HasError = true; LastException = ex; return(result); } #endregion Таблица для поиска названия узла подстанции по его ИД // список участков схемы фидера (узел задан ИД) ICollection <Model.Line> lineNodesList = GetLines(id_fider); // цикл по всем участкам схемы фидера int edgeIndex = 1; foreach (var item in lineNodesList) { FillVertexProperties(item.NodeStartId, ref dictionaryNodeTPNames, ref dictionaryNodeNames, ref dictionaryNodePSTName, ref vertities); FillVertexProperties(item.NodeEndId, ref dictionaryNodeTPNames, ref dictionaryNodeNames, ref dictionaryNodePSTName, ref vertities); item.NodeStart = vertities[item.NodeStartId].Name; item.NodeEnd = vertities[item.NodeEndId].Name; edges.Add(new Graph.FiderGraphEdge(edgeIndex, vertities[item.NodeStartId], vertities[item.NodeEndId])); edgeIndex++; } result.Lines = lineNodesList; result.GraphVertities = vertitiesList; result.GraphEdges = edges; return(result); }