package org.goko.core.gcode.rs274ngcv3.modifier.translate; import org.goko.core.common.exception.GkException; import org.goko.core.common.measure.quantity.Angle; import org.goko.core.common.measure.quantity.Length; import org.goko.core.gcode.element.GCodeLine; import org.goko.core.gcode.element.IGCodeProvider; import org.goko.core.gcode.element.IInstructionSetIterator; import org.goko.core.gcode.rs274ngcv3.context.EnumDistanceMode; import org.goko.core.gcode.rs274ngcv3.context.GCodeContext; import org.goko.core.gcode.rs274ngcv3.element.GCodeProvider; import org.goko.core.gcode.rs274ngcv3.element.IModifier; import org.goko.core.gcode.rs274ngcv3.element.InstructionProvider; import org.goko.core.gcode.rs274ngcv3.element.InstructionType; import org.goko.core.gcode.rs274ngcv3.instruction.AbstractInstruction; import org.goko.core.gcode.rs274ngcv3.instruction.AbstractStraightInstruction; import org.goko.core.gcode.rs274ngcv3.instruction.ArcFeedInstruction; import org.goko.core.gcode.rs274ngcv3.modifier.AbstractModifier; public class TranslateModifier extends AbstractModifier<GCodeProvider> implements IModifier<GCodeProvider> { private Length translationX; private Length translationY; private Length translationZ; private Angle translationA; private Angle translationB; private Angle translationC; /** * Constructor * @param idGCodeProvider target provider id */ public TranslateModifier() { super("Translate"); this.translationX = Length.ZERO; this.translationY = Length.ZERO; this.translationZ = Length.ZERO; this.translationA = Angle.ZERO; this.translationB = Angle.ZERO; this.translationC = Angle.ZERO; } /** (inheritDoc) * @see org.goko.core.gcode.rs274ngcv3.element.IModifier#isConfigured() */ @Override public boolean isConfigured() { return true; } /** (inheritDoc) * @see org.goko.core.gcode.rs274ngcv3.element.IModifier#apply(org.goko.core.gcode.rs274ngcv3.element.GCodeProvider, org.goko.core.gcode.rs274ngcv3.element.GCodeProvider) */ @Override protected void applyModifier(IGCodeProvider source, GCodeProvider target) throws GkException { GCodeContext localContext = new GCodeContext(); InstructionProvider sourceInstructionSet = getRS274NGCService().getInstructions(localContext, source); IInstructionSetIterator<GCodeContext, AbstractInstruction> iterator = getRS274NGCService().getIterator(sourceInstructionSet, localContext); while(iterator.hasNext()){ GCodeContext preContext = iterator.getContext(); AbstractInstruction instr = iterator.next(); // We only translate in relative distance if(preContext.getDistanceMode() == EnumDistanceMode.ABSOLUTE){ if(instr.getType() == InstructionType.STRAIGHT_FEED || instr.getType() == InstructionType.STRAIGHT_TRAVERSE){ AbstractStraightInstruction straightInstruction = (AbstractStraightInstruction) instr; if(straightInstruction.getX() != null){ straightInstruction.setX(straightInstruction.getX().add(translationX)); } if(straightInstruction.getY() != null){ straightInstruction.setY(straightInstruction.getY().add(translationY)); } if(straightInstruction.getZ() != null){ straightInstruction.setZ(straightInstruction.getZ().add(translationZ)); } if(straightInstruction.getA() != null){ straightInstruction.setA(straightInstruction.getA().add(translationA)); } if(straightInstruction.getB() != null){ straightInstruction.setB(straightInstruction.getB().add(translationB)); } if(straightInstruction.getC() != null){ straightInstruction.setC(straightInstruction.getC().add(translationC)); } }else if(instr.getType() == InstructionType.ARC_FEED){ translateArcFeed((ArcFeedInstruction)instr, preContext); } } } GCodeProvider result = getRS274NGCService().getGCodeProvider(localContext, sourceInstructionSet); for (GCodeLine line : result.getLines()) { target.addLine(line); } } /** * Translation of an arc feed instruction * @param instr the instruction * @param preContext the context in which the instruction is evaluated * @throws GkException GkException */ private void translateArcFeed(ArcFeedInstruction instr, GCodeContext preContext) throws GkException { if(instr.getX() != null){ instr.setX(instr.getX().add(translationX)); } if(instr.getY() != null){ instr.setY(instr.getY().add(translationY)); } if(instr.getZ() != null){ instr.setZ(instr.getZ().add(translationZ)); } if(instr.getA() != null){ instr.setA(instr.getA().add(translationA)); } if(instr.getB() != null){ instr.setB(instr.getB().add(translationB)); } if(instr.getC() != null){ instr.setC(instr.getC().add(translationC)); } // switch (preContext.getPlane()) { // case XY_PLANE: instr.setFirstEnd( instr.getFirstEnd().add(translationX)); // instr.setSecondEnd( instr.getSecondEnd().add(translationY)); // instr.setFirstAxis( instr.getFirstAxis().add(translationX)); // instr.setSecondAxis( instr.getSecondAxis().add(translationY)); // instr.setAxisEndPoint( instr.getAxisEndPoint().add(translationZ)); // break; // case XZ_PLANE: instr.setFirstEnd( instr.getFirstEnd().add(translationZ)); // instr.setSecondEnd( instr.getSecondEnd().add(translationX)); // instr.setFirstAxis( instr.getFirstAxis().add(translationZ)); // instr.setSecondAxis( instr.getSecondAxis().add(translationX)); // instr.setAxisEndPoint( instr.getAxisEndPoint().add(translationY)); // break; // case YZ_PLANE: instr.setFirstEnd( instr.getFirstEnd().add(translationY)); // instr.setSecondEnd( instr.getSecondEnd().add(translationZ)); // instr.setFirstAxis( instr.getFirstAxis().add(translationY)); // instr.setSecondAxis( instr.getSecondAxis().add(translationZ)); // instr.setAxisEndPoint( instr.getAxisEndPoint().add(translationX)); // break; // default: throw new GkTechnicalException("Not a valid plane in GCodeContext ["+preContext.getPlane()+"]"); // } } /** * @return the translationX */ public Length getTranslationX() { return translationX; } /** * @param translationX the translationX to set */ public void setTranslationX(Length translationX) { this.translationX = translationX; updateModificationDate(); } /** * @return the translationY */ public Length getTranslationY() { return translationY; } /** * @param translationY the translationY to set */ public void setTranslationY(Length translationY) { this.translationY = translationY; updateModificationDate(); } /** * @return the translationZ */ public Length getTranslationZ() { return translationZ; } /** * @param translationZ the translationZ to set */ public void setTranslationZ(Length translationZ) { this.translationZ = translationZ; updateModificationDate(); } /** * @return the translationA */ public Angle getTranslationA() { return translationA; } /** * @param translationA the translationA to set */ public void setTranslationA(Angle translationA) { this.translationA = translationA; } /** * @return the translationB */ public Angle getTranslationB() { return translationB; } /** * @param translationB the translationB to set */ public void setTranslationB(Angle translationB) { this.translationB = translationB; } /** * @return the translationC */ public Angle getTranslationC() { return translationC; } /** * @param translationC the translationC to set */ public void setTranslationC(Angle translationC) { this.translationC = translationC; } }