Salome HOME
controle_python
[modules/smesh.git] / src / Tools / blocFissure / gmu / creeZoneDefautGeom.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021  EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 """Zone de défaut, constructions géométrique avec CAO d'origine"""
21
22 import logging
23 from .geomsmesh import geompy
24 from .geomsmesh import geomPublish
25 from .geomsmesh import geomPublishInFather
26 from . import initLog
27 from .prolongeVertices import prolongeVertices
28
29 def creeZoneDefautGeom(objetSain, shapeDefaut, origShapes, verticesShapes, dmoyen, lgExtrusion=50):
30   """
31   Construction CAO de la zone à remailler, quand on utilise la CAO d'origine,
32   apres appel creeZoneDefautMaillage
33   @param objetSain : la géometrie de l'objet initial
34   @param shapeDefaut : objet géometrique représentant la fissure
35   (selon les cas, un point central, ou une shape plus complexe,
36   dont on ne garde que les vertices)
37   @param origShapes : liste id subShapes
38   @param verticesShapes : listes noeuds de bord
39   @param dmoyen : longueur arete moyenne bord
40   @lgExtrusion : distance d'extrusion de la face du defaut
41   (ne vaut que pour des fissures courtes)
42   @return (facesDefaut, centreDefaut, normalDefaut, extrusionDefaut)
43   """
44   logging.info("start")
45
46   trace = True
47   faces = list()
48   curves = list()
49   cdgs = list()
50   projs = list()
51   normals = list()
52   extrusions = list()
53   partitions = list()
54   decoupes = list()
55
56   for ishape, vertices in enumerate(verticesShapes):
57     aShape = origShapes[ishape]
58     [face] = geompy.SubShapes(objetSain, [aShape])
59     faces.append(face)
60     curve = geompy.MakePolyline(vertices, False)
61     curves.append(curve)
62     if trace:
63       name="poly_%d"%aShape
64       geomPublish(initLog.debug, curve, name)
65     #
66     cdg = geompy.MakeCDG(curve)
67     cdgs.append(cdg)
68     if trace:
69       name="cdgpoly_%d"%aShape
70       geomPublish(initLog.debug, cdg, name)
71     #
72     projCdg = geompy.MakeProjection(cdg, face)
73     projs.append(projCdg)
74     if trace:
75       name="projCdg_%d"%aShape
76       geomPublish(initLog.debug, projCdg, name)
77     #
78     normal = geompy.GetNormal(face, projCdg)
79     normals.append(normal)
80     if trace:
81       name="normal_%d"%aShape
82       geomPublish(initLog.debug, normal, name)
83     #
84     extrusion = geompy.MakePrismVecH2Ways(curve, normal, 10)
85     extrusions.append(extrusion)
86     if trace:
87       name="extrusion_%d"%aShape
88       geomPublish(initLog.debug, extrusion, name)
89     #
90     verticesProlongees = prolongeVertices(vertices)
91     #
92     curveprol = geompy.MakePolyline(verticesProlongees, False)
93     if trace:
94       name="polyProl_%d"%aShape
95       geomPublish(initLog.debug, curveprol, name)
96     #
97     extruprol = geompy.MakePrismVecH2Ways(curveprol, normal, 10)
98     if trace:
99       name="extruProl_%d"%aShape
100       geomPublish(initLog.debug, extruprol, name)
101     #
102     partition = geompy.MakePartition([face], [extruprol], [], [], geompy.ShapeType["FACE"], 0, [], 0)
103     partitions.append(partition)
104     if trace:
105       name="partition_%d"%aShape
106       geomPublish(initLog.debug, partition, name)
107   #
108
109   centreSphere = geompy.MakeCDG(shapeDefaut)
110   geomPublish(initLog.debug, centreSphere, "cdg_defaut")
111   ccurves = geompy.MakeCompound(curves)
112   gravCenter = geompy.MakeCDG(ccurves)
113   geomPublish(initLog.debug, gravCenter, "cdg_curves")
114   for indice, part in enumerate(partitions):
115     if trace:
116       logging.debug(" --- original shape %s", origShapes[indice])
117     dists = list()
118     facesToSort = list()
119     subFaces = geompy.ExtractShapes(part, geompy.ShapeType["FACE"], True)
120     for aFace in subFaces:
121       cdg = geompy.MakeCDG(aFace)
122       distance = geompy.MinDistance(cdg, centreSphere)
123       dists.append(distance)
124       facesToSort.append(aFace)
125       if trace:
126         logging.debug("distance = %s", distance)
127     if len(dists) > 0:
128       minDist = min(dists)
129       for j,d in enumerate(dists):
130         if d == minDist:
131           aFace = facesToSort[j]
132           name="decoupe_%d"%origShapes[indice]
133           geomPublish(initLog.debug, aFace, name)
134           decoupes.append(aFace)
135           break
136
137   facesDefaut = decoupes[0]
138   if len(decoupes) > 1:
139     facesDefaut = geompy.MakePartition(decoupes, [], [], [], geompy.ShapeType["FACE"], 0, [], 0)
140   geomPublish(initLog.debug, facesDefaut, "facesDefaut")
141
142   shells = list()
143   if len(decoupes) > 1: # plusieurs faces de defaut
144     subFaces = geompy.ExtractShapes(facesDefaut, geompy.ShapeType["FACE"], True)
145     # --- regroupe les subFaces en shells connectes
146     theFaces = list(subFaces) # copy
147     while theFaces:
148       logging.debug("------- len(theFaces) %s" , len(theFaces))
149       theFace = theFaces[0]
150       logging.debug("  start with face %s",theFaces[0])
151       theFaces[0:1] = list()
152       aShell = [theFace]
153       toAdd =[theFace]
154       while toAdd:
155         toAdd = list()
156         toRemove = list()
157         for indice, la_face in enumerate(theFaces):
158           logging.debug("  try %s", la_face)
159           for aFace in aShell:
160             logging.debug("    with %s", aFace)
161             try:
162               _ = geompy.GetSharedShapesMulti([aFace, la_face], geompy.ShapeType["EDGE"])
163               edgeShared = True
164             except:
165               edgeShared = False
166             if edgeShared:
167               if la_face not in toAdd:
168                 toAdd.append(la_face)
169                 toRemove.append(indice)
170                 logging.debug("    --- add %s", la_face)
171         aShell += toAdd
172         for k in sorted(toRemove, reverse=True):
173           theFaces[k:k+1] = list()
174       theShell = geompy.MakeShell(aShell)
175       name = "theShell%d"%len(shells)
176       geomPublish(initLog.debug, theShell,name)
177       shells.append(theShell)
178     #
179     distances = list()
180     for aShell in shells: # --- trouver le shell en contact avec la fissure
181       distances.append(geompy.MinDistance(aShell, shapeDefaut))
182     minDist = min(distances)
183     for indice, dist in enumerate(distances):
184       if dist == minDist:
185         indice0 = indice
186         break
187     theShellDefaut = shells[indice0]
188     #
189   else: # --- une seule face de defaut
190     subFaces = [facesDefaut]
191     theShellDefaut = geompy.MakeShell(subFaces)
192   if trace:
193     geomPublish(initLog.debug, theShellDefaut,"theShellDefaut")
194
195   theFaces = geompy.ExtractShapes(theShellDefaut, geompy.ShapeType["FACE"], True)
196   distances = list()
197   for aFace in theFaces:
198     distances.append(geompy.MinDistance(aFace, centreSphere))
199   minDist = min(distances)
200   for indice, dist in enumerate(distances):
201     if dist == minDist:
202       indice0 = indice
203       break
204
205   centreDefaut = geompy.MakeProjection(centreSphere, theFaces[indice0])
206   if trace:
207     geomPublish(initLog.debug, centreDefaut, "centreDefaut")
208   normalDefaut = geompy.GetNormal(subFaces[indice0], centreDefaut)
209   if trace:
210     geomPublish(initLog.debug, normalDefaut, "normalDefaut")
211   extrusionDefaut = geompy.MakePrismVecH(theShellDefaut, normalDefaut, -lgExtrusion)
212   info = geompy.ShapeInfo(extrusionDefaut)
213   logging.debug("shape info %s", info)
214   if (info['SOLID'] > 1) or (info['COMPOUND'] > 0) :
215     solids = geompy.ExtractShapes(extrusionDefaut, geompy.ShapeType["SOLID"], True)
216     solid0 = solids[0]
217     for i in range(1,len(solids)):
218       solid0 = geompy.MakeFuse(solid0, solids[i])
219     extrusionDefaut = solid0
220   if trace:
221     geomPublish(initLog.debug, extrusionDefaut, "extrusionDefaut")
222
223   return facesDefaut, centreDefaut, normalDefaut, extrusionDefaut