From cc50cd4f0c5a3b53b419b35a6021a0731430c0e0 Mon Sep 17 00:00:00 2001 From: GERALD NICOLAS Date: Wed, 15 Sep 2021 11:38:14 +0200 Subject: [PATCH] =?utf8?q?Gestion=20des=20points=20align=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../macros/pipeNetwork/feature.py | 127 ++++++++++++++---- .../macros/pipeNetwork/pipeNetwork_ligne.txt | 25 ++-- 2 files changed, 116 insertions(+), 36 deletions(-) diff --git a/src/PythonAddons/macros/pipeNetwork/feature.py b/src/PythonAddons/macros/pipeNetwork/feature.py index 38ced6311..36f73c8a1 100755 --- a/src/PythonAddons/macros/pipeNetwork/feature.py +++ b/src/PythonAddons/macros/pipeNetwork/feature.py @@ -29,6 +29,8 @@ from salome.shaper import model import ModelAPI from GeomAPI import * +import numpy as np + # Si erreur : def raiseException(texte): @@ -120,7 +122,7 @@ Par défaut, on supposera que la connection est angulaire et que ce n'est pas un """ #print(line) texte = line - splitLine = line.split(" ") + splitLine = line.split() if ( len(splitLine) != 5 ): diagno = 1 elif splitLine[0] in self.infoPoints: @@ -157,30 +159,99 @@ La ligne à décoder est formée des informations : . si la méthode est 2 par 2 : chaque tronçon est décrit par les identifiants des 2 noeuds Par défaut, on supposera que la méthode est par ligne. """ - splitLine = line.split(" ") - printverbose ("Enregistrement du tronçon : {}".format(line),verbose=self._verbose) + splitLine = line.split() + printverbose ("Enregistrement du tronçon : {}".format(splitLine),verbose=self._verbose) diagno = 0 if method == self.twopartwo : if self.connectivities: # Recherche si le tronçon existe déjà ou s'il est nouveau + existe = False for key, val in self.connectivities.items(): print(key, " ******* {}".format(val)) if val['chainage'][-1] == splitLine[0]: # Le tronçon existe val['chainage'].append(splitLine[1]) print("On complète le tronçon") - return diagno + existe = True + break # Le tronçon n'existe pas - print("On démarre un nouveau tronçon - Cas 2") - self.newConnectivity(splitLine[0], splitLine) + if not existe: + print("On démarre un nouveau tronçon - Cas 2") + self.newConnectivity(splitLine[0], splitLine) else : print("On démarre un nouveau tronçon - Cas 1") self.newConnectivity(splitLine[0], splitLine) else : self.newConnectivity(splitLine[0], splitLine) #print ("Retour de readConnectivity = {}".format(diagno)) + return diagno +#==================================================================================== + + def correctConnectivity(self): + """Correction des connectivités pour tenir compte de points alignés + +Si 3 points sont alignés sur une ligne et qu'aucune ligne ne part du point central, +il faut scinder la ligne au niveau de ce point pour traiter correctement la suite : on se mettrait +à créer un plan avec ces 3 points alignés et tout s'effondre ensuite. + """ + while True: + # On explore toutes les lignes et on cherche un cas où sur une ligne 3 points consécutifs sont alignés + for _, value in self.connectivities.items(): + # Sur cette ligne, a-t-on 3 points consécutifs alignés ? + modif = self.correctConnectivity_a(value["chainage"]) + # Si on a modifié la description des connectivités, on recommence l'analyse + if modif: + break + # Si plus rien n'a été modifié, c'est fini + if not modif: + break + + def correctConnectivity_a(self, l_noeuds): + """On explore toutes les lignes et on cherche un cas où sur une ligne 3 points consécutifs sont alignés + +Entrées : + :l_noeuds: liste des noeuds de la ligne + +Sorties : + :modif: on a modifié ou non la description des lignes + """ + modif = False + nb_points = len(l_noeuds) + printverbose ("Analyse de {}".format(l_noeuds), verbose=self._verbose_max or True) + #print ("nb_points = {}".format(nb_points)) + + indice = 0 + nb_test = nb_points - 2 + for iaux in range(nb_test): + # Calcul de l'angle entre les 3 points de la séquence + vect = list() + #print ("({},{},{}".format(l_noeuds[iaux],l_noeuds[iaux+1],l_noeuds[iaux+2])) + for jaux in range(3): + coox = self.infoPoints[l_noeuds[iaux+jaux]]["X"] + cooy = self.infoPoints[l_noeuds[iaux+jaux]]["Y"] + cooz = self.infoPoints[l_noeuds[iaux+jaux]]["Z"] + vect.append(np.array((coox,cooy,cooz),np.float)) + cosinus = np.dot(vect[1]-vect[0],vect[1]-vect[2])/(np.linalg.norm(vect[1]-vect[0])* np.linalg.norm(vect[1]-vect[2])) + #print ("cosinus = {}".format(cosinus)) + # Si l'angle est plat, c'est que les 3 points sont alignés : on arrête... sauf si ce point est un départ d'une autre ! + if ( (1.-np.abs(cosinus)) < 1.e-4 ): + indice = iaux+1 + if l_noeuds[indice] not in self.connectivities: + break + else: + indice = 0 + # Si un angle plat a été trouvé, on scinde la ligne + if indice: + #print ("id_noeud_debut = {}, {}".format(l_noeuds[0], l_noeuds[:indice+1])) + #print ("id_noeud_new = {}, {}".format(l_noeuds[indice], l_noeuds[indice:])) + self.newConnectivity(l_noeuds[0], l_noeuds[:indice+1]) + self.newConnectivity(l_noeuds[indice], l_noeuds[indice:]) + modif = True + + return modif + #==================================================================================== def newConnectivity(self, key, value): @@ -197,7 +268,7 @@ La ligne est formée de deux informations : . l'identifiant du noeud . la caractérisation de la connection : "angular_connection" ou "radius=xxx" """ - splitLine = line.split(" ") + splitLine = line.split() if len(splitLine) != 2: print(line) diagno = 1 @@ -503,7 +574,7 @@ Il est nommé conformément au noeud d'application. Cela n'a qu'un intérêt gra while ind < len(value['chainage'])-1: value["starts"].append(self.connectivities[key]['chainage'][ind]) objectsForPath, ind, isPipe, end_noeud = self.retrieveSubshapesforWire(copy, key, ind) - if self._verbose: + if self._verbose_max: print("************************* ind = {}".format(ind)) print("************************* objectsForPath = {}".format(objectsForPath)) path = model.addWire(part, objectsForPath, False) @@ -689,46 +760,52 @@ Il est nommé conformément au noeud d'application. Cela n'a qu'un intérêt gra if error: break - # B.2. Signalement de la fin d'une chaine + + # B.2. Gestion des points alignés + self.print_info (self._verbose_max or True, "avant gestion des points alignés") + + self.correctConnectivity () + + # B.3. Signalement de la fin d'une chaine for key, value in self.connectivities.items(): self.infoPoints[value['chainage'][-1]]["isEnd"] = True - self.print_info (self._verbose_max or True, "après les lectures") + self.print_info (self._verbose_max or True, "avant les création de points, etc.") - # B.3. Creation des points + # B.4. Creation des points self.createPoints(part) - # B.4. Creation des polylines + # B.5. Creation des polylines self.createPolylines(part) - # B.5. Creation des fillets + # B.6. Creation des fillets self.createFillets(part) - # B.6. Recherche des coudes droits + # B.7. Recherche des coudes droits self.searchRightConnections(part) - # B.7. Création des paths pour le pipeNetwork + # B.8. Création des paths pour le pipeNetwork self.createPaths(part) - # B.8. Création des sketchs pour le pipeNetwork + # B.9. Création des sketchs pour le pipeNetwork self.createSketches(part) - self.print_info (self._verbose_max) + self.print_info (self._verbose_max or True, "après la création des sketchs") - # B.9. Création des pipes + # B.10. Création des pipes self.createPipes(part, nameRes) - # B.10. Dossier pour les opérations internes + # B.11. Dossier pour les opérations internes print("========================= Mise en dossier =========================") self.folder = model.addFolder(part, self.lfeatures[0], self.lfeatures[-1]) self.folder.setName("{}_inter".format(nameRes)) - # Ménage des résultats inutiles - #print("================== Ménage des résultats inutiles ==================") - #laux = list() - #for iaux in range(len(self.ledges)): - #laux.append(model.selection("EDGE", "Edge_{}_1".format(iaux))) - #_ = model.addRemoveResults(part, laux) + # B.12. Ménage des résultats inutiles + print("================== Ménage des résultats inutiles ==================") + laux = list() + for iaux in range(len(self.ledges)): + laux.append(model.selection("EDGE", "Edge_{}_1".format(iaux))) + _ = model.addRemoveResults(part, laux) break diff --git a/src/PythonAddons/macros/pipeNetwork/pipeNetwork_ligne.txt b/src/PythonAddons/macros/pipeNetwork/pipeNetwork_ligne.txt index 2a33849bf..2b41ca6ef 100644 --- a/src/PythonAddons/macros/pipeNetwork/pipeNetwork_ligne.txt +++ b/src/PythonAddons/macros/pipeNetwork/pipeNetwork_ligne.txt @@ -3,28 +3,31 @@ nodes section # Le tuyau principal id_noeud1 - 0 0 0 id_noeud2 - 10 -10 0 -id_noeud3 - 20 -20 0 -id_noeud4 - 21 -21 10 -id_noeud5 - 30 -21 10 -id_noeud6 - 30 -10 10 -id_noeud7 - 30 0 10 +id_noeud3 - 15 -15 0 +id_noeud4 - 20 -20 0 +id_noeud5 - 21 -21 10 +id_noeud6 - 30 -21 10 +id_noeud7 - 30 -10 10 +id_noeud8 - 30 -5 10 +id_noeud9 - 30 0 10 # Les deux piquages id_noeudA id_noeud2 -5 -5 10 id_noeudB id_noeudA 0 5 10 id_noeudC - 30 -10 20 id_noeudD id_noeudC 5 5 5 +id_noeudE id_noeudD 5 5 5 # Connectivité : connectivity section # Choix entre 2 méthodes=soit 2par2 soit par_ligne method=par_ligne -id_noeud1 id_noeud2 id_noeud3 id_noeud4 id_noeud5 id_noeud6 id_noeud7 -id_noeud2 id_noeudA id_noeudB -id_noeud6 id_noeudC id_noeudD +id_noeud1 id_noeud2 id_noeud3 id_noeud4 id_noeud5 id_noeud6 id_noeud7 id_noeud8 id_noeud9 +id_noeudB id_noeudA id_noeud2 +id_noeud7 id_noeudC id_noeudD id_noeudE # Congés de raccordement : fillets section id_noeud2 angular_connection -id_noeud3 radius=1 -id_noeud4 angular_connection -id_noeud5 radius=2 +id_noeud4 radius=1 +id_noeud5 angular_connection +id_noeud6 radius=2 -- 2.39.2