Exemple #1
0
 public virtual void LoadTool()
 {
     foreach (BaseShape item in CADInterface.currentShapes)
     {
         item.IsSelected = false;
         item.Show       = DisplayStyle.Normal;
     }
     CADInterface.DrawShap();
 }
Exemple #2
0
        public List <PlateModel> mainmethod(CADInterface cadinterface1)
        {
            List <PlateModel> listPlate    = new List <PlateModel>();
            List <string>     listFileName = selectList("选择dxf文件", new string[] { "dxf" });

            if (listFileName.Count > 0)
            {
                //DateTime beforDT = System.DateTime.Now;
                for (int i = 0; i < listFileName.Count; i++)
                {
                    listPlate.Add(analyticalPaper(listFileName[i], cadinterface1));
                }
                //DateTime afterDT = System.DateTime.Now;
                //TimeSpan ts = afterDT.Subtract(beforDT);
                //Console.WriteLine("时间:{0}", ts.TotalSeconds);
            }
            else
            {
                //MessageBox .Show("没有选择对应的文件");
            }
            return(listPlate);
        }
Exemple #3
0
        /// <summary>
        /// NFP方案第一次生成
        /// </summary>
        /// <param name="listGene"></param>
        /// <param name="stock"></param>
        /// <param name="angleTest"></param>
        /// <returns></returns>
        public PaiYangFangAn createFirstFangAn(List <PlateModel> listGene, Stock stock, int angleTest)
        {
            PaiYangFangAn pyfa          = new PaiYangFangAn();
            int           signFirstGene = 0;                                          //判断第一次选择基因的起始点
            bool          sAndLGArea    = judgeStockAndListGeneArea(stock, listGene); //判断原材料面积和钢板基因序列未使用的件号面积和
            bool          bn            = true;                                       //算法判断开始
            int           sigModel      = 0;
            int           count         = 0;                                          //执行次数

            while (bn)
            {
                #region 获取当前最前面的原材料钢板碎片
                BaseModel stockDebris = stock.ListModel[sigModel];
                if (stockDebris.ListShape.Count == 0)
                {
                    //不存在可用碎片的时候退出方案
                    bn = false;
                    break;
                }
                #endregion

                int signGene = selectFirstGeneFalse(listGene, pyfa, signFirstGene);

                #region 判断是否存在基因序列
                if (signGene == -99)
                {
                    //不存在基因序列的时候退出方案
                    bn = false;
                    break;
                }
                #endregion

                #region 判断该基因序列的面积是否符合标准
                if (stockDebris.Area < listGene[signGene].Area)
                {
                    //当可排样碎片面积小于排样件号面积的时候重新选择件号,件号要求小于碎片
                    signGene = selectFirstSortByArea(signGene, listGene, pyfa, stockDebris);
                    if (signGene == -99)
                    {
                        //不存在基因序列的时候退出方案
                        bn = false;
                        break;
                    }
                }
                #endregion

                List <Trajectory> listTrajectory = new List <Trajectory>();   //记录重心的运行轨迹
                PointF            SPointSign     = listGene[signGene].RotateCenter;
                for (int i = 0; i < (angleTest == -9999 ? 360 / 5 : 360 / 360); i++)
                {
                    //有问题
                    #region 开始运行临界判断,记录可行的临界轨迹
                    //listGene[signGene] = new RotateOper().RotatePlate(listGene[signGene], listGene[signGene].RotateCenter, (angleTest == -9999 ? 5 * i : angleTest));
                    listGene[signGene] = new RotateOper().RotatePlate(listGene[signGene], SPointSign, (angleTest == -9999 ? 5 * i : angleTest));
                    FirstStockPoint startLoopPoint    = getFirstPoint(stockDebris);                                      //作为初始位置
                    List <PointF>   newListStockPoint = getNewListPoint(stockDebris.ListPoint, startLoopPoint.StartInt); //获取新的原材料点顺序,起始点所在的线的点置为起始点
                    int             signTop           = getPlateFirstTopPoint(listGene[signGene].OutModel);              //作为初始位置的对接点
                    List <PointF>   newListPlatePoint = getNewListPoint(listGene[signGene].OutModel.ListPoint, signTop);

                    List <NFPLineAngle> stockLine = new AddOper().addNFPLineAngle(newListStockPoint); //获取原材料碎片的边界线角度和起始
                    List <NFPLineAngle> plateLine = new AddOper().addNFPLineAngle(newListPlatePoint);
                    List <Line>         listGuiJi = new List <Line>();                                //记录内NFP的移动轨迹
                    for (int j = 0; j < stockLine.Count; j++)
                    {
                        if (judgePlusOrMinus(stockLine, j))
                        {
                            #region 为凸点,即件号上的点在原材料钢板上的线的边界做移动
                            PointF getSign = getSignGuiJiPointTu(stockLine[j], newListStockPoint, newListPlatePoint);
                            //移动到初始状态,起始点,获取重心坐标
                            float moveX = newListStockPoint[stockLine[j].StartInt].X - getSign.X;
                            float moveY = newListStockPoint[stockLine[j].StartInt].Y - getSign.Y;
                            listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                    moveX,
                                                                    moveY);

                            PointF lineSp = listGene[signGene].RotateCenter;
                            listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                    -(moveX),
                                                                    -(moveY));
                            //listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                            //   (SPointSign.X - listGene[signGene].RotateCenter.X),
                            //   (SPointSign.Y - listGene[signGene].RotateCenter.Y));
                            moveX = newListStockPoint[stockLine[j].EndInt].X - getSign.X;
                            moveY = newListStockPoint[stockLine[j].EndInt].Y - getSign.Y;
                            listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                    moveX,
                                                                    moveY);
                            PointF lineEp = listGene[signGene].RotateCenter;
                            listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                    -(moveX),
                                                                    -(moveY));
                            //listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                            //   (SPointSign.X - listGene[signGene].RotateCenter.X),
                            //   (SPointSign.Y - listGene[signGene].RotateCenter.Y));
                            listGuiJi.Add(new Line(lineSp, lineEp));
                            if (count >= 0)
                            {
                                CADInterface.currentShapes.Add(new Line(lineSp, lineEp));
                            }
                            #endregion
                        }
                        else
                        {
                            #region 为凹点,即原材料上的点在件号上的线上移动
                            List <NFPLineAngle> newNFPLine = getSignGuiJiPointAo(stockLine, j, plateLine);
                            float allAngle = getAoAngleRange(stockLine, j);
                            for (int k = 0; k < newNFPLine.Count; k++)
                            {
                                if (stockLine[j].Angle + allAngle > 360)
                                {
                                    if ((newNFPLine[k].Angle >= stockLine[j].Angle && newNFPLine[k].Angle < 360) ||
                                        (newNFPLine[k].Angle >= 0 && newNFPLine[k].Angle <= stockLine[j].Angle + allAngle - 360))
                                    {
                                        PointF getSignAo = stockLine[j].StartPoint;
                                        float  moveXAo   = getSignAo.X - newNFPLine[k].StartPoint.X;
                                        float  moveYAo   = getSignAo.Y - newNFPLine[k].StartPoint.Y;
                                        listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                                moveXAo,
                                                                                moveYAo);
                                        PointF lineSpAo = listGene[signGene].RotateCenter;
                                        listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                                -(moveXAo),
                                                                                -(moveYAo));
                                        //listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                        //    (SPointSign.X - listGene[signGene].RotateCenter.X),
                                        //    (SPointSign.Y - listGene[signGene].RotateCenter.Y));
                                        moveXAo            = getSignAo.X - newNFPLine[k].EndPoint.X;
                                        moveYAo            = getSignAo.Y - newNFPLine[k].EndPoint.Y;
                                        listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                                moveXAo,
                                                                                moveYAo);
                                        PointF lineEpAo = listGene[signGene].RotateCenter;
                                        listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                                -(moveXAo),
                                                                                -(moveYAo));
                                        //listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                        //   (SPointSign.X - listGene[signGene].RotateCenter.X),
                                        //   (SPointSign.Y - listGene[signGene].RotateCenter.Y));
                                        listGuiJi.Add(new Line(lineSpAo, lineEpAo));

                                        if (count >= 0)
                                        {
                                            CADInterface.currentShapes.Add(new Line(lineSpAo, lineEpAo));
                                        }
                                    }
                                }
                                else
                                {
                                    if (newNFPLine[k].Angle >= stockLine[j].Angle && newNFPLine[k].Angle <= stockLine[j].Angle + allAngle)
                                    {
                                        PointF getSignAo = stockLine[j].StartPoint;
                                        float  moveXAo   = getSignAo.X - newNFPLine[k].StartPoint.X;
                                        float  moveYAo   = getSignAo.Y - newNFPLine[k].StartPoint.Y;
                                        listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                                moveXAo,
                                                                                moveYAo);
                                        PointF lineSpAo = listGene[signGene].RotateCenter;
                                        listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                                -(moveXAo),
                                                                                -(moveYAo));
                                        //listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                        //   (SPointSign.X - listGene[signGene].RotateCenter.X),
                                        //   (SPointSign.Y - listGene[signGene].RotateCenter.Y));
                                        moveXAo            = getSignAo.X - newNFPLine[k].EndPoint.X;
                                        moveYAo            = getSignAo.Y - newNFPLine[k].EndPoint.Y;
                                        listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                                moveXAo,
                                                                                moveYAo);
                                        PointF lineEpAo = listGene[signGene].RotateCenter;
                                        listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                                -(moveXAo),
                                                                                -(moveYAo));
                                        //listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                        //   (SPointSign.X - listGene[signGene].RotateCenter.X),
                                        //   (SPointSign.Y - listGene[signGene].RotateCenter.Y));

                                        listGuiJi.Add(new Line(lineSpAo, lineEpAo));

                                        if (count >= 0)
                                        {
                                            CADInterface.currentShapes.Add(new Line(lineSpAo, lineEpAo));
                                        }
                                    }
                                }
                            }
                            #endregion

                            #region 处理完凹点后处理凹点所在的线
                            PointF getSign = getSignGuiJiPointTu(stockLine[j], newListStockPoint, newListPlatePoint);
                            //移动到初始状态,起始点,获取重心坐标
                            float moveX = newListStockPoint[stockLine[j].StartInt].X - getSign.X;
                            float moveY = newListStockPoint[stockLine[j].StartInt].Y - getSign.Y;
                            listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                    moveX,
                                                                    moveY);
                            PointF lineSp = listGene[signGene].RotateCenter;
                            listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                    -(moveX),
                                                                    -(moveY));
                            //listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                            //    (SPointSign.X - listGene[signGene].RotateCenter.X),
                            //    (SPointSign.Y - listGene[signGene].RotateCenter.Y));
                            moveX = newListStockPoint[stockLine[j].EndInt].X - getSign.X;
                            moveY = newListStockPoint[stockLine[j].EndInt].Y - getSign.Y;
                            listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                    moveX,
                                                                    moveY);
                            PointF lineEp = listGene[signGene].RotateCenter;
                            listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                                                                    -(moveX),
                                                                    -(moveY));
                            //listGene[signGene] = moveOper.MovePlate(listGene[signGene],
                            //    (SPointSign.X - listGene[signGene].RotateCenter.X),
                            //    (SPointSign.Y - listGene[signGene].RotateCenter.Y));
                            listGuiJi.Add(new Line(lineSp, lineEp));
                            if (count >= 0)
                            {
                                CADInterface.currentShapes.Add(new Line(lineSp, lineEp));
                            }
                            #endregion
                        }
                    }
                    //listGene[signGene] = new RotateOper().RotatePlate(listGene[signGene], listGene[signGene].RotateCenter, (angleTest == -9999 ? -5 * i + 360: -angleTest + 360));
                    listGene[signGene] = new RotateOper().RotatePlate(listGene[signGene], SPointSign, (angleTest == -9999 ? -5 * i + 360 : -angleTest + 360));

                    Trajectory tj = new Trajectory();
                    tj.Angle = (angleTest == -9999 ? 5 * i : angleTest);
                    tj.ListPoint.Add(getGuiJiDian(listGuiJi));
                    tj.Plate = listGene[signGene];
                    listTrajectory.Add(tj);
                    //for (int j = 0; j < listGuiJi.Count; j++)
                    //{
                    //    CADInterface.currentShapes.Add(listGuiJi[j]);
                    //}
                    #endregion
                }

                #region 筛选轨迹旋转最左最下的临界轨迹点
                if (listTrajectory.Count > 0)
                {
                    pyfa = getLeftDownPlate(listTrajectory, pyfa);
                    //pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate = new RotateOper().RotatePlate(
                    //    pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate,
                    //    pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate.RotateCenter,
                    //    pyfa.ListPlate[pyfa.ListPlate.Count - 1].Angle);
                    pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate = new RotateOper().RotatePlate(
                        pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate,
                        SPointSign,
                        pyfa.ListPlate[pyfa.ListPlate.Count - 1].Angle);
                    MessageBox.Show("" + pyfa.ListPlate[pyfa.ListPlate.Count - 1].Angle + "\n" +
                                    (pyfa.ListPlate[pyfa.ListPlate.Count - 1].Position.X - pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate.RotateCenter.X)
                                    + "\n" + (pyfa.ListPlate[pyfa.ListPlate.Count - 1].Position.Y - pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate.RotateCenter.Y)
                                    + "\n" + (pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate.RotateCenter.X)
                                    + "\n" + (pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate.RotateCenter.Y)
                                    + "\n" + (pyfa.ListPlate[pyfa.ListPlate.Count - 1].Position.X)
                                    + "\n" + (pyfa.ListPlate[pyfa.ListPlate.Count - 1].Position.Y)
                                    + "\n" + SPointSign.X
                                    + "\n" + SPointSign.Y);
                    pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate = new MoveOper().MovePlate(
                        pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate,
                        pyfa.ListPlate[pyfa.ListPlate.Count - 1].Position.X - pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate.RotateCenter.X,
                        pyfa.ListPlate[pyfa.ListPlate.Count - 1].Position.Y - pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate.RotateCenter.Y);
                    PointF sign = pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate.OutModel.ListPoint[0];
                    for (int i = 1; i < pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate.OutModel.ListPoint.Count; i++)
                    {
                        sign = sign.X > pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate.OutModel.ListPoint[i].X ? pyfa.ListPlate[pyfa.ListPlate.Count - 1].Plate.OutModel.ListPoint[i] : sign;
                    }
                    MessageBox.Show(sign + "");
                    count = count + 1;
                    CADInterface.DrawShap();
                    //System.Threading.Thread.Sleep(2000);
                }
                else
                {
                    signFirstGene = signGene + 1;
                    continue;
                }
                #endregion

                #region 重新生成原材料碎片
                List <BaseModel> newListModel = rebuildStockModelList(stock.ListModel[sigModel], pyfa);
                stock.ListModel.RemoveAt(sigModel);
                stock.ListModel.AddRange(newListModel);
                #endregion

                #region 对原材料碎片进行排序,从大到小,或从大到小
                stock.ListModel = sAndLGArea ? new ModelOper().sortModel(stock.ListModel, true) : new ModelOper().sortModel(stock.ListModel, false);
                #endregion

                signFirstGene = 0;          //重置起始基因点为0

                bn = false;
            }

            return(pyfa);
        }
Exemple #4
0
        private PlateModel analyticalPaper(string url)
        {
            //DateTime beforDT = System.DateTime.Now;

            PlateModel plate = new PlateModel();

            string[] urlStr     = url.Split('\\');
            string[] nameAndNum = urlStr[urlStr.Length - 1].Split('-');
            plate.PlateName  = nameAndNum[0];
            plate.PlateCode  = nameAndNum[0];
            plate.PlateCount = int.Parse(nameAndNum[1].Substring(0, nameAndNum[1].Length - 4));

            #region 加载dxf文件,获取文件每行的内容
            List <string> listDxfInfo = new List <string>();
            StreamReader  sr          = new StreamReader(url, Encoding.Default);
            String        input;
            while ((input = sr.ReadLine()) != "EOF")
            {
                listDxfInfo.Add(input);
            }
            listDxfInfo.Add("EOF");
            sr.Close();
            #endregion

            #region 提取需要的信息内容,这里按图形和文字进行分类提取
            List <string> listLine    = new List <string>();                            //直线类型
            List <string> listCircle  = new List <string>();                            //圆类型
            List <string> listArc     = new List <string>();                            //圆弧类型
            List <string> listEllipse = new List <string>();                            //椭圆类型
            List <string> listText    = new List <string>();                            //单行文字类型
            List <string> listMtext   = new List <string>();                            //多行文字类型
            List <string> listLayer   = new List <string>();                            //图层信息
            Dictionary <string, string> layerNandC = new Dictionary <string, string>(); //图层颜色和信息

            for (int i = 0; i < listDxfInfo.Count; i++)
            {
                string s1 = listDxfInfo[i].Trim();
                string s2 = listDxfInfo[i = i + 1].Trim();

                if ("LAYER".Equals(s2) && "0".Equals(s1))
                {
                    List <string> getList = createListByClass(i - 1, listDxfInfo);
                    listLayer.AddRange(getList);
                    i = i + getList.Count - 2;
                    getList.Clear();
                }
                else if ("LINE".Equals(s2) && "0".Equals(s1))
                {
                    List <string> getList = createListByClass(i - 1, listDxfInfo);
                    listLine.AddRange(getList);
                    i = i + getList.Count - 2;
                    getList.Clear();
                }
                else if ("CIRCLE".Equals(s2) && "0".Equals(s1))
                {
                    List <string> getList = createListByClass(i - 1, listDxfInfo);
                    listCircle.AddRange(getList);
                    i = i + getList.Count - 2;
                    getList.Clear();
                }
                else if ("ARC".Equals(s2) && "0".Equals(s1))
                {
                    List <string> getList = createListByClass(i - 1, listDxfInfo);
                    listArc.AddRange(getList);
                    i = i + getList.Count - 2;
                    getList.Clear();
                }
                else if ("ELLIPSE".Equals(s2) && "0".Equals(s1))
                {
                    List <string> getList = createListByClass(i - 1, listDxfInfo);
                    listEllipse.AddRange(getList);
                    i = i + getList.Count - 2;
                    getList.Clear();
                }
                else if ("TEXT".Equals(s2) && "0".Equals(s1))
                {
                    List <string> getList = createListByClass(i - 1, listDxfInfo);
                    listText.AddRange(getList);
                    i = i + getList.Count - 2;
                    getList.Clear();
                }
                else if ("MTEXT".Equals(s2) && "0".Equals(s1))
                {
                    List <string> getList = createListByClass(i - 1, listDxfInfo);
                    listMtext.AddRange(getList);
                    i = i + getList.Count - 2;
                    getList.Clear();
                }
            }

            listDxfInfo.Clear();
            #endregion

            #region 利用GDI+在自己的cad面板中画出提取出的内容
            if (listLayer.Count > 0)
            {
                layerNandC = new LayerTool().getLayer(listLayer);
            }
            if (listLine.Count > 0)
            {
                plate.OutModel.ListShape.AddRange(new LineTool().getLineByColor(listLine, layerNandC));
            }
            if (listCircle.Count > 0)
            {
                plate.OutModel.ListShape.AddRange(new CircleTool().getLineByColor(listCircle, layerNandC));
            }
            if (listArc.Count > 0)
            {
                plate.OutModel.ListShape.AddRange(new ArcTool().getLineByColor(listArc, layerNandC));
            }
            //if (listText.Count > 0) { new TextTool().createText(listText); }
            if (listEllipse.Count > 0)
            {
                plate.OutModel.ListShape.AddRange(new EllipseTool().getLineByColor(listEllipse, layerNandC));
            }
            #endregion

            listEllipse.Clear();
            listText.Clear();
            listArc.Clear();
            listCircle.Clear();
            listLine.Clear();
            listLayer.Clear();
            layerNandC.Clear();

            ModelOper modelOper = new ModelOper();

            plate = modelOper.baseShapeSort(plate);
            for (int k = 0; k < plate.InnerModel.Count; k++)
            {
                plate.InnerModel[k] = modelOper.reSetPointShunXu(plate.InnerModel[k], false);
            }

            //for (int i = 0; i < plate.InnerModel[0].ListShape.Count; i++)
            //{
            //    Console.WriteLine("{0},{1},{2}",
            //       plate.InnerModel[0].ListShape[i].ShapeClass, plate.InnerModel[0].ListShape[i].StartPoint, plate.InnerModel[0].ListShape[i].EndPoint);
            //}

            //CADInterface.currentPlates.Add(plate.OutModel);          //这里不存在外围面域,下面的判断之后才选定外围面域
            CADInterface.currentPlates.AddRange(plate.InnerModel);
            CADInterface.DrawShap();
            plate = modelOper.reSetOutInner(plate);
            plate = modelOper.juedeIsArc(plate);
            plate = new CalculateArea().getPlateArea(plate);
            plate = new CalculateArea().getPlateBound(plate);
            plate = new CreateCenterPoint().getRotateCenter(plate);
            plate = new CreateCenterPoint().getPowCenter(plate);

            //DateTime afterDT = System.DateTime.Now;
            //TimeSpan ts = afterDT.Subtract(beforDT);
            //Console.WriteLine("件号:{0},时间:{1}",
            //        plate.PlateName, ts.TotalSeconds);

            return(plate);

            //DateTime afterDT = System.DateTime.Now;
            //TimeSpan ts = afterDT.Subtract(beforDT);
            //MessageBox.Show("DateTime总共花费:" + ts.TotalMilliseconds);
        }
Exemple #5
0
        /// <summary>
        /// 开始排样
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolStripButton6_Click(object sender, EventArgs e)
        {
            if (listPlate.Count <= 0)
            {
                MessageBox.Show("请先加载需要排样的件号");
                return;
            }

            #region 检查原材料是否符合标准
            if (listStock.Count <= 0)
            {
                MessageBox.Show("请输入一定数量的原材料钢板");
                return;
            }
            else
            {
                //for (int i = 0; i < listStock.Count; i++)
                //{
                //    Console.WriteLine("编号:{0},数量:{1}",
                //    listStock[i].StockId, (listStock[i].Num - listStock[i].UseNum));
                //}

                bool haveStock = false;
                for (int i = 0; i < listStock.Count; i++)
                {
                    if (listStock[i].Num - listStock[i].UseNum > 0)
                    {
                        haveStock = true;
                    }
                }
                if (!haveStock)
                {
                    MessageBox.Show("请输入一定数量的原材料钢板");
                    return;
                }
            }
            #endregion

            GeneForm geneFrom = new GeneForm(this);
            geneFrom.ShowDialog();

            #region 加载原材料钢板
            for (int i = 0; i < listStock.Count; i++)
            {
                if (listStock[i].Num - listStock[i].UseNum > 0)
                {
                    #region 加载原材料钢板的时候,创建原材料钢板的面域以及逆时针循环的点集
                    for (int j = 0; j < listStock[i].StockForm.Count; j++)
                    {
                        listStock[i].StockForm[j].ShapeID = CADInterface.globalID;
                        CADInterface.globalID             = CADInterface.globalID + 1;
                        CADInterface.currentShapes.Add(listStock[i].StockForm[j]);
                    }

                    BaseModel newStockModel = new AddOper().addModel(listStock[i].StockForm);
                    listStock[i].ListModel.Add(newStockModel);
                    CADInterface.currentPlates.Add(newStockModel);
                    CADInterface.nowStock = listStock[i];
                    newStockModel.Draw(CADInterface.bGrp.Graphics);

                    ZoomOper zoom = new ShapeOper.ZoomOper();
                    zoom.zoomYuanCaiLiao(this.tableLayoutPanel1);

                    CADInterface.DrawShap();
                    #endregion
                    break;
                }
            }
            #endregion

            GeneSuanFa gene = new GeneSuanFa();
            NFPSuanFa  nfp  = new NFPSuanFa();

            #region 对读取的钢板件号进行遗传编码
            geneCode.AddRange(gene.createGeneCode(listPlate));
            #endregion

            //Console.WriteLine("种群大小:{0}", geneCode.Count);

            DateTime beforDT = System.DateTime.Now;

            PaiYangFangAn fangAn = nfp.createFirstFangAn(geneCode, CADInterface.nowStock, angleTest);

            DateTime afterDT = System.DateTime.Now;
            TimeSpan ts      = afterDT.Subtract(beforDT);

            Console.WriteLine("获取初始解的时间:{0}", ts.TotalSeconds);

            DateTime beforDT1 = System.DateTime.Now;

            fangAn = gene.getFinallyFangAn(geneCode, fangAn);

            DateTime afterDT1 = System.DateTime.Now;
            TimeSpan ts1      = afterDT1.Subtract(beforDT1);

            Console.WriteLine("获取最终解的时间:{0}", ts1.TotalSeconds);

            Console.WriteLine("获取最终解的利用率:{0}", fangAn.LiYouLv);

            #region 最终方案中已使用的基因编码,置为true
            for (int i = 0; i < fangAn.ListPlate.Count; i++)
            {
                for (int j = 0; j < geneCode.Count; j++)
                {
                    if (fangAn.ListPlate[i].Plate.InheritanceID == geneCode[j].InheritanceID)
                    {
                        geneCode[j].HadUsedGene = true;
                        break;
                    }
                }
            }
            #endregion
        }