public void AddInitialPos(RobotPos initialPos) { if (initialPos != null) { if (_initialPos == null) { _initialPos = new List <RobotPos>(); } Boolean isNewData = true; // On verifie si la position n'existe pas déjà) foreach (RobotPos currentRobotPos in _initialPos) { if ((initialPos.x == currentRobotPos.x) && (initialPos.y == currentRobotPos.y) && (initialPos.angle == currentRobotPos.angle) && (initialPos.statusFlag.GetValueString() == currentRobotPos.statusFlag.GetValueString())) { isNewData = false; } } // L'objet n'a pas été trouvé, on l'ajoute if (isNewData == true) { _initialPos.Add(new RobotPos(initialPos.x, initialPos.y, initialPos.angle, initialPos.statusFlag)); } } }
public RobotPos GetOutputPos(int index) { RobotPos Ret = null; if ((index >= 0) && (_initialPos != null)) { List <RobotPos> resultList = GetOutputPos(); if ((resultList != null) && (resultList.Count() > index)) { Ret = resultList[index]; } } if (Ret == null) { Ret = new RobotPos(); } return(Ret); }
public void ComputeRobotPos(Strategy currentStrategy) { DisplayPos currentDisplayPos = null; List <DisplayPos> nextList = new List <DisplayPos>(); RobotPos currentRobotPos = new RobotPos(); List <RobotAction> allRobotActions = null; if (currentStrategy != null) { // On commence par détruire les anciens éléments _displayPos = null; _displayPos = new List <DisplayPos>(); // Creation de la liste allRobotActions = currentStrategy.GetAllRobotAction(); foreach (RobotAction currentRobotAction in allRobotActions) { currentDisplayPos = new DisplayPos(currentRobotAction); _displayPos.Add(currentDisplayPos); } // Creation de l'objet initial currentRobotPos.x = currentStrategy.DefaultPosX; currentRobotPos.y = currentStrategy.DefaultPosY; currentRobotPos.angle = currentStrategy.DefaultPosA; currentRobotPos.statusFlag = new RobotStatusFlag(); // Creation du premier élément nextList.Clear(); currentDisplayPos = GetDisplayPosByID(1); if (currentDisplayPos != null) { currentDisplayPos.AddInitialPos(currentRobotPos); nextList.Add(currentDisplayPos); } // On ajoute tous les élements de la stratégie principale foreach (DisplayPos current in _displayPos) { if ((current.actionID >= 1) && (current.actionID < 1000)) { nextList.Add(current); } } int loopDetection = 0; while ((nextList.Count() > 0) && (loopDetection < loopDetectionMaxValue)) { loopDetection = loopDetection + 1; // Etape 1 : On transfert les données de la liste nextIDs vers currentIDs List <DisplayPos> currentList = new List <DisplayPos>(nextList); DisplayPos currentItem = null; nextList.Clear(); // Etape 2 : Pour chaque élément de la liste while (currentList.Count() > 0) { // On récupère le premier élément de la liste et on le supprimer de la liste courante currentItem = currentList[0]; currentList.RemoveAt(0); // Etape 2.1 : On calcule la position de sortie List <RobotPos> outputPos = currentItem.GetOutputPos(); if ((outputPos != null) && (outputPos.Count() > 0)) { // On ajoute les données que si on ne boucle pas sur nous même et qu'on a un ID valide if ((currentItem.nextID != currentItem.actionID) && (currentItem.nextID > 0)) { // On ajoute que si on est dans la stratégie principale if (((currentItem.actionID > 0) && (currentItem.actionID < 100)) || ((currentItem.actionID >= 100) && (currentItem.nextID > 100))) { currentDisplayPos = GetDisplayPosByID(currentItem.nextID); if (currentDisplayPos != null) { Boolean addNewItemToList = true; currentDisplayPos.AddInitialPos(outputPos); foreach (DisplayPos current in nextList) { if (current.actionID == currentDisplayPos.actionID) { addNewItemToList = false; } } foreach (DisplayPos current in currentList) { if (current.actionID == currentDisplayPos.actionID) { addNewItemToList = false; } } if (addNewItemToList == true) { nextList.Add(currentDisplayPos); } } } } } } currentList.Clear(); currentList = null; } if (loopDetection >= loopDetectionMaxValue) { MessageBox.Show("Une Loop a été détectée dans la stratégie!\nLa génération de la trajectoire est stoppée.", "Strategy Générator", MessageBoxButton.OK, MessageBoxImage.Warning); } } }