public Example()
        {
            DiagramConstants.RoutingGridSize = 40d;
            DiagramConstants.ContainerMargin = 0d;
            InitializeComponent();

            this.fileManager = new Controls.Diagrams.Extensions.FileManager(this.diagram);
            this.DataContext = this.dc = new TablesGraphSource();
            var newRouter = new AStarRouter(this.diagram) { WallOptimization = true };
            this.diagram.RoutingService.Router = newRouter;
            this.diagram.RoutingService.FreeRouter = newRouter;
            this.Loaded += this.OnLoaded;
        }
        public Example()
        {
            DiagramConstants.ContainerMargin = 0;

            InitializeComponent();

            this.fileManager = new FileManager(this.diagram);
            this.diagram.ServiceLocator.Register<IResizingService>(new CustomResizingService(this.diagram));
            this.PopulateToolbox();
            var newRouter = new AStarRouter(this.diagram) { WallOptimization = true };
            this.diagram.RoutingService.Router = newRouter;
            this.diagram.RoutingService.FreeRouter = newRouter;
            this.Loaded += this.OnLoaded;
        }
예제 #3
0
        //
        // AStar WRAPPER
        //

        /// <summary>
        /// Route wires between two viases bounding shapes(walls)
        /// </summary>
        /// <param name="vias1">start point</param>
        /// <param name="vias2">end point</param>
        /// <param name="shapes">walls</param>
        /// <param name="select"></param>
        /// <returns></returns>

        public List <Entity> Route(Entity vias1, Entity vias2,
                                   List <Entity> shapes,
                                   bool select)
        {
            long Stamp1;
            long Stamp2;

            List <Entity> wires = new List <Entity>();

            Point start = LambdaToImage(vias1.LambdaX, vias1.LambdaY);
            Point end   = LambdaToImage(vias2.LambdaX, vias2.LambdaY);

            //
            // Remove home shapes
            //

            List <Entity> pendingRemove = new List <Entity>();

            PointF point1 = new PointF(vias1.LambdaX, vias1.LambdaY);
            PointF point2 = new PointF(vias2.LambdaX, vias2.LambdaY);

            foreach (Entity shape in shapes)
            {
                PointF topLeft;
                PointF bottomRight;

                GetBoundingBox(shape, out topLeft, out bottomRight);

                if (IsPointInBox(point1, topLeft, bottomRight) ||
                    IsPointInBox(point2, topLeft, bottomRight))
                {
                    pendingRemove.Add(shape);
                }
            }

            foreach (Entity shape in pendingRemove)
            {
                shapes.Remove(shape);
            }

            //
            // Get global bounding box
            //

            int maxx = Math.Max(start.X, end.X);
            int maxy = Math.Max(start.Y, end.Y);

            foreach (Entity shape in shapes)
            {
                PointF topLeft;
                PointF bottomRight;

                GetBoundingBox(shape, out topLeft, out bottomRight);

                Point bottomRightScreen = LambdaToImage(bottomRight.X, bottomRight.Y);

                if (bottomRightScreen.X > maxx)
                {
                    maxx = bottomRightScreen.X;
                }
                if (bottomRightScreen.Y > maxy)
                {
                    maxy = bottomRightScreen.Y;
                }
            }

            //
            // Generate grid
            //

            Stamp1 = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

            var grid = new Grid2D(this,
                                  maxx + 1,
                                  maxy + 1,
                                  shapes,
                                  start.X, start.Y,
                                  end.X, end.Y);

            Stamp2 = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

            Console.WriteLine("Grid2D: " + (Stamp2 - Stamp1).ToString() + " ms");

            //
            // Dispatch router
            //

            Stamp1 = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

            var astar = new AStarRouter(grid.Start, grid.Goal);

            var result = astar.Run();

            Stamp2 = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

            Console.WriteLine("AStarRouter: " + (Stamp2 - Stamp1).ToString() + " ms");

            //
            // Draw wires
            //

            IEnumerable <INode> path = astar.GetPath();

            GridNode startNode = (GridNode)path.First();
            GridNode prevNode  = (GridNode)path.First();

            Entity wire;
            Point  startPlane;
            Point  prevPlane;

            foreach (INode node in path)
            {
                if (path.First() == node)
                {
                    continue;
                }

                GridNode gridNode = (GridNode)node;

                if (gridNode.X != startNode.X &&
                    gridNode.Y != startNode.Y)
                {
                    startPlane = grid.GridToPlane(new Point(startNode.X, startNode.Y));
                    prevPlane  = grid.GridToPlane(new Point(prevNode.X, prevNode.Y));

                    wire = AddWireOnImage(EntityType.WireInterconnect,
                                          startPlane.X, startPlane.Y,
                                          prevPlane.X, prevPlane.Y);

                    if (wire == null)
                    {
                        Console.WriteLine("!!!");
                    }

                    if (select && wire != null)
                    {
                        wire.Selected = true;
                    }
                    if (wire != null)
                    {
                        wires.Add(wire);
                    }

                    startNode = prevNode;
                }

                prevNode = gridNode;
            }

            startPlane = grid.GridToPlane(new Point(startNode.X, startNode.Y));
            prevPlane  = grid.GridToPlane(new Point(prevNode.X, prevNode.Y));

            wire = AddWireOnImage(EntityType.WireInterconnect,
                                  startPlane.X, startPlane.Y,
                                  prevPlane.X, prevPlane.Y);

            if (select && wire != null)
            {
                wire.Selected = true;
            }
            if (wire != null)
            {
                wires.Add(wire);
            }

            return(wires);
        }