Salome HOME
generalisation publication conditionnelle
[modules/smesh.git] / src / Tools / blocFissure / gmu / identifieElementsDebouchants.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4 import math
5
6 from geomsmesh import geompy
7 from geomsmesh import geomPublish
8 from geomsmesh import geomPublishInFather
9 import initLog
10
11 from produitMixte import produitMixte
12 from whichSide import whichSide
13   
14 def identifieElementsDebouchants(ifil, facesDefaut, partitionPeauFissFond,
15                                 edgesFondIn, edgesFondFiss, wireFondFiss,
16                                 aretesVivesC, fillingFaceExterne,
17                                 edgesPipeIn, verticesPipePeau, rayonPipe,
18                                 facesInside, facesOnside):
19   """
20   elements débouchants (intersection pipe et peau), indexés selon les edges du fond de fissure (edgesFondIn)
21   """
22   
23   logging.info('start')
24  
25   verticesEdgesFondIn = [] # les points du fond de fissure au débouché du pipe sur la peau (indice de edgesFondIn)
26   pipexts = []             # les segments de pipe associés au points de fond de fissure débouchants (même indice)
27   cercles = []             # les cercles de generation des pipes débouchant (même indice)
28   facesFissExt = []        # les faces de la fissure externe associés au points de fond de fissure débouchants (même indice)
29   edgesFissExtPeau = []    # edges des faces de fissure externe sur la peau (même indice)
30   edgesFissExtPipe = []    # edges des faces de fissure externe sur le pipe (même indice)
31
32   #logging.debug("edgesFondIn %s", edgesFondIn)
33   for iedf, edge in enumerate(edgesFondIn):
34     name = "edgeFondIn%d"%iedf
35     geomPublishInFather(initLog.debug, partitionPeauFissFond, edge, name)
36     dist = [ geompy.MinDistance(pt, edge) for pt in verticesPipePeau]
37     ptPeau = verticesPipePeau[dist.index(min(dist))] # le point de verticesPipePeau a distance minimale de l'edge
38     [u, PointOnEdge, EdgeInWireIndex]  = geompy.MakeProjectionOnWire(ptPeau, wireFondFiss)
39     logging.debug("u:%s, EdgeInWireIndex: %s, len(edgesFondFiss): %s", u, EdgeInWireIndex, len(edgesFondFiss))
40     localEdgeInFondFiss = edgesFondFiss[EdgeInWireIndex]
41     centre = PointOnEdge
42     centre2 = geompy.MakeVertexOnCurve(localEdgeInFondFiss, u)
43     geomPublishInFather(initLog.debug, partitionPeauFissFond, centre2, "centre2_%d"%iedf)
44     verticesEdgesFondIn.append(centre)
45     name = "verticeEdgesFondIn%d"%iedf
46     geomPublishInFather(initLog.debug, partitionPeauFissFond, centre, name)
47     norm = geompy.MakeTangentOnCurve(localEdgeInFondFiss, u)
48     geomPublishInFather(initLog.debug, partitionPeauFissFond, centre, "norm%d"%iedf)
49     cercle = geompy.MakeCircle(centre, norm, rayonPipe)
50     geomPublishInFather(initLog.debug, partitionPeauFissFond, cercle, "cerclorig%d"%iedf)
51     [vertex] = geompy.ExtractShapes(cercle, geompy.ShapeType["VERTEX"], False)
52     vec1 = geompy.MakeVector(centre, vertex)
53     vec2 = geompy.MakeVector(centre, ptPeau)
54     angle = geompy.GetAngleRadians(vec1, vec2)
55     # cas général : on reconstitue une portion de pipe, avec l'arête de couture qui coincide
56     #   avec la face de fissure, au niveau du débouché sur la face externe
57     # cas dégénéré : le pipe débouche perpendiculairement à une surface plane à l'origine.
58     #   La partition filling / pipe reconstruit échoue.
59     #   - Si on partitionne le filling avec un simple pipe obtenu par extrusion droite du cercle,
60     #     cela donne un point en trop sur le cercle.
61     #   - Si on prend une vraie surface plane (pas un filling), on peut faire la partition avec 
62     #     les pipes reconstruits              
63     logging.debug("angle=%s", angle)
64     #if abs(angle) > 1.e-7:
65     sommetAxe = geompy.MakeTranslationVector(centre, norm)
66     pm = produitMixte(centre, vertex, ptPeau, sommetAxe)
67     if pm > 0:  # ajout de pi a (-)angle pour éviter des points confondus (partition échoue) dans les cas dégénérés
68       cercle = geompy.MakeRotation(cercle, norm, angle + math.pi)
69     else:
70       cercle = geompy.MakeRotation(cercle, norm, -angle + math.pi)
71     name = "cercle%d"%iedf
72     geomPublishInFather(initLog.debug,partitionPeauFissFond, cercle, name)
73     cercles.append(cercle)
74
75     # --- estimation de la longueur du pipe necessaire de part et d'autre du point de sortie
76     if aretesVivesC is None:
77       faceTestPeau = fillingFaceExterne
78     else:
79       faceTestPeau = facesDefaut[ifil]
80     sideCentre = whichSide(faceTestPeau, centre)
81     locPt0 = geompy.MakeVertexOnCurve(localEdgeInFondFiss, 0.0)
82     locPt1 = geompy.MakeVertexOnCurve(localEdgeInFondFiss, 1.0)
83     sidePt0 = whichSide(faceTestPeau, locPt0)
84     sidePt1 = whichSide(faceTestPeau, locPt1)
85     logging.debug("position centre cercle: %s, extremité edge u0: %s, u1: %s", sideCentre, sidePt0, sidePt1) 
86     normFace = geompy.GetNormal(faceTestPeau, ptPeau)
87     inclPipe = abs(geompy.GetAngleRadians(norm, normFace))
88     lgp = max(rayonPipe/2., abs(3*rayonPipe*math.tan(inclPipe)))
89     logging.debug("angle inclinaison Pipe en sortie: %s degres, lgp: %s", inclPipe*180/math.pi, lgp)
90     
91     # --- position des points extremite du pipe sur l'edge debouchante
92     #     il faut la distance curviligne ofp du point central par rapport à une extrémité de l'edge débouchante
93     locEdgePart = geompy.MakePartition([localEdgeInFondFiss],[centre], [], [], geompy.ShapeType["EDGE"], 0, [], 0)
94     edgesLoc = geompy.ExtractShapes(locEdgePart, geompy.ShapeType["EDGE"], False)
95     edgesLocSorted =[(geompy.MinDistance(edge, locPt0), kk, edge) for kk, edge in enumerate(edgesLoc)]
96     edgesLocSorted.sort()
97     ofp = geompy.BasicProperties(edgesLocSorted[0][2])[0] # distance curviligne centre locPt0
98     logging.debug("distance curviligne centre extremite0: %s", ofp)
99     p1 = geompy.MakeVertexOnCurveByLength(localEdgeInFondFiss, ofp +lgp, locPt0)
100     p2 = geompy.MakeVertexOnCurveByLength(localEdgeInFondFiss, ofp -lgp, locPt0)
101     geomPublishInFather(initLog.debug, wireFondFiss, p1, "p1_%d"%iedf)
102     geomPublishInFather(initLog.debug, wireFondFiss, p2, "p2_%d"%iedf)
103
104     edgePart = geompy.MakePartition([localEdgeInFondFiss], [p1,p2], [], [], geompy.ShapeType["EDGE"], 0, [], 0)
105     edps = geompy.ExtractShapes(edgePart, geompy.ShapeType["EDGE"], True)
106     for edp in edps:
107       if geompy.MinDistance(centre, edp) < 1.e-3:
108         pipext = geompy.MakePipe(cercle, edp)
109         name = "pipeExt%d"%iedf
110         geomPublishInFather(initLog.debug, partitionPeauFissFond, pipext, name)
111         pipexts.append(pipext)
112
113     for ifa, face in enumerate(facesInside):
114       logging.debug("recherche edges communes entre une face inside et (faces onside, edges pipe et fond débouchante)")
115       edgesPeauFis = []
116       edgesPipeFis = []
117       edgesPipeFnd = []
118       try:
119         edgesPeauFis = geompy.GetSharedShapesMulti([geompy.MakeCompound(facesOnside), face], geompy.ShapeType["EDGE"])
120         logging.debug("    faces onside %s",edgesPeauFis)
121         edgesPipeFis = geompy.GetSharedShapesMulti([geompy.MakeCompound(edgesPipeIn), face], geompy.ShapeType["EDGE"])
122         logging.debug("    edgesPipeIn %s", edgesPipeFis)
123         edgesPipeFnd = geompy.GetSharedShapesMulti([geompy.MakeCompound(edgesFondIn), face], geompy.ShapeType["EDGE"])
124         logging.debug("    edgesFondIn %s ", edgesPipeFnd)
125       except:
126         logging.debug("  pb edges communes %s %s %s",edgesPeauFis, edgesPipeFis, edgesPipeFnd)
127         pass
128       if (len(edgesPeauFis) > 0) and (len(edgesPipeFis) > 0) and (len(edgesPipeFnd) == 0):
129         dist = geompy.MinDistance(geompy.MakeCompound(edgesPeauFis), ptPeau)
130         logging.debug("    test distance extrémité reference %s", dist)
131         if dist < 1.e-3: # c'est la face de fissure externe associée
132           logging.debug("    face %s inside ajoutée", ifa)
133           facesFissExt.append(face)
134           name="faceFissExt%d"%iedf
135           geomPublishInFather(initLog.debug, partitionPeauFissFond, face, name)
136           dist = 1.
137           for ipe, edpe in enumerate(edgesPeauFis):
138             for ipi, edpi in enumerate(edgesPipeFis):
139               dist = geompy.MinDistance(edpe, edpi)
140               if dist < 1.e-3:
141                 edgesFissExtPeau.append(edpe)
142                 name="edgesFissExtPeau%d"%iedf
143                 geomPublishInFather(initLog.debug, partitionPeauFissFond, edpe, name)
144                 edgesFissExtPipe.append(edpi)
145                 name="edgesFissExtPipe%d"%iedf
146                 geomPublishInFather(initLog.debug, partitionPeauFissFond, edpi, name)
147                 break
148             if dist < 1.e-3:
149               break
150
151   return (verticesEdgesFondIn, pipexts, cercles, facesFissExt, edgesFissExtPeau, edgesFissExtPipe)