/// <summary> /// Возвращает список всех соединений в виде пар точек(отрезков) /// </summary> /// <param name="pcb"></param> /// <returns></returns> public List <Tuple <Point, Point> > GetAllNets(PrintedCircuitBoard pcb) { List <Tuple <Point, Point> > lst = new List <Tuple <Point, Point> >(); foreach (var net in pcb.NetList) { if (net.Pads.Count > 1) { lst.AddRange(GetSegmentListFromNet(net)); } } return(lst); }
static void Main(string[] args) { Console.ForegroundColor = ConsoleColor.Black; Console.BackgroundColor = ConsoleColor.White; Console.Clear(); OpenFileDialog dialog = new OpenFileDialog(); string fileName = ""; dialog.Filter = "PCB files |*.kicad_pcb;"; if (dialog.ShowDialog() == DialogResult.OK) { fileName = dialog.FileName; } //KicadParser parser = new KicadParser("C:\\Users\\disap\\Desktop\\Diplom\\PrintedCircuitBoards\\Kicad_Projects\\kicad\\kicad.kicad_pcb"); KicadParser parser = new KicadParser(fileName); PrintedCircuitBoard pcb = parser.MakePcBoardFromTree(); //Console.WriteLine(pcb.GetIntersectionsNumber()); Chromosome.LeftUpperPoint = new Point(20, 20); // левый верхний угол рабочего пространства Chromosome.WorkspaceHeight = 55; // высота рабочего пространства в котором генерируются новые особи Chromosome.WorkspaceWidth = 55; //ширина рабочего пространства в котором генерируются новые особи GeneticAlgorithm.PoolSize = 100; // размер пула GeneticAlgorithm.MaxChromosomeAge = 5; // максимальный возраст хромосомы GeneticAlgorithm.SelectionCount = 100; //число хромосом переживающих селекцию //pcb.Modules[16].Lock(); // фиксируем элемент u2 в центре //pcb.Modules[16].LockXCoordinate(); //фиксируем по X //pcb.Modules[16].LockYCoordinate(); // фиксируем по Y Console.WriteLine(pcb.GetIntersectionsNumber()); Chromosome.ExamplePrintedCircuitBoard = pcb; // пример платы по которой будут генерироваться новые особи GeneticAlgorithm genAlgorithm = new GeneticAlgorithm(); genAlgorithm.Start(); Chromosome bestChromosome = genAlgorithm.GetBestChromosome(); parser.UpdateTreeFromPcb(bestChromosome.PrintCircuitBoard); parser.WriteFile("out1.kicad_pcb", parser.Tree.Head); }
public void UpdateTreeFromPcb(PrintedCircuitBoard pcb) { int count = 0; foreach (Node curModule in Tree.Head.Nodes.Where(x => x.Text.Contains("module"))) { string rotate = ((pcb.Modules[count].Rotate == 0) ? "" : pcb.Modules[count].Rotate.ToString()); int padCount = 0; if (curModule.Text.Split(' ').ToList()[1] == (pcb.Modules[count].Name)) { foreach (Node character in curModule.Nodes) { List <string> values = character.Text.Split(' ').ToList(); switch (values[0]) { case "at": character.Text = String.Format("at {0} {1}", pcb.Modules[count].Position.ToString(), rotate); break; case "fp_text": List <string> textPos = character.Nodes[0].Text.Split(' ').ToList(); character.Nodes[0].Text = String.Format("at {0} {1} {2}", textPos[1], textPos[2], rotate); break; case "pad": List <string> splitText = character.Nodes[0].Text.Split(' ').ToList(); character.Nodes[0].Text = String.Format("at {0} {1} {2}", splitText[1], splitText[2], rotate); padCount++; break; } } } count++; } }
/// <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 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); }