Example #1
0
        public void ParserGCode_G1_Correct_G01_G41_X10_X20_Test()
        {
            ParserGCode p = new ParserGCode();

            List <GCodeLine> result      = p.Parse("G01 G41 X10 " + Environment.NewLine + "X20");
            List <GCodeLine> rightresult = new List <GCodeLine>();

            GCodeLine gCodeLineResult1 = new GCodeLine(1);

            gCodeLineResult1.Command.Add("G1");
            gCodeLineResult1.Command.Add("G41");
            gCodeLineResult1.XPos = 10;

            GCodeLine gCodeLineResult2 = new GCodeLine(2);

            gCodeLineResult2.Command.Add("G1");
            gCodeLineResult2.XPos = 20;

            rightresult.Add(gCodeLineResult1);
            rightresult.Add(gCodeLineResult2);
            rightresult.Add(new GCodeLine(3));

            string resulttext      = ListToString(result);
            string rightresulttext = ListToString(rightresult);

            Assert.AreEqual(resulttext, rightresulttext);
        }
Example #2
0
        public void AddLine()
        {
            MockGCodeAccumulator mockGCA = new MockGCodeAccumulator();
            GCodeBuilder         gcb     = new GCodeBuilder(mockGCA);

            GCodeLine l = new GCodeLine(100, LineType.Comment);

            l.Comment = "testComment";
            gcb.AddLine(l);
            Assert.IsTrue(mockGCA.Lines.Count == 1);
            Assert.AreEqual("testComment", mockGCA.Lines[0].Comment);
            Assert.AreEqual(LineType.Comment, mockGCA.Lines[0].Type);
            Assert.AreEqual(0, mockGCA.Lines[0].LineNumber);

            GCodeLine l2 = new GCodeLine(100, LineType.GCode);

            l2.Comment = "testComment2";
            l2.Code    = 10;
            GCodeParam p = GCodeParam.Double(2.5, "X");

            l2.Parameters = new GCodeParam[1] {
                p
            };
            gcb.AddLine(l2);
            Assert.IsTrue(mockGCA.Lines.Count == 2);
            Assert.AreEqual("testComment2", mockGCA.Lines[1].Comment);
            Assert.AreEqual(10, mockGCA.Lines[1].Code);
            Assert.AreEqual(LineType.GCode, mockGCA.Lines[1].Type);
            Assert.AreEqual(1, mockGCA.Lines[1].LineNumber);
            Assert.AreEqual(p, mockGCA.Lines[1].Parameters[0]);
        }
Example #3
0
        protected virtual Vector3d ExtractPosition(GCodeLine line, Vector3d previousPosition)
        {
            double x = previousPosition.x;
            double y = previousPosition.y;
            double z = previousPosition.z;

            if (line.Parameters != null)
            {
                foreach (var param in line?.Parameters)
                {
                    switch (param.Identifier)
                    {
                    case "X":
                        x = param.DoubleValue;
                        break;

                    case "Y":
                        y = param.DoubleValue;
                        break;

                    case "Z":
                        z = param.DoubleValue;
                        break;
                    }
                }
            }
            return(new Vector3d(x, y, z));
        }
Example #4
0
        public GCodeFile ArcsToLines(double length)
        {
            var newFile = new List <GCodeCommand>();

            foreach (var cmd in Commands)
            {
                if (cmd is GCodeArc)
                {
                    foreach (var segment in ((GCodeArc)cmd).Split(length).Cast <GCodeArc>())
                    {
                        var ilne = new GCodeLine()
                        {
                            Start = segment.Start,
                            End   = segment.End,
                            Feed  = segment.Feed,
                            Rapid = false
                        };
                        newFile.Add(ilne);
                    }
                }
                else
                {
                    newFile.Add(cmd);
                }
            }

            return(new GCodeFile(newFile));
        }
Example #5
0
        private static void insertArcMove(ItemPath item, int pos, Point oldPoint, Point endPoint, Point center, bool isCW, double depth)
        {
            GCodeMotion   motion;
            ArcProperties arcMove;
            Point         p1 = Round(oldPoint);
            Point         p2 = Round(endPoint);
            double        x = 0, y = 0;

            arcMove = gcodeMath.getArcMoveProperties(p1, p2, center, isCW);
            double stepwidth = (double)Properties.Settings.Default.importGCSegment;

            int insertCounter = 1;

            if (stepwidth > arcMove.radius / 2)
            {
                stepwidth = arcMove.radius / 5;
            }
            double step = Math.Asin(stepwidth / arcMove.radius);     // in RAD

            //                    double step = Math.Asin((double)Properties.Settings.Default.importGCSegment / arcMove.radius);     // in RAD
            if (step > Math.Abs(arcMove.angleDiff))
            {
                step = Math.Abs(arcMove.angleDiff / 2);
            }

            if (arcMove.angleDiff > 0)   //(da > 0)                                             // if delta >0 go counter clock wise
            {
                for (double angle = (arcMove.angleStart + step); angle < (arcMove.angleStart + arcMove.angleDiff); angle += step)
                {
                    x      = arcMove.center.X + arcMove.radius * Math.Cos(angle);
                    y      = arcMove.center.Y + arcMove.radius * Math.Sin(angle);
                    motion = new GCodeLine(new Point(x, y), depth);
                    item.Dimension.setDimensionXY(x, y);
                    item.path.Insert(pos + insertCounter, motion);
                    insertCounter++;
                    item.PathLength += PointDistance(oldPoint, endPoint);    // distance from last to current point
                    oldPoint         = endPoint;
                }
            }
            else                                                       // else go clock wise
            {
                for (double angle = (arcMove.angleStart - step); angle > (arcMove.angleStart + arcMove.angleDiff); angle -= step)
                {
                    x      = arcMove.center.X + arcMove.radius * Math.Cos(angle);
                    y      = arcMove.center.Y + arcMove.radius * Math.Sin(angle);
                    motion = new GCodeLine(new Point(x, y), depth);
                    item.Dimension.setDimensionXY(x, y);
                    item.path.Insert(pos + insertCounter, motion);
                    insertCounter++;
                    item.PathLength += PointDistance(oldPoint, endPoint);    // distance from last to current point
                    oldPoint         = endPoint;
                }
            }
            motion = new GCodeLine(new Point(endPoint.X, endPoint.Y), depth);
            item.Dimension.setDimensionXY(endPoint.X, endPoint.Y);
            item.path.Insert(pos + insertCounter, motion);
            item.PathLength += PointDistance(oldPoint, endPoint);    // distance from last to current point
            oldPoint         = endPoint;
        }
Example #6
0
 private PrintVertex UpdatePrintVertex(GCodeLine line, PrintVertex previousVertex)
 {
     return(new PrintVertex(
                ExtractPosition(line, previousVertex.Position),
                ExtractFeedRate(line, previousVertex.FeedRate),
                ExtractDimensions(line, previousVertex.Dimensions),
                ExtractExtrusion(line, previousVertex.Extrusion.x)));
 }
Example #7
0
        /// <summary>
        /// Parse GCodeline property. Get values of G-Code commands
        /// </summary>
        public void ParseGCode()
        {
            var arr = GCodeLine.ToUpper().Split(' ');

            try
            {
                for (int i = 0; i < arr.Length; i++)
                {
                    //logger.Info("GCodeTool1" + arr[i].ToString());

                    if (arr[i].Contains("X"))
                    {
                        X = arr[i].Remove(0, 1);
                    }
                    else if (arr[i].Contains("Y"))
                    {
                        Y = arr[i].Remove(0, 1);
                    }
                    else if (arr[i].Contains("I"))
                    {
                        I = arr[i].Remove(0, 1);
                    }
                    else if (arr[i].Contains("J"))
                    {
                        J = arr[i].Remove(0, 1);
                    }
                    else if (arr[i].Contains("F"))
                    {
                        F = arr[i].Remove(0, 1);
                    }
                    else if (arr[i].Contains("S"))
                    {
                        S = arr[i].Remove(0, 1);
                    }
                    else if (arr[i].Contains("G"))
                    {
                        G = arr[i].Remove(0, 1);
                        ProcessGCode(G);
                    }
                    else if (arr[i].Contains("M"))
                    {
                        M = arr[i].Remove(0, 1);
                        ProcessMCode(M);
                    }
                    else
                    {
                        arr[i] = string.Empty;
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error("Method ParseGCode raised: {0}", ex.ToString());
            }
        }
Example #8
0
        public void NotNewLayer_NoComment()
        {
            var line = new GCodeLine(0, LineType.GCode);

            line.Code       = 1;
            line.Parameters = new GCodeParam[] { GCodeParam.Double(200, "X") };

            var isNewLine = LineIsNewLayerComment(line, out int index, out double height);

            Assert.IsFalse(isNewLine);
        }
Example #9
0
 private bool LineIsNewFeatureType(GCodeLine line, FillTypeFlags fillType, out FillTypeFlags newFillType)
 {
     newFillType = fillType;
     if (GCodeLineUtil.ExtractFillType(line, ref newFillType))
     {
         if (newFillType != fillType)
         {
             return(true);
         }
     }
     return(false);
 }
Example #10
0
        public virtual void ObserveGcodeLine(GCodeLine line)
        {
            if (line.Type != LineType.GCode)
            {
                return;
            }

            double x = VertexPrevious.Position.x;
            double y = VertexPrevious.Position.y;

            GCodeUtil.TryFindParamNum(line.Parameters, "X", ref x);
            GCodeUtil.TryFindParamNum(line.Parameters, "Y", ref y);

            VertexCurrent.Position = new Vector3d(x, y, 0);

            double f = GCodeUtil.UnspecifiedValue;

            if (GCodeUtil.TryFindParamNum(line.Parameters, "F", ref f))
            {
                VertexCurrent.FeedRate = f;
            }

            double extrusionAmount = GCodeUtil.UnspecifiedValue;
            bool   featureActive   = GCodeUtil.TryFindParamNum(line.Parameters, "E", ref extrusionAmount) &&
                                     extrusionAmount > VertexPrevious.Extrusion.x &&
                                     currentFeatureInfo != null;

            foreach (var s in endFeatureComments)
            {
                if (!string.IsNullOrWhiteSpace(line.Comment) && line.Comment.ToLower().Contains(s))
                {
                    featureActive = false;
                }
            }

            if (featureActive)
            {
                Vector2d average   = new Segment2d(VertexCurrent.Position.xy, VertexPrevious.Position.xy).Center;
                double   distance  = VertexCurrent.Position.Distance(VertexPrevious.Position);
                double   extrusion = extrusionAmount - VertexPrevious.Extrusion.x;

                currentFeatureInfo.Extrusion += extrusion;
                currentFeatureInfo.Distance  += distance;
                currentFeatureInfo.BoundingBox.Contain(VertexPrevious.Position.xy);
                currentFeatureInfo.BoundingBox.Contain(VertexCurrent.Position.xy);
                currentFeatureInfo.UnweightedCenterOfMass += average * extrusion;
                currentFeatureInfo.Duration += distance / VertexCurrent.FeedRate;

                VertexCurrent.Extrusion = new Vector3d(extrusionAmount, 0, 0);
            }

            VertexPrevious = new PrintVertex(VertexCurrent);
        }
Example #11
0
        public void NewLayerUnknown()
        {
            var line = new GCodeLine(0, LineType.UnknownString);

            line.OriginalString = "; layer 99, Z = 33.33";

            var isNewLine = LineIsNewLayerComment(line, out int index, out double height);

            Assert.IsTrue(isNewLine);
            Assert.AreEqual(99, index);
            Assert.AreEqual(33.33, height);
        }
Example #12
0
        public void NewLayerCommentAlternate()
        {
            var line = new GCodeLine(0, LineType.Comment);

            line.Comment = "layer 99: 33.33mm";

            var isNewLine = LineIsNewLayerComment(line, out int index, out double height);

            Assert.IsTrue(isNewLine);
            Assert.AreEqual(99, index);
            Assert.AreEqual(33.33, height);
        }
            public ItemPath(Point tmp)
            {
                isReversed = false;
                distance   = 0;
                pathLength = 0;
                path       = new List <GCodeMotion>();
                dimension  = new Dimensions();
                GCodeMotion motion = new GCodeLine(tmp);

                dimension.setDimensionXY(tmp.X, tmp.Y);
                path.Add(motion);
                start = end = tmp;
            }
        private void CodeAddPoint(int idx, System.Windows.Point p)
        {
            var code = Code.Codes[idx] as GCodeLine;
            var line = new GCodeLine(x: p.X, y: p.Y, speed: code.f, mode: code.SpeedMode);

            Code.Codes.Insert(idx, line);
            NotifyPropertyChanged("CodeCount");
            UpdateObjSize();
            NotifyPropertyChanged("CodePosition");
            NotifyPropertyChanged("CurrentCodeString");
            renderList();
            PositionChanged?.Invoke(CodePosition);
        }
            public void Add(Point tmp, double z, double ang)
            {
                GCodeMotion motion = new GCodeLine(tmp, z, ang);

                dimension.setDimensionXY(tmp.X, tmp.Y);
                path.Add(motion);
                pathLength += PointDistance(end, tmp);    // distance from last to current point
                end         = tmp;
                if (start == end)
                {
                    isClosed = true;
                }
            }
Example #16
0
 public static bool ExtractFillType(GCodeLine line, ref string featureType)
 {
     if (line.Comment != null)
     {
         int indexOfFillType = line.Comment.IndexOf("feature");
         if (indexOfFillType >= 0)
         {
             featureType = line.Comment.Substring(indexOfFillType + 8).Trim();
             return(true);
         }
     }
     return(false);
 }
Example #17
0
 protected virtual double ExtractFeedRate(GCodeLine line, double previousFeedrate)
 {
     if (line.Parameters != null)
     {
         foreach (var param in line?.Parameters)
         {
             if (param.Identifier == "F")
             {
                 return(param.DoubleValue);
             }
         }
     }
     return(previousFeedrate);
 }
Example #18
0
 protected virtual double ExtractExtrusion(GCodeLine line, double previousExtrusion)
 {
     if (line.Parameters != null)
     {
         foreach (var param in line?.Parameters)
         {
             if (param.Identifier == "E")
             {
                 return(param.DoubleValue);
             }
         }
     }
     return(previousExtrusion);
 }
Example #19
0
 protected void SetExtrusionCoordinateMode(GCodeLine line)
 {
     if (line.Type == LineType.MCode)
     {
         if (line.Code == 82)
         {
             extruderRelativeCoordinates = false;
         }
         else if (line.Code == 83)
         {
             extruderRelativeCoordinates = true;
         }
     }
 }
Example #20
0
 public static bool ExtractFillType(GCodeLine line, ref FillTypeFlags fillType)
 {
     if (line.comment != null)
     {
         int indexOfFillType = line.comment.IndexOf("feature");
         if (indexOfFillType >= 0)
         {
             var featureName = line.comment.Substring(indexOfFillType + 8).Trim();
             fillType = FeatureTypeLabelerFFF.Value.FillTypeFlagFromFeatureLabel(featureName);
             return(true);
         }
     }
     return(false);
 }
Example #21
0
        /// <summary>
        /// Parse GCodeline property. Get values of G-Code commands
        /// </summary>
        public void ParseGCode()
        {
            var arr = GCodeLine.ToUpper(CultureInfo.CurrentCulture).Split(' ');

            for (int i = 0; i < arr.Length; i++)
            {
                //logger.Info("GCodeTool1" + arr[i].ToString());

                if (arr[i].Contains("X"))
                {
                    X = arr[i].Remove(0, 1);
                }
                else if (arr[i].Contains("Y"))
                {
                    Y = arr[i].Remove(0, 1);
                }
                else if (arr[i].Contains("I"))
                {
                    I = arr[i].Remove(0, 1);
                }
                else if (arr[i].Contains("J"))
                {
                    J = arr[i].Remove(0, 1);
                }
                else if (arr[i].Contains("F"))
                {
                    F = arr[i].Remove(0, 1);
                }
                else if (arr[i].Contains("S"))
                {
                    S = arr[i].Remove(0, 1);
                }
                else if (arr[i].Contains("G"))
                {
                    G = arr[i].Remove(0, 1);
                    ProcessGCode(G);
                }
                else if (arr[i].Contains("M"))
                {
                    M = arr[i].Remove(0, 1);
                    ProcessMCode(M);
                }
                else
                {
                    arr[i] = string.Empty;
                }
            }
        }
Example #22
0
        public override void ProcessGCodeLine(GCodeLine line)
        {
            if (LineIsEmpty(line))
            {
                return;
            }

            SetExtrusionCoordinateMode(line);
            currentVertex = UpdatePrintVertex(line, previousVertex);

            if (LineIsNewLayerComment(line, out int index, out double height))
            {
                toolpath = FinishToolpath();
                EmitNewLayer(currentLayerIndex++, height);
            }

            if (LineIsTravel(line))
            {
                CloseToolpathAndAddTravel(previousVertex, currentVertex);
            }

            if (LineIsNewFillTypeComment(line, out var newFillType))
            {
                toolpath          = FinishToolpath();
                toolpath.Type     = ToolpathTypes.Deposition;
                toolpath.FillType = newFillType;
            }

            if (line.Comment?.Contains("Plane Change") ?? false)
            {
                toolpath.Type = ToolpathTypes.PlaneChange;
            }

            if (line.Type == LineType.GCode)
            {
                if (VertexHasNegativeOrZeroExtrusion(previousVertex, currentVertex))
                {
                    CloseToolpathAndAddTravel(previousVertex, currentVertex);
                }
                else if (toolpath != null)
                {
                    AppendVertexToCurrentToolpath(currentVertex);
                }
            }

            previousVertex = currentVertex;
        }
        public void ObserveGcodeLine(GCodeLine line)
        {
            if (line.type != GCodeLine.LType.GCode)
            {
                return;
            }

            double x = VertexPrevious.Position.x;
            double y = VertexPrevious.Position.y;

            bool found_x = GCodeUtil.TryFindParamNum(line.parameters, "X", ref x);
            bool found_y = GCodeUtil.TryFindParamNum(line.parameters, "Y", ref y);

            if (!found_x || !found_y)
            {
                return;
            }

            VertexCurrent.Position = new Vector3d(x, y, 0);

            double f = GCodeUtil.UnspecifiedValue;

            if (GCodeUtil.TryFindParamNum(line.parameters, "F", ref f))
            {
                VertexCurrent.FeedRate = f;
            }

            double extrusionAmount = GCodeUtil.UnspecifiedValue;

            if (GCodeUtil.TryFindParamNum(line.parameters, "E", ref extrusionAmount) &&
                extrusionAmount >= VertexPrevious.Extrusion.x && currentFeatureInfo != null)
            {
                Vector2d average  = new Segment2d(VertexCurrent.Position.xy, VertexPrevious.Position.xy).Center;
                double   distance = VertexCurrent.Position.Distance(VertexPrevious.Position);

                double extrusion = extrusionAmount - VertexPrevious.Extrusion.x;
                currentFeatureInfo.Extrusion += extrusion;
                currentFeatureInfo.Distance  += distance;
                currentFeatureInfo.BoundingBox.Contain(VertexCurrent.Position.xy);
                currentFeatureInfo.UnweightedCenterOfMass += average * extrusion;
                currentFeatureInfo.Duration += distance / VertexCurrent.FeedRate;

                VertexCurrent.Extrusion = new Vector3d(extrusionAmount, 0, 0);
            }

            VertexPrevious = new PrintVertex(VertexCurrent);
        }
Example #24
0
        public void ParserGCode_G1_Correct_G01_X10_Y10_Test()
        {
            ParserGCode p = new ParserGCode();

            List <GCodeLine> result      = p.Parse("G01 X10 Y10");
            List <GCodeLine> rightresult = new List <GCodeLine>();

            GCodeLine gCodeLineResult1 = new GCodeLine(1, "G1", 10, 10);

            rightresult.Add(gCodeLineResult1);
            rightresult.Add(new GCodeLine(2));

            string resulttext      = ListToString(result);
            string rightresulttext = ListToString(rightresult);

            Assert.AreEqual(resulttext, rightresulttext);
        }
Example #25
0
        public virtual GCodeLine Clone()
        {
            GCodeLine clone = new GCodeLine(this.lineNumber, this.type);

            clone.orig_string = this.orig_string;
            clone.N           = this.N;
            clone.code        = this.code;
            if (this.parameters != null)
            {
                clone.parameters = new GCodeParam[this.parameters.Length];
                for (int i = 0; i < this.parameters.Length; ++i)
                {
                    clone.parameters[i] = this.parameters[i];
                }
            }
            clone.comment = this.comment;
            return(clone);
        }
Example #26
0
        protected bool LineIsNewFillTypeComment(GCodeLine line, out IFillType fillType)
        {
            if (line.Comment != null)
            {
                var match = fillTypeLabelPattern.Match(line.Comment);
                if (match.Success)
                {
                    if (!FillTypes.TryGetValue(match.Groups[1].Captures[0].Value, out fillType))
                    {
                        fillType = new DefaultFillType();
                    }
                    return(true);
                }
            }

            fillType = null;
            return(false);
        }
Example #27
0
        public virtual GCodeLine Clone()
        {
            GCodeLine clone = new GCodeLine(LineNumber, Type);

            clone.OriginalString = OriginalString;
            clone.N    = N;
            clone.Code = Code;
            if (Parameters != null)
            {
                clone.Parameters = new GCodeParam[Parameters.Length];
                for (int i = 0; i < Parameters.Length; ++i)
                {
                    clone.Parameters[i] = Parameters[i];
                }
            }
            clone.Comment = Comment;
            return(clone);
        }
Example #28
0
        public void ParserGCode_G1_Correct_G1_X10_Test()
        {
            ParserGCode p = new ParserGCode();

            List <GCodeLine> result      = p.Parse("G1 X10");
            List <GCodeLine> rightresult = new List <GCodeLine>();

            GCodeLine gCodeLineResult1 = new GCodeLine(1);

            gCodeLineResult1.Command.Add("G1");
            gCodeLineResult1.XPos = 10;

            rightresult.Add(gCodeLineResult1);
            rightresult.Add(new GCodeLine(2));

            string resulttext      = ListToString(result);
            string rightresulttext = ListToString(rightresult);

            Assert.AreEqual(resulttext, rightresulttext);
        }
Example #29
0
        private GCodeMotion ParseLine(List <Word> Words, double MotionMode, Vector3 EndPos)
        {
            if (Words.Count > 0)
            {
                var bldr = new StringBuilder();
                foreach (var word in Words)
                {
                    bldr.Append(word.FullWord + "; ");
                }

                throw new Exception("Motion Command must be last in line Unparsed words in block => " + bldr.ToString());
            }

            var motion = new GCodeLine();

            motion.Start = State.Position;
            motion.End   = EndPos;
            motion.Rapid = MotionMode == 0;
            return(motion);
        }
Example #30
0
        public void ParserGCode_G1_Correct_G01_SEG10_52_ANG45_Test()
        {
            ParserGCode p = new ParserGCode();

            List <GCodeLine> result      = p.Parse("G01 SEG10.52 ANG45");
            List <GCodeLine> rightresult = new List <GCodeLine>();

            GCodeLine gCodeLineResult1 = new GCodeLine(1);

            gCodeLineResult1.Command.Add("G1");
            gCodeLineResult1.SEG = 10.52;
            gCodeLineResult1.ANG = 45;

            rightresult.Add(gCodeLineResult1);
            rightresult.Add(new GCodeLine(2));

            string resulttext      = ListToString(result);
            string rightresulttext = ListToString(rightresult);

            Assert.AreEqual(resulttext, rightresulttext);
        }