/// <summary> /// Поворот модуля на заданный градус /// </summary> /// <param name="module"></param> /// <param name="angle"></param> public static void RotateModule(Module module, double angle) { double radians = angle * Math.PI / 180; Point newCoordinate1 = GeometricSolver.RotatePoint(module.LeftUpperBound, radians); Point newCoordinate2 = GeometricSolver.RotatePoint(module.RighLowerBound, radians); module.LeftUpperBound = GeometricSolver.GetMin(newCoordinate1, newCoordinate2.X, newCoordinate2.Y); module.RighLowerBound = GeometricSolver.GetMax(newCoordinate2, newCoordinate1.X, newCoordinate1.Y); foreach (var pad in module.Pads) { pad.Position = GeometricSolver.RotatePoint(pad.Position, radians); } module.Rotate += angle; }
public PrintedCircuitBoard MakePcBoardFromTree() { PrintedCircuitBoard pcBoard = new PrintedCircuitBoard(); pcBoard.Modules = new List <Module>(); pcBoard.NetList = new List <Net>(); foreach (Node curModule in Tree.Head.Nodes.Where(x => x.Text.Contains("module"))) { Point min = new Point(double.MaxValue, double.MaxValue); Point max = new Point(double.MinValue, double.MinValue); Module module = new Module(curModule.Text.Split(' ')[1]); foreach (Node character in curModule.Nodes) { List <string> values = character.Text.Split(' ').ToList(); switch (values[0]) { case "path": module.Path = values[1]; break; case "at": List <double> position = GetCoordinates(new List <Node> { character }); module.Position.X = position[0]; module.Position.Y = position[1]; module.Rotate = (position.Count == 3) ? position[2] : 0; break; case "fp_line": List <double> list = GetCoordinates(character.Nodes.Take(2).ToList()); min = GeometricSolver.GetMin(GeometricSolver.GetMin(min, list[0], list[1]), list[2], list[3]); max = GeometricSolver.GetMax(GeometricSolver.GetMax(max, list[0], list[1]), list[2], list[3]); break; case "fp_circle": break; case "pad": Pad pad = new Pad(); int n; if (int.TryParse(values[1], out n)) { pad.Number = int.Parse(values[1]); } else { pad.Name = values[1]; } List <double> pos = GetCoordinates(character.Nodes.Where(x => x.Text.Contains("at")).ToList()); pad.Position.X = pos[0]; pad.Position.Y = pos[1]; List <double> size = GetCoordinates(character.Nodes.Where(x => x.Text.Contains("size")).ToList()); List <string> curNet = character.Nodes.Where(x => x.Text.Contains("net")).SelectMany(x => x.Text.Split(' ')).ToList(); Net net = null; if (curNet.Count != 0) { foreach (var edge in pcBoard.NetList) { if (edge.Number == int.Parse(curNet[1]) && edge.Name == curNet[2]) { net = edge; } } if (net == null) { pad.Net = new Net(curNet[2], int.Parse(curNet[1])); pad.Net.Pad1 = pad; pad.Net.Pads.Add(pad); pcBoard.NetList.Add(pad.Net); } else { pad.Net = net; pad.Net.Pad2 = pad; pad.Net.Pads.Add(pad); } } pad.Module = module; min = GeometricSolver.GetMin(min, pos[0] - size[0] / 2, pos[1] - size[1] / 2); max = GeometricSolver.GetMax(max, pos[0] + size[0] / 2, pos[1] + size[1] / 2); module.Pads.Add(pad); break; } } module.LeftUpperBound = min; module.RighLowerBound = max; var temp = module.Rotate; Chromosome.RotateModule(module, module.Rotate); module.Rotate = temp; pcBoard.Modules.Add(module); } return(pcBoard); }