示例#1
0
        /// <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);
        }