1 # -*- coding: utf-8 -*-
4 from geomsmesh import geompy
5 from prolongeVertices import prolongeVertices
7 # -----------------------------------------------------------------------------
8 # --- zone de defaut, constructions geometrique avec CAO d'origine
10 def creeZoneDefautGeom(objetSain, shapeDefaut, origShapes, verticesShapes, dmoyen, lgExtrusion=50):
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)
37 for ishape, vertices in enumerate(verticesShapes):
38 aShape = origShapes[ishape]
39 [face] = geompy.SubShapes(objetSain, [aShape])
41 curve = geompy.MakePolyline(vertices, False)
45 geompy.addToStudy(curve, name)
47 cdg = geompy.MakeCDG(curve)
50 name="cdgpoly_%d"%aShape
51 geompy.addToStudy(cdg, name)
53 projCdg = geompy.MakeProjection(cdg, face)
56 name="projCdg_%d"%aShape
57 geompy.addToStudy(projCdg, name)
59 normal = geompy.GetNormal(face, projCdg)
60 normals.append(normal)
62 name="normal_%d"%aShape
63 geompy.addToStudy(normal, name)
65 extrusion = geompy.MakePrismVecH2Ways(curve, normal, 10)
66 extrusions.append(extrusion)
68 name="extrusion_%d"%aShape
69 geompy.addToStudy(extrusion, name)
71 verticesProlongees = prolongeVertices(vertices)
73 curveprol = geompy.MakePolyline(verticesProlongees, False)
75 name="polyProl_%d"%aShape
76 geompy.addToStudy(curveprol, name)
78 extruprol = geompy.MakePrismVecH2Ways(curveprol, normal, 10)
80 name="extruProl_%d"%aShape
81 geompy.addToStudy(extruprol, name)
83 partition = geompy.MakePartition([face], [extruprol], [], [], geompy.ShapeType["FACE"], 0, [], 0)
84 partitions.append(partition)
86 name="partition_%d"%aShape
87 geompy.addToStudy(partition, name)
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)):
98 logging.debug(" --- original shape %s", origShapes[i])
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)
108 logging.debug("distance = %s", distance)
113 for j,d in enumerate(dists):
115 aFace = facesToSort[j]
116 name="decoupe_%d"%origShapes[i]
117 geompy.addToStudy(aFace, name)
118 decoupes.append(aFace)
123 facesDefaut = decoupes[0]
124 if len(decoupes) > 1:
125 facesDefaut = geompy.MakePartition(decoupes, [], [], [], geompy.ShapeType["FACE"], 0, [], 0)
126 geompy.addToStudy(facesDefaut, "facesDefaut")
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])
140 while len(toAdd) > 0:
143 for i in range(len(theFaces)):
144 logging.debug(" try %s", theFaces[i])
146 logging.debug(" with %s", aFace)
148 edge = geompy.GetSharedShapesMulti([aFace, theFaces[i]], geompy.ShapeType["EDGE"])
153 if theFaces[i] not in toAdd:
154 toAdd.append(theFaces[i])
156 logging.debug(" --- add %s", theFaces[i])
158 for k in sorted(toRemove, reverse=True):
160 theShell = geompy.MakeShell(aShell)
161 name = "theShell%d"%len(shells)
162 geompy.addToStudy(theShell,name)
163 shells.append(theShell)
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:
172 theShellDefaut = shells[index]
174 else: # --- une seule face de defaut
175 subFaces = [facesDefaut]
176 theShellDefaut = geompy.MakeShell(subFaces)
178 geompy.addToStudy(theShellDefaut,"theShellDefaut")
180 theFaces = geompy.ExtractShapes(theShellDefaut, geompy.ShapeType["FACE"], True)
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:
189 centreDefaut = geompy.MakeProjection(centreSphere, theFaces[index])
191 geompy.addToStudy(centreDefaut, "centreDefaut")
192 normalDefaut = geompy.GetNormal(subFaces[index], centreDefaut)
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)
201 for i in range(1,len(solids)):
202 solid0 = geompy.MakeFuse(solid0, solids[i])
203 extrusionDefaut = solid0
205 geompy.addToStudy(extrusionDefaut, "extrusionDefaut")
207 return facesDefaut, centreDefaut, normalDefaut, extrusionDefaut