コード例 #1
0
            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();
            }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
                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);
                    }
                }
コード例 #5
0
ファイル: NetworkEdge.cs プロジェクト: Kirill78Z/InfoTools
            /// <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);
            }
コード例 #6
0
        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);
        }
コード例 #7
0
 public override int GetHashCode()
 {
     return(NetworkEdge.GetHashCode());
 }
コード例 #8
0
 public NetworkEdgeWrapper(NetworkEdge edge, bool start)
 {
     NetworkEdge = edge;
     Start       = start;
 }
コード例 #9
0
            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);
                }
            }
コード例 #10
0
        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 });
        }