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);
        }
Beispiel #2
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
 }
Beispiel #3
0
 public Net(Pad Pad1, Pad Pad2)
 {
     this.Pad1 = Pad1;
     this.Pad2 = Pad2;
 }