예제 #1
0
        /// <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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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++;
            }
        }
예제 #4
0
 /// <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
 }
예제 #5
0
        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);
        }