package org.goko.core.gcode.rs274ngcv3.instruction.builder;
import java.util.List;
import org.goko.core.common.exception.GkException;
import org.goko.core.common.measure.quantity.Angle;
import org.goko.core.common.measure.quantity.AngleUnit;
import org.goko.core.common.measure.quantity.Length;
import org.goko.core.gcode.element.GCodeWord;
import org.goko.core.gcode.rs274ngcv3.context.EnumMotionMode;
import org.goko.core.gcode.rs274ngcv3.context.GCodeContext;
import org.goko.core.gcode.rs274ngcv3.element.InstructionType;
import org.goko.core.gcode.rs274ngcv3.instruction.StraightFeedInstruction;
import org.goko.core.gcode.rs274ngcv3.utils.GCodeWordUtils;
public class StraightFeedBuilder extends AbstractInstructionBuilder<StraightFeedInstruction> {
public StraightFeedBuilder() {
super(InstructionType.STRAIGHT_FEED);
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.instruction.IInstructionBuilder#match(org.goko.core.gcode.rs274ngcv3.context.GCodeContext, java.util.List)
*/
@Override
public boolean match(GCodeContext context, List<GCodeWord> words) throws GkException {
if(GCodeWordUtils.containsWordRegex("G(0?)1", words)){
return true; // Explicit feedrate mode
}else if(GCodeWordUtils.containsWordByLetter("X", words)
|| GCodeWordUtils.containsWordByLetter("Y", words)
|| GCodeWordUtils.containsWordByLetter("Z", words)
|| GCodeWordUtils.containsWordByLetter("A", words)
|| GCodeWordUtils.containsWordByLetter("B", words)
|| GCodeWordUtils.containsWordByLetter("C", words)){
if(context.getMotionMode() == EnumMotionMode.FEEDRATE){
// Make sure there is no other motion mode word
if(!GCodeWordUtils.containsWordRegex("G(0?)0", words)
&& !GCodeWordUtils.containsWordRegex("G(0?)2", words)
&& !GCodeWordUtils.containsWordRegex("G(0?)3", words)
&& !GCodeWordUtils.containsWord("G38.2", words)){
return true;
}
}
}
return false;
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.instruction.IInstructionBuilder#toInstruction(org.goko.core.gcode.rs274ngcv3.context.GCodeContext, java.util.List)
*/
@Override
protected StraightFeedInstruction getInstruction(GCodeContext context, List<GCodeWord> words) throws GkException {
Length x = findWordLength("X", words, null, context.getUnit().getUnit());
Length y = findWordLength("Y", words, null, context.getUnit().getUnit());
Length z = findWordLength("Z", words, null, context.getUnit().getUnit());
Angle a = findWordAngle("A", words, null, AngleUnit.DEGREE_ANGLE);
Angle b = findWordAngle("B", words, null, AngleUnit.DEGREE_ANGLE);
Angle c = findWordAngle("C", words, null, AngleUnit.DEGREE_ANGLE);
// Consume the word
GCodeWordUtils.findAndRemoveWordRegex("G(0?)1", words);
return new StraightFeedInstruction(x, y, z, a, b, c);
}
}