def test_is_valid_refente_for_bobines_fille__multiple_selected(self): bobine_0 = fake_bobine_fille(laize=150, color="Blanc", length=700, gr=30, poses=[1]) bobine_1 = fake_bobine_fille(laize=150, color="Blanc", length=700, gr=30, poses=[1, 2, 4]) bobine_2 = fake_bobine_fille(laize=150, color="Blanc", length=700, gr=30, poses=[1]) bobine_3 = fake_bobine_fille(laize=150, color="Blanc", length=700, gr=30, poses=[1, 4]) bobines_selected = [ BobineFilleSelected(bobine=bobine_0, pose=1), BobineFilleSelected(bobine=bobine_1, pose=2), ] bobines = [bobine_2, bobine_3] refente = Refente(laize1=150, laize2=150, laize3=150, laize4=150) res = get_bobine_fille_combinaisons_for_refente(refente=refente, bobines_fille=bobines, bobines_fille_selected=bobines_selected) self.assertEqual(len(res), 0)
def add_bobine_selected(self, bobine, pose): from commun.model.bobine_fille_selected import BobineFilleSelected new_bobine = BobineFilleSelected(bobine, pose=pose) self.bobines_filles_selected.append(new_bobine) self.update_all_current_store() self.update_encrier() self.ON_CHANGED_SIGNAL.emit()
def test_is_valid_refente_for_bobines_fille__multi_the_same_pose_compatible(self): bobine_0 = fake_bobine_fille(laize=150, poses=[2], color="Blanc") bobines_selected = [BobineFilleSelected(bobine=bobine_0, pose=2)] bobine_1 = fake_bobine_fille(laize=150, poses=[1, 1, 4], color="Blanc") bobines = [bobine_1] refente = Refente(laize1=150, laize2=150, laize3=150, laize4=150) res = get_bobine_fille_combinaisons_for_refente(refente=refente, bobines_fille=bobines, bobines_fille_selected=bobines_selected) self.assertEqual(len(res), 1)
def get_bobine_fille_combinaisons_for_refente(refente, bobines_fille, bobines_fille_selected=None, max_solutions=1): if bobines_fille_selected is None: bobines_fille_selected = [] # Prépare une liste avec les solutions combinaisons = Combinaisons() # Convertit la refente en RefenteBuffer initial_refente_buffer = RefenteBuffer(refente.laizes) # Récupère toutes les combinaisons possible de refente après avoir appliqué # les bobines filles sélectionnées refentes = initial_refente_buffer.get_combinaisons(bobines_fille_selected) # Groupe les bobines qui fonctionnent entre elles clusters = _group_bobines_fille(bobines_fille, bobines_fille_selected) # Test chacun des groupes et refente for refente in refentes: if refente.is_full(): continue for cluster in clusters: # Convertit les BobineFille du groupe en BobineFilleSelected bobines_poses = [ bobine_fille_selected for bobine_fille in cluster for bobine_fille_selected in [ BobineFilleSelected(bobine_fille, pose) for pose in bobine_fille.poses ] ] # Group les BobineFilleSelected par laize bobine_poses_by_laize = {} for bobine_pose in bobines_poses: laize = bobine_pose.laize if not bobine_poses_by_laize.get(laize): bobine_poses_by_laize[laize] = [] bobine_poses_by_laize[laize].append(bobine_pose) # Test si il existe une combinaison valid dans ce groupe res = _is_valid_refente_for_bobines_pose(refente, bobine_poses_by_laize, max_solutions) # Si on trouve des combinaisons, on les ajoute au tableau des solutions # et on s'arrete dès qu'on en a assez. if res: for combi in res: if max_solutions is not None and len( combinaisons.all()) >= max_solutions: # print("Combinaisons: ", combinaisons.all(max_solutions)) return combinaisons.all(max_solutions) combinaisons.add(combi) # Retourne toutes les combinaisons qu'on a trouvées # print("Combinaisons: ", combinaisons.all(max_solutions)) return combinaisons.all(max_solutions)
def rec_is_valid_refente_for_bobines_fille(refente, bobines_fille, bobines_fille_selected): if bobines_fille_selected: refente_with_bobines_fille_selected = get_new_refente_with_bobines_fille( refente, bobines_fille=bobines_fille_selected, full_complete=True) else: refente_with_bobines_fille_selected = refente for laize in refente_with_bobines_fille_selected.laizes: if not is_valid_laize_for_bobines_fille(laize, bobines_fille): return False if is_full_refente_with_bobines_fille_selected( refente=refente_with_bobines_fille_selected): return True for bobine in bobines_fille: bobine_fille_contrainte = bobines_fille_selected[ 0] if bobines_fille_selected else None if not is_valid_bobine_fille_for_bobine_fille( bobine_fille=bobine, bobine_fille_contrainte=bobine_fille_contrainte): continue for pose in bobine.poses: from commun.model.bobine_fille_selected import BobineFilleSelected bobine_fille_selected = BobineFilleSelected(bobine=bobine, pose=pose) if not is_valid_bobine_fille_and_pose_for_bobines_fille( bobine_fille_selected, pose, bobines_fille=bobines_fille_selected): continue elif not is_valid_bobine_fille_and_pose_for_refente( bobine_fille=bobine_fille_selected, pose=bobine_fille_selected.pose, refente=refente_with_bobines_fille_selected, bobines_fille_selected=bobines_fille_selected, get_new_refente=False): continue else: if bobines_fille_selected: new_bobines_fille_selected = bobines_fille_selected.copy() else: new_bobines_fille_selected = [] new_bobines_fille_selected.append(bobine_fille_selected) if rec_is_valid_refente_for_bobines_fille( refente=refente_with_bobines_fille_selected, bobines_fille=bobines_fille, bobines_fille_selected=new_bobines_fille_selected): return True new_bobines_fille_selected.pop() return False
def get_bobines(code_bobines_filles): bobines = [] code_bobines_filles_split = code_bobines_filles.split("_") index = 0 while True: if code_bobines_filles_split[index]: bobine = bobine_fille_store.get_bobine( code_bobines_filles_split[index]) bobine_selected = BobineFilleSelected( bobine=bobine, pose=int(code_bobines_filles_split[index + 1]), index=int(code_bobines_filles_split[index + 2])) bobines.append(bobine_selected) index += 3 else: break return bobines
def is_valid_bobine_fille_and_pose_for_refente_bobines_filles_selected_with_bobines_filles( refente, bobine_fille, pose, bobines_filles, bobines_fille_selected=None): """ On suppose que la bobine fille est dans bobine filles selected """ new_bobine_fille_selected = BobineFilleSelected(bobine=bobine_fille, pose=pose) if bobines_fille_selected is None: bobines_fille_selected = [] new_bobines_filles_selected = bobines_fille_selected + [ new_bobine_fille_selected ] new_bobines_filles = remove_bobine_fille_and_pose_in_bobines_filles( bobine_fille=bobine_fille, pose=pose, bobines_filles=bobines_filles) return is_valid_refente_bobines_fille_bobines_fille_selected( refente=refente, bobines_fille=new_bobines_filles, bobines_fille_selected=new_bobines_filles_selected)
def test_is_valid_bobine_fille_for_bobines_fille__remove_pose_in_poses(self): bobine_0 = fake_bobine_fille(laize=150, poses=[2, 1]) bobine_selected = BobineFilleSelected(bobine=bobine_0, pose=2) bobines = [bobine_selected] is_valid_bobine_fille_for_bobines_fille(bobine_fille=bobine_selected, bobines_fille=bobines) self.assertEqual(bobine_0.poses, [1])
def test_get_new_refente_with_bobines_fille__no_neutre_full_complete(self): bobine_0 = fake_bobine_fille(laize=150, color="Jaune", poses=[1]) bobines_selected = [BobineFilleSelected(bobine=bobine_0, pose=1)] refente_0 = Refente(laize1=150, laize2=150, laize3=150, laize4=150) new_refente = get_new_refente_with_bobines_fille(refente_0, bobines_selected, full_complete=True) self.assertEqual(new_refente.laizes, [None, 150, 150, 150, None, None, None])