public virtual void LoadTool() { foreach (BaseShape item in CADInterface.currentShapes) { item.IsSelected = false; item.Show = DisplayStyle.Normal; } CADInterface.DrawShap(); }
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); }
/// <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); }
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); }
/// <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 }