private void RemnantMatInfoForm_Paint(object sender, PaintEventArgs e) { if (m_polyMat != null) { // all polygons in material. Poly2DListEx poly2DList = new Poly2DListEx(); poly2DList.AddPoly(m_polyMat.GetMatPolygon()); poly2DList.AddPolyList(m_polyMat.GetUselessHoleList()); // clear screen and set the background color. m_matViewPort.BindRendContext(); m_matViewPort.ClearScreen(); m_matViewPort.SetBackgroundColor(Color.Black); // draw coordinate. m_matViewPort.SetDrawColor(Color.Blue); m_matViewPort.SetLineWidth(1); m_matViewPort.DrawCoordinate(0, 0, 0, false); // draw material polygons. m_matViewPort.SetDrawColor(Color.White); m_matViewPort.SetLineWidth(1); for (int i = 0; i < poly2DList.Size(); i++) { Polygon2DEx poly = poly2DList.GetPolygonByIndex(i); ArrayList lineItems = poly.GetLineList(); for (int j = 0; j < lineItems.Count; j++) { m_matViewPort.DrawLineItem((LineItemEx)lineItems[j]); } } // draw selected polygon. if (m_selPoly != null) { // hold the current drawing mode. ROP_MODE_EX iOldRopMode = ROP_MODE_EX.ROP_EX_NORMAL; m_matViewPort.GetROP(ref iOldRopMode); // hold the current drawing width. int iOldLineWid = m_matViewPort.GetLineWidth(); // hold the current drawing color. Color oldColor = new Color(); m_matViewPort.GetDrawColor(ref oldColor); // get the stipple mode. bool bOldStipple = false; int iOldRepeat = 1; ushort iOldPattern = 0xffff; m_matViewPort.GetLineStipple(ref bOldStipple, ref iOldRepeat, ref iOldPattern); // draw selected part placements. m_matViewPort.SetROP(ROP_MODE_EX.ROP_EX_COPY); m_matViewPort.SetLineWidth(2); m_matViewPort.SetDrawColor(Color.Red); m_matViewPort.SetLineStipple(true, 2, 0xcccc); ArrayList lineItems = m_selPoly.GetLineList(); for (int j = 0; j < lineItems.Count; j++) { m_matViewPort.DrawLineItem((LineItemEx)lineItems[j]); } // restore the old drawer config. m_matViewPort.SetROP(iOldRopMode); m_matViewPort.SetLineWidth(iOldLineWid); m_matViewPort.SetDrawColor(oldColor); m_matViewPort.SetLineStipple(bOldStipple, iOldRepeat, iOldPattern); } // swap buffer to display the geometry. m_matViewPort.SwapBuffers(); } }
// load boundary polygon from dxf/dwg file. static public MatEx LoadMatFromDxfdwg(String strFilePath, NestParamEx nestParam) { MatEx mat = null; /************************************************************************/ // load all geometry items from the dxf/dwg file. // the file name. int iDotIndex = strFilePath.LastIndexOf('.'); int iSlashIndex = strFilePath.LastIndexOf('\\'); String strFileName = strFilePath.Substring(iSlashIndex + 1, iDotIndex - iSlashIndex - 1); // whether the file is dxf file or dwg file. bool bDwg = true; String strExt = strFilePath.Substring(iDotIndex, strFilePath.Length - iDotIndex); strExt = strExt.ToLower(); if (strExt == ".dxf") { bDwg = false; } else if (strExt == ".dwg") { bDwg = true; } else { return(mat); } // extract geometry items from dxf/dwg file. ImpDataEx impData; if (!bDwg) { impData = NestFacadeEx.ExtractGeomItems(strFilePath); } else { // the temp folder for dxf. String strDxfPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); strDxfPath += "\\"; strDxfPath += new Random().Next(1, 100000).ToString(); strDxfPath += ".dxf"; // save dxf file in tmp path. NestFacadeEx.Dwg2Dxf(strFilePath, strDxfPath); // extract geometry items from dxf file. impData = NestFacadeEx.ExtractGeomItems(strDxfPath); // delete the temp file. File.Delete(strDxfPath); } /************************************************************************/ /************************************************************************/ // get the polygons from the dxf/dwg file. // build the polygons of all the geometry items. GeomItemListEx geomItemList = impData.GetAllGeomItem(); Poly2DListEx polyList = NestFacadeEx.BuildPolyListFromLineArc(geomItemList, nestParam.GetConTol()); // if no closed polygon found, return. if (polyList.Size() == 0) { MessageBox.Show("No closed boundary found.", "NestProfessor DEMO"); return(mat); } // the outer boundary polygon. int iMaxIndex = polyList.GetMaxAreaPoly(); Polygon2DEx outerPoly = polyList.GetPolygonByIndex(iMaxIndex); // the hole polygons. polyList.DelPolygonByIndex(iMaxIndex); Poly2DListEx holePolyList = polyList; /************************************************************************/ /************************************************************************/ // build the material object. // whether the boundary polygon is a rectangle. bool bRectMat = true; if (outerPoly.GetPtCount() != 4) { bRectMat = false; } else if (holePolyList.Size() > 0) { bRectMat = false; } else { // line items in the polygon. ArrayList lineItems = outerPoly.GetLineList(); LineItemEx lineItem1 = (LineItemEx)lineItems[0]; LineItemEx lineItem2 = (LineItemEx)lineItems[1]; LineItemEx lineItem3 = (LineItemEx)lineItems[2]; LineItemEx lineItem4 = (LineItemEx)lineItems[3]; if (Math.Abs(lineItem1.GetLength() - lineItem3.GetLength()) > 0.0001) { bRectMat = false; } if (Math.Abs(lineItem2.GetLength() - lineItem4.GetLength()) > 0.0001) { bRectMat = false; } Vector2DEx vect1 = lineItem1.GetBaseVector(); Vector2DEx vect2 = lineItem2.GetBaseVector(); if (!vect1.OrthogonalTo(vect2)) { bRectMat = false; } } // build the material object. if (bRectMat) { mat = new RectMatEx(strFileName, outerPoly.GetBoundaryRect(), 1); } else { PolyMatEx polyMat = new PolyMatEx(strFileName, outerPoly, 1); polyMat.SetUselessHoleList(holePolyList); mat = polyMat; } /************************************************************************/ return(mat); }