com.rvantwisk.cnctools.operations.facing.FacingController.java Source code

Java tutorial

Introduction

Here is the source code for com.rvantwisk.cnctools.operations.facing.FacingController.java

Source

/*
 * Copyright (c) 2013, R. van Twisk
 * All rights reserved.
 * Licensed under the The BSD 3-Clause License;
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://opensource.org/licenses/BSD-3-Clause
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 *
 * Neither the name of the aic-util nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package com.rvantwisk.cnctools.operations.facing;

import com.rvantwisk.cnctools.controls.DimensionControl;
import com.rvantwisk.cnctools.controls.GCodeViewerControl;
import com.rvantwisk.cnctools.controls.SelectOrEditToolControl;
import com.rvantwisk.cnctools.controls.opengl.ArrowsActor;
import com.rvantwisk.cnctools.controls.opengl.GCodeActor;
import com.rvantwisk.cnctools.controls.opengl.PlatformActor;
import com.rvantwisk.cnctools.data.CNCToolsPostProcessConfig;
import com.rvantwisk.cnctools.data.Project;
import com.rvantwisk.cnctools.data.interfaces.TaskModel;
import com.rvantwisk.cnctools.gcode.CncToolsRS274;
import com.rvantwisk.cnctools.misc.Factory;
import com.rvantwisk.cnctools.misc.ToolDBManager;
import com.rvantwisk.cnctools.operations.interfaces.MillTaskController;
import com.rvantwisk.events.ToolChangedEvent;
import com.rvantwisk.gcodeparser.GCodeParser;
import com.rvantwisk.gcodeparser.MachineStatus;
import com.rvantwisk.gcodeparser.exceptions.SimException;
import com.rvantwisk.gcodeparser.exceptions.UnsupportedSimException;
import com.rvantwisk.gcodeparser.machines.StatisticLimitsController;
import com.rvantwisk.gcodeparser.validators.LinuxCNCValidator;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.net.URL;
import java.util.ResourceBundle;

/**
 * Created by rvt on 12/30/13.
 */
@Component
public class FacingController implements MillTaskController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private Project project;
    @Autowired
    private ToolDBManager toolDBManager;
    private FacingModel model;
    @FXML
    private ResourceBundle resources;
    @FXML
    private URL location;
    @FXML
    private ToggleGroup edgeDirection;
    @FXML
    private ToggleGroup cutDirection;
    @FXML
    private GCodeViewerControl gCodeViewerControl;
    @FXML
    private ComboBox<FacingModel.Configuration> iCutStrategy;
    @FXML
    private CheckBox iEdgeCleanup;
    @FXML
    private RadioButton iEdgeClimb;
    @FXML
    private RadioButton iEdgeConv;
    @FXML
    private RadioButton iConv;
    @FXML
    private RadioButton iClimb;
    @FXML
    private ChoiceBox<String> iPartReference;
    @FXML
    private DimensionControl iXLength;
    @FXML
    private DimensionControl iYLength;
    @FXML
    private DimensionControl iZFinal;
    @FXML
    private DimensionControl iZSafe;
    @FXML
    private DimensionControl iZTop;
    @FXML
    private SelectOrEditToolControl selectOrEditTool;

    @Override
    public void setProject(Project project) {
        this.project = project;
    }

    @FXML
    void initialize() {
        assert cutDirection != null : "fx:id=\"cutDirection\" was not injected: check your FXML file 'Facing.fxml'.";
        assert edgeDirection != null : "fx:id=\"edgeDirection\" was not injected: check your FXML file 'Facing.fxml'.";
        assert gCodeViewerControl != null : "fx:id=\"gCodeViewerControl\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iClimb != null : "fx:id=\"iClimb\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iConv != null : "fx:id=\"iConv\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iCutStrategy != null : "fx:id=\"iCutStrategy\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iEdgeCleanup != null : "fx:id=\"iEdgeCleanup\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iEdgeClimb != null : "fx:id=\"iEdgeClimb\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iEdgeConv != null : "fx:id=\"iEdgeConv\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iPartReference != null : "fx:id=\"iPartReference\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iXLength != null : "fx:id=\"iXLength\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iYLength != null : "fx:id=\"iYLength\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iZFinal != null : "fx:id=\"iZFinal\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iZSafe != null : "fx:id=\"iZSafe\" was not injected: check your FXML file 'Facing.fxml'.";
        assert iZTop != null : "fx:id=\"iZTop\" was not injected: check your FXML file 'Facing.fxml'.";
        assert selectOrEditTool != null : "fx:id=\"selectOrEditTool\" was not injected: check your FXML file 'Facing.fxml'.";

        iCutStrategy.getItems().clear();
        iCutStrategy.getItems().addAll(FacingModel.CONFIGLIST);

        modelToForm();

        selectOrEditTool.addEventHandler(ToolChangedEvent.TOOL_CHANGED_EVENT, new EventHandler<ToolChangedEvent>() {
            @Override
            public void handle(ToolChangedEvent toolChangedEvent) {
                generateGCode();
            }
        });

        iXLength.dimensionProperty().valueProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
                generateGCode();
            }
        });
        iYLength.dimensionProperty().valueProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
                generateGCode();
            }
        });
        iZFinal.dimensionProperty().valueProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
                generateGCode();
            }
        });
        iZSafe.dimensionProperty().valueProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
                generateGCode();
            }
        });
        iZTop.dimensionProperty().valueProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
                generateGCode();
            }
        });

        iEdgeCleanup.selectedProperty().addListener(new ChangeListener<Boolean>() {
            @Override
            public void changed(ObservableValue<? extends Boolean> observableValue, Boolean aBoolean,
                    Boolean aBoolean2) {
                generateGCode();
            }
        });

        edgeDirection.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
            @Override
            public void changed(ObservableValue<? extends Toggle> observableValue, Toggle toggle, Toggle toggle2) {
                generateGCode();
            }
        });
        cutDirection.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
            @Override
            public void changed(ObservableValue<? extends Toggle> observableValue, Toggle toggle, Toggle toggle2) {
                generateGCode();
            }
        });

        iCutStrategy.valueProperty().addListener(new ChangeListener<FacingModel.Configuration>() {

            @Override
            public void changed(ObservableValue<? extends FacingModel.Configuration> observableValue,
                    FacingModel.Configuration configuration, FacingModel.Configuration configuration2) {
                generateGCode();
            }
        });

        iPartReference.valueProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observableValue, String s, String s2) {
                generateGCode();
            }
        });

        generateGCode();
    }

    @Override
    public TaskModel getModel() {
        formToModel();
        return model;
    }

    @Override
    public void setModel(final TaskModel model) {
        this.model = (FacingModel) model;
    }

    @Override
    public <T extends TaskModel> T createNewModel() {
        return (T) new FacingModel();
    }

    @Override
    public void destroy() {
        gCodeViewerControl.destroy();
    }

    private void formToModel() {

        model.setToolID(this.selectOrEditTool.getTool().getId());
        model.setCutStrategy(this.iCutStrategy.selectionModelProperty().getValue().getSelectedItem());
        model.setEdgeCleanup(this.iEdgeCleanup.selectedProperty().get());
        model.setEdgeCleanupClimb(this.iEdgeClimb.selectedProperty().get());
        model.setPartReference(this.iPartReference.selectionModelProperty().getValue().getSelectedItem());

        model.getzFinal().set(this.iZFinal.dimensionProperty());
        model.getzSafe().set(this.iZSafe.dimensionProperty());
        model.getzTop().set(this.iZTop.dimensionProperty());
        model.getWidth().set(this.iXLength.dimensionProperty());
        model.getHeight().set(this.iYLength.dimensionProperty());

        model.setClimbCutting(this.iClimb.selectedProperty().get());
    }

    private void modelToForm() {
        selectOrEditTool.setTool(toolDBManager.getByID(model.getToolID()));

        int i = iCutStrategy.getItems().indexOf(model.cutStrategyProperty().get());
        iCutStrategy.getSelectionModel().select(i < 0 ? i = 0 : i);

        iEdgeCleanup.selectedProperty().set(model.edgeCleanupProperty().get());
        iEdgeClimb.selectedProperty().set(model.getEdgeCleanupClimb());
        iEdgeConv.selectedProperty().set(!model.getEdgeCleanupClimb());

        i = iPartReference.getItems().indexOf(model.partReferenceProperty().get());
        iPartReference.getSelectionModel().select(i < 0 ? i = 0 : i);

        iZFinal.dimensionProperty().set(model.getzFinal());
        iZSafe.dimensionProperty().set(model.getzSafe());
        iZTop.dimensionProperty().set(model.getzTop());
        iXLength.dimensionProperty().set(model.getWidth());
        iYLength.dimensionProperty().set(model.getHeight());

        iClimb.selectedProperty().set(model.getClimbCutting());
        iConv.selectedProperty().set(!model.getClimbCutting());
    }

    private void generateGCode() {
        String error = "";
        try {

            formToModel();

            CNCToolsPostProcessConfig ppc;
            ppc = project.getPostProcessor();
            if (ppc == null) {
                ppc = Factory.newPostProcessor();
            }

            CncToolsRS274 gCodeGenerator = new CncToolsRS274(ppc);
            gCodeGenerator.startProgram();
            model.generateGCode(toolDBManager, gCodeGenerator, "");
            gCodeGenerator.endProgram();

            GCodeActor machine = new GCodeActor("gcode");
            ArrowsActor arrows = new ArrowsActor("arrows");
            StatisticLimitsController stats = new StatisticLimitsController();
            LinuxCNCValidator validator = new LinuxCNCValidator();

            GCodeParser parser = new GCodeParser(validator, gCodeGenerator.getGCode().concate(), machine, arrows,
                    stats);

            gCodeViewerControl.addActor(machine);
            gCodeViewerControl.addActor(arrows);

            // create a platform
            gCodeViewerControl
                    .addActor(new PlatformActor(stats.getMinValues().get(MachineStatus.Axis.X).floatValue() - 20.0f,
                            stats.getMinValues().get(MachineStatus.Axis.Y).floatValue() - 20.0f,
                            stats.getMaxValues().get(MachineStatus.Axis.X).floatValue() + 20.0f,
                            stats.getMaxValues().get(MachineStatus.Axis.Y).floatValue() + 20.0f, stats.isMetric()));

        } catch (UnsupportedSimException e) {
            error = e.getMessage();
            logger.error("UnsupportedSimException", e);
        } catch (SimException e) {
            error = e.getMessage();
            logger.error("SimException", e);
        } catch (Exception e) {
            logger.error("Exception", e);
            error = e.getMessage();
        }
    }
}