package org.goko.core.gcode.rs274ngcv3.utils;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import org.goko.core.common.measure.quantity.QuantityUtils;
import org.goko.core.gcode.rs274ngcv3.context.EnumDistanceMode;
import org.goko.core.gcode.rs274ngcv3.context.EnumPlane;
import org.goko.core.gcode.rs274ngcv3.context.GCodeContext;
import org.goko.core.gcode.rs274ngcv3.instruction.ArcFeedInstruction;
import org.goko.core.math.Arc3b;
import org.goko.core.math.Tuple6b;
public class InstructionUtils {
public static Arc3b getArc(GCodeContext context, ArcFeedInstruction instruction){
boolean clockwise = instruction.isClockwise();
Tuple6b startTuple = new Tuple6b(context.getX(), context.getY(), context.getZ(), context.getA(), context.getB(), context.getC());
// Apply coordinate system offset
Tuple6b offset = context.getCoordinateSystemData(context.getCoordinateSystem());
startTuple = startTuple.add(offset);
Tuple6b center = getCenterPoint(context, instruction);
Tuple6b end = getEndPoint(context, instruction);
return new Arc3b(startTuple, center, end, getNormalVector(context.getPlane()), clockwise);
}
private static Vector3d getNormalVector(EnumPlane enumGCodeCommandPlane){
Vector3d vec = null;
if(EnumPlane.XY_PLANE == enumGCodeCommandPlane){
vec = new Vector3d(0,0,1);
}else if(EnumPlane.XZ_PLANE == enumGCodeCommandPlane){
vec = new Vector3d(0,1,0);
}else if(EnumPlane.YZ_PLANE == enumGCodeCommandPlane){
vec = new Vector3d(1,0,0);
}
return vec;
}
private static Tuple6b getEndPoint(GCodeContext context, ArcFeedInstruction instruction){
Tuple6b startTuple = null;
if(context.getDistanceMode() == EnumDistanceMode.ABSOLUTE){
startTuple = new Tuple6b( context.getX(),
context.getY(),
context.getZ(),
context.getA(),
context.getB(),
context.getC());
if(instruction.getX() != null){
startTuple.setX(instruction.getX());
}
if(instruction.getY() != null){
startTuple.setY(instruction.getY());
}
if(instruction.getZ() != null){
startTuple.setZ(instruction.getZ());
}
} else if(context.getDistanceMode() == EnumDistanceMode.RELATIVE){
startTuple = new Tuple6b( QuantityUtils.add(context.getX(), instruction.getX()),
QuantityUtils.add(context.getY(), instruction.getY()),
QuantityUtils.add(context.getZ(), instruction.getZ()),
context.getA(),
context.getB(),
context.getC());
}else{
throw new RuntimeException("Unsupported distance mode "+context.getDistanceMode());
}
// Apply coordinate system offset
Tuple6b offset = context.getCoordinateSystemData(context.getCoordinateSystem());
startTuple = startTuple.add(offset);
Point3d result = startTuple.toPoint3d(context.getUnit().getUnit());
Tuple6b resultTuple = new Tuple6b(result.x, result.y, result.z,context.getUnit().getUnit());
return resultTuple;
}
private static Tuple6b getCenterPoint(GCodeContext context, ArcFeedInstruction instruction){
Tuple6b startTuple = new Tuple6b( QuantityUtils.add(context.getX(), instruction.getI()),
QuantityUtils.add(context.getY(), instruction.getJ()),
QuantityUtils.add(context.getZ(), instruction.getK()),
context.getA(),
context.getB(),
context.getC());
// Apply coordinate system offset
Tuple6b offset = context.getCoordinateSystemData(context.getCoordinateSystem());
startTuple = startTuple.add(offset);
Point3d result = startTuple.toPoint3d(context.getUnit().getUnit());
Tuple6b resultTuple = new Tuple6b(result.x, result.y, result.z,context.getUnit().getUnit());
return resultTuple;
}
}