public JunctionLabelMapping(bool start, NetworkEdge edge, List <TextPosition> lblsNearNN) { Start = start; NetworkEdge = edge; //нужно внести корректировки в порядок LabelRelation в списке foreach (TextPosition txtPos in lblsNearNN //LabelRelation lr in MappingPriorityList ) { LabelRelation lr = new LabelRelation(txtPos); MappingPriorityList.Add(lr); Point3d txtPt = lr.TextPosition.GetCenter(); Polyline poly = (Polyline)NetworkEdge.PolyId.GetObject(OpenMode.ForRead); using (Polyline polyClone = (Polyline)poly.Clone()) { polyClone.Elevation = 0;//на случай если у полилинии задана высота //расчитать расстояние до коробки от полилинии с помощью API AutoCAD lr.Distance = DistanceFromPolyToTxtBox(polyClone, txtPos); //Point3d txtPt3d = new Point3d(txtPt.X, txtPt.Y, 0); Point3d closestPt = polyClone.GetClosestPointTo(txtPt, false); double param = polyClone.GetParameterAtPoint(closestPt); double startParam = polyClone.StartParam; double endParam = polyClone.EndParam; double averageParam = (startParam + endParam) / 2; bool inclinesToStartOfPolyline = param <= averageParam; //Нужно убедиться, что //- текстовая метка в пределах линии //- текстовая метка ближе к текущему узлу, чем к соседнему //Если это не так, то опускать LabelRelation в конец списка //double param = curve.GetClosestPointTo(txtPt3d).Parameter; if (param == startParam || param == endParam || lr.Distance > 2) // или если расстояние до текста явно слишком большое { lr.HasNormalPriority = false; } else { lr.HasNormalPriority = Start == inclinesToStartOfPolyline;//TODO: Только в том случае если на другом конце тоже находится колодец??? } //расстояние до центра текстового примитива как второй фактор сортировки lr.CenterDistance = closestPt.DistanceTo(txtPt); } } MappingPriorityList.Sort(); }
public void NetworkEdgeConstructorTest1() { Network network = new Network(); NetworkEdge networkEdge = new NetworkEdge(network); Assert.AreEqual(network, networkEdge.Network); Assert.AreEqual(NetworkEdgeType.IsA, networkEdge.Type); Assert.IsNull(networkEdge.StartNode); Assert.IsNull(networkEdge.EndNode); }
public void NetworkEdgeConstructorTest2() { Network network = new Network(); NetworkNode networkNode1 = network.Nodes.Add(); NetworkNode networkNode2 = network.Nodes.Add(); NetworkEdge networkEdge = new NetworkEdge(network, networkNode1, networkNode2); Assert.AreEqual(NetworkEdgeType.IsA, networkEdge.Type); Assert.AreEqual(network, networkEdge.Network); Assert.AreEqual(networkNode1, networkEdge.StartNode); Assert.AreEqual(networkNode2, networkEdge.EndNode); }
public Relation(NetworkEdge edge, bool start, TextPosition txt) { NetworkEdge = edge; NetworkEdgeByStart = start; TextPosition = txt; Point3d txtPt = TextPosition.GetCenter(); Polyline poly = (Polyline)NetworkEdge.PolyId.GetObject(OpenMode.ForRead); using (Polyline polyClone = (Polyline)poly.Clone()) { polyClone.Elevation = 0;//на случай если у полилинии задана высота //расчитать расстояние до коробки от полилинии с помощью API AutoCAD Distance = DistanceFromPolyToTxtBox(polyClone, TextPosition); Point3d closestPt = polyClone.GetClosestPointTo(txtPt, false); double param = polyClone.GetParameterAtPoint(closestPt); double startParam = polyClone.StartParam; double endParam = polyClone.EndParam; double averageParam = (startParam + endParam) / 2; bool inclinesToStartOfPolyline = param <= averageParam; NetworkNode oppositeNode = NetworkEdgeByStart ? NetworkEdge.EndNode : NetworkEdge.StartNode; bool oppositeNodeHaveSeveralAttachedEdges = oppositeNode.AttachedEdges.Count > 1; if ((NetworkEdgeByStart && param == startParam) || (!NetworkEdgeByStart && param == endParam) ||//текст находится c другой стороны колодца Distance > LBL_TOO_FAR_FROM_LINE)//расстояние до текста явно слишком большое { HasNormalPriority = false; } else if ( //polyClone.Length > EDGE_LENGTH_LBL_LONGITUDINAL_POSITION_MATTERS//если полилиния не слишком короткая //&& oppositeNodeHaveSeveralAttachedEdges//к соседнему узлу подходит более 1 ребра ) { HasNormalPriority = NetworkEdgeByStart == inclinesToStartOfPolyline;//текстовая метка ближе к текущему узлу, чем к соседнему } //расстояние до центра текстового примитива CenterDistance = closestPt.DistanceTo(txtPt); } }
/// <summary> /// Сращивание двух ребер, стыкующихся в одном узле /// </summary> /// <param name="nn"></param> public NetworkEdge(NetworkNode nn /*, Transaction tr, BlockTableRecord ms*/) { if (nn.AttachedEdges.Count != 2) { throw new ArgumentException(nameof(nn)); } NetworkEdge edge1 = nn.AttachedEdges[0]; NetworkEdge edge2 = nn.AttachedEdges[1]; bool edge1Start = edge1.StartNode == nn; bool edge2Start = edge2.StartNode == nn; StartNode = edge1Start ? edge1.EndNode : edge1.StartNode; EndNode = edge2Start ? edge2.EndNode : edge2.StartNode; StartPipeJunctionData = edge1Start ? edge1.EndPipeJunctionData : edge1.StartPipeJunctionData; EndPipeJunctionData = edge2Start ? edge2.EndPipeJunctionData : edge2.StartPipeJunctionData; //PositionList List <Point2d> posList1 = new List <Point2d>(edge1.PositionList); if (edge1Start) { posList1.Reverse(); } posList1.RemoveAt(posList1.Count - 1); List <Point2d> posList2 = new List <Point2d>(edge2.PositionList); if (!edge2Start) { posList2.Reverse(); } PositionList = posList1.Concat(posList2).ToList(); CreatePositionCurve(PositionList); //переназначить ссылки на примыкающие ребра у соседних узлов! StartNode.AttachedEdges.Remove(edge1); StartNode.AttachedEdges.Add(this); EndNode.AttachedEdges.Remove(edge2); EndNode.AttachedEdges.Add(this); }
private void CheckNetworkEdge( NetworkEdge networkEdge, Network network, NetworkNode startNode, NetworkNode endNode) { Assert.IsNotNull(networkEdge); CheckNetworkObjectId(networkEdge); Assert.AreEqual(network, networkEdge.Network); Assert.AreEqual(startNode, networkEdge.StartNode); Assert.AreEqual(endNode, networkEdge.EndNode); }
public override int GetHashCode() { return(NetworkEdge.GetHashCode()); }
public NetworkEdgeWrapper(NetworkEdge edge, bool start) { NetworkEdge = edge; Start = start; }
private void BruteForceSearch(List <ISolverWrapper> searchSeq, int n, HashSet <NetworkEdge> edgesOut, HashSet <TextPosition> txtOut, HashSet <int> txtContentOut, Dictionary <NetworkEdge, TextPosition> result, double sumDist) { //NetworkEdgeWrapper newr = searchSeq[n]; ISolverWrapper w = searchSeq[n]; List <Relation> priorityList = w.RelationsPriority; bool possiblePairFound = false; int i = 0; //перебрать все конкурирующие варианты, //если допустимая пара не найдена, то все оставшиеся //до тех пор пока допустимая пара не будет найдена while ((i < w.CompCount + invalidNumberCombinationResults && i < priorityList.Count) ||//если какие-то варианты были отбракованы из-за неправильного сочетания цифр, то прибавлять их количество к CompCount (!possiblePairFound && i < priorityList.Count)) { Relation relation = priorityList[i]; NetworkEdge edge = relation.NetworkEdge; TextPosition txt = relation.TextPosition; int txtContent = Convert.ToInt32(txt.TextContent.Trim()); if (!txtOut.Contains(txt) && //не допускать один и тот же текст !txtContentOut.Contains(txtContent) &&//не допускать 2 одинаковые цифры !edgesOut.Contains(edge) //не допускать повторение ребер ) { possiblePairFound = true; HashSet <NetworkEdge> edgesOutNextStep = new HashSet <NetworkEdge>(edgesOut); HashSet <TextPosition> txtOutNextStep = new HashSet <TextPosition>(txtOut); HashSet <int> txtContentOutNextStep = new HashSet <int>(txtContentOut); Dictionary <NetworkEdge, TextPosition> resultNextStep = new Dictionary <NetworkEdge, TextPosition>(result); edgesOutNextStep.Add(edge); txtOutNextStep.Add(txt); txtContentOutNextStep.Add(txtContent); resultNextStep.Add(edge, txt); double sumDistNextStep = sumDist + relation.Distance; if (n != searchSeq.Count - 1) { BruteForceSearch(searchSeq, n + 1, edgesOutNextStep, txtOutNextStep, txtContentOutNextStep, resultNextStep, sumDistNextStep); } else { CheckCandidateResult(resultNextStep, sumDistNextStep); } } i++; } if (!possiblePairFound) { //данный проход завершен CheckCandidateResult(result, sumDist); } }
public object GetNetwork() { List <NetworkEdge> networkEdge = new List <NetworkEdge>(); List <NetworkBuyer> networkBuyer = new List <NetworkBuyer>(); List <NetworkSupplier> networkSupplier = new List <NetworkSupplier>(); using (db) { using (var command = db.Database.GetDbConnection().CreateCommand()) { command.CommandText = "EXEC NetworkEdges"; db.Database.OpenConnection(); using (var result = command.ExecuteReader()) { while (result.Read()) { var item = new NetworkEdge(); item.BuyerId = (int)result[0]; item.SupplierId = (int)result[1]; networkEdge.Add(item); } } } using (var command = db.Database.GetDbConnection().CreateCommand()) { command.CommandText = "EXEC NetworkBuyers"; db.Database.OpenConnection(); using (var result = command.ExecuteReader()) { while (result.Read()) { var item = new NetworkBuyer(); item.BuyerId = (int)result[0]; item.Name = (string)result[1]; item.TotalAmountUYU = (int)result[2]; networkBuyer.Add(item); } } } using (var command = db.Database.GetDbConnection().CreateCommand()) { command.CommandText = "EXEC NetworkSuppliers"; db.Database.OpenConnection(); using (var result = command.ExecuteReader()) { while (result.Read()) { var item = new NetworkSupplier(); item.SupplierId = (int)result[0]; item.Name = (string)result[1]; item.TotalAmountUYU = (int)result[2]; networkSupplier.Add(item); } } } } var nodes = networkSupplier.Cast <INetworkNode>().Concat(networkBuyer.Cast <INetworkNode>()); this.dataProccessingService.ExportFile("prueba1.xlsx", nodes, networkEdge); return(new { suppliers = networkSupplier, buyers = networkBuyer, edges = networkEdge }); }