コード例 #1
0
 /// <summary>
 /// 增加一个用户,增加成功则返回true
 /// </summary>
 /// <param name="_user"></param>
 /// <returns></returns>
 public static bool AddUser(User _user)
 {
     if (AddOper.addUser(_user) > 0)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
コード例 #2
0
ファイル: Program.cs プロジェクト: skrobanskyi/function-ooad
        static void Main(string[] args)
        {
            Function f1 = new SinFunc();

            f1.argumentFunction = new Argum();
            Function f2 = new CosFunc();

            f2.argumentFunction = new ExpFunc();
            f2.argumentFunction.argumentFunction = new Argum();
            Function f3 = new AddOper(f1, f2);

            Console.WriteLine(f1.ToString());
            Console.WriteLine(f2.ToString());
            Console.WriteLine(f3.ToString());
            Console.WriteLine("===========================");
            Console.WriteLine("Diff " + f2.ToString() + " = " + f2.Diff().ToString() + "\n");
            Console.WriteLine("===========================");
            Console.WriteLine("Value " + f2.ToString() + "=" + f2.Diff().ToString() + "\n");
            Console.WriteLine("===========================");
            string Path = "XMLoutput.xml";

            using (StreamWriter sw = new StreamWriter(Path, false, System.Text.Encoding.Default))
            {
                sw.WriteLine(f2.ToXML());
            }
            Dictionary <int, double> Coefficients = new Dictionary <int, double>();

            Coefficients.Add(0, 2);
            Coefficients.Add(1, 7);
            Function f4 = new Polynom(f2, Coefficients);

            Console.WriteLine(f4.ToString());
            Console.WriteLine("===========================");
            double val = f2.CalculateCalc(5);

            Console.WriteLine(f2.ToString() + "=" + val);

            string Path1 = "XMLoutput1.xml";

            using (StreamWriter sw = new StreamWriter(Path1, false, System.Text.Encoding.Default))
            {
                sw.WriteLine(f4.ToXML());
            }

            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
コード例 #3
0
        public void TestAddInstruction()
        {
            var testAddOper = new AddOper();

            testAddOper.Number = 3;
            var testApply = new ApplyOper();

            testApply.Number = 4;

            var testInstructions = new List <InstructionBase>();

            testInstructions.Add(testAddOper);
            testInstructions.Add(testApply);
            var testCalculator = new Calculator(testInstructions);

            Assert.AreEqual(7, testCalculator.Calculate());
        }
コード例 #4
0
ファイル: FangFaBeiFen.cs プロジェクト: zhang8153119/nesting
        /// <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);
        }
コード例 #5
0
        /// <summary>
        /// 返回是否插入新闻成功
        /// </summary>
        /// <param name="_new"></param>
        /// <returns></returns>
        public static bool insertNew(New _new)
        {
            _new.Create_Time = DateTime.Now;

            return(AddOper.insertNew(_new) > 0);
        }
コード例 #6
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
        }