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