diff --git a/DevEfficace/rapport.md b/DevEfficace/rapport.md index 57e2c8bb503e8153ea05fd21d650bed7563c12c6..88110653b61e7e6f0c763359c635fd4c21e7f0a6 100644 --- a/DevEfficace/rapport.md +++ b/DevEfficace/rapport.md @@ -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 | --- -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é diff --git a/res/stages/choose-attributes.fxml b/res/stages/choose-attributes.fxml new file mode 100644 index 0000000000000000000000000000000000000000..e16bafd0057ed87a9f7b09cfc503c9e7f610a4e7 --- /dev/null +++ b/res/stages/choose-attributes.fxml @@ -0,0 +1,26 @@ +<?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> diff --git a/res/stages/data-view-stage.fxml b/res/stages/data-view-stage.fxml index 9f17a8fd5c75ee133bb950bbb475f88f00c6548f..d2658c4ebee924b06feb5eac100b804aa366305b 100644 --- a/res/stages/data-view-stage.fxml +++ b/res/stages/data-view-stage.fxml @@ -68,14 +68,14 @@ </HBox> <VBox prefHeight="65.0" prefWidth="801.0"> <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> <Insets /> </opaqueInsets> <padding> <Insets left="2.0" right="2.0" /> </padding> - </HBox> + </VBox> </children> </VBox> </children> diff --git a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java index 9a220bdf4e1c24f8db37dad2a63785c1c25873de..4d38f1f0d7b078b7a5511cae8186bc47f2b122cf 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java @@ -45,56 +45,61 @@ public class AddDataController { ClassificationModel model = ClassificationModel.getClassificationModel(); if (!model.getDatas().isEmpty()) { Map<String, Object> attrMap = model.getDatas().get(0).getAttributesNames(); + int classificationType = model.getDatas().get(0).getClassificationType(); for (Map.Entry<String, Object> entry : attrMap.entrySet()) { String attrName = entry.getKey(); Object attrValue = entry.getValue(); - Label label = new Label(attrName); - HBox hbox = new HBox(10, label); - hbox.setAlignment(Pos.CENTER); - hbox.setSpacing(10); - - if (attrValue instanceof Double) { - Spinner<Double> doubleSpinner = new Spinner<>(); - doubleSpinner.setEditable(true); - SpinnerValueFactory<Double> valueFactory = - new SpinnerValueFactory.DoubleSpinnerValueFactory( - 0.0, - 9999, - 0.0, - 0.5 - ); - doubleSpinner.setValueFactory(valueFactory); - hbox.getChildren().add(doubleSpinner); - components.add(doubleSpinner); - } - else if (attrValue instanceof Integer) { - Spinner<Integer> integerSpinner = new Spinner<>(); - integerSpinner.setEditable(true); - SpinnerValueFactory<Integer> valueFactory = - new SpinnerValueFactory.IntegerSpinnerValueFactory( - 0, - Integer.MAX_VALUE, - 0, - 1 - ); - integerSpinner.setValueFactory(valueFactory); - hbox.getChildren().add(integerSpinner); - components.add(integerSpinner); - } - else if (attrValue instanceof String) { - TextField textField = new TextField(); - hbox.getChildren().add(textField); - components.add(textField); - } - else if (attrValue instanceof Boolean) { - ChoiceBox<String> choiceBox = new ChoiceBox<>(); - choiceBox.getItems().addAll("VRAI", "FAUX"); - choiceBox.setValue("VRAI"); - hbox.getChildren().add(choiceBox); - components.add(choiceBox); + if(!attrMap.keySet().toArray()[classificationType].equals(attrName)) { + Label label = new Label(attrName); + HBox hbox = new HBox(10, label); + hbox.setAlignment(Pos.CENTER); + hbox.setSpacing(10); + + if (attrValue instanceof Double) { + Spinner<Double> doubleSpinner = new Spinner<>(); + doubleSpinner.setEditable(true); + SpinnerValueFactory<Double> valueFactory = + new SpinnerValueFactory.DoubleSpinnerValueFactory( + 0.0, + 9999, + 0.0, + 0.5 + ); + doubleSpinner.setValueFactory(valueFactory); + hbox.getChildren().add(doubleSpinner); + components.add(doubleSpinner); + } + else if (attrValue instanceof Integer) { + Spinner<Integer> integerSpinner = new Spinner<>(); + integerSpinner.setEditable(true); + SpinnerValueFactory<Integer> valueFactory = + new SpinnerValueFactory.IntegerSpinnerValueFactory( + 0, + Integer.MAX_VALUE, + 0, + 1 + ); + integerSpinner.setValueFactory(valueFactory); + hbox.getChildren().add(integerSpinner); + components.add(integerSpinner); + } + else if (attrValue instanceof String) { + TextField textField = new TextField(); + hbox.getChildren().add(textField); + components.add(textField); + } + else if (attrValue instanceof Boolean) { + ChoiceBox<String> choiceBox = new ChoiceBox<>(); + choiceBox.getItems().addAll("VRAI", "FAUX"); + choiceBox.setValue("VRAI"); + hbox.getChildren().add(choiceBox); + components.add(choiceBox); + } + entries.getChildren().add(hbox); } - entries.getChildren().add(hbox); + + } } } diff --git a/src/main/java/fr/univlille/sae/classification/controller/ChooseAttributesController.java b/src/main/java/fr/univlille/sae/classification/controller/ChooseAttributesController.java new file mode 100644 index 0000000000000000000000000000000000000000..e2105ebd204cf13402dfde477a0559eaf75338e6 --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/controller/ChooseAttributesController.java @@ -0,0 +1,58 @@ +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(); + } + +} diff --git a/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java b/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java index 4baf15fcc240ad98712f30d4d42a49855513be51..ae5fd924352c1d8b177d437fc8d33943ca710e0c 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java @@ -4,6 +4,9 @@ import com.opencsv.exceptions.CsvException; import com.opencsv.exceptions.CsvRequiredFieldEmptyException; import fr.univlille.sae.classification.model.ClassificationModel; 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.scene.control.Alert; import javafx.scene.control.Button; @@ -76,13 +79,20 @@ public class LoadDataController { ClassificationModel.getClassificationModel().setType(typeChoisi); try { + DataVisualizationView.resetAxis(); + LoadableData.setClassificationTypeGlobal(-1); ClassificationModel.getClassificationModel().loadData(file); + ChooseAttributesView chooseAttributesView = new ChooseAttributesView(ClassificationModel.getClassificationModel(), (Stage) stage.getOwner()); + chooseAttributesView.show(); }catch (RuntimeException | CsvRequiredFieldEmptyException e) { Alert alert = new Alert(Alert.AlertType.ERROR); alert.initOwner(stage); alert.setHeaderText(e.toString()); alert.setContentText("Le chargement du fichier à echoué, veuillez reessayer !"); alert.showAndWait(); + e.printStackTrace(); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); } stage.close(); } diff --git a/src/main/java/fr/univlille/sae/classification/knn/MethodKNN.java b/src/main/java/fr/univlille/sae/classification/knn/MethodKNN.java index 686303ccf2d4e88c048c40d37c40ebe7719370b4..c27e2df513ced5ab0a53559accbdfc9317c5b0e5 100644 --- a/src/main/java/fr/univlille/sae/classification/knn/MethodKNN.java +++ b/src/main/java/fr/univlille/sae/classification/knn/MethodKNN.java @@ -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) { // On recupere toutes les données @@ -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. List<LoadableData> kVoisins = MethodKNN.kVoisins(datas, data, k, distance); @@ -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 int maxK = (int) (Math.sqrt(datas.size())); System.out.println("Max k: " + maxK); @@ -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 { 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 diff --git a/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java index 403e01cbbfdc0b1b94d65de4ec9196c80d43878a..b2ecdbe8af0eb18f87da05049189dc42205bd4c0 100644 --- a/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java +++ b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java @@ -90,17 +90,16 @@ public class ClassificationModel extends Observable { .withType(type.getClazz()) .build().parse(); - Set<String> types = new HashSet<>(); - for (LoadableData d : datas) { - types.add(d.getClassification()); - } Collections.shuffle(datas); - LoadableData.setClassificationTypes(types); + + LoadableData.setClassificationTypes(getDatas()); notifyObservers(); } catch (IOException e) { 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 { public void classifierDonnee(LoadableData data) { if(dataToClass.get(data) != null && dataToClass.get(data)) return; this.dataToClass.remove(data); - data.setClassification(MethodKNN.estimateClass(datas, data, k, distance)); + try { + data.setClassification(MethodKNN.estimateClass(datas, data, k, distance)); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } notifyObservers(data); dataToClass.put(data, true); } diff --git a/src/main/java/fr/univlille/sae/classification/model/Iris.java b/src/main/java/fr/univlille/sae/classification/model/Iris.java index 49ff5b8834288e96cd703e23baa887be1fcc92d7..c11c919a93a5947c10afcdf1da6e132ef50603f6 100644 --- a/src/main/java/fr/univlille/sae/classification/model/Iris.java +++ b/src/main/java/fr/univlille/sae/classification/model/Iris.java @@ -34,6 +34,7 @@ public class Iris extends LoadableData { */ public Iris(double sepalLength, double sepalWidth, double petalLength, double petalWidth, String variety) { super(); + classificationType = 4; this.sepalWidth = sepalWidth; this.sepalLength = sepalLength; this.petalWidth = petalWidth; @@ -56,25 +57,62 @@ public class Iris extends LoadableData { * Constructeur par défaut. */ public Iris() { - // + classificationType = 4; } /** - * Renvoie la classification (variété) de l'Iris. - * @return variété de l'Iris. + * Renvoie la classification de l'objet. + * + * @return classification sous forme de chaîne. */ @Override - public String getClassification() { - return variety; + public String getClassification() throws IllegalAccessException { + 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. - * @param classification variété à définir. */ @Override - public void setClassification(String classification) { - this.variety = classification; + public Map<String, Object> getClassifiedAttributes() { + 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 { attrNames.put("Largeur des sépales", sepalWidth); attrNames.put("Longueur des pétales", petalLength); attrNames.put("Largeur des pétales", petalWidth); + attrNames.put("Variété", variety); return attrNames; } @@ -145,12 +184,16 @@ public class Iris extends LoadableData { */ @Override public String toString() { - return ( - "Sepal length: " + sepalLength + "\n" + - "Sepal width: " + sepalWidth + "\n" + - "Petal length: " + petalLength + "\n" + - "Petal width: " + petalWidth + "\n" + - "Variety: " + getClassification() - ); + try { + return ( + "Sepal length: " + sepalLength + "\n" + + "Sepal width: " + sepalWidth + "\n" + + "Petal length: " + petalLength + "\n" + + "Petal width: " + petalWidth + "\n" + + "Variety: " + getClassification() + ); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } } } diff --git a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java index d1b6696c9a3b53870870913fb953e819b3f1a413..81eeaeb369c0c700abd0af9c69d086e1c8847f1e 100644 --- a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java +++ b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java @@ -1,13 +1,11 @@ package fr.univlille.sae.classification.model; +import javafx.scene.control.Label; import javafx.scene.paint.Color; -import java.util.Map; -import java.util.HashMap; +import java.util.*; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; /** * Classe abstraite représentant des données pouvant être chargées. @@ -18,6 +16,8 @@ public abstract class LoadableData { private static Map<String, Color> classification = new HashMap<>() ; + protected static int classificationType = 1; + /** * Constructeur par défaut. */ @@ -29,7 +29,7 @@ public abstract class LoadableData { * Renvoie la classification de l'objet. * @return classification sous forme de chaîne. */ - public abstract String getClassification(); + public abstract String getClassification() throws IllegalAccessException; /** * Renvoie les types de classification définis. @@ -43,12 +43,25 @@ public abstract class LoadableData { 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. - * @param classificationTypes ensemble de types de classification à définir. - */ - public static void setClassificationTypes(Set<String> classificationTypes) { - LoadableData.classificationTypes = classificationTypes; + */ + public static void setClassificationTypes(List<LoadableData> datas) throws IllegalAccessException { + + Set<String> types = new HashSet<>(); + for (LoadableData d : datas) { + types.add(d.getClassification()); + } + + + classificationTypes = types; + LoadableData.classification.clear(); int nbOfColors = classificationTypes.size() + 1; int nb = 0; @@ -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. * @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(); diff --git a/src/main/java/fr/univlille/sae/classification/model/Pokemon.java b/src/main/java/fr/univlille/sae/classification/model/Pokemon.java index 7ac5fad96ac847d5199b969014b9c3f852fa4e79..92383a09e1ab7828b13d774bd2927d1770bcde48 100644 --- a/src/main/java/fr/univlille/sae/classification/model/Pokemon.java +++ b/src/main/java/fr/univlille/sae/classification/model/Pokemon.java @@ -1,9 +1,8 @@ package fr.univlille.sae.classification.model; import com.opencsv.bean.CsvBindByName; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; + +import java.util.*; public class Pokemon extends LoadableData{ @@ -38,8 +37,10 @@ public class Pokemon extends LoadableData{ 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) { super(); + classificationType = 9; this.name = name; this.attack = attack; this.baseEggSteps = baseEggSteps; @@ -67,7 +68,7 @@ public class Pokemon extends LoadableData{ * Constructeur par défaut. */ public Pokemon() { - // + classificationType = 9; } /** @@ -76,8 +77,8 @@ public class Pokemon extends LoadableData{ * @return classification sous forme de chaîne. */ @Override - public String getClassification() { - return type1; + public String getClassification() throws IllegalAccessException { + return (String) this.getClass().getDeclaredFields()[classificationType].get(this).toString(); } /** @@ -86,11 +87,47 @@ public class Pokemon extends LoadableData{ * @param classification classification à définir. */ @Override - public void setClassification(String classification) { - this.type1 = classification; + public void setClassification(String classification) throws IllegalAccessException { + 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. * @@ -109,6 +146,8 @@ public class Pokemon extends LoadableData{ attrNames.put("HP", hp); attrNames.put("Special attack", spAttack); attrNames.put("Special defense", spDefense); + attrNames.put("Type 1", type1); + attrNames.put("Type 2", type2); attrNames.put("Speed", speed); attrNames.put("Is legendary", isLegendary); return attrNames; diff --git a/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java b/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java index 23393fafb2eb0ea1d79280bc8502acaef14caaac..01357ad774a623f225dd3570bf98dea04eb5c5bd 100644 --- a/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java +++ b/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java @@ -76,9 +76,9 @@ public class ViewUtil { line.getChildren().add(tempHBox); String[] colorsString = colors.keySet().toArray(new String[0]); - for(int i = 0 ; i < colorsString.length ; i+= 7) { - for(int j = 0 ; i+j < colorsString.length && j < i+7 ; j++) { - if(j%7 == 0 && i != 0 ) { + for (int i = 0; i < colorsString.length; i += 7) { + for (int j = 0; i + j < colorsString.length && j < i + 7; j++) { + if (j % 7 == 0 && i != 0) { legend.getChildren().add(line); line = new HBox(); line.setSpacing(10); @@ -86,30 +86,29 @@ public class ViewUtil { } tempHBox = new HBox(); - label = new Label(colorsString[i+j]); + label = new Label(colorsString[i + j]); Circle circle = new Circle(5); - circle.setFill(colors.get(colorsString[i+j])); + circle.setFill(colors.get(colorsString[i + j])); tempHBox.getChildren().addAll(circle, label); line.getChildren().add(tempHBox); - } } + if (colorsString.length < 7) legend.getChildren().add(line); - if(colorsString.length < 7) legend.getChildren().add(line); + /** + for(String s : colors.keySet()) { + Circle c = new Circle(5); + c.setFill(colors.get(s)); + label = new Label(s); + tempHBox = new HBox(); + tempHBox.getChildren().addAll(c, label); -/** - for(String s : colors.keySet()) { - Circle c = new Circle(5); - c.setFill(colors.get(s)); - label = new Label(s); - tempHBox = new HBox(); - tempHBox.getChildren().addAll(c, label); - - hbox.getChildren().add(tempHBox); - } - */ + hbox.getChildren().add(tempHBox); + } + */ + + return legend; + } - return legend; - } -} + } diff --git a/src/main/java/fr/univlille/sae/classification/view/ChooseAttributesView.java b/src/main/java/fr/univlille/sae/classification/view/ChooseAttributesView.java new file mode 100644 index 0000000000000000000000000000000000000000..a45432293db34ecb8618d0926e7352f2593de21c --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/view/ChooseAttributesView.java @@ -0,0 +1,70 @@ +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(); + } + } + +} diff --git a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java index 68d70c468c480b1ac178c38e901cfddf6f8ee524..8692885007e9d7ff4671a0bcc1a46a1497339ed2 100644 --- a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java @@ -3,8 +3,6 @@ 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; diff --git a/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java b/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java index 0ee1a0140fd6e25ea2dba391e677ffcafbe6679a..4731963414da81af4948af4fb470355cd4afc5ae 100644 --- a/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java +++ b/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java @@ -14,10 +14,7 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.shape.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Classe abstraite représentant une vue de visualisation des données. @@ -25,6 +22,9 @@ import java.util.Map; */ public abstract class DataVisualizationView { + private static Set<DataVisualizationView> views; + + public DataVisualizationController controller; private ScatterChart.Series series1; private ScatterChart.Series series2; @@ -45,6 +45,12 @@ public abstract class DataVisualizationView { this.serieList = new HashMap<String, ScatterChart.Series<Double, Double>>(); this.model = model; this.series4 = new XYChart.Series(); + views.add(this); + } + + + public static void resetAxis() { + // call method resetAxis for each instance of DataVisualizationView (views) } /**