/// <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); }
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; } }
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); }
/// <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; }