1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021 EDF R&D
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"""
23 from .geomsmesh import geompy
24 from .geomsmesh import geomPublish
25 from .geomsmesh import geomPublishInFather
27 from .prolongeVertices import prolongeVertices
29 def creeZoneDefautGeom(objetSain, shapeDefaut, origShapes, verticesShapes, dmoyen, lgExtrusion=50):
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)
56 for ishape, vertices in enumerate(verticesShapes):
57 aShape = origShapes[ishape]
58 [face] = geompy.SubShapes(objetSain, [aShape])
60 curve = geompy.MakePolyline(vertices, False)
64 geomPublish(initLog.debug, curve, name)
66 cdg = geompy.MakeCDG(curve)
69 name="cdgpoly_%d"%aShape
70 geomPublish(initLog.debug, cdg, name)
72 projCdg = geompy.MakeProjection(cdg, face)
75 name="projCdg_%d"%aShape
76 geomPublish(initLog.debug, projCdg, name)
78 normal = geompy.GetNormal(face, projCdg)
79 normals.append(normal)
81 name="normal_%d"%aShape
82 geomPublish(initLog.debug, normal, name)
84 extrusion = geompy.MakePrismVecH2Ways(curve, normal, 10)
85 extrusions.append(extrusion)
87 name="extrusion_%d"%aShape
88 geomPublish(initLog.debug, extrusion, name)
90 verticesProlongees = prolongeVertices(vertices)
92 curveprol = geompy.MakePolyline(verticesProlongees, False)
94 name="polyProl_%d"%aShape
95 geomPublish(initLog.debug, curveprol, name)
97 extruprol = geompy.MakePrismVecH2Ways(curveprol, normal, 10)
99 name="extruProl_%d"%aShape
100 geomPublish(initLog.debug, extruprol, name)
102 partition = geompy.MakePartition([face], [extruprol], [], [], geompy.ShapeType["FACE"], 0, [], 0)
103 partitions.append(partition)
105 name="partition_%d"%aShape
106 geomPublish(initLog.debug, partition, name)
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):
116 logging.debug(" --- original shape %s", origShapes[indice])
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)
126 logging.debug("distance = %s", distance)
129 for j,d in enumerate(dists):
131 aFace = facesToSort[j]
132 name="decoupe_%d"%origShapes[indice]
133 geomPublish(initLog.debug, aFace, name)
134 decoupes.append(aFace)
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")
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
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()
157 for indice, la_face in enumerate(theFaces):
158 logging.debug(" try %s", la_face)
160 logging.debug(" with %s", aFace)
162 _ = geompy.GetSharedShapesMulti([aFace, la_face], geompy.ShapeType["EDGE"])
167 if la_face not in toAdd:
168 toAdd.append(la_face)
169 toRemove.append(indice)
170 logging.debug(" --- add %s", la_face)
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)
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):
187 theShellDefaut = shells[indice0]
189 else: # --- une seule face de defaut
190 subFaces = [facesDefaut]
191 theShellDefaut = geompy.MakeShell(subFaces)
193 geomPublish(initLog.debug, theShellDefaut,"theShellDefaut")
195 theFaces = geompy.ExtractShapes(theShellDefaut, geompy.ShapeType["FACE"], True)
197 for aFace in theFaces:
198 distances.append(geompy.MinDistance(aFace, centreSphere))
199 minDist = min(distances)
200 for indice, dist in enumerate(distances):
205 centreDefaut = geompy.MakeProjection(centreSphere, theFaces[indice0])
207 geomPublish(initLog.debug, centreDefaut, "centreDefaut")
208 normalDefaut = geompy.GetNormal(subFaces[indice0], centreDefaut)
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)
217 for i in range(1,len(solids)):
218 solid0 = geompy.MakeFuse(solid0, solids[i])
219 extrusionDefaut = solid0
221 geomPublish(initLog.debug, extrusionDefaut, "extrusionDefaut")
223 return facesDefaut, centreDefaut, normalDefaut, extrusionDefaut