Пример #1
0
        /// <summary>
        /// parse string line from nc file into path ARC entity
        /// </summary>
        /// <param name="ncLine">line from NC file</param>
        /// <param name="blockT">Block type</param>
        /// <returns>ArcPathEntity</returns>
        private ArcPathEntity ParseArc(string ncLine, BlockType blockT, bool jeton, bool invertedF)
        {
            var ent = new ArcPathEntity(blockT);

            ent.JetOn = jeton;

            string[] splitLine = ncLine.Split(splitters, StringSplitOptions.None);

            foreach (string str in splitLine)
            {
                if (str.Contains(n))
                {
                    ent.LineNumber = ParseInt(str, n);
                }
                if (str.Contains(x))
                {
                    ent.Position.X = ParseDouble(str, x);
                    ent.ContainsX  = true;
                }
                if (str.Contains(y))
                {
                    ent.Position.Y = ParseDouble(str, y);
                    ent.ContainsY  = true;
                }
                if (str.Contains(z))
                {
                    ent.Position.Z = ParseDouble(str, z);
                    ent.ContainsZ  = true;
                }
                if (str.Contains(i))
                {
                    ent.Icoordinate = ParseDouble(str, i);
                }
                if (str.Contains(j))
                {
                    ent.Jcoordinate = ParseDouble(str, j);
                }
                if (str.Contains(k))
                {
                    ent.Kcoordinate = ParseDouble(str, k);
                }
                if (str.Contains(f))
                {
                    ent.ContainsF = true;

                    ent.Feedrate = GetFeedrate(str, invertedF);
                }
            }
            ent.Type = blockT;

            return(ent);
        }
Пример #2
0
        private void CalcPathLengths()
        {
            double cumulativeTime = 0;

            for (int i = 1; i < path.Count; i++)
            {
                path[i].Length = path[i].Position.DistanceTo(path[i - 1].Position);
                if (path[i] is ArcPathEntity)
                {
                    ArcPathEntity arc = path[i] as ArcPathEntity;
                    CalcSweepAngle(ref arc, path[i - 1].Position);
                }
                path[i].TravelTime     = path[i].Feedrate.MoveTimeSeconds(path[i].Length);
                cumulativeTime        += path[i].TravelTime;
                path[i].CumulativeTime = cumulativeTime;
            }
        }
Пример #3
0
        private IPathEntity parseArc(BlockType type, string[] ParamArr)
        {
            ArcPathEntity entity = new ArcPathEntity(type);

            entity.Type     = type;
            entity.Ccomp    = (CComp)(int.Parse(ParamArr[0]));
            entity.ArcPlane = (ArcPlane)(int.Parse(ParamArr[1]));
            if (entity.ArcPlane == ArcPlane.XY)
            {
                entity.Position.X = double.Parse(ParamArr[2]);
                entity.Position.Y = double.Parse(ParamArr[3]);
            }
            if (entity.ArcPlane == ArcPlane.XZ)
            {
                entity.Position.X = double.Parse(ParamArr[2]);
                entity.Position.Z = double.Parse(ParamArr[3]);
            }
            if (entity.ArcPlane == ArcPlane.YZ)
            {
                entity.Position.Y = double.Parse(ParamArr[2]);
                entity.Position.Z = double.Parse(ParamArr[3]);
            }
            entity.CenterPoint.X  = double.Parse(ParamArr[4]);
            entity.CenterPoint.Y  = double.Parse(ParamArr[5]);
            entity.CenterPoint.Z  = double.Parse(ParamArr[6]);
            entity.Feedrate.Value = getPositiveF(double.Parse(ParamArr[7]));
            entity.ControlFlag    = (CtrlFlag)int.Parse(ParamArr[8]);
            entity.ArcType        = ArcSpecType.NCI;
            int IarcFlag = int.Parse(ParamArr[9]);

            if (IarcFlag == 0)
            {
                entity.FullArcFlag = false;
            }
            else
            {
                entity.FullArcFlag = true;
            }
            entity.JetOn = getJetOn(entity.Feedrate.Value, toolpath.NomFeedrate);
            return(entity);
        }
Пример #4
0
        /// <summary>
        /// return true and blocktype if line is a g-code line
        /// </summary>
        /// <param name="ncLine">line from program</param>
        /// <param name="blockT">block type</param>
        /// <returns>true if line is part of path</returns>

        private void CalcSweepAngle(ref ArcPathEntity arc, IMachinePosition startPoint)
        {
            Vector3 vRadius    = new Vector3();
            double  startAngle = 0;
            double  endAngle   = 0;
            double  radius     = 0;
            double  sweep      = 0;

            double dxprev = 0;
            double dyprev = 0;
            double dzprev = 0;

            Vector3 vEnd   = new GeometryLib.Vector3(arc.Position.X, arc.Position.Y, arc.Position.Z);
            Vector3 vStart = new Vector3(startPoint.X, startPoint.Y, startPoint.Z);

            switch (arc.ArcType)
            {
            case ArcSpecType.IJKAbsolute:

                arc.CenterPoint = new GeometryLib.Vector3(arc.Position.X - arc.Icoordinate, arc.Position.Y - arc.Jcoordinate, arc.Position.Z - arc.Kcoordinate);
                arc.Radius      = vEnd.Length;
                radius          = arc.Radius;
                dxprev          = startPoint.X - arc.Icoordinate;
                dyprev          = startPoint.Y - arc.Jcoordinate;
                dzprev          = startPoint.Z - arc.Kcoordinate;

                break;

            case ArcSpecType.Radius:

                break;

            case ArcSpecType.NCI:
                vRadius    = new Vector3(arc.Position.X - arc.CenterPoint.X, arc.Position.Y - arc.CenterPoint.Y, arc.Position.Z - arc.CenterPoint.Z);
                arc.Radius = vRadius.Length;
                break;

            default:
            case ArcSpecType.IJKRelative:
                vRadius         = new GeometryLib.Vector3(arc.Icoordinate, arc.Jcoordinate, arc.Kcoordinate);
                arc.Radius      = vRadius.Length;
                arc.CenterPoint = new Vector3(startPoint.X + arc.Icoordinate, startPoint.Y + arc.Jcoordinate, startPoint.Z + arc.Kcoordinate);
                break;
            }
            switch (arc.ArcPlane)
            {
            case ArcPlane.XY:
                startAngle = Math.Atan2(vStart.Y - arc.CenterPoint.Y, vStart.X - arc.CenterPoint.X);
                endAngle   = Math.Atan2(vEnd.Y - arc.CenterPoint.Y, vEnd.X - arc.CenterPoint.X);
                break;

            case ArcPlane.XZ:
                startAngle = Math.Atan2(vStart.Z - arc.CenterPoint.Z, vStart.X - arc.CenterPoint.X);
                endAngle   = Math.Atan2(vEnd.Z - arc.CenterPoint.Z, vEnd.X - arc.CenterPoint.X);
                break;

            case ArcPlane.YZ:
                startAngle = Math.Atan2(vStart.Z - arc.CenterPoint.Z, vStart.Y - arc.CenterPoint.Y);
                endAngle   = Math.Atan2(vEnd.Z - arc.CenterPoint.Z, vEnd.Y - arc.CenterPoint.Y);
                break;
            }
            sweep = endAngle - startAngle;

            if (arc.Type == BlockType.CWARC)
            {
                sweep = 2 * Math.PI - sweep;
                if (sweep > 0)
                {
                    sweep = -1 * sweep;
                }
            }
            else
            {
                if (sweep < 0)
                {
                    sweep = Math.Abs(sweep);
                }
            }

            if (arc.FullArcFlag)
            {
                sweep = 2 * Math.PI;
            }

            arc.SweepAngle    = sweep;
            arc.StartAngleRad = startAngle;
        }