コード例 #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)
        {
            ArcPathEntity ent = new ArcPathEntity(blockT);

            ent.JetOn             = jeton;
            ent.Feedrate.Inverted = invertedF;
            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.Feedrate.Value = parseDouble(str, f);
                    ent.ContainsF      = true;
                    if (invertedF)
                    {
                        ent.Feedrate.Units = FeedrateUnits.SecPerMove;
                    }
                    else
                    {
                        ent.Feedrate.Units = FeedrateUnits.InPerMin;
                    }
                }
            }
            ent.Type = blockT;

            return(ent);
        }
コード例 #2
0
        private ModelPathEntity interpolateArc(PathEntity5Axis p1, PathEntity5Axis p2, double currentTime)
        {
            ModelPathEntity mpe = new ModelPathEntity(p2);
            ArcPathEntity   arc = p2 as ArcPathEntity;
            double          dt  = currentTime - p1.CumulativeTime;

            mpe.Position = getNewArcEndpoint(arc, dt);
            return(mpe);
        }
コード例 #3
0
        private void calcPathLengths()
        {
            path[0].Length = 0;
            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;
            }
        }
コード例 #4
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>
        ArcPathEntity parseArc(string ncLine, BlockType blockT)
        {
            ArcPathEntity ent = new ArcPathEntity(blockT);

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

            foreach (string str in splitLine)
            {
                if (str.Contains(n))
                {
                    ent.PathNumber = parseInt(str, n);
                }
                if (str.Contains(x))
                {
                    ent.EndPoint.X = parseDouble(str, x);
                }
                if (str.Contains(y))
                {
                    ent.EndPoint.Y = parseDouble(str, y);
                }
                if (str.Contains(z))
                {
                    ent.EndPoint.Z = parseDouble(str, z);
                }
                if (str.Contains(i))
                {
                    ent.I = parseDouble(str, i);
                }
                if (str.Contains(j))
                {
                    ent.J = parseDouble(str, j);
                }
                if (str.Contains(k))
                {
                    ent.K = parseDouble(str, k);
                }
                if (str.Contains(f))
                {
                    ent.Feedrate = parseDouble(str, f);
                }
            }
            ent.Type = blockT;
            return(ent);
        }
コード例 #5
0
        private PathEntity5Axis 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);
        }
コード例 #6
0
        public CNCLib.XYZBCMachPosition getNewArcEndpoint(ArcPathEntity arc, double newSweepAngle)
        {
            double coord1 = 0;
            double coord2 = 0;
            var    mp     = new CNCLib.XYZBCMachPosition();

            switch (arc.Type)
            {
            case BlockType.CCWArc:
                coord1 = arc.Radius * Math.Cos(arc.StartAngleRad + newSweepAngle);
                coord2 = arc.Radius * Math.Sin(arc.StartAngleRad + newSweepAngle);
                break;

            case BlockType.CWArc:
                coord1 = arc.Radius * Math.Cos(arc.StartAngleRad - newSweepAngle);
                coord2 = arc.Radius * Math.Sin(arc.StartAngleRad - newSweepAngle);
                break;
            }
            switch (arc.ArcPlane)
            {
            case ArcPlane.XY:
                mp.X = coord1 + arc.CenterPoint.X;
                mp.Y = coord2 + arc.CenterPoint.Y;
                mp.Z = arc.Position.Z;
                break;

            case ArcPlane.XZ:
                mp.X = coord1 + arc.CenterPoint.X;
                mp.Z = coord2 + arc.CenterPoint.Z;
                mp.Y = arc.Position.Y;
                break;

            case ArcPlane.YZ:
                mp.Y = coord1 + arc.CenterPoint.Y;
                mp.Z = coord2 + arc.CenterPoint.Z;
                mp.X = arc.Position.X;
                break;
            }
            return(mp);
        }
コード例 #7
0
        /// <summary>
        /// parse arc move from NCI file
        /// </summary>
        /// <param name="type"></param>
        /// <param name="ParamArr"></param>
        /// <returns></returns>
        private PathEntity arcMove(BlockType type, string[] ParamArr)
        {
            ArcPathEntity entity = new ArcPathEntity(type);

            entity.Ccomp    = (CComp)(int.Parse(ParamArr[0]));
            entity.ArcPlane = (ArcPlane)(int.Parse(ParamArr[1]));
            if (entity.ArcPlane == ArcPlane.XY)
            {
                entity.EndPoint.X = double.Parse(ParamArr[2]);
                entity.EndPoint.Y = double.Parse(ParamArr[3]);
            }
            if (entity.ArcPlane == ArcPlane.XZ)
            {
                entity.EndPoint.X = double.Parse(ParamArr[2]);
                entity.EndPoint.Z = double.Parse(ParamArr[3]);
            }
            if (entity.ArcPlane == ArcPlane.YZ)
            {
                entity.EndPoint.Y = double.Parse(ParamArr[2]);
                entity.EndPoint.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      = positiveF(double.Parse(ParamArr[7]));
            entity.ControlFlag   = (CtrlFlag)int.Parse(ParamArr[8]);
            int IarcFlag = int.Parse(ParamArr[9]);

            if (IarcFlag == 0)
            {
                entity.FullArcFlag = false;
            }
            else
            {
                entity.FullArcFlag = true;
            }
            return(entity);
        }
コード例 #8
0
        private List <ModelPathEntity> parseArc(double increment, PathEntity5Axis entity, CNCLib.XYZBCMachPosition startPoint)
        {
            try
            {
                List <ModelPathEntity> path = new List <ModelPathEntity>();
                ArcPathEntity          arc  = entity as ArcPathEntity;
                Vector3 vEnd       = new GeometryLib.Vector3(arc.Position.X, arc.Position.Y, arc.Position.Z);
                Vector3 vStart     = new Vector3(startPoint.X, startPoint.Y, startPoint.Z);
                double  segLength  = Math.Abs(arc.SweepAngle * arc.Radius);
                int     parseCount = (int)Math.Round(segLength / increment);
                if (parseCount == 0)
                {
                    parseCount = 1;
                }
                double dA = arc.SweepAngle / parseCount;

                for (int j = 0; j < parseCount; j++)
                {
                    ModelPathEntity pathSeg = new ModelPathEntity(arc);

                    pathSeg.Position = getNewArcEndpoint(arc, j * dA);
                    if (entity.JetOn == true)
                    {
                        pathSeg.JetOn = true;
                    }
                    else
                    {
                        pathSeg.JetOn = false;
                    }
                    path.Add(pathSeg);
                }
                return(path);
            }
            catch (Exception)
            {
                throw;
            }
        }
コード例 #9
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, CNCLib.XYZBCMachPosition 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;
        }