Skip to content
Snippets Groups Projects
Commit 7d221e90 authored by Matias Mennecart's avatar Matias Mennecart
Browse files

Optimisations et fix de bugs

parent 3a35a061
Branches
Tags
No related merge requests found
Showing
with 110 additions and 181 deletions
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.*?>
<?import javafx.scene.chart.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.stage.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.Scene?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.chart.ScatterChart?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Region?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<?import javafx.stage.Stage?>
<Stage fx:id="stage" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.DataStageController">
<Stage fx:id="stage" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.DataStageController">
<scene>
<Scene>
<AnchorPane prefHeight="487.0" prefWidth="692.0">
<AnchorPane prefHeight="380.0" prefWidth="692.0">
<children>
<VBox prefHeight="488.0" prefWidth="691.0">
<VBox prefHeight="399.0" prefWidth="691.0">
<children>
<HBox alignment="TOP_CENTER" prefHeight="356.0" prefWidth="691.0" spacing="5.0">
<children>
......@@ -52,11 +58,6 @@
</Button>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="169.0" prefWidth="691.0" spacing="50.0">
<children>
<Button fx:id="classifyData" disable="true" mnemonicParsing="false" onAction="#classifyDatas" prefHeight="26.0" prefWidth="157.0" text="Classifier les données" />
</children>
</HBox>
</children>
</VBox>
</children></AnchorPane>
......
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.stage.*?>
<Stage fx:id="stage" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.DisplaySettingsController">
<scene>
<Scene>
<AnchorPane prefHeight="200" prefWidth="200">
<children>
<VBox alignment="CENTER" layoutY="1.0" prefHeight="292.0" prefWidth="438.0" spacing="30.0">
<children>
<HBox alignment="CENTER" prefHeight="58.0" prefWidth="294.0" spacing="20.0">
<children>
<Label text="Nouvel ajout" />
<ColorPicker fx:id="addColor" editable="true" />
</children></HBox>
<Button fx:id="confirmSettings" mnemonicParsing="false" text="Valider" />
</children></VBox>
</children></AnchorPane>
</Scene>
</scene>
</Stage>
package fr.univlille.sae.classification.controller;
import fr.univlille.sae.classification.model.ClassificationModel;
import fr.univlille.sae.classification.model.Iris;
import fr.univlille.sae.classification.view.DataVisualizationView;
import fr.univlille.sae.classification.view.MainStageView;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory;
import javafx.stage.Stage;
import java.io.IOException;
import java.text.ParseException;
import java.util.function.UnaryOperator;
public class AddDataController {
@FXML
private Stage stage;
@FXML
private Button confirmAdd;
@FXML
private Spinner<Double> sepalLengthSpinner;
......@@ -36,6 +30,7 @@ public class AddDataController {
@FXML
public void initialize() {
sepalLengthSpinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0.0, 200.0, 3.0,0.1));
sepalWidthSpinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0.0, 200.0, 3.0, 0.1));
petalLengthSpinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0.0, 200.0, 3.0, 0.1));
......@@ -53,7 +48,7 @@ public class AddDataController {
this.mainStageView = mainStageView;
}
public void validate() throws IOException {
public void validate() {
System.out.println("validé");
mainStageView.getController().getClassifyData().setDisable(false);
......
package fr.univlille.sae.classification.controller;
import fr.univlille.sae.classification.model.ClassificationModel;
import fr.univlille.sae.classification.view.DataVisualizationView;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
......@@ -18,8 +17,6 @@ public class AxesSettingsController{
@FXML
ChoiceBox selectAbs;
@FXML
Button confirmAxes;
DataVisualizationView dataVisualizationView;
......
package fr.univlille.sae.classification.controller;
import fr.univlille.sae.classification.model.ClassificationModel;
import fr.univlille.sae.classification.view.*;
import fr.univlille.sae.classification.view.AxesSettingsView;
import fr.univlille.sae.classification.view.DataStageView;
import javafx.fxml.FXML;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.ScatterChart;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
......@@ -16,38 +15,14 @@ public class DataStageController {
@FXML
Stage stage;
@FXML
NumberAxis absAxe;
@FXML
NumberAxis ordAxe;
@FXML
Button settings;
@FXML
Button loadData;
@FXML
Button classifyData;
@FXML
ScatterChart scatterChart;
@FXML
Label AxesSelected;
Stage loadStage;
private DataStageView dataStageView;
/**
* Ouvre l'interface de chargement des données.
* @throws IOException
*/
public void openLoadData() throws IOException {
LoadDataView loadDataView = new LoadDataView(ClassificationModel.getClassificationModel(), stage);
loadDataView.show();
}
public void openAxesSetting()throws IOException {
AxesSettingsView axesSettingsView = new AxesSettingsView(ClassificationModel.getClassificationModel(), stage, dataStageView);
......@@ -58,10 +33,6 @@ public class DataStageController {
this.dataStageView = dataStageView;
}
public void classifyDatas() {
ClassificationModel.getClassificationModel().classifierDonnees();
classifyData.setDisable(true);
}
public ScatterChart getScatterChart() {
......@@ -72,7 +43,4 @@ public class DataStageController {
this.AxesSelected.setText(texte);
}
public Button getClassifyData() {
return this.classifyData;
}
}
package fr.univlille.sae.classification.controller;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ColorPicker;
import javafx.stage.Stage;
public class DisplaySettingsController {
@FXML
Stage stage;
@FXML
Button confirmSettings;
@FXML
ColorPicker addColor;
}
......@@ -4,7 +4,6 @@ import fr.univlille.sae.classification.model.ClassificationModel;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
......@@ -18,11 +17,6 @@ public class LoadDataController {
@FXML
Stage stage;
@FXML
Button browseFile;
@FXML
Button confirmDataSelection;
@FXML
TextField filePath;
......@@ -45,7 +39,7 @@ public class LoadDataController {
public void validate() throws IOException {
if (file == null) {
if (file == null || file.isDirectory() || !file.exists()) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Erreur de chargement du fichier");
alert.setHeaderText(null);
......@@ -54,8 +48,8 @@ public class LoadDataController {
alert.showAndWait();
openFileChooser();
return;
//throw exception
}
ClassificationModel.getClassificationModel().loadData(file);
stage.close();
}
......
......@@ -3,12 +3,10 @@ package fr.univlille.sae.classification.controller;
import fr.univlille.sae.classification.model.ClassificationModel;
import fr.univlille.sae.classification.view.*;
import javafx.fxml.FXML;
import javafx.scene.chart.*;
import javafx.scene.chart.ScatterChart;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.*;
import javafx.stage.Stage;
import java.io.IOException;
......@@ -19,20 +17,7 @@ public class MainStageController {
@FXML
Stage stage;
@FXML
NumberAxis absAxe;
@FXML
NumberAxis ordAxe;
@FXML
Button settings;
@FXML
Button loadData;
@FXML
Button addData;
@FXML
Button classifyData;
......@@ -44,7 +29,6 @@ public class MainStageController {
Label AxesSelected;
Stage loadStage;
private MainStageView mainStageView;
/**
......
......@@ -3,13 +3,10 @@ package fr.univlille.sae.classification.model;
import com.opencsv.bean.CsvToBeanBuilder;
import fr.univlille.sae.classification.utils.Observable;
import javax.xml.crypto.Data;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.concurrent.CopyOnWriteArrayList;
......@@ -88,7 +85,7 @@ public class ClassificationModel extends Observable {
*/
private void classifierDonnee(LoadableData data) {
List<String> classes = new ArrayList<>(data.getClassificationTypes());
List<String> classes = new ArrayList<>(LoadableData.getClassificationTypes());
Random rdm = new Random();
data.setClassification(classes.get(rdm.nextInt(classes.size())));
notifyObservers(data);
......
package fr.univlille.sae.classification.model;
import com.opencsv.bean.*;
import com.opencsv.bean.CsvBindByName;
import javafx.scene.paint.Color;
import java.util.Random;
public class Iris extends LoadableData{
......@@ -91,13 +89,12 @@ public class Iris extends LoadableData{
}
public String[] getAttributesName() {
String[] names = new String[]{
return new String[]{
"sepalLength",
"sepalWidth",
"petalLength",
"petalWidth"
};
return names;
}
@Override
......
......@@ -13,10 +13,6 @@ public abstract class LoadableData {
}
public void addClassification(String classificationType) {
this.classificationTypes.add(classificationType);
}
public abstract String getClassification() ;
public static Set<String> getClassificationTypes() {
......
package fr.univlille.sae.classification.view;
import fr.univlille.sae.classification.controller.AddDataController;
import fr.univlille.sae.classification.controller.AxesSettingsController;
import fr.univlille.sae.classification.model.ClassificationModel;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Alert;
......
package fr.univlille.sae.classification.view;
import fr.univlille.sae.classification.controller.AxesSettingsController;
import fr.univlille.sae.classification.controller.DataStageController;
import fr.univlille.sae.classification.controller.MainStageController;
import fr.univlille.sae.classification.model.ClassificationModel;
import fr.univlille.sae.classification.model.LoadableData;
import javafx.fxml.FXMLLoader;
......@@ -10,7 +8,6 @@ import javafx.scene.control.Alert;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javax.xml.crypto.Data;
import java.io.File;
import java.io.IOException;
import java.net.URL;
......
package fr.univlille.sae.classification.view;
import fr.univlille.sae.classification.controller.DataStageController;
import fr.univlille.sae.classification.controller.MainStageController;
import fr.univlille.sae.classification.model.ClassificationModel;
import fr.univlille.sae.classification.model.DataType;
import fr.univlille.sae.classification.model.Iris;
import fr.univlille.sae.classification.model.LoadableData;
import fr.univlille.sae.classification.utils.Observable;
import fr.univlille.sae.classification.utils.Observer;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.chart.ScatterChart;
import javafx.scene.chart.XYChart;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;
import java.io.File;
......@@ -27,10 +28,21 @@ public class DataStageView extends DataVisualizationView implements Observer {
private ClassificationModel model;
private DataStageController controller;
private XYChart.Series series1 ;
private XYChart.Series series2 ;
private XYChart.Series series3 ;
private XYChart.Series series4 ;
private Stage root;
public DataStageView(ClassificationModel model) {
super();
this.model = model;
this.series1 = new XYChart.Series();
this.series2 = new XYChart.Series();
this.series3 = new XYChart.Series();
this.series4 = new XYChart.Series();
model.attach(this);
}
......@@ -52,6 +64,12 @@ public class DataStageView extends DataVisualizationView implements Observer {
controller = loader.getController();
controller.setDataStageView(this);
scatterChart = controller.getScatterChart();
scatterChart.getData().addAll(series4, series1, series2, series3 );
System.out.println("DataStageView scatter chart: " +scatterChart);
controller.setAxesSelected("Aucun fichier sélectionné");
if (!model.getDatas().isEmpty()) {
......@@ -64,10 +82,10 @@ public class DataStageView extends DataVisualizationView implements Observer {
if(scatterChart == null) throw new IllegalStateException();
if(!(observable instanceof ClassificationModel)) throw new IllegalStateException();
//on vide le nuage pour s'assurer que celui-ci est bien vide
scatterChart.getData().clear();
ObservableList<XYChart.Series> series = scatterChart.getData();
for(XYChart.Series serie: series) {serie.getData().clear();}
XYChart.Series series1 = new XYChart.Series();
series1.setName("Iris");
//Jalon 1: on verifie que le type de donnée est bien IRIS
if(model.getType() == DataType.IRIS) {
......@@ -76,8 +94,6 @@ public class DataStageView extends DataVisualizationView implements Observer {
}
else{
controller.setAxesSelected("");
// On ajoute la serie au nuage
scatterChart.getData().add(series1);
//On recupere les données du model
List<LoadableData> points = new ArrayList<>(model.getDatas());
......@@ -89,9 +105,29 @@ public class DataStageView extends DataVisualizationView implements Observer {
XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(iris.getDataType(actualX),
iris.getDataType(actualY));
dataPoint.setNode(getCircle(iris));
series1.getData().add(dataPoint);
dataPoint.setNode(getForm(iris, new Circle(5)));
switch (iris.getClassification()) {
case "Setosa":
series1.getData().add(dataPoint);
break;
case "Versicolor":
series2.getData().add(dataPoint);
break;
case "Virginica":
series3.getData().add(dataPoint);
break;
default:
dataPoint.setNode(getForm(iris, new Rectangle(10, 10)));
series4.getData().add(dataPoint);
break;
}
series1.setName("Setosa");
series2.setName("Versicolor");
series3.setName("Virginica");
series4.setName("undefinied");
}
}
......@@ -99,10 +135,9 @@ public class DataStageView extends DataVisualizationView implements Observer {
}
private Circle getCircle(Iris iris) {
Circle circle = new Circle(5);
circle.setFill(iris.getColor());
circle.setOnMouseClicked(e -> {
private Shape getForm(Iris iris, Shape form) {
form.setFill(iris.getColor());
form.setOnMouseClicked(e -> {
ContextMenu contextMenu = new ContextMenu();
for(String attributes : iris.getAttributesName()) {
contextMenu.getItems().add(new MenuItem(attributes + " : " + iris.getDataType(attributes)));
......@@ -110,7 +145,7 @@ public class DataStageView extends DataVisualizationView implements Observer {
contextMenu.show(root, e.getScreenX(), e.getScreenY());
});
return circle;
return form;
}
......@@ -130,10 +165,9 @@ public class DataStageView extends DataVisualizationView implements Observer {
iris.getDataType(actualY)
);
dataPoint.setNode(getCircle(iris));
dataPoint.setNode(getForm(iris, new Rectangle(10, 10)));
if (!scatterChart.getData().isEmpty()) {
XYChart.Series series = (XYChart.Series) scatterChart.getData().get(0);
series.getData().add(dataPoint);
series4.getData().add(dataPoint);
}
}
}
......
package fr.univlille.sae.classification.view;
import fr.univlille.sae.classification.controller.LoadDataController;
import fr.univlille.sae.classification.controller.MainStageController;
import fr.univlille.sae.classification.model.ClassificationModel;
import fr.univlille.sae.classification.model.DataType;
......@@ -8,13 +7,12 @@ import fr.univlille.sae.classification.model.Iris;
import fr.univlille.sae.classification.model.LoadableData;
import fr.univlille.sae.classification.utils.Observable;
import fr.univlille.sae.classification.utils.Observer;
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.chart.ScatterChart;
import javafx.scene.chart.XYChart;
import javafx.scene.control.*;
import javafx.scene.paint.Color;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
......@@ -23,7 +21,9 @@ import javafx.stage.Stage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class MainStageView extends DataVisualizationView implements Observer {
......@@ -32,7 +32,9 @@ public class MainStageView extends DataVisualizationView implements Observer {
private Stage root;
public MainStageView(ClassificationModel model) {
super();
this.model = model;
model.attach(this);
}
......@@ -68,7 +70,10 @@ public class MainStageView extends DataVisualizationView implements Observer {
loader.getController();
controller = loader.getController();
controller.setMainStageView(this);
scatterChart = controller.getScatterChart();
System.out.println("DataStageView scatter chart: " +scatterChart );
controller.setAxesSelected("Aucun fichier sélectionné");
}
......@@ -83,6 +88,7 @@ public class MainStageView extends DataVisualizationView implements Observer {
XYChart.Series series1 = new XYChart.Series();
XYChart.Series series2 = new XYChart.Series();
XYChart.Series series3 = new XYChart.Series();
XYChart.Series series4 = new XYChart.Series();
......@@ -106,12 +112,19 @@ public class MainStageView extends DataVisualizationView implements Observer {
dataPoint.setNode(getForm(iris, new Circle(5)));
if(iris.getClassification().equals("Setosa")){
series1.getData().add(dataPoint);
}else if(iris.getClassification().equals("Versicolor")){
series2.getData().add(dataPoint);
}else if(iris.getClassification().equals("Virginica")){
series3.getData().add(dataPoint);
switch (iris.getClassification()) {
case "Setosa":
series1.getData().add(dataPoint);
break;
case "Versicolor":
series2.getData().add(dataPoint);
break;
case "Virginica":
series3.getData().add(dataPoint);
break;
default:
series4.getData().add(dataPoint);
break;
}
}
......@@ -119,8 +132,9 @@ public class MainStageView extends DataVisualizationView implements Observer {
series1.setName("Setosa");
series2.setName("Versicolor");
series3.setName("Virginica");
series4.setName("undefinied");
scatterChart.getData().addAll(series1, series2, series3);
scatterChart.getData().addAll(series1, series2, series3, series4);
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment