1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2024 CEA, EDF
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 """Zone de défaut, constructions géométrique avec CAO d'origine"""
25 from .geomsmesh import geompy
26 from .geomsmesh import geomPublish
27 from .prolongeVertices import prolongeVertices
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
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)
54 for ishape, vertices in enumerate(verticesShapes):
55 aShape = origShapes[ishape]
56 [face] = geompy.SubShapes(objetSain, [aShape])
58 curve = geompy.MakePolyline(vertices, False)
62 geomPublish(initLog.debug, curve, name)
64 cdg = geompy.MakeCDG(curve)
67 name="cdgpoly_%d"%aShape
68 geomPublish(initLog.debug, cdg, name)
70 projCdg = geompy.MakeProjection(cdg, face)
73 name="projCdg_%d"%aShape
74 geomPublish(initLog.debug, projCdg, name)
76 normal = geompy.GetNormal(face, projCdg)
77 normals.append(normal)
79 name="normal_%d"%aShape
80 geomPublish(initLog.debug, normal, name)
82 extrusion = geompy.MakePrismVecH2Ways(curve, normal, 10)
83 extrusions.append(extrusion)
85 name="extrusion_%d"%aShape
86 geomPublish(initLog.debug, extrusion, name)
88 verticesProlongees = prolongeVertices(vertices)
90 curveprol = geompy.MakePolyline(verticesProlongees, False)
92 name="polyProl_%d"%aShape
93 geomPublish(initLog.debug, curveprol, name)
95 extruprol = geompy.MakePrismVecH2Ways(curveprol, normal, 10)
97 name="extruProl_%d"%aShape
98 geomPublish(initLog.debug, extruprol, name)
100 partition = geompy.MakePartition([face], [extruprol], [], [], geompy.ShapeType["FACE"], 0, [], 0)
101 partitions.append(partition)
103 name="partition_%d"%aShape
104 geomPublish(initLog.debug, partition, name)
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):
114 logging.debug(" --- original shape %s", origShapes[indice])
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)
124 logging.debug("distance = %s", distance)
127 for j,d in enumerate(dists):
129 aFace = facesToSort[j]
130 name="decoupe_%d"%origShapes[indice]
131 geomPublish(initLog.debug, aFace, name)
132 decoupes.append(aFace)
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")
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
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()
155 for indice, la_face in enumerate(theFaces):
156 logging.debug(" try %s", la_face)
158 logging.debug(" with %s", aFace)
160 _ = geompy.GetSharedShapesMulti([aFace, la_face], geompy.ShapeType["EDGE"])
165 if la_face not in toAdd:
166 toAdd.append(la_face)
167 toRemove.append(indice)
168 logging.debug(" --- add %s", la_face)
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)
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):
183 theShellDefaut = shells[indice]
186 else: # --- une seule face de defaut
187 subFaces = [facesDefaut]
188 theShellDefaut = geompy.MakeShell(subFaces)
190 geomPublish(initLog.debug, theShellDefaut,"theShellDefaut")
192 theFaces = geompy.ExtractShapes(theShellDefaut, geompy.ShapeType["FACE"], True)
194 for aFace in theFaces:
195 distances.append(geompy.MinDistance(aFace, centreSphere))
196 minDist = min(distances)
197 for indice, dist in enumerate(distances):
202 centreDefaut = geompy.MakeProjection(centreSphere, theFaces[indice0])
204 geomPublish(initLog.debug, centreDefaut, "centreDefaut")
205 normalDefaut = geompy.GetNormal(subFaces[indice0], centreDefaut)
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)
214 for i in range(1,len(solids)):
215 solid0 = geompy.MakeFuse(solid0, solids[i])
216 extrusionDefaut = solid0
218 geomPublish(initLog.debug, extrusionDefaut, "extrusionDefaut")
220 return facesDefaut, centreDefaut, normalDefaut, extrusionDefaut