private void WriteResult(SheetMetalResult smr) { var msg = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11}", Path.GetFileName(smr.Path), smr.IsSheetMetalPart, smr.HasFlatPattern, smr.Comment, Math.Round(smr.Area, 1), Math.Round(smr.Perimeter, 1), smr.Bends, smr.Holes, Math.Round(smr.Thickness, 2), Math.Round(smr.LARWidth, 1), Math.Round(smr.LARHeight, 1), DateTime.Now.ToString("s")); if (!File.Exists(mResultsFilePath)) { const string header = @"Part Name,Sheet Metal,Flat Pattern,Comment,Area,Perimeter,No of Bends,No of Holes/Piercings,Thickness,LAR Width,LAR Height,Date-Time"; using (var sw = File.CreateText(mResultsFilePath)) { sw.WriteLine(header); } } using (var sw = File.AppendText(mResultsFilePath)) { sw.WriteLine(msg); } }
private void LogFlatteningError(string filePath, string errMsg) { var smrErr = new SheetMetalResult(filePath, errMsg); WriteResult(smrErr); }
protected void Calculate(Document doc) { var resultsDir = Path.GetDirectoryName(doc.Path); mResultsFilePath = mResultsFilePath ?? Path.Combine(resultsDir, ExcelFileName); var sheetMetalPart = GetSheetMetalPart(doc); if (sheetMetalPart == null) { var smr1 = new SheetMetalResult(doc.Path, false, false); WriteResult(smr1); return; } var flatPart = GetFlatPart(doc); var flatPattern = flatPart.FlatPattern; if (flatPattern == null) { var smr2 = new SheetMetalResult(doc.Path, true, false); WriteResult(smr2); return; } var flatDesBodies = flatPattern.FlatBodies; var allDesBodies = new List <DesignBody>(flatDesBodies); var anchorDesFace = flatPattern.AnchorFace; var bendDesBodies = from thisDesFace in flatPattern.BendFaces select thisDesFace.Parent; allDesBodies.Add(anchorDesFace.Parent); allDesBodies.AddRange(bendDesBodies); var allBodies = (from desBody in allDesBodies select desBody.Shape.Copy()).ToList(); var firstBody = allBodies.First(); allBodies.Remove(firstBody); try { firstBody.Unite(allBodies); } catch (Exception ex) { LogFlatteningError(doc.Path, "Body.Unite --> " + ex.Message); } //firstBody.Fuse(allBodies, false, null); //firstBody.Stitch(allBodies, 0.01d, null); Debug.Assert(firstBody.PieceCount == 1, "Cannot operate on disjoint bodies"); Debug.Assert(firstBody.IsClosed); Debug.Assert(firstBody.IsManifold); if (firstBody.PieceCount != 1) { LogFlatteningError(doc.Path, firstBody, "More than one body in flattened part"); return; } if (!firstBody.IsClosed) { LogFlatteningError(doc.Path, firstBody, "Open body in flattened part"); return; } if (!firstBody.IsManifold) { LogFlatteningError(doc.Path, firstBody, "Non-manifold body in flattened part"); return; } var orderedFaces = firstBody.Faces.OrderBy(x => x.Area).ToList(); var largestFace = orderedFaces[orderedFaces.Count - 1]; var opositeLargestFace = orderedFaces[orderedFaces.Count - 2]; var larSize = GetMinimalBoundingBoxSize(largestFace); var separation = largestFace.GetClosestSeparation(opositeLargestFace); var thickness = separation.Distance; var lengthUnit = doc.Units.Length; var lengthFactor = lengthUnit.ConversionFactor; var areaFactor = lengthFactor * lengthFactor; var area = largestFace.Area; var perimeter = largestFace.Perimeter; var numHoles = largestFace.Loops.Where(x => !x.IsOuter).Count(); var smr3 = new SheetMetalResult( doc.Path, area * areaFactor, perimeter * lengthFactor, flatPattern.BendFaces.Count(), numHoles, thickness * lengthFactor, larSize.Width * lengthFactor, larSize.Height * lengthFactor); WriteResult(smr3); // will only create diagnostic part in DEBUG CreatePart(firstBody); if (false) { var dxfFilePath = Path.ChangeExtension(doc.Path, ".dxf"); CreateFlatPatternDXF(dxfFilePath, firstBody); } }