#!/usr/bin/env python3 #coding: utf-8 ''' Created on 5 avr. 2017 Copyright 2017 Jean-Marie Mineau, Maxime Keller This file is part of "ISN's Cube". "ISN's Cube" is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. "ISN's Cube" is distributed in the hope that it will be useful and recreative, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with "ISN's Cube". If not, see . @author: Sert à traiter des cubies. ''' from operator import itemgetter class CubeGetteur: """Sert à traiter des cubies.""" def __init__(self): pass def getH(self): """Récupère les cubie du haut et retourne leur index.""" cubiesH = [] for cubie in self.cubies: if len(cubiesH) < 9: cubiesH.append([self.cubies.index(cubie), cubie.centre.y]) else: cubiesH = sorted(cubiesH,key=itemgetter(1)) if cubiesH[0][1] < cubie.centre.y: cubiesH = cubiesH[1:] cubiesH.append([self.cubies.index(cubie), cubie.centre.y]) cubiesH = [item[0] for item in cubiesH] return cubiesH def getB(self): """Récupère les cubie du bas et retourne leur index.""" cubiesH = [] for cubie in self.cubies: if len(cubiesH) < 9: cubiesH.append([self.cubies.index(cubie), cubie.centre.y]) else: cubiesH = sorted(cubiesH,key=itemgetter(1), reverse=True) if cubiesH[0][1] > cubie.centre.y: cubiesH = cubiesH[1:] cubiesH.append([self.cubies.index(cubie), cubie.centre.y]) cubiesH = [item[0] for item in cubiesH] return cubiesH def getD(self): """Récupère les cubie de droite et retourne leur index.""" cubiesD = [] for cubie in self.cubies: if len(cubiesD) < 9: cubiesD.append([self.cubies.index(cubie), cubie.centre.x]) else: cubiesD = sorted(cubiesD,key=itemgetter(1)) if cubiesD[0][1] < cubie.centre.x: cubiesD = cubiesD[1:] cubiesD.append([self.cubies.index(cubie), cubie.centre.x]) cubiesD = [item[0] for item in cubiesD] return cubiesD def getG(self): """Récupère les cubie de Gauche et retourne leur index.""" cubiesG = [] for cubie in self.cubies: if len(cubiesG) < 9: cubiesG.append([self.cubies.index(cubie), cubie.centre.x]) else: cubiesG = sorted(cubiesG,key=itemgetter(1), reverse=True) if cubiesG[0][1] > cubie.centre.x: cubiesG = cubiesG[1:] cubiesG.append([self.cubies.index(cubie), cubie.centre.x]) cubiesG = [item[0] for item in cubiesG] return cubiesG def getAv(self): """Récupère les cubie derrière et retourne leur index.""" cubiesA = [] for cubie in self.cubies: if len(cubiesA) < 9: cubiesA.append([self.cubies.index(cubie), cubie.centre.z]) else: cubiesH = sorted(cubiesA,key=itemgetter(1), reverse=True) if cubiesH[0][1] > cubie.centre.z: cubiesA = cubiesH[1:] cubiesA.append([self.cubies.index(cubie), cubie.centre.z]) cubiesA = [item[0] for item in cubiesA] return cubiesA def getAr(self): """Récupère les cubie de derrière et retourne leur index.""" cubiesA = [] for cubie in self.cubies: if len(cubiesA) < 9: cubiesA.append([self.cubies.index(cubie), cubie.centre.z]) else: cubiesA = sorted(cubiesA,key=itemgetter(1)) if cubiesA[0][1] < cubie.centre.z: cubiesA = cubiesA[1:] cubiesA.append([self.cubies.index(cubie), cubie.centre.z]) cubiesA = [item[0] for item in cubiesA] return cubiesA def getCubieByPos(self, pos): """Retourne l'indice du Cubie de pos donné. Cette pos est relative au cube, elle est donné en x,y,z, l'origine étant le centre du cube, et l'unité correspond à 1 cubie.""" if pos[0] == -1: potentielsCubies = self.getG() elif pos[0] == 1: potentielsCubies = self.getD() elif pos[0] == 0: #Celui est est plus embetant, il n'y a pas de méthode pour les recuperer #Donc c'est toutes les valeur sauf celle des deux autre tranchhes. indicesFaux = self.getG() + self.getD() potentielsCubies = [i for i in range(len(self.cubies)) if i not in indicesFaux] else: raise ValueError("Vous devez demander une ordonné de -1, 0 ou 1") # Parce que la pep 20 est bien if pos[1] == -1: potentielsCubies = [i for i in potentielsCubies if i in self.getB()] elif pos[1] == 1: potentielsCubies = [i for i in potentielsCubies if i in self.getH()] elif pos[1] == 0: indicesFaux = self.getB() + self.getH() potentielsCubies = [i for i in potentielsCubies if i not in indicesFaux] else: raise ValueError("Vous devez demander une abscice de -1, 0 ou 1") #Errors should never pass silently. if pos[2] == -1: potentielsCubies = [i for i in potentielsCubies if i in self.getAv()] elif pos[2] == 1: potentielsCubies = [i for i in potentielsCubies if i in self.getAr()] elif pos[2] == 0: indicesFaux = self.getAv() + self.getAr() potentielsCubies = [i for i in potentielsCubies if i not in indicesFaux] else: raise ValueError("Vous devez demander une profondeur de -1, 0 ou 1") #Oui, aujourd'hui j'ai voulu faire propre. if len(potentielsCubies) > 1: raise Exception("Maxime, je sait pas comment t'as fait, mais t'as réussit à trouver \ Une coordonnée avec plusieurs Cubie!!!") elif len(potentielsCubies) == 0: raise Exception("Pas de Cubies ici, peut être avez vous demandé l'origine?") else: return potentielsCubies[0] def getCubieByColors(self, couleurs): """Retourne l'indice du Cubie de couleurs données. Ces couleurs sont une liste donnant les couleurs exact, mais pas obligatoirement dans l'ordre.""" for cubie in self.cubies: if len(couleurs) != len(cubie.couleursResolution): continue bonCubie = True for couleur in couleurs: if couleur not in cubie.couleursResolution: bonCubie = False break if bonCubie: return self.cubies.index(cubie) raise Exception("Pas de cubies correspondanr aux couleurs données.") def getPosRelative(self, cubie): """Retourne la position relative du cubie (don on donne l'indice).""" if cubie not in range(len(self.cubies)): raise ValueError("Vous devez rentrer un indice de l'argument 'cubies'.") if cubie in self.getG(): x = -1 elif cubie in self.getD(): x = 1 else: x = 0 if cubie in self.getB(): y = -1 elif cubie in self.getH(): y = 1 else : y = 0 if cubie in self.getAv(): z = -1 elif cubie in self.getAr(): z = 1 else: z = 0 return x, y, z