package org.goko.tools.autoleveler.modifier.builder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.swt.widgets.Composite; import org.goko.core.common.exception.GkException; import org.goko.core.common.measure.quantity.Length; import org.goko.core.common.measure.quantity.LengthUnit; import org.goko.core.common.measure.quantity.Speed; import org.goko.core.common.measure.quantity.SpeedUnit; import org.goko.core.controller.IProbingService; import org.goko.core.gcode.element.IGCodeProvider; import org.goko.core.gcode.rs274ngcv3.IRS274NGCService; 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.modifier.IModifierListener; import org.goko.core.math.BoundingTuple6b; import org.goko.core.math.Tuple6b; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.AbstractModifierUiProvider; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.IModifierUiProvider; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.panel.IModifierPropertiesPanel; import org.goko.tools.autoleveler.bean.grid.GridHeightMap; import org.goko.tools.autoleveler.modifier.AutoLevelerModifier; import org.goko.tools.autoleveler.modifier.GridAutoLevelerModifier; import org.goko.tools.autoleveler.modifier.renderer.GridAutoLevelerRenderer; import org.goko.tools.autoleveler.modifier.ui.AutoLevelerModifierConfigurationPanel; import org.goko.tools.viewer.jogl.service.IJoglViewerService; import org.goko.tools.viewer.jogl.utils.render.internal.AbstractVboJoglRenderer; public class AutoLevelerModifierBuilder extends AbstractModifierUiProvider<GridAutoLevelerModifier> implements IModifierUiProvider<GridAutoLevelerModifier>, IModifierListener{ /** GCode service required by modifier */ private IRS274NGCService rs274ngcService; /** The jogl viewer service */ private IJoglViewerService joglViewerService; private IProbingService probingService; /** Create the renderer for the modifier */ private Map<Integer, AbstractVboJoglRenderer> renderers; /** * Constructor */ public AutoLevelerModifierBuilder() { super(GridAutoLevelerModifier.class); this.renderers = new HashMap<Integer, AbstractVboJoglRenderer>(); } /** (inheritDoc) * @see org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.IModifierUiProvider#createDefaultModifier(java.lang.Integer) */ @Override public GridAutoLevelerModifier createDefaultModifier(Integer idTargetGCodeProvider) throws GkException { GridAutoLevelerModifier modifier = new GridAutoLevelerModifier(); modifier.setIdGCodeProvider(idTargetGCodeProvider); IGCodeProvider provider = getRS274NGCService().getGCodeProvider(idTargetGCodeProvider); BoundingTuple6b bounds = getRS274NGCService().getBounds(new GCodeContext(), getRS274NGCService().getInstructions(new GCodeContext(), provider)); List<Tuple6b> offsets = new ArrayList<Tuple6b>(); offsets.add(new Tuple6b( bounds.getMin().getX(), bounds.getMin().getY(), Length.ZERO)); offsets.add(new Tuple6b( bounds.getMin().getX(), bounds.getMax().getY(), Length.ZERO)); offsets.add(new Tuple6b( bounds.getMax().getX(), bounds.getMin().getY(), Length.ZERO)); offsets.add(new Tuple6b( bounds.getMax().getX(), bounds.getMax().getY(), Length.ZERO)); GridHeightMap defaultMap = new GridHeightMap(new int[][]{{0,1},{2,3}}, offsets); defaultMap.setClearanceHeight(Length.valueOf(3, LengthUnit.MILLIMETRE)); defaultMap.setStart(bounds.getMin()); defaultMap.setEnd(bounds.getMax()); defaultMap.setProbeFeedrate(Speed.valueOf(30, SpeedUnit.MILLIMETRE_PER_MINUTE)); defaultMap.setProbeStartHeight(Length.valueOf(1, LengthUnit.MILLIMETRE)); defaultMap.setProbeLowerHeight(Length.valueOf(-1, LengthUnit.MILLIMETRE)); defaultMap.setMoveFeedrate(Speed.valueOf(1000, SpeedUnit.MILLIMETRE_PER_MINUTE)); modifier.setRS274NGCService(rs274ngcService); modifier.setHeightMap(defaultMap); return modifier; } /** (inheritDoc) * @see org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.IModifierUiProvider#providesConfigurationPanelFor(org.goko.core.gcode.rs274ngcv3.element.IModifier) */ @Override public boolean providesConfigurationPanelFor(IModifier<?> modifier) throws GkException { return modifier instanceof AutoLevelerModifier; } /** (inheritDoc) * @see org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.IModifierUiProvider#getModifierName() */ @Override public String getModifierName() { return "Auto leveler"; } /** * @return the rs274ngcService */ public IRS274NGCService getRS274NGCService() { return rs274ngcService; } /** * @param rs274ngcService the rs274ngcService to set */ public void setRS274NGCService(IRS274NGCService rs274ngcService) { this.rs274ngcService = rs274ngcService; this.rs274ngcService.addModifierListener(this); } /** (inheritDoc) * @see org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.AbstractModifierUiProvider#createPropertiesPanelForModifier(org.eclipse.swt.widgets.Composite, org.goko.core.gcode.rs274ngcv3.element.IModifier) */ @Override protected IModifierPropertiesPanel<GridAutoLevelerModifier> createPropertiesPanelForModifier(Composite parent, GridAutoLevelerModifier modifier) throws GkException { AutoLevelerModifierConfigurationPanel panel = new AutoLevelerModifierConfigurationPanel(getContext()); panel.createContent(parent, modifier); panel.getController().setModifier(modifier); parent.layout(); return panel; } /** (inheritDoc) * @see org.goko.core.gcode.rs274ngcv3.modifier.IModifierListener#onModifierCreate(java.lang.Integer) */ @Override public void onModifierCreate(Integer idModifier) throws GkException { IModifier<GCodeProvider> modifier = getRS274NGCService().getModifier(idModifier); if(modifier instanceof GridAutoLevelerModifier){ GridAutoLevelerModifier autoleveler = (GridAutoLevelerModifier) modifier; GridAutoLevelerRenderer renderer = new GridAutoLevelerRenderer(autoleveler); renderers.put(autoleveler.getId(), renderer); joglViewerService.addRenderer(renderer); } } /** (inheritDoc) * @see org.goko.core.gcode.rs274ngcv3.modifier.IModifierListener#onModifierUpdate(java.lang.Integer) */ @Override public void onModifierUpdate(Integer idModifier) throws GkException { IModifier<GCodeProvider> modifier = getRS274NGCService().getModifier(idModifier); if(modifier instanceof GridAutoLevelerModifier){ GridAutoLevelerModifier autoleveler = (GridAutoLevelerModifier) modifier; renderers.get(autoleveler.getId()).update(); } } /** (inheritDoc) * @see org.goko.core.gcode.rs274ngcv3.modifier.IModifierListener#onModifierDelete(java.lang.Integer) */ @Override public void onModifierDelete(IModifier<?> modifier) throws GkException { if(renderers.containsKey(modifier.getId())){ AbstractVboJoglRenderer renderer = renderers.get(modifier.getId()); renderers.remove(modifier.getId()); renderer.destroy(); } } /** * @return the joglViewerService */ public IJoglViewerService getJoglViewerService() { return joglViewerService; } /** * @param joglViewerService the joglViewerService to set */ public void setJoglViewerService(IJoglViewerService joglViewerService) { this.joglViewerService = joglViewerService; } /** * @return the probingService */ public IProbingService getProbingService() { return probingService; } /** * @param probingService the probingService to set */ public void setProbingService(IProbingService probingService) { this.probingService = probingService; } }