Skip to content
Snippets Groups Projects
Commit 11b4c357 authored by Hugo Desmons's avatar Hugo Desmons
Browse files

Merge branch 'matiasmennecart' into 'master'

Add attributes selection for classification

See merge request sae302/2024/H4_SAE3.3!30
parents 4689be00 b3f7dc41
No related branches found
No related tags found
No related merge requests found
Showing
with 395 additions and 127 deletions
...@@ -120,7 +120,10 @@ On obtient donc un taux de reussiste plutôt élevé. A chaque fois l'algorithme ...@@ -120,7 +120,10 @@ On obtient donc un taux de reussiste plutôt élevé. A chaque fois l'algorithme
| Distance Manhattan Normalisée | 0.178 | 0.188 | 0.2 | 0.215 | 0.205 | 0.203 | 0.194 | 0.190 | 0.184 | 0.180 | 0.190 | 7 | | Distance Manhattan Normalisée | 0.178 | 0.188 | 0.2 | 0.215 | 0.205 | 0.203 | 0.194 | 0.190 | 0.184 | 0.180 | 0.190 | 7 |
--- ---
ajoyter un commentaire sur les resultats Le taux de reussiste est ici plus bas, cela s'explique notement par le nombre d'attribut different et la complexité a identifier le type d'un pokemon.
Cependant le taux de reussiste reste satisfaisant et stable.
Classification par isLegendary
## Efficacité ## Efficacité
......
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.Scene?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Text?>
<?import javafx.stage.Stage?>
<Stage fx:id="stage" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.ChooseAttributesController">
<scene>
<Scene>
<AnchorPane prefHeight="175.0" prefWidth="317.0">
<children>
<VBox alignment="CENTER" prefHeight="200.0" prefWidth="315.0" spacing="30.0" stylesheets="@../css/style.css">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Veuillez selectionner l'attribut sur lequel vous souhaitez classifier les données" textAlignment="CENTER" wrappingWidth="254.06924438476562" />
<ChoiceBox fx:id="choice" prefWidth="150.0" stylesheets="@../css/style.css" />
<Button mnemonicParsing="false" onAction="#validate" stylesheets="@../css/style.css" text="Valider" textFill="WHITE" />
</children>
</VBox>
</children></AnchorPane>
</Scene>
</scene>
</Stage>
...@@ -68,14 +68,14 @@ ...@@ -68,14 +68,14 @@
</HBox> </HBox>
<VBox prefHeight="65.0" prefWidth="801.0"> <VBox prefHeight="65.0" prefWidth="801.0">
<children> <children>
<HBox fx:id="legend" alignment="CENTER" prefHeight="58.0" prefWidth="762.0" spacing="10.0"> <VBox fx:id="legend" alignment="CENTER" prefHeight="58.0" prefWidth="762.0" spacing="10.0">
<opaqueInsets> <opaqueInsets>
<Insets /> <Insets />
</opaqueInsets> </opaqueInsets>
<padding> <padding>
<Insets left="2.0" right="2.0" /> <Insets left="2.0" right="2.0" />
</padding> </padding>
</HBox> </VBox>
</children> </children>
</VBox> </VBox>
</children> </children>
......
...@@ -45,10 +45,12 @@ public class AddDataController { ...@@ -45,10 +45,12 @@ public class AddDataController {
ClassificationModel model = ClassificationModel.getClassificationModel(); ClassificationModel model = ClassificationModel.getClassificationModel();
if (!model.getDatas().isEmpty()) { if (!model.getDatas().isEmpty()) {
Map<String, Object> attrMap = model.getDatas().get(0).getAttributesNames(); Map<String, Object> attrMap = model.getDatas().get(0).getAttributesNames();
int classificationType = model.getDatas().get(0).getClassificationType();
for (Map.Entry<String, Object> entry : attrMap.entrySet()) { for (Map.Entry<String, Object> entry : attrMap.entrySet()) {
String attrName = entry.getKey(); String attrName = entry.getKey();
Object attrValue = entry.getValue(); Object attrValue = entry.getValue();
if(!attrMap.keySet().toArray()[classificationType].equals(attrName)) {
Label label = new Label(attrName); Label label = new Label(attrName);
HBox hbox = new HBox(10, label); HBox hbox = new HBox(10, label);
hbox.setAlignment(Pos.CENTER); hbox.setAlignment(Pos.CENTER);
...@@ -96,6 +98,9 @@ public class AddDataController { ...@@ -96,6 +98,9 @@ public class AddDataController {
} }
entries.getChildren().add(hbox); entries.getChildren().add(hbox);
} }
}
} }
} }
......
package fr.univlille.sae.classification.controller;
import fr.univlille.sae.classification.model.ClassificationModel;
import fr.univlille.sae.classification.model.LoadableData;
import javafx.fxml.FXML;
import javafx.scene.control.ChoiceBox;
import javafx.stage.Stage;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ChooseAttributesController {
@FXML
Stage stage;
@FXML
ChoiceBox<String> choice;
@FXML
public void initialize() {
LoadableData rdmData = ClassificationModel.getClassificationModel().getDatas().get(0);
choice.getItems().addAll(rdmData.getClassifiedAttributes().keySet());
String value = rdmData.getAttributesNames().keySet().toArray(new String[0])[rdmData.getClassificationType()];
if(!rdmData.getClassifiedAttributes().containsKey(value)) {
value = (String) rdmData.getClassifiedAttributes().keySet().toArray()[0];
}
choice.setValue(value);
}
public void validate() {
String selected = choice.getValue();
LoadableData rdmData = ClassificationModel.getClassificationModel().getDatas().get(0);
System.out.println(LoadableData.getClassifications());
List<String> temp = new ArrayList<>(rdmData.getAttributesNames().keySet());
System.out.println(selected);
System.out.println("Index: " + temp.indexOf(selected));
try {
rdmData.setClassificationType(temp.indexOf(selected));
} catch (IllegalAccessException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
stage.close();
}
}
...@@ -4,6 +4,9 @@ import com.opencsv.exceptions.CsvException; ...@@ -4,6 +4,9 @@ import com.opencsv.exceptions.CsvException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException; import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
import fr.univlille.sae.classification.model.ClassificationModel; import fr.univlille.sae.classification.model.ClassificationModel;
import fr.univlille.sae.classification.model.DataType; import fr.univlille.sae.classification.model.DataType;
import fr.univlille.sae.classification.model.LoadableData;
import fr.univlille.sae.classification.view.ChooseAttributesView;
import fr.univlille.sae.classification.view.DataVisualizationView;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.Alert; import javafx.scene.control.Alert;
import javafx.scene.control.Button; import javafx.scene.control.Button;
...@@ -76,13 +79,20 @@ public class LoadDataController { ...@@ -76,13 +79,20 @@ public class LoadDataController {
ClassificationModel.getClassificationModel().setType(typeChoisi); ClassificationModel.getClassificationModel().setType(typeChoisi);
try { try {
DataVisualizationView.resetAxis();
LoadableData.setClassificationTypeGlobal(-1);
ClassificationModel.getClassificationModel().loadData(file); ClassificationModel.getClassificationModel().loadData(file);
ChooseAttributesView chooseAttributesView = new ChooseAttributesView(ClassificationModel.getClassificationModel(), (Stage) stage.getOwner());
chooseAttributesView.show();
}catch (RuntimeException | CsvRequiredFieldEmptyException e) { }catch (RuntimeException | CsvRequiredFieldEmptyException e) {
Alert alert = new Alert(Alert.AlertType.ERROR); Alert alert = new Alert(Alert.AlertType.ERROR);
alert.initOwner(stage); alert.initOwner(stage);
alert.setHeaderText(e.toString()); alert.setHeaderText(e.toString());
alert.setContentText("Le chargement du fichier à echoué, veuillez reessayer !"); alert.setContentText("Le chargement du fichier à echoué, veuillez reessayer !");
alert.showAndWait(); alert.showAndWait();
e.printStackTrace();
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} }
stage.close(); stage.close();
} }
......
...@@ -51,15 +51,6 @@ public class MethodKNN { ...@@ -51,15 +51,6 @@ public class MethodKNN {
} }
} }
/**
* Permet de recuperer les K-voisins les plus proches d'une données dans un jeu de données
* en fonction d'une Distance.
* @param datas Le jeu de données
* @param data La donnée avec laquelle calculer la distance
* @param k Le nombre de voisins a recupérer
* @param distance
* @return
*/
public static List<LoadableData> kVoisins(List<LoadableData> datas, LoadableData data, int k, Distance distance) { public static List<LoadableData> kVoisins(List<LoadableData> datas, LoadableData data, int k, Distance distance) {
// On recupere toutes les données // On recupere toutes les données
...@@ -77,7 +68,7 @@ public class MethodKNN { ...@@ -77,7 +68,7 @@ public class MethodKNN {
public static String estimateClass(List<LoadableData> datas, LoadableData data, int k, Distance distance) { public static String estimateClass(List<LoadableData> datas, LoadableData data, int k, Distance distance) throws IllegalAccessException {
// On recupere les K voisions de data. // On recupere les K voisions de data.
List<LoadableData> kVoisins = MethodKNN.kVoisins(datas, data, k, distance); List<LoadableData> kVoisins = MethodKNN.kVoisins(datas, data, k, distance);
...@@ -105,7 +96,7 @@ public class MethodKNN { ...@@ -105,7 +96,7 @@ public class MethodKNN {
} }
public static int bestK(List<LoadableData> datas, Distance distance) { public static int bestK(List<LoadableData> datas, Distance distance) throws IllegalAccessException {
// On borne le K pour eviter de trouver un K trop grand // On borne le K pour eviter de trouver un K trop grand
int maxK = (int) (Math.sqrt(datas.size())); int maxK = (int) (Math.sqrt(datas.size()));
System.out.println("Max k: " + maxK); System.out.println("Max k: " + maxK);
...@@ -128,7 +119,7 @@ public class MethodKNN { ...@@ -128,7 +119,7 @@ public class MethodKNN {
} }
public static double robustesse(List<LoadableData> datas, int k, Distance distance, double testPart) { public static double robustesse(List<LoadableData> datas, int k, Distance distance, double testPart) throws IllegalAccessException {
...@@ -167,7 +158,7 @@ public class MethodKNN { ...@@ -167,7 +158,7 @@ public class MethodKNN {
return taux/(1/testPart); return taux/(1/testPart);
} }
public static void main(String[] args) throws CsvRequiredFieldEmptyException { public static void main(String[] args) throws CsvRequiredFieldEmptyException, IllegalAccessException {
//Test de la robustesse et du meillleur K //Test de la robustesse et du meillleur K
......
...@@ -90,17 +90,16 @@ public class ClassificationModel extends Observable { ...@@ -90,17 +90,16 @@ public class ClassificationModel extends Observable {
.withType(type.getClazz()) .withType(type.getClazz())
.build().parse(); .build().parse();
Set<String> types = new HashSet<>();
for (LoadableData d : datas) {
types.add(d.getClassification());
}
Collections.shuffle(datas); Collections.shuffle(datas);
LoadableData.setClassificationTypes(types);
LoadableData.setClassificationTypes(getDatas());
notifyObservers(); notifyObservers();
} catch (IOException e) { } catch (IOException e) {
System.err.println("Erreur lors du chargement des données : " + e.getMessage()); System.err.println("Erreur lors du chargement des données : " + e.getMessage());
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} }
} }
...@@ -121,7 +120,11 @@ public class ClassificationModel extends Observable { ...@@ -121,7 +120,11 @@ public class ClassificationModel extends Observable {
public void classifierDonnee(LoadableData data) { public void classifierDonnee(LoadableData data) {
if(dataToClass.get(data) != null && dataToClass.get(data)) return; if(dataToClass.get(data) != null && dataToClass.get(data)) return;
this.dataToClass.remove(data); this.dataToClass.remove(data);
try {
data.setClassification(MethodKNN.estimateClass(datas, data, k, distance)); data.setClassification(MethodKNN.estimateClass(datas, data, k, distance));
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
notifyObservers(data); notifyObservers(data);
dataToClass.put(data, true); dataToClass.put(data, true);
} }
......
...@@ -34,6 +34,7 @@ public class Iris extends LoadableData { ...@@ -34,6 +34,7 @@ public class Iris extends LoadableData {
*/ */
public Iris(double sepalLength, double sepalWidth, double petalLength, double petalWidth, String variety) { public Iris(double sepalLength, double sepalWidth, double petalLength, double petalWidth, String variety) {
super(); super();
classificationType = 4;
this.sepalWidth = sepalWidth; this.sepalWidth = sepalWidth;
this.sepalLength = sepalLength; this.sepalLength = sepalLength;
this.petalWidth = petalWidth; this.petalWidth = petalWidth;
...@@ -56,25 +57,62 @@ public class Iris extends LoadableData { ...@@ -56,25 +57,62 @@ public class Iris extends LoadableData {
* Constructeur par défaut. * Constructeur par défaut.
*/ */
public Iris() { public Iris() {
// classificationType = 4;
} }
/** /**
* Renvoie la classification (variété) de l'Iris. * Renvoie la classification de l'objet.
* @return variété de l'Iris. *
* @return classification sous forme de chaîne.
*/ */
@Override @Override
public String getClassification() { public String getClassification() throws IllegalAccessException {
return variety; return (String) this.getClass().getDeclaredFields()[classificationType].get(this).toString();
}
/**
* Permet de modifier l'attribut sur lequelle ont souhaite classifier
* Ne sont valable que les attributs present dans getClassificationAttributes()
*
* Le numéro de l'attribut correspond a sa place dans la liste de tous le attributs.
* @param classificationType
*/
@Override
public void setClassificationType(int classificationType) throws IllegalArgumentException, IllegalAccessException {
if(classificationType < 0 || classificationType > getAttributesNames().size()) throw new IllegalArgumentException("Cette attribut n'existe pas");
String keyToVerify = getAttributesNames().keySet().toArray(new String[0])[classificationType];
if(!getClassifiedAttributes().containsKey(keyToVerify)) throw new IllegalArgumentException("Cette attribut ne peut pas être utiliser pour la classification");
LoadableData.classificationType = classificationType;
System.out.println("Set type to : " + classificationType);
LoadableData.setClassificationTypes(ClassificationModel.getClassificationModel().getDatas());
} }
/** /**
* Définit la classification (variété) de l'Iris. * Définit la classification (variété) de l'Iris.
* @param classification variété à définir.
*/ */
@Override @Override
public void setClassification(String classification) { public Map<String, Object> getClassifiedAttributes() {
this.variety = classification; Map<String, Object> attributes = new LinkedHashMap<>();
attributes.put("Variété", variety);
return attributes;
}
@Override
public int getClassificationType() {
return classificationType;
}
/**
* Définit la classification de l'objet.
*
* @param classification classification à définir.
*/
@Override
public void setClassification(String classification) throws IllegalAccessException {
this.getClass().getDeclaredFields()[classificationType].set(this, classification);
} }
/** /**
...@@ -136,6 +174,7 @@ public class Iris extends LoadableData { ...@@ -136,6 +174,7 @@ public class Iris extends LoadableData {
attrNames.put("Largeur des sépales", sepalWidth); attrNames.put("Largeur des sépales", sepalWidth);
attrNames.put("Longueur des pétales", petalLength); attrNames.put("Longueur des pétales", petalLength);
attrNames.put("Largeur des pétales", petalWidth); attrNames.put("Largeur des pétales", petalWidth);
attrNames.put("Variété", variety);
return attrNames; return attrNames;
} }
...@@ -145,6 +184,7 @@ public class Iris extends LoadableData { ...@@ -145,6 +184,7 @@ public class Iris extends LoadableData {
*/ */
@Override @Override
public String toString() { public String toString() {
try {
return ( return (
"Sepal length: " + sepalLength + "\n" + "Sepal length: " + sepalLength + "\n" +
"Sepal width: " + sepalWidth + "\n" + "Sepal width: " + sepalWidth + "\n" +
...@@ -152,5 +192,8 @@ public class Iris extends LoadableData { ...@@ -152,5 +192,8 @@ public class Iris extends LoadableData {
"Petal width: " + petalWidth + "\n" + "Petal width: " + petalWidth + "\n" +
"Variety: " + getClassification() "Variety: " + getClassification()
); );
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
} }
} }
package fr.univlille.sae.classification.model; package fr.univlille.sae.classification.model;
import javafx.scene.control.Label;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import java.util.Map; import java.util.*;
import java.util.HashMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* Classe abstraite représentant des données pouvant être chargées. * Classe abstraite représentant des données pouvant être chargées.
...@@ -18,6 +16,8 @@ public abstract class LoadableData { ...@@ -18,6 +16,8 @@ public abstract class LoadableData {
private static Map<String, Color> classification = new HashMap<>() ; private static Map<String, Color> classification = new HashMap<>() ;
protected static int classificationType = 1;
/** /**
* Constructeur par défaut. * Constructeur par défaut.
*/ */
...@@ -29,7 +29,7 @@ public abstract class LoadableData { ...@@ -29,7 +29,7 @@ public abstract class LoadableData {
* Renvoie la classification de l'objet. * Renvoie la classification de l'objet.
* @return classification sous forme de chaîne. * @return classification sous forme de chaîne.
*/ */
public abstract String getClassification(); public abstract String getClassification() throws IllegalAccessException;
/** /**
* Renvoie les types de classification définis. * Renvoie les types de classification définis.
...@@ -43,12 +43,25 @@ public abstract class LoadableData { ...@@ -43,12 +43,25 @@ public abstract class LoadableData {
return classification; return classification;
} }
public static void setClassificationTypeGlobal(int classificationType) throws IllegalArgumentException, IllegalAccessException {
LoadableData.classificationType = classificationType;
}
public abstract void setClassificationType(int classificationType) throws IllegalArgumentException, IllegalAccessException;
/** /**
* Définit les types de classification disponibles. * Définit les types de classification disponibles.
* @param classificationTypes ensemble de types de classification à définir.
*/ */
public static void setClassificationTypes(Set<String> classificationTypes) { public static void setClassificationTypes(List<LoadableData> datas) throws IllegalAccessException {
LoadableData.classificationTypes = classificationTypes;
Set<String> types = new HashSet<>();
for (LoadableData d : datas) {
types.add(d.getClassification());
}
classificationTypes = types;
LoadableData.classification.clear(); LoadableData.classification.clear();
int nbOfColors = classificationTypes.size() + 1; int nbOfColors = classificationTypes.size() + 1;
int nb = 0; int nb = 0;
...@@ -97,11 +110,15 @@ public abstract class LoadableData { ...@@ -97,11 +110,15 @@ public abstract class LoadableData {
*/ */
public abstract Map<String, Object> getClassifiedAttributes();
public abstract int getClassificationType() ;
/** /**
* Définit la classification de l'objet. * Définit la classification de l'objet.
* @param classification classification à définir. * @param classification classification à définir.
*/ */
public abstract void setClassification(String classification); public abstract void setClassification(String classification) throws IllegalAccessException;
public abstract Map<String, Object> getAttributesNames(); public abstract Map<String, Object> getAttributesNames();
......
package fr.univlille.sae.classification.model; package fr.univlille.sae.classification.model;
import com.opencsv.bean.CsvBindByName; import com.opencsv.bean.CsvBindByName;
import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.*;
import java.util.Map;
public class Pokemon extends LoadableData{ public class Pokemon extends LoadableData{
...@@ -38,8 +37,10 @@ public class Pokemon extends LoadableData{ ...@@ -38,8 +37,10 @@ public class Pokemon extends LoadableData{
private boolean isLegendary; private boolean isLegendary;
public Pokemon(String name, int attack, int baseEggSteps, double captureRate, int defense, int experienceGrowth, int hp, int spAttack, int spDefense, String type1, String type2, double speed, boolean isLegendary) { public Pokemon(String name, int attack, int baseEggSteps, double captureRate, int defense, int experienceGrowth, int hp, int spAttack, int spDefense, String type1, String type2, double speed, boolean isLegendary) {
super(); super();
classificationType = 9;
this.name = name; this.name = name;
this.attack = attack; this.attack = attack;
this.baseEggSteps = baseEggSteps; this.baseEggSteps = baseEggSteps;
...@@ -67,7 +68,7 @@ public class Pokemon extends LoadableData{ ...@@ -67,7 +68,7 @@ public class Pokemon extends LoadableData{
* Constructeur par défaut. * Constructeur par défaut.
*/ */
public Pokemon() { public Pokemon() {
// classificationType = 9;
} }
/** /**
...@@ -76,8 +77,8 @@ public class Pokemon extends LoadableData{ ...@@ -76,8 +77,8 @@ public class Pokemon extends LoadableData{
* @return classification sous forme de chaîne. * @return classification sous forme de chaîne.
*/ */
@Override @Override
public String getClassification() { public String getClassification() throws IllegalAccessException {
return type1; return (String) this.getClass().getDeclaredFields()[classificationType].get(this).toString();
} }
/** /**
...@@ -86,11 +87,47 @@ public class Pokemon extends LoadableData{ ...@@ -86,11 +87,47 @@ public class Pokemon extends LoadableData{
* @param classification classification à définir. * @param classification classification à définir.
*/ */
@Override @Override
public void setClassification(String classification) { public void setClassification(String classification) throws IllegalAccessException {
this.type1 = classification; this.getClass().getDeclaredFields()[classificationType].set("", classification);
} }
/**
* Permet de modifier l'attribut sur lequelle ont souhaite classifier
* Ne sont valable que les attributs present dans getClassificationAttributes()
*
* Le numéro de l'attribut correspond a sa place dans la liste de tous le attributs.
* @param classificationType
*/
public void setClassificationType(int classificationType) throws IllegalArgumentException, IllegalAccessException {
if(classificationType < 0 || classificationType > getAttributesNames().size()) throw new IllegalArgumentException("Cette attribut n'existe pas");
String keyToVerify = getAttributesNames().keySet().toArray(new String[0])[classificationType];
if(!getClassifiedAttributes().containsKey(keyToVerify)) throw new IllegalArgumentException("Cette attribut ne peut pas être utiliser pour la classification");
LoadableData.classificationType = classificationType;
System.out.println("Set type to : " + classificationType);
LoadableData.setClassificationTypes(ClassificationModel.getClassificationModel().getDatas());
}
public Map<String, Object> getClassifiedAttributes() {
Map<String, Object> attributes = new LinkedHashMap<>();
attributes.put("Experience growth", experienceGrowth);
attributes.put("Type 1", type1);
attributes.put("Type 2", type2);
attributes.put("Is legendary", isLegendary);
return attributes;
}
@Override
public int getClassificationType() {
return classificationType;
}
/** /**
* Renvoie les noms des attributs de l'objet. * Renvoie les noms des attributs de l'objet.
* *
...@@ -109,6 +146,8 @@ public class Pokemon extends LoadableData{ ...@@ -109,6 +146,8 @@ public class Pokemon extends LoadableData{
attrNames.put("HP", hp); attrNames.put("HP", hp);
attrNames.put("Special attack", spAttack); attrNames.put("Special attack", spAttack);
attrNames.put("Special defense", spDefense); attrNames.put("Special defense", spDefense);
attrNames.put("Type 1", type1);
attrNames.put("Type 2", type2);
attrNames.put("Speed", speed); attrNames.put("Speed", speed);
attrNames.put("Is legendary", isLegendary); attrNames.put("Is legendary", isLegendary);
return attrNames; return attrNames;
......
...@@ -91,10 +91,8 @@ public class ViewUtil { ...@@ -91,10 +91,8 @@ public class ViewUtil {
circle.setFill(colors.get(colorsString[i + j])); circle.setFill(colors.get(colorsString[i + j]));
tempHBox.getChildren().addAll(circle, label); tempHBox.getChildren().addAll(circle, label);
line.getChildren().add(tempHBox); line.getChildren().add(tempHBox);
} }
} }
if (colorsString.length < 7) legend.getChildren().add(line); if (colorsString.length < 7) legend.getChildren().add(line);
/** /**
...@@ -112,4 +110,5 @@ public class ViewUtil { ...@@ -112,4 +110,5 @@ public class ViewUtil {
return legend; return legend;
} }
} }
package fr.univlille.sae.classification.view;
import fr.univlille.sae.classification.controller.AddDataController;
import fr.univlille.sae.classification.controller.ChooseAttributesController;
import fr.univlille.sae.classification.model.ClassificationModel;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Alert;
import javafx.stage.Modality;
import javafx.stage.Stage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class ChooseAttributesView {
private ClassificationModel model;
private Stage owner;
/**
* Constructeur pour initialiser la vue de choix des attributs
* @param model le modèle de classification
* @param owner la fenêtre parente de cette vue.
*/
public ChooseAttributesView(ClassificationModel model, Stage owner) {
this.model = model;
this.owner = owner;
}
public void show() {
FXMLLoader loader = new FXMLLoader();
URL fxmlFileUrl = getClass().getClassLoader().getResource("stages"+ File.separator+"choose-attributes.fxml");
if (fxmlFileUrl == null) {
System.out.println("Impossible de charger le fichier fxml");
System.exit(-1);
}
loader.setLocation(fxmlFileUrl);
try {
Stage root = loader.load();
// ChooseAttributesController controller = loader.getController();
if (model.getDatas().isEmpty()) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("Erreur");
alert.setHeaderText(null);
alert.setContentText("Veuillez d'abord charger les données avant de pouvoir choisir l'attribut a classifier");
alert.showAndWait();
return;
}
root.setResizable(false);
root.initOwner(owner);
root.initModality(Modality.APPLICATION_MODAL);
root.setTitle("Choix d'attribut");
root.showAndWait();
} catch (IOException e) {
System.out.println("Erreur lors du chargement de la scène : " + e.getMessage());
e.printStackTrace();
}
}
}
...@@ -3,8 +3,6 @@ package fr.univlille.sae.classification.view; ...@@ -3,8 +3,6 @@ package fr.univlille.sae.classification.view;
import fr.univlille.sae.classification.controller.DataStageController; import fr.univlille.sae.classification.controller.DataStageController;
import fr.univlille.sae.classification.controller.MainStageController; import fr.univlille.sae.classification.controller.MainStageController;
import fr.univlille.sae.classification.model.ClassificationModel; 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.model.LoadableData;
import fr.univlille.sae.classification.utils.Observable; import fr.univlille.sae.classification.utils.Observable;
import fr.univlille.sae.classification.utils.Observer; import fr.univlille.sae.classification.utils.Observer;
......
...@@ -14,10 +14,7 @@ import javafx.scene.layout.HBox; ...@@ -14,10 +14,7 @@ import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.scene.shape.*; import javafx.scene.shape.*;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* Classe abstraite représentant une vue de visualisation des données. * Classe abstraite représentant une vue de visualisation des données.
...@@ -25,6 +22,9 @@ import java.util.Map; ...@@ -25,6 +22,9 @@ import java.util.Map;
*/ */
public abstract class DataVisualizationView { public abstract class DataVisualizationView {
private static Set<DataVisualizationView> views;
public DataVisualizationController controller; public DataVisualizationController controller;
private ScatterChart.Series series1; private ScatterChart.Series series1;
private ScatterChart.Series series2; private ScatterChart.Series series2;
...@@ -45,6 +45,12 @@ public abstract class DataVisualizationView { ...@@ -45,6 +45,12 @@ public abstract class DataVisualizationView {
this.serieList = new HashMap<String, ScatterChart.Series<Double, Double>>(); this.serieList = new HashMap<String, ScatterChart.Series<Double, Double>>();
this.model = model; this.model = model;
this.series4 = new XYChart.Series(); this.series4 = new XYChart.Series();
views.add(this);
}
public static void resetAxis() {
// call method resetAxis for each instance of DataVisualizationView (views)
} }
/** /**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment