Salome HOME
Update of CheckDone
[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 . import initLog
24
25 from .geomsmesh import geompy
26 from .geomsmesh import geomPublish
27 from .prolongeVertices import prolongeVertices
28
29 def creeZoneDefautGeom(objetSain, shapeDefaut, origShapes, verticesShapes, lgExtrusion=50):
30   """Construction CAO de la zone à remailler, quand on utilise la CAO d'origine,apres appel creeZoneDefautMaillage
31
32   @param objetSain : la géometrie de l'objet initial
33   @param shapeDefaut : objet géometrique représentant la fissure
34   (selon les cas, un point central, ou une shape plus complexe,
35   dont on ne garde que les vertices)
36   @param origShapes : liste id subShapes
37   @param verticesShapes : listes noeuds de bord
38   @lgExtrusion : distance d'extrusion de la face du defaut
39   (ne vaut que pour des fissures courtes)
40   @return (facesDefaut, centreDefaut, normalDefaut, extrusionDefaut)
41   """
42   logging.info("start")
43
44   trace = True
45   faces = list()
46   curves = list()
47   cdgs = list()
48   projs = list()
49   normals = list()
50   extrusions = list()
51   partitions = list()
52   decoupes = list()
53
54   for ishape, vertices in enumerate(verticesShapes):
55     aShape = origShapes[ishape]
56     [face] = geompy.SubShapes(objetSain, [aShape])
57     faces.append(face)
58     curve = geompy.MakePolyline(vertices, False)
59     curves.append(curve)
60     if trace:
61       name="poly_%d"%aShape
62       geomPublish(initLog.debug, curve, name)
63     #
64     cdg = geompy.MakeCDG(curve)
65     cdgs.append(cdg)
66     if trace:
67       name="cdgpoly_%d"%aShape
68       geomPublish(initLog.debug, cdg, name)
69     #
70     projCdg = geompy.MakeProjection(cdg, face)
71     projs.append(projCdg)
72     if trace:
73       name="projCdg_%d"%aShape
74       geomPublish(initLog.debug, projCdg, name)
75     #
76     normal = geompy.GetNormal(face, projCdg)
77     normals.append(normal)
78     if trace:
79       name="normal_%d"%aShape
80       geomPublish(initLog.debug, normal, name)
81     #
82     extrusion = geompy.MakePrismVecH2Ways(curve, normal, 10)
83     extrusions.append(extrusion)
84     if trace:
85       name="extrusion_%d"%aShape
86       geomPublish(initLog.debug, extrusion, name)
87     #
88     verticesProlongees = prolongeVertices(vertices)
89     #
90     curveprol = geompy.MakePolyline(verticesProlongees, False)
91     if trace:
92       name="polyProl_%d"%aShape
93       geomPublish(initLog.debug, curveprol, name)
94     #
95     extruprol = geompy.MakePrismVecH2Ways(curveprol, normal, 10)
96     if trace:
97       name="extruProl_%d"%aShape
98       geomPublish(initLog.debug, extruprol, name)
99     #
100     partition = geompy.MakePartition([face], [extruprol], [], [], geompy.ShapeType["FACE"], 0, [], 0)
101     partitions.append(partition)
102     if trace:
103       name="partition_%d"%aShape
104       geomPublish(initLog.debug, partition, name)
105   #
106
107   centreSphere = geompy.MakeCDG(shapeDefaut)
108   geomPublish(initLog.debug, centreSphere, "cdg_defaut")
109   ccurves = geompy.MakeCompound(curves)
110   gravCenter = geompy.MakeCDG(ccurves)
111   geomPublish(initLog.debug, gravCenter, "cdg_curves")
112   for indice, part in enumerate(partitions):
113     if trace:
114       logging.debug(" --- original shape %s", origShapes[indice])
115     dists = list()
116     facesToSort = list()
117     subFaces = geompy.ExtractShapes(part, geompy.ShapeType["FACE"], True)
118     for aFace in subFaces:
119       cdg = geompy.MakeCDG(aFace)
120       distance = geompy.MinDistance(cdg, centreSphere)
121       dists.append(distance)
122       facesToSort.append(aFace)
123       if trace:
124         logging.debug("distance = %s", distance)
125     if len(dists) > 0:
126       minDist = min(dists)
127       for j,d in enumerate(dists):
128         if d == minDist:
129           aFace = facesToSort[j]
130           name="decoupe_%d"%origShapes[indice]
131           geomPublish(initLog.debug, aFace, name)
132           decoupes.append(aFace)
133           break
134
135   facesDefaut = decoupes[0]
136   if len(decoupes) > 1:
137     facesDefaut = geompy.MakePartition(decoupes, [], [], [], geompy.ShapeType["FACE"], 0, [], 0)
138   geomPublish(initLog.debug, facesDefaut, "facesDefaut")
139
140   shells = list()
141   if len(decoupes) > 1: # plusieurs faces de defaut
142     subFaces = geompy.ExtractShapes(facesDefaut, geompy.ShapeType["FACE"], True)
143     # --- regroupe les subFaces en shells connectes
144     theFaces = list(subFaces) # copy
145     while theFaces:
146       logging.debug("------- len(theFaces) %s" , len(theFaces))
147       theFace = theFaces[0]
148       logging.debug("  start with face %s",theFaces[0])
149       theFaces[0:1] = list()
150       aShell = [theFace]
151       toAdd =[theFace]
152       while toAdd:
153         toAdd = list()
154         toRemove = list()
155         for indice, la_face in enumerate(theFaces):
156           logging.debug("  try %s", la_face)
157           for aFace in aShell:
158             logging.debug("    with %s", aFace)
159             try:
160               _ = geompy.GetSharedShapesMulti([aFace, la_face], geompy.ShapeType["EDGE"])
161               edgeShared = True
162             except:
163               edgeShared = False
164             if edgeShared:
165               if la_face not in toAdd:
166                 toAdd.append(la_face)
167                 toRemove.append(indice)
168                 logging.debug("    --- add %s", la_face)
169         aShell += toAdd
170         for k in sorted(toRemove, reverse=True):
171           theFaces[k:k+1] = list()
172       theShell = geompy.MakeShell(aShell)
173       name = "theShell%d"%len(shells)
174       geomPublish(initLog.debug, theShell,name)
175       shells.append(theShell)
176     #
177     distances = list()
178     for aShell in shells: # --- trouver le shell en contact avec la fissure
179       distances.append(geompy.MinDistance(aShell, shapeDefaut))
180     minDist = min(distances)
181     for indice, dist in enumerate(distances):
182       if dist == minDist:
183         theShellDefaut = shells[indice]
184         break
185     #
186   else: # --- une seule face de defaut
187     subFaces = [facesDefaut]
188     theShellDefaut = geompy.MakeShell(subFaces)
189   if trace:
190     geomPublish(initLog.debug, theShellDefaut,"theShellDefaut")
191
192   theFaces = geompy.ExtractShapes(theShellDefaut, geompy.ShapeType["FACE"], True)
193   distances = list()
194   for aFace in theFaces:
195     distances.append(geompy.MinDistance(aFace, centreSphere))
196   minDist = min(distances)
197   for indice, dist in enumerate(distances):
198     if dist == minDist:
199       indice0 = indice
200       break
201
202   centreDefaut = geompy.MakeProjection(centreSphere, theFaces[indice0])
203   if trace:
204     geomPublish(initLog.debug, centreDefaut, "centreDefaut")
205   normalDefaut = geompy.GetNormal(subFaces[indice0], centreDefaut)
206   if trace:
207     geomPublish(initLog.debug, normalDefaut, "normalDefaut")
208   extrusionDefaut = geompy.MakePrismVecH(theShellDefaut, normalDefaut, -lgExtrusion)
209   info = geompy.ShapeInfo(extrusionDefaut)
210   logging.debug("shape info %s", info)
211   if (info['SOLID'] > 1) or (info['COMPOUND'] > 0) :
212     solids = geompy.ExtractShapes(extrusionDefaut, geompy.ShapeType["SOLID"], True)
213     solid0 = solids[0]
214     for i in range(1,len(solids)):
215       solid0 = geompy.MakeFuse(solid0, solids[i])
216     extrusionDefaut = solid0
217   if trace:
218     geomPublish(initLog.debug, extrusionDefaut, "extrusionDefaut")
219
220   return facesDefaut, centreDefaut, normalDefaut, extrusionDefaut