// extraire les données de data dans public void CreateDataset(string path) { List <string> tempData; List <string> dataArray; GameObject tempPrefab; Dataset tempSet; int temp; int tempElectrodeNb; // on sépare les données par ligne dans une liste dataArray = data.Split('\n').ToList(); // on enlève les espaces en début et fin de chaque ligne (pour ne pas avoir de ligne vide) foreach (string s in dataArray) { s.Trim(); } // on parse la première ligne tempData = dataArray[0].Split(separator).ToList(); // on récupère le nb d'électrodes int.TryParse(tempData[0], out tempElectrodeNb); // On crée un dataset tempSet = new Dataset(path.Split('\\').Last(), tempElectrodeNb); // on sauvegarde l'unité de temps tempSet.timeUnit = tempData[1]; // on récupère les timeStamps for (int i = 2; i < tempData.Count(); ++i) { // si la string peut être convertie en int, on ajoute cet int à la liste dans le dataset if (int.TryParse(tempData[i], out temp)) { tempSet.timestamps.Add(temp); } } // on parse les électrodes for (int i = 1; i < dataArray.Count(); ++i) { if (dataArray[i] != "") { // on récupère les infos de la ligne tempData = dataArray[i].Split(separator).ToList(); // on crée une nouvelle struct d'electrode et on lui met les infos de base ElectrodeLocal EL = new ElectrodeLocal(int.Parse(tempData[0], numberFormat), tempData[1], tempData[2], float.Parse(tempData[3], numberFormat), float.Parse(tempData[4], numberFormat), float.Parse(tempData[5], numberFormat), tempData.Count() - 6); // on récupère les valeurs de relevés et on les mets dans la struct for (int j = 6; j < tempData.Count(); ++j) { float.TryParse(tempData[j], NumberStyles.Float, numberFormat, out EL.values[j - 6]); } // on ajoute la structure ainsi créée à la liste des électrodes du dataset tempSet.data.Add(EL); } } // ici on peut faire différent check => UNIQUEMENT TEST SUR DATASET ACTUEL // si le nb d'électrodes dans la liste est différent de nbelectrodes, il y a un soucis on interrompt l'ajout if (tempSet.data.Count != tempElectrodeNb) { Debug.Log("Error : Specified number of electrodes doesn't match with the actual number of electrode lines in the file, please check for discrepancies. Dataset will not be added"); return; ////////////////// AJOUTER /////////////// // affichage d'une pop-up avec les différents messages d'erreur pour version buildée ////////////////// AJOUTER /////////////// } else { foreach (var item in tempSet.data) { // si le nombre de relevé d'une électrode est différent du nombre de timestamps if (item.values.Length != tempSet.timestamps.Count()) { Debug.Log("Error : At least one electrode has a number of values different from the provided number of timestamps, please check for discrepancies. Dataset will not be added."); return; } } } /*! Si tout va bien : !*/ // on incrémente le compteur de datasets ++datasetsCount; // une fois le dataset complet, on ajoute le dataset à la liste globale sets.Add(tempSet); // on crée le prefab d'UI tempPrefab = (GameObject)Instantiate(prefabUI, new Vector3(0, 0, 0), Quaternion.identity, GameObject.FindWithTag("DatasetsPanel").transform); // on met les bons textes dans le prefab tempPrefab.GetComponentsInChildren <Text>().ElementAt(0).text = "Set" + datasetsCount.ToString(); tempPrefab.GetComponentsInChildren <Text>().ElementAt(1).text = tempSet.electrodesNb.ToString() + " electrodes"; tempPrefab.GetComponentsInChildren <Text>().ElementAt(2).text = tempSet.name; // on change l'ordre du prefab dans la hiérarchie tempPrefab.transform.SetSiblingIndex(tempPrefab.transform.GetSiblingIndex() - 1); // on assigne le bon callback au bouton remove tempPrefab.GetComponentInChildren <Button>().onClick.AddListener(() => RemoveDataset(tempPrefab)); }
public void CalculateFinalSet() { // si le check de la formule ne passe pas if (!CheckFormula()) { // afficher message pour dire de régler les erreurs d'abord // sortir de la fonction : on ne fait pas le calcul return; } // pour stocker min et max float minTest = 0; float maxTest = 0; // On active le panneau d'info de loading loadingPanel.SetActive(true); // On vide le dataset calculé avant s'il y en a un //proSet.Clear(); // on supprime les électrodes déjà instanciées foreach (Electrode elec in GetComponentsInChildren <Electrode>()) { Destroy(elec.gameObject); } // on remet à 0 le controller controller.value = 0; // on crée le compteur et le tableau pour stocker les arguments int argCounter = 0; Argument[] arg = new Argument[usedSets.Count]; // on instancie les arguments et on set leur nom foreach (int k in usedSets) { arg[argCounter] = new Argument("Set" + k, 0); ++argCounter; //Debug.Log("Set"+k); } // on reset le compteur utilisé argCounter = 0; // On crée l'expression Expression e = new Expression(formulaField.text, arg); // on crée le dataset final //Debug.Log(sets[0].name); proSet = new Dataset("proSet", sets[usedSets[0] - 1].electrodesNb); // on choisit l'unité de temps du premier set proSet.timeUnit = sets[usedSets[0] - 1].timeUnit; // on instancie les timestamps réels des datasets choisis //proSet.timestamps = sets[usedSets[0]-1].timestamps; foreach (int item in sets[usedSets[0] - 1].timestamps) { proSet.timestamps.Add(item); } // on met à jour l'UI en adaptant le slider controller.maxValue = proSet.timestamps.Count - 1; // pour le nombre d'électrodes des sets for (int i = 0; i < proSet.electrodesNb; ++i) { // On crée une nouvelle électrode ElectrodeLocal ELL = new ElectrodeLocal(sets[usedSets[0] - 1].data[i].ID, sets[usedSets[0] - 1].data[i].name, sets[usedSets[0] - 1].data[i].patient, sets[usedSets[0] - 1].data[i].coords.x, sets[usedSets[0] - 1].data[i].coords.y, sets[usedSets[0] - 1].data[i].coords.z, sets[usedSets[0] - 1].data[i].values.Length); // on boucle sur le nombre de timestamps for (int j = 0; j < proSet.timestamps.Count; ++j) { // on set toutes les variables du calcul foreach (int k in usedSets) { arg[argCounter].setArgumentValue(sets[k - 1].data[i].values[j]); ++argCounter; } // on calcule la valeur et on la met dans l'électrode en train d'être créée //Expression e = new Expression(formulaField.text,arg); //Debug.Log(e.calculate()); ELL.values[j] = (float)e.calculate(); if (ELL.values[j] < minTest) { minTest = ELL.values[j]; } else if (ELL.values[j] > maxTest) { maxTest = ELL.values[j]; } // on reset argCounter argCounter = 0; } // On insère l'électrode dans le dataset final proSet.data.Add(ELL); // On met à jour les données de min et max minValue = minTest; maxValue = maxTest; // On met à jour leur affichage minField.text = minValue.ToString(); maxField.text = maxValue.ToString(); } // // Si le champ max n'a pas été rempli // // // On cherche le max de la série de valeurs et il devient le max // // // Si le champ min n'a pas été rempli // // // On cherche le min de la série de valeurs et il devient le min // // On crée les électrodes dans la visualisation InstantiateElectrodes(); // On a fini, on désactive le panneau d'info de loading loadingPanel.SetActive(false); // On affiche les bonnes couleurs pour les électrodes UpdateElectrodesColor(); // On update la taille des électrodes UpdateElecrodesScale(electrodeScale.text); }
int AddDataset(List <string> data, int index, bool pro) { List <string> tempData; Dataset tempSet; int temp; GameObject tempPrefab; // on parse la première ligne tempData = data[index].Split(';').ToList(); index++; // On crée un dataset tempSet = new Dataset(tempData[0], int.Parse(tempData[2], c)); // Get the time unit tempSet.timeUnit = tempData[1]; // on récupère les timeStamps for (int i = 3; i < tempData.Count(); ++i) { // si la string peut être convertie en int, on ajoute cet int à la liste dans le dataset if (int.TryParse(tempData[i], NumberStyles.Any, c, out temp)) { tempSet.timestamps.Add(temp); } } // on parse les électrodes for (int i = 0; i < tempSet.electrodesNb; ++i) { // on récupère les infos de la ligne tempData = data[index].Split(';').ToList(); //Debug.Log(tempData.Count + " " + data[index]); // on crée une nouvelle struct d'electrode et on lui met les infos de base ElectrodeLocal EL = new ElectrodeLocal(int.Parse(tempData[0], c), tempData[1], tempData[2], float.Parse(tempData[3], c), float.Parse(tempData[4], c), float.Parse(tempData[5], c), tempData.Count() - 7); // on récupère les valeurs de relevés et on les mets dans la struct for (int j = 6; j < tempData.Count() - 1; ++j) { float.TryParse(tempData[j], NumberStyles.Any, c, out EL.values[j - 6]); } // on ajoute la structure ainsi créée à la liste des électrodes du dataset tempSet.data.Add(EL); index++; } // si on assigne le set calculé if (pro) { electrodesData.proSet = tempSet; electrodesData.InstantiateElectrodes(); } // sinon, on fait la création normale d'un dataset else { // on incrémente le compteur de datasets electrodesData.datasetsCount++; // une fois le dataset complet, on ajoute le dataset à la liste globale electrodesData.sets.Add(tempSet); // on crée le prefab d'UI (si il y a un endroit où le mettre) if (datasetsPanel != null) { tempPrefab = (GameObject)Instantiate(electrodesData.prefabUI, new Vector3(0, 0, 0), Quaternion.identity, datasetsPanel.transform); // on met les bons textes dans le prefab tempPrefab.GetComponentsInChildren <Text>().ElementAt(0).text = "Set" + electrodesData.datasetsCount.ToString(); tempPrefab.GetComponentsInChildren <Text>().ElementAt(1).text = tempSet.electrodesNb.ToString() + " electrodes"; tempPrefab.GetComponentsInChildren <Text>().ElementAt(2).text = tempSet.name; // on change l'ordre du prefab dans la hiérarchie tempPrefab.transform.SetSiblingIndex(tempPrefab.transform.GetSiblingIndex() - 1); // on assigne le bon callback au bouton remove tempPrefab.GetComponentInChildren <Button>().onClick.AddListener(() => electrodesData.RemoveDataset(tempPrefab)); } } return(index); }