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/ChooseAttributesController.java b/src/main/java/fr/univlille/sae/classification/controller/ChooseAttributesController.java new file mode 100644 index 0000000000000000000000000000000000000000..b6f75c26986045ac156a1e5d7ba1f8f83863ba05 --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/controller/ChooseAttributesController.java @@ -0,0 +1,56 @@ +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); + + 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) { + 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..0a68ecb8fbcef6bb1c513beadd07c1a9a35b6464 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,8 @@ 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.view.ChooseAttributesView; +import fr.univlille.sae.classification.view.MainStageView; import javafx.fxml.FXML; import javafx.scene.control.Alert; import javafx.scene.control.Button; @@ -77,6 +79,8 @@ public class LoadDataController { ClassificationModel.getClassificationModel().setType(typeChoisi); try { 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); 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 f37d5519057e01c16df3f10d791c0be0ed0059cc..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,14 +90,11 @@ 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()); 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 381a19395a1d8a97109f3fc46d247ee2851b57e2..4e4af39813a887509ff6d49f90a02d88f85d92e0 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; @@ -60,31 +61,55 @@ public class Iris extends LoadableData { } /** - * 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()); } @Override public Map<String, Object> getClassifiedAttributes() { - return Map.of(); + Map<String, Object> attributes = new LinkedHashMap<>(); + + attributes.put("Variété", variety); + + return attributes; } @Override public int getClassificationType() { - return 0; + return classificationType; } /** - * Définit la classification (variété) de l'Iris. - * @param classification variété à définir. + * Définit la classification de l'objet. + * + * @param classification classification à définir. */ @Override - public void setClassification(String classification) { - this.variety = classification; + public void setClassification(String classification) throws IllegalAccessException { + this.getClass().getDeclaredFields()[classificationType].set("", classification); } /** @@ -146,6 +171,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; } @@ -155,12 +181,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 90d43b00dd0e2d417e23a711af22a552310dea44..87bafa353da85ccb488bece9785b2290454ff863 100644 --- a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java +++ b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java @@ -2,12 +2,9 @@ package fr.univlille.sae.classification.model; 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 +15,8 @@ public abstract class LoadableData { private static Map<String, Color> classification = new HashMap<>() ; + protected static int classificationType = 1; + /** * Constructeur par défaut. */ @@ -43,12 +42,25 @@ public abstract class LoadableData { return classification; } + public static void setClassificationTypeGlobal(int classificationType) throws IllegalArgumentException, IllegalAccessException { + ClassificationModel.getClassificationModel().getDatas().get(0).setClassificationType(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; 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 faec110043fb617da86efbef5e0f752c7b57bed7..ffbe89a1be65c57f55169289ffde08190364ee54 100644 --- a/src/main/java/fr/univlille/sae/classification/model/Pokemon.java +++ b/src/main/java/fr/univlille/sae/classification/model/Pokemon.java @@ -36,10 +36,11 @@ public class Pokemon extends LoadableData{ @CsvBindByName(column = "is_legendary") private boolean isLegendary; - private int classificationType = 5; + 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; @@ -98,17 +99,21 @@ public class Pokemon extends LoadableData{ * 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{ + public void setClassificationType(int classificationType) throws IllegalArgumentException, IllegalAccessException { if(classificationType < 0 || classificationType > getAttributesNames().size()) throw new IllegalArgumentException("Cette attribut n'existe pas"); - if(getClassifiedAttributes().containsKey(getAttributesNames().keySet().toArray()[classificationType])) throw new IllegalArgumentException("Cette attribut ne peut pas être utiliser pour la classification"); - this.classificationType = classificationType; + 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 HashMap<>(); + Map<String, Object> attributes = new LinkedHashMap<>(); attributes.put("Experience growth", experienceGrowth); attributes.put("Type 1", type1); 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(); + } + } + +}