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