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); }
/// <summary> /// Конструктор копирующий конфигурацию платы /// </summary> /// <param name="printedCircuitBoard"></param> public PrintedCircuitBoard(PrintedCircuitBoard printedCircuitBoard) { Modules = new List <Module>(); NetList = new List <Net>(); foreach (var curModule in printedCircuitBoard.Modules) { Module module = new Module(curModule.Name); module.Path = curModule.Path; module.Position = new Point(curModule.Position); module.Rotate = curModule.Rotate; if (curModule.IsLockedX()) { module.LockXCoordinate(); } if (curModule.IsLockedY()) { module.LockYCoordinate(); } module.LeftUpperBound = new Point(curModule.LeftUpperBound); module.RighLowerBound = new Point(curModule.RighLowerBound); foreach (var curPad in curModule.Pads) { Pad pad = new Pad(); pad.Number = curPad.Number; pad.Position = new Point(curPad.Position.X, curPad.Position.Y); if (curPad.Net == null) { continue; } Net net = null; try { foreach (var edge in NetList) { if (edge.Number == curPad.Net.Number && edge.Name == curPad.Net.Name) { net = edge; } } } catch (NullReferenceException e) { } if (net == null) { pad.Net = new Net(curPad.Net.Name, curPad.Net.Number); pad.Net.Pad1 = pad; pad.Net.Pads.Add(pad); NetList.Add(pad.Net); } else { pad.Net = net; pad.Net.Pad2 = pad; pad.Net.Pads.Add(pad); } pad.Module = module; module.Pads.Add(pad); } Modules.Add(module); } // TODO:make a clone PrintedCircuitBoard from another PrintedCircuitBoard : Solved }
public Net(Pad Pad1, Pad Pad2) { this.Pad1 = Pad1; this.Pad2 = Pad2; }