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; }
// // 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); }