コード例 #1
0
ファイル: TestUtilities.cs プロジェクト: broettge/MatterSlice
        public static Polygons GetTravelPolygonsForLayer(this string[] layerGCode, ref MovementInfo movementInfo)
        {
            var foundPolygons = new Polygons();

            bool         traveling    = false;
            MovementInfo lastMovement = movementInfo;

            foreach (MovementInfo currentMovement in TestUtilities.GetLayerMovements(layerGCode, lastMovement))
            {
                bool isTravel = currentMovement.extrusion == lastMovement.extrusion;

                if (traveling)
                {
                    if (isTravel)
                    {
                        // add to the travel
                        foundPolygons[foundPolygons.Count - 1].Add(new IntPoint(
                                                                       (long)(currentMovement.position.x * 1000),
                                                                       (long)(currentMovement.position.y * 1000),
                                                                       (long)(currentMovement.position.z * 1000)));
                    }
                    else
                    {
                        traveling = false;
                    }
                }
                else                 // not traveling
                {
                    if (isTravel)
                    {
                        // starting a new travel
                        foundPolygons.Add(new Polygon());

                        foundPolygons[foundPolygons.Count - 1].Add(new IntPoint(
                                                                       (long)(currentMovement.position.x * 1000),
                                                                       (long)(currentMovement.position.y * 1000),
                                                                       (long)(currentMovement.position.z * 1000)));
                        traveling = true;
                    }
                }

                lastMovement = currentMovement;
            }

            for (int i = foundPolygons.Count - 1; i >= 0; i--)
            {
                if (foundPolygons[i].PolygonLength() == 0)
                {
                    foundPolygons.RemoveAt(i);
                }
            }

            movementInfo = lastMovement;
            return(foundPolygons);
        }
コード例 #2
0
        public static List <IEnumerable <MovementInfo> > GetAllLayersMovements(this string[] loadedGCode)
        {
            var layerCount = TestUtilities.LayerCount(loadedGCode);

            var layerMovements = new List <IEnumerable <MovementInfo> >(layerCount);

            for (int i = 0; i < layerCount; i++)
            {
                layerMovements.Add(TestUtilities.GetLayerMovements(loadedGCode.GetLayer(i)));
            }

            return(layerMovements);
        }
コード例 #3
0
        private static void CheckLayersIncrement(string stlFile, string gcodeFile)
        {
            string risingLayersStlFile       = TestUtilities.GetStlPath(stlFile);
            string risingLayersGCodeFileName = TestUtilities.GetTempGCodePath(gcodeFile);

            var config = new ConfigSettings();

            config.FirstLayerThickness = .2;
            config.LayerThickness      = .2;
            var processor = new FffProcessor(config);

            processor.SetTargetFile(risingLayersGCodeFileName);
            processor.LoadStlFile(risingLayersStlFile);
            // slice and save it
            processor.DoProcessing();
            processor.Dispose();

            string[] risingLayersGCodeContent = TestUtilities.LoadGCodeFile(risingLayersGCodeFileName);

            // test .1 layer height
            int layerCount = TestUtilities.LayerCount(risingLayersGCodeContent);

            Assert.IsTrue(layerCount == 50);

            var startingPosition = default(MovementInfo);

            for (int layerIndex = 0; layerIndex < layerCount; layerIndex++)
            {
                string[] layerInfo     = TestUtilities.GetLayer(risingLayersGCodeContent, layerIndex);
                int      movementIndex = 0;
                // check that all layers move up
                foreach (MovementInfo movement in TestUtilities.GetLayerMovements(layerInfo, startingPosition))
                {
                    if (movement.line.Contains("X") ||
                        movement.line.Contains("Y") ||
                        movement.line.Contains("Z"))
                    {
                        if (layerIndex > 0)
                        {
                            Assert.AreEqual(movement.position.z, .2 + layerIndex * .2, .001);
                            Assert.IsTrue(movement.position.z >= startingPosition.position.z);
                        }
                    }

                    // always go up
                    startingPosition.position = new Vector3(0, 0, Math.Max(startingPosition.position.z, movement.position.z));
                    movementIndex++;
                }
            }
        }
コード例 #4
0
        public static Polygons GetExtrusionPolygonsForLayer(this string[] layerGCode, ref MovementInfo movementInfo, bool validateOverlaps = true)
        {
            var foundPolygons = new Polygons();

            bool   extruding        = false;
            int    movementCount    = 0;
            double movementAmount   = double.MaxValue / 2;           // always add a new extrusion the first time
            var    lastMovement     = movementInfo;
            var    lastLastMovement = movementInfo;

            foreach (MovementInfo currentMovement in TestUtilities.GetLayerMovements(layerGCode, lastMovement))
            {
                bool isRetraction = currentMovement.extrusion != lastMovement.extrusion && (currentMovement.position == lastMovement.position);
                bool isZLift      = currentMovement.position.x == lastMovement.position.x && currentMovement.position.y == lastMovement.position.y && currentMovement.position.z != lastMovement.position.z;
                bool isExtrude    = !isRetraction && !isZLift && currentMovement.extrusion != lastMovement.extrusion;

                if (extruding)
                {
                    if (isExtrude)
                    {
                        // add to the extrusion
                        foundPolygons[foundPolygons.Count - 1].Add(new IntPoint(
                                                                       (long)(currentMovement.position.x * 1000),
                                                                       (long)(currentMovement.position.y * 1000),
                                                                       (long)(currentMovement.position.z * 1000)));
                    }
                    else
                    {
                        // we are switching so add in the point to the last extrude
                        extruding      = false;
                        movementAmount = 0;
                        if (foundPolygons[foundPolygons.Count - 1].Count == 1)
                        {
                            foundPolygons[foundPolygons.Count - 1].Add(new IntPoint(
                                                                           (long)(lastMovement.position.x * 1000),
                                                                           (long)(lastMovement.position.y * 1000),
                                                                           (long)(lastMovement.position.z * 1000)));
                        }
                    }
                }
                else                 // not extruding
                {
                    if (isExtrude)
                    {
                        if (movementAmount >= 0)
                        {
                            // starting a new extrusion
                            foundPolygons.Add(new Polygon());

                            // add in the last position
                            foundPolygons[foundPolygons.Count - 1].Add(new IntPoint(
                                                                           (long)(lastMovement.position.x * 1000),
                                                                           (long)(lastMovement.position.y * 1000),
                                                                           (long)(lastMovement.position.z * 1000)));
                        }

                        foundPolygons[foundPolygons.Count - 1].Add(new IntPoint(
                                                                       (long)(currentMovement.position.x * 1000),
                                                                       (long)(currentMovement.position.y * 1000),
                                                                       (long)(currentMovement.position.z * 1000)));
                        extruding = true;
                    }
                    else                     // do nothing waiting for extrude
                    {
                        movementAmount += (currentMovement.position - lastMovement.position).Length;
                    }
                }

                lastLastMovement = lastMovement;
                lastMovement     = currentMovement;
                movementCount++;
            }

            for (int i = foundPolygons.Count - 1; i >= 0; i--)
            {
                if (!extruding && foundPolygons[i].Count == 1)
                {
                    foundPolygons.RemoveAt(i);
                }
                else if (foundPolygons[foundPolygons.Count - 1].Count == 1)
                {
                    foundPolygons[foundPolygons.Count - 1].Add(new IntPoint(
                                                                   (long)(lastLastMovement.position.x * 1000),
                                                                   (long)(lastLastMovement.position.y * 1000),
                                                                   (long)(lastLastMovement.position.z * 1000)));
                    break;
                }
            }

            movementInfo = lastMovement;

            // validate that the polygons do not double extrude
            if (validateOverlaps)
            {
                Assert.IsFalse(HasOverlapingSegments(foundPolygons));
            }

            return(foundPolygons);
        }
コード例 #5
0
        private static void CheckSpiralCone(string stlFile, string gcodeFile, bool enableThinWalls = false)
        {
            string cylinderStlFile       = TestUtilities.GetStlPath(stlFile);
            string cylinderGCodeFileName = TestUtilities.GetTempGCodePath(gcodeFile);

            var config = new ConfigSettings
            {
                FirstLayerThickness            = .2,
                LayerThickness                 = .2,
                NumberOfBottomLayers           = 0,
                ContinuousSpiralOuterPerimeter = true
            };

            if (enableThinWalls)
            {
                config.ExpandThinWalls = true;
                config.FillThinGaps    = true;
            }

            var processor = new FffProcessor(config);

            processor.SetTargetFile(cylinderGCodeFileName);
            processor.LoadStlFile(cylinderStlFile);
            // slice and save it
            processor.DoProcessing();
            processor.Dispose();

            string[] cylinderGCodeContent = TestUtilities.LoadGCodeFile(cylinderGCodeFileName);

            // test .1 layer height
            int layerCount = TestUtilities.LayerCount(cylinderGCodeContent);

            Assert.AreEqual(50, layerCount, "SpiralCone should have 50 layers");

            for (int i = 2; i < layerCount - 3; i++)
            {
                string[] layerInfo = TestUtilities.GetLayer(cylinderGCodeContent, i);

                // check that all layers move up continuously
                var lastMovement = default(MovementInfo);
                foreach (MovementInfo movement in TestUtilities.GetLayerMovements(layerInfo))
                {
#if __ANDROID__
                    Assert.IsTrue(movement.position.z > lastMovement.position.z);
#else
                    Assert.Greater(movement.position.z, lastMovement.position.z, "Z position should increment per layer");
#endif
                    lastMovement = movement;
                }

                double radiusForLayer = 5.0 + (20.0 - 5.0) / layerCount * i;

                bool first = true;
                lastMovement = default(MovementInfo);
                // check that all moves are on the outside of the cylinder (not crossing to a new point)
                foreach (MovementInfo movement in TestUtilities.GetLayerMovements(layerInfo))
                {
                    if (!first)
                    {
                        Assert.IsTrue((movement.position - lastMovement.position).Length < 2);

                        var xyOnly = new Vector3(movement.position.x, movement.position.y, 0);
                        Assert.AreEqual(radiusForLayer, xyOnly.Length, .3);
                    }

                    lastMovement = movement;
                    first        = false;
                }
            }
        }
コード例 #6
0
        public void DualMaterialPrintMovesCorrectly(bool createWipeTower)
        {
            string leftPart     = "Box Left";
            string rightPart    = "Box Right";
            string leftStlFile  = TestUtilities.GetStlPath(leftPart);
            string rightStlFile = TestUtilities.GetStlPath(rightPart);

            string outputGCodeFileName = TestUtilities.GetTempGCodePath("DualPartMoves");

            var config = new ConfigSettings();

            config.ExtruderCount        = 2;
            config.FirstLayerThickness  = .2;
            config.LayerThickness       = .2;
            config.NumberOfBottomLayers = 0;
            if (createWipeTower)
            {
                config.WipeTowerSize = 10;
            }
            else
            {
                config.WipeTowerSize = 0;
            }

            var processor = new FffProcessor(config);

            processor.SetTargetFile(outputGCodeFileName);
            processor.LoadStlFile(leftStlFile);
            processor.LoadStlFile(rightStlFile);
            // slice and save it
            processor.DoProcessing();
            processor.Dispose();

            string[] gCodeContent = TestUtilities.LoadGCodeFile(outputGCodeFileName);

            // test .1 layer height
            int layerCount = TestUtilities.LayerCount(gCodeContent);

            Assert.IsTrue(layerCount == 50);

            bool hadMoveLessThan85 = false;

            var lastMovement = default(MovementInfo);

            for (int i = 0; i < layerCount - 3; i++)
            {
                string[] layerInfo = TestUtilities.GetLayer(gCodeContent, i);

                // check that all layers move up continuously
                foreach (MovementInfo movement in TestUtilities.GetLayerMovements(layerInfo, lastMovement, onlyG1s: true))
                {
                    if (i > 2)
                    {
                        if (createWipeTower)
                        {
                            Assert.IsTrue(movement.position.x > 75 && movement.position.y > 10, "Moves don't go to 0");
                            if (movement.position.x < 85)
                            {
                                hadMoveLessThan85 = true;
                            }
                        }
                        else
                        {
                            Assert.IsTrue(movement.position.x > 85 && movement.position.y > 10, "Moves don't go to 0");
                        }
                    }

                    lastMovement = movement;
                }
            }

            if (createWipeTower)
            {
                Assert.IsTrue(hadMoveLessThan85, "found a wipe tower");
            }
        }
コード例 #7
0
        public void AllMovesRequiringRetractionDoRetraction(string baseFileName, string settingsIniFile = "")
        {
            string stlToLoad = TestUtilities.GetStlPath(baseFileName + ".stl");

            // check that default is support printed with extruder 0
            string gcodeToCreate = TestUtilities.GetTempGCodePath(baseFileName + "_retract_.gcode");

            var config = new ConfigSettings();

            if (settingsIniFile == "")
            {
                config.MinimumTravelToCauseRetraction   = 2;
                config.MinimumExtrusionBeforeRetraction = 0;
                config.MergeOverlappingLines            = false;
                config.FirstLayerExtrusionWidth         = .5;
            }
            else
            {
                config.ReadSettings(settingsIniFile);
            }

            // this is what we detect
            config.RetractionZHop = 5;

            var processor = new FffProcessor(config);

            processor.SetTargetFile(gcodeToCreate);
            processor.LoadStlFile(stlToLoad);
            // slice and save it
            processor.DoProcessing();
            processor.Dispose();

            string[] gcodeContents       = TestUtilities.LoadGCodeFile(gcodeToCreate);
            int      layerCount          = TestUtilities.LayerCount(gcodeContents);
            bool     firstPosition       = true;
            var      lastMovement        = default(MovementInfo);
            var      lastExtrusion       = default(MovementInfo);
            bool     lastMoveIsExtrusion = true;

            for (int layerIndex = 0; layerIndex < layerCount; layerIndex++)
            {
                string[] layerGCode    = TestUtilities.GetLayer(gcodeContents, layerIndex);
                int      movementIndex = 0;
                foreach (MovementInfo movement in TestUtilities.GetLayerMovements(layerGCode, lastMovement))
                {
                    if (!firstPosition)
                    {
                        bool isTravel = lastMovement.extrusion == movement.extrusion;
                        if (isTravel)
                        {
                            Vector3 lastPosition = lastMovement.position;
                            lastPosition.z = 0;
                            Vector3 currenPosition = movement.position;
                            currenPosition.z = 0;
                            double xyLength = (lastPosition - currenPosition).Length;
                            if (xyLength > config.MinimumTravelToCauseRetraction &&
                                lastMoveIsExtrusion)
                            {
                                Assert.GreaterOrEqual(movement.position.z, lastExtrusion.position.z);
                            }

                            lastMoveIsExtrusion = false;
                        }
                        else
                        {
                            lastMoveIsExtrusion = true;
                            lastExtrusion       = movement;
                        }

                        lastMoveIsExtrusion = !isTravel;
                    }

                    lastMovement  = movement;
                    firstPosition = false;
                    movementIndex++;
                }
            }

            // make sure we don't switch extruders
            Assert.IsFalse(TestUtilities.UsesExtruder(gcodeContents, 1));
            Assert.IsFalse(TestUtilities.UsesExtruder(gcodeContents, 2));
        }
コード例 #8
0
        private static void CheckSpiralCylinder(string stlFile, string gcodeFile, int expectedLayers, bool enableThinWalls = false)
        {
            string cylinderStlFile       = TestUtilities.GetStlPath(stlFile);
            string cylinderGCodeFileName = TestUtilities.GetTempGCodePath(gcodeFile);

            var config = new ConfigSettings();

            config.FirstLayerThickness = .2;
            config.LayerThickness      = .2;
            if (enableThinWalls)
            {
                config.ExpandThinWalls = true;
                config.FillThinGaps    = true;
            }

            config.NumberOfBottomLayers           = 0;
            config.ContinuousSpiralOuterPerimeter = true;
            var processor = new FffProcessor(config);

            processor.SetTargetFile(cylinderGCodeFileName);
            processor.LoadStlFile(cylinderStlFile);
            // slice and save it
            processor.DoProcessing();
            processor.Dispose();

            string[] cylinderGCodeContent = TestUtilities.LoadGCodeFile(cylinderGCodeFileName);

            // test .1 layer height
            int layerCount = TestUtilities.LayerCount(cylinderGCodeContent);

            Assert.IsTrue(layerCount == expectedLayers);

            for (int i = 2; i < layerCount - 3; i++)
            {
                string[] layerInfo = TestUtilities.GetLayer(cylinderGCodeContent, i);

                // check that all layers move up continuously
                var lastMovement = default(MovementInfo);
                foreach (MovementInfo movement in TestUtilities.GetLayerMovements(layerInfo))
                {
                    Assert.IsTrue(movement.position.z > lastMovement.position.z);

                    lastMovement = movement;
                }

                bool first = true;
                lastMovement = default(MovementInfo);
                // check that all moves are on the outside of the cylinder (not crossing to a new point)
                foreach (MovementInfo movement in TestUtilities.GetLayerMovements(layerInfo))
                {
                    if (!first)
                    {
                        Assert.IsTrue((movement.position - lastMovement.position).Length < 2);

                        var xyOnly = new Vector3(movement.position.x, movement.position.y, 0);
                        Assert.AreEqual(9.8, xyOnly.Length, .3);
                    }

                    lastMovement = movement;
                    first        = false;
                }
            }
        }