/// <summary> /// Import a new strategy from an external file (given as parameter) /// </summary> /// <param name="inputFileName">filename of internal file</param> /// <param name="patternFileName">pattern file to use for the importation</param> /// <returns></returns> public int Import(String inputFileName, String patternFileName) { int Ret = -1; int patternLineIndex = 0; int importLineIndex = 0; int minLineIndex = 0; int nbLineToRemove = 0; int currentLineIndex = 0; int counter = 0; TextFile patternFile = new TextFile(); // Fichier pattern pour l'import des données TextFile fileToImport = new TextFile(); // Fichier à importer StructuredFile importFile = new StructuredFile(); // Fichier utiliser pour lire les données List <String> patternLoop = new List <string>(); // Pour stocker les lignes du pattern à repeter dans la rubrique LOOP String lineRead = ""; // Variable pour lire les données du fichier StructuredFileKey currentKey = null; try { // Verification des paramètres if ((inputFileName != null) && (patternFileName != null)) { // Lecture du fichier modele patternFile.Load(patternFileName); // Lecture du fichier à importer fileToImport.Load(inputFileName); // Si les fichiers sont valides, on les prépare pour les importer if ((patternFile.Count() > 0) && (fileToImport.Count() > 0)) { #region PreparationDesFichiers // Suppression des tabulations patternFile.ReplaceInFile("\t", ""); fileToImport.ReplaceInFile("\t", ""); // Suppression des lignes inutiles patternFile.RemoveEmptyLine(); fileToImport.RemoveEmptyLine(); // Mise en correspondance des fichiers // Recherche de l'index du début de boucle importLineIndex = fileToImport.GetFirstIndexLine(PrivateConst.subStrategyBeginTag, 0); patternLineIndex = patternFile.GetFirstIndexLine(PrivateConst.subStrategyBeginTag, 0); // Verification de la presence de la boucle dans les 2 fichiers if ((importLineIndex >= 0) && (patternLineIndex >= 0)) { // Lecture du minimum de ligne minLineIndex = Math.Min(importLineIndex, patternLineIndex); // Verification si un ecart existe dans le positionnement du tag de debut de boucle if (importLineIndex != patternLineIndex) { // Suppression des lignes en trop dans le fichier d'import nbLineToRemove = importLineIndex - minLineIndex; for (int i = 0; i < nbLineToRemove; i++) { fileToImport.RemoveLine(minLineIndex); } // Suppression des lignes en trop dans le fichier de modèle nbLineToRemove = patternLineIndex - minLineIndex; for (int i = 0; i < nbLineToRemove; i++) { patternFile.RemoveLine(minLineIndex); } } // Creation des boucles // 1 - Lecture des lignes du modèle do { // Lecture de la ligne lineRead = patternFile.GetLine(minLineIndex + 1); // Verification du contenu if ((lineRead != null) && (lineRead.Contains(PrivateConst.subStrategyBeginTag) == false) && (lineRead.Contains(PrivateConst.subStrategyEndTag) == false)) { patternLoop.Add(lineRead); // Ajout de la ligne courante patternFile.RemoveLine(minLineIndex + 1); } }while ((lineRead != null) && (lineRead.Contains(PrivateConst.subStrategyEndTag) == false)); if (patternLoop.Count() > 0) { // 2 - Duplication des données du modele en fonction des données du fichier à importer currentLineIndex = minLineIndex + 1; // On se place au début de la boucle counter = 0; // Initialisation du compteur pour dupliquer le pattern do { // Lecture de la ligne lineRead = fileToImport.GetLine(currentLineIndex); if ((lineRead != null) && (lineRead.Contains(PrivateConst.subStrategyBeginTag) == false) && (lineRead.Contains(PrivateConst.subStrategyEndTag) == false)) { // Verification du compteur if (counter >= patternLoop.Count()) { counter = 0; } // Ajout de la ligne de pattern en conséquence patternFile.AddLine(patternLoop[counter], currentLineIndex); counter = counter + 1; } currentLineIndex = currentLineIndex + 1; }while ((lineRead != null) && (lineRead.Contains(PrivateConst.subStrategyEndTag) == false)); } } // Ajout des lignes dans le fichier d'import si les tailles ne correspondent pas while (patternFile.Count() > fileToImport.Count()) { fileToImport.AddLine("EMPTY LINE"); } // Ajout des lignes dans le fichier pattern si les tailles ne correspondent pas while (fileToImport.Count() > patternFile.Count()) { patternFile.AddLine("EMPTY LINE"); } #endregion #region LectureDesDonnees // Ajout du fichier pattern importFile.SetPatternFile(patternFile); // Lecture du fichier importFile.Import(fileToImport); #endregion #region TraitementDesDonnees if (importFile.Count() > 0) { // Lecture des groupes un par un foreach (StructuredFileGroup currentGroup in importFile.GetAllGroup()) { // Lecture de la clé contenant le nom de la Stategy currentKey = currentGroup.GetFirstKey(PrivateConst.TAG_SubStrategyName); // Si la clé courante fait partie d'une stratégie if (currentKey != null) { // Si le group actuel appartient à une stratégie, lecture du nom de la stratégie String subStrategyName = currentKey.valueString; RobotAction actionToImport = new RobotAction(); // Si il s'agit d'une action à ajouter à la stratégie if (actionToImport.Import(currentGroup) == true) { bool isAdded = false; for (int i = 0; i < _subStrategies.Count(); i++) { // Si la clé lue appartient à la stratégie courante, on l'ajoute if (subStrategyName == _subStrategies[i].Name) { _subStrategies[i].AddAction(actionToImport); isAdded = true; } } // Si la clé n'a pas été ajoutée, on l'ajoute if (isAdded == false) { int subStrategyID = Convert.ToInt32(Math.Floor(actionToImport.ID / 100.0)); SubStrategy subStrategyToAdd = new SubStrategy(subStrategyName, subStrategyID); subStrategyToAdd.AddAction(actionToImport); _subStrategies.Add(subStrategyToAdd); } } } else { // Sinon la clé est ajoutée aux variables globales de l'appli (si la clé est nécessaire) // Lecture du nom de la stratégie currentKey = currentGroup.GetFirstKey(PrivateConst.TAG_StrategyName); if (currentKey != null) { _strategyName = currentKey.valueString; } // Variables pour la position initiale currentKey = currentGroup.GetFirstKey(PrivateConst.TAG_InitialPosX); if (currentKey != null) { _initialPos.param2 = currentKey.valueString; } currentKey = currentGroup.GetFirstKey(PrivateConst.TAG_InitialPosY); if (currentKey != null) { _initialPos.param3 = currentKey.valueString; } currentKey = currentGroup.GetFirstKey(PrivateConst.TAG_InitialPosA); if (currentKey != null) { _initialPos.param4 = currentKey.valueString; } // Valeur par défaut currentKey = currentGroup.GetFirstKey(PrivateConst.TAG_DefaultSpeed); if (currentKey != null) { _defaultSpeed = currentKey.valueInt; } // Valeur par défaut currentKey = currentGroup.GetFirstKey(PrivateConst.TAG_DefaultPivotSpeed); if (currentKey != null) { _defaultPivotSpeed = currentKey.valueInt; } } } } #endregion } } } catch (Exception ex) { _debugTool.WriteLine("Strategy Import() : " + ex.Message); Ret = -1; } return(Ret); }