X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FTools%2FblocFissure%2Fgmu%2FidentifieElementsDebouchants.py;h=d32b10efec506a0c42f9a2cf8d14b63fc4455ec6;hp=4f6de333ce60a3a9fb6f3cc2e5976e4d2bcc4d20;hb=2cf6435f1492b63b9adf4e8256d88968638ed9bf;hpb=cfa45d551fd47dd3648dea6e50ac74329b0d9e5d diff --git a/src/Tools/blocFissure/gmu/identifieElementsDebouchants.py b/src/Tools/blocFissure/gmu/identifieElementsDebouchants.py index 4f6de333c..d32b10efe 100644 --- a/src/Tools/blocFissure/gmu/identifieElementsDebouchants.py +++ b/src/Tools/blocFissure/gmu/identifieElementsDebouchants.py @@ -1,148 +1,71 @@ # -*- coding: utf-8 -*- +# Copyright (C) 2014-2021 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +"""Eléments débouchants (intersection pipe et peau), indexés selon les edges du fond de fissure (edgesFondIn)""" import logging -import math -from geomsmesh import geompy +from .identifieElementsDebouchants_a import identifieElementsDebouchants_a +from .identifieElementsDebouchants_b import identifieElementsDebouchants_b +from .identifieElementsDebouchants_c import identifieElementsDebouchants_c +from .identifieElementsDebouchants_d import identifieElementsDebouchants_d -from produitMixte import produitMixte -from whichSide import whichSide - -def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond, - edgesFondIn, edgesFondFiss, wireFondFiss, - aretesVivesC, fillingFaceExterne, - edgesPipeIn, verticesPipePeau, rayonPipe, +def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond, \ + edgesFondIn, edgesFondFiss, wireFondFiss, \ + aretesVivesC, fillingFaceExterne, \ + edgesPipeIn, verticesPipePeau, rayonPipe, \ facesInside, facesOnside): - """ - elements débouchants (intersection pipe et peau), indexés selon les edges du fond de fissure (edgesFondIn) - """ - + """Eléments débouchants (intersection pipe et peau), indexés selon les edges du fond de fissure (edgesFondIn)""" + logging.info('start') - - verticesEdgesFondIn = [] # les points du fond de fissure au débouché du pipe sur la peau (indice de edgesFondIn) - pipexts = [] # les segments de pipe associés au points de fond de fissure débouchants (même indice) - cercles = [] # les cercles de generation des pipes débouchant (même indice) - facesFissExt = [] # les faces de la fissure externe associés au points de fond de fissure débouchants (même indice) - edgesFissExtPeau = [] # edges des faces de fissure externe sur la peau (même indice) - edgesFissExtPipe = [] # edges des faces de fissure externe sur le pipe (même indice) + + verticesEdgesFondIn = list() # les points du fond de fissure au débouché du pipe sur la peau (indice de edgesFondIn) + pipexts = list() # les segments de pipe associés au points de fond de fissure débouchants (même indice) + cercles = list() # les cercles de generation des pipes débouchant (même indice) + facesFissExt = list() # les faces de la fissure externe associés au points de fond de fissure débouchants (même indice) + edgesFissExtPeau = list() # edges des faces de fissure externe sur la peau (même indice) + edgesFissExtPipe = list() # edges des faces de fissure externe sur le pipe (même indice) #logging.debug("edgesFondIn %s", edgesFondIn) for iedf, edge in enumerate(edgesFondIn): - name = "edgeFondIn%d"%iedf - geompy.addToStudyInFather(partitionPeauFissFond, edge, name) - dist = [ geompy.MinDistance(pt, edge) for pt in verticesPipePeau] - ptPeau = verticesPipePeau[dist.index(min(dist))] # le point de verticesPipePeau a distance minimale de l'edge - [u, PointOnEdge, EdgeInWireIndex] = geompy.MakeProjectionOnWire(ptPeau, wireFondFiss) - logging.debug("u:%s, EdgeInWireIndex: %s, len(edgesFondFiss): %s", u, EdgeInWireIndex, len(edgesFondFiss)) - localEdgeInFondFiss = edgesFondFiss[EdgeInWireIndex] - centre = PointOnEdge - centre2 = geompy.MakeVertexOnCurve(localEdgeInFondFiss, u) - geompy.addToStudyInFather(partitionPeauFissFond, centre2, "centre2_%d"%iedf) + + ptPeau, centre, norm, localEdgeInFondFiss, localEdgeInFondFiss, cercle = \ + identifieElementsDebouchants_a(iedf, \ + partitionPeauFissFond, edgesFondFiss, wireFondFiss, \ + verticesPipePeau, rayonPipe, edge,) verticesEdgesFondIn.append(centre) - name = "verticeEdgesFondIn%d"%iedf - geompy.addToStudyInFather(partitionPeauFissFond, centre, name) - norm = geompy.MakeTangentOnCurve(localEdgeInFondFiss, u) - geompy.addToStudyInFather(partitionPeauFissFond, centre, "norm%d"%iedf) - cercle = geompy.MakeCircle(centre, norm, rayonPipe) - geompy.addToStudyInFather(partitionPeauFissFond, cercle, "cerclorig%d"%iedf) - [vertex] = geompy.ExtractShapes(cercle, geompy.ShapeType["VERTEX"], False) - vec1 = geompy.MakeVector(centre, vertex) - vec2 = geompy.MakeVector(centre, ptPeau) - angle = geompy.GetAngleRadians(vec1, vec2) - # cas général : on reconstitue une portion de pipe, avec l'arête de couture qui coincide - # avec la face de fissure, au niveau du débouché sur la face externe - # cas dégénéré : le pipe débouche perpendiculairement à une surface plane à l'origine. - # La partition filling / pipe reconstruit échoue. - # - Si on partitionne le filling avec un simple pipe obtenu par extrusion droite du cercle, - # cela donne un point en trop sur le cercle. - # - Si on prend une vraie surface plane (pas un filling), on peut faire la partition avec - # les pipes reconstruits - logging.debug("angle=%s", angle) - #if abs(angle) > 1.e-7: - sommetAxe = geompy.MakeTranslationVector(centre, norm) - pm = produitMixte(centre, vertex, ptPeau, sommetAxe) - if pm > 0: # ajout de pi a (-)angle pour éviter des points confondus (partition échoue) dans les cas dégénérés - cercle = geompy.MakeRotation(cercle, norm, angle + math.pi) - else: - cercle = geompy.MakeRotation(cercle, norm, -angle + math.pi) - name = "cercle%d"%iedf - geompy.addToStudyInFather(partitionPeauFissFond, cercle, name) cercles.append(cercle) # --- estimation de la longueur du pipe necessaire de part et d'autre du point de sortie - if aretesVivesC is None: - faceTestPeau = fillingFaceExterne - else: - faceTestPeau = facesDefaut[ifil] - sideCentre = whichSide(faceTestPeau, centre) - locPt0 = geompy.MakeVertexOnCurve(localEdgeInFondFiss, 0.0) - locPt1 = geompy.MakeVertexOnCurve(localEdgeInFondFiss, 1.0) - sidePt0 = whichSide(faceTestPeau, locPt0) - sidePt1 = whichSide(faceTestPeau, locPt1) - logging.debug("position centre cercle: %s, extremité edge u0: %s, u1: %s", sideCentre, sidePt0, sidePt1) - normFace = geompy.GetNormal(faceTestPeau, ptPeau) - inclPipe = abs(geompy.GetAngleRadians(norm, normFace)) - lgp = max(rayonPipe/2., abs(3*rayonPipe*math.tan(inclPipe))) - logging.debug("angle inclinaison Pipe en sortie: %s degres, lgp: %s", inclPipe*180/math.pi, lgp) - - # --- position des points extremite du pipe sur l'edge debouchante - # il faut la distance curviligne ofp du point central par rapport à une extrémité de l'edge débouchante - locEdgePart = geompy.MakePartition([localEdgeInFondFiss],[centre], [], [], geompy.ShapeType["EDGE"], 0, [], 0) - edgesLoc = geompy.ExtractShapes(locEdgePart, geompy.ShapeType["EDGE"], False) - edgesLocSorted =[(geompy.MinDistance(edge, locPt0), kk, edge) for kk, edge in enumerate(edgesLoc)] - edgesLocSorted.sort() - ofp = geompy.BasicProperties(edgesLocSorted[0][2])[0] # distance curviligne centre locPt0 - logging.debug("distance curviligne centre extremite0: %s", ofp) - p1 = geompy.MakeVertexOnCurveByLength(localEdgeInFondFiss, ofp +lgp, locPt0) - p2 = geompy.MakeVertexOnCurveByLength(localEdgeInFondFiss, ofp -lgp, locPt0) - geompy.addToStudyInFather(wireFondFiss, p1, "p1_%d"%iedf) - geompy.addToStudyInFather(wireFondFiss, p2, "p2_%d"%iedf) + loc_pt0, lgp = identifieElementsDebouchants_b(ifil, \ + facesDefaut,aretesVivesC, fillingFaceExterne, rayonPipe, \ + ptPeau, centre, norm, localEdgeInFondFiss) - edgePart = geompy.MakePartition([localEdgeInFondFiss], [p1,p2], [], [], geompy.ShapeType["EDGE"], 0, [], 0) - edps = geompy.ExtractShapes(edgePart, geompy.ShapeType["EDGE"], True) - for edp in edps: - if geompy.MinDistance(centre, edp) < 1.e-3: - pipext = geompy.MakePipe(cercle, edp) - name = "pipeExt%d"%iedf - geompy.addToStudyInFather(partitionPeauFissFond, pipext, name) - pipexts.append(pipext) + # --- position des points extremite du pipe sur l'edge debouchante + identifieElementsDebouchants_c(iedf,\ + partitionPeauFissFond, wireFondFiss, \ + centre, localEdgeInFondFiss, cercle, loc_pt0, lgp, pipexts) - for ifa, face in enumerate(facesInside): - logging.debug("recherche edges communes entre une face inside et (faces onside, edges pipe et fond débouchante)") - edgesPeauFis = [] - edgesPipeFis = [] - edgesPipeFnd = [] - try: - edgesPeauFis = geompy.GetSharedShapesMulti([geompy.MakeCompound(facesOnside), face], geompy.ShapeType["EDGE"]) - logging.debug(" faces onside %s",edgesPeauFis) - edgesPipeFis = geompy.GetSharedShapesMulti([geompy.MakeCompound(edgesPipeIn), face], geompy.ShapeType["EDGE"]) - logging.debug(" edgesPipeIn %s", edgesPipeFis) - edgesPipeFnd = geompy.GetSharedShapesMulti([geompy.MakeCompound(edgesFondIn), face], geompy.ShapeType["EDGE"]) - logging.debug(" edgesFondIn %s ", edgesPipeFnd) - except: - logging.debug(" pb edges communes %s %s %s",edgesPeauFis, edgesPipeFis, edgesPipeFnd) - pass - if (len(edgesPeauFis) > 0) and (len(edgesPipeFis) > 0) and (len(edgesPipeFnd) == 0): - dist = geompy.MinDistance(geompy.MakeCompound(edgesPeauFis), ptPeau) - logging.debug(" test distance extrémité reference %s", dist) - if dist < 1.e-3: # c'est la face de fissure externe associée - logging.debug(" face %s inside ajoutée", ifa) - facesFissExt.append(face) - name="faceFissExt%d"%iedf - geompy.addToStudyInFather(partitionPeauFissFond, face, name) - dist = 1. - for ipe, edpe in enumerate(edgesPeauFis): - for ipi, edpi in enumerate(edgesPipeFis): - dist = geompy.MinDistance(edpe, edpi) - if dist < 1.e-3: - edgesFissExtPeau.append(edpe) - name="edgesFissExtPeau%d"%iedf - geompy.addToStudyInFather(partitionPeauFissFond, edpe, name) - edgesFissExtPipe.append(edpi) - name="edgesFissExtPipe%d"%iedf - geompy.addToStudyInFather(partitionPeauFissFond, edpi, name) - break - if dist < 1.e-3: - break + # --- Recherche edges communes entre une face inside et (faces onside, edges pipe et fond débouchante) + identifieElementsDebouchants_d(iedf,\ + partitionPeauFissFond, edgesFondIn, edgesPipeIn, \ + facesInside, facesOnside, \ + ptPeau, facesFissExt, edgesFissExtPeau, edgesFissExtPipe) - return (verticesEdgesFondIn, pipexts, cercles, facesFissExt, edgesFissExtPeau, edgesFissExtPipe) \ No newline at end of file + return (verticesEdgesFondIn, pipexts, cercles, facesFissExt, edgesFissExtPeau, edgesFissExtPipe)