Exemple #1
0
        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);
            }
        }
Exemple #2
0
        private void LogFlatteningError(string filePath, string errMsg)
        {
            var smrErr = new SheetMetalResult(filePath, errMsg);

            WriteResult(smrErr);
        }
Exemple #3
0
        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);
            }
        }