smesh/src/Tools/blocFissure/gmu/creeZoneDefautGeom.py

208 lines
6.8 KiB
Python
Raw Normal View History

2014-01-09 20:20:44 +06:00
# -*- coding: utf-8 -*-
import logging
from geomsmesh import geompy
from prolongeVertices import prolongeVertices
# -----------------------------------------------------------------------------
# --- zone de defaut, constructions geometrique avec CAO d'origine
def creeZoneDefautGeom(objetSain, shapeDefaut, origShapes, verticesShapes, dmoyen, lgExtrusion=50):
"""
Construction CAO de la zone à remailler, quand on utilise la CAO d'origine,
apres appel creeZoneDefautMaillage
@param objetSain : la géometrie de l'objet initial
@param shapeDefaut : objet géometrique représentant la fissure
(selon les cas, un point central, ou une shape plus complexe,
dont on ne garde que les vertices)
@param origShapes : liste id subShapes
@param verticesShapes : listes noeuds de bord
@param dmoyen : longueur arete moyenne bord
@lgExtrusion : distance d'extrusion de la face du defaut
(ne vaut que pour des fissures courtes)
@return (facesDefaut, centreDefaut, normalDefaut, extrusionDefaut)
"""
logging.info("start")
trace = True
faces = []
curves = []
cdgs = []
projs = []
normals = []
extrusions = []
partitions = []
decoupes = []
for ishape, vertices in enumerate(verticesShapes):
aShape = origShapes[ishape]
[face] = geompy.SubShapes(objetSain, [aShape])
faces.append(face)
curve = geompy.MakePolyline(vertices, False)
curves.append(curve)
if trace:
name="poly_%d"%aShape
geompy.addToStudy(curve, name)
#
cdg = geompy.MakeCDG(curve)
cdgs.append(cdg)
if trace:
name="cdgpoly_%d"%aShape
geompy.addToStudy(cdg, name)
#
projCdg = geompy.MakeProjection(cdg, face)
projs.append(projCdg)
if trace:
name="projCdg_%d"%aShape
geompy.addToStudy(projCdg, name)
#
normal = geompy.GetNormal(face, projCdg)
normals.append(normal)
if trace:
name="normal_%d"%aShape
geompy.addToStudy(normal, name)
#
extrusion = geompy.MakePrismVecH2Ways(curve, normal, 10)
extrusions.append(extrusion)
if trace:
name="extrusion_%d"%aShape
geompy.addToStudy(extrusion, name)
#
verticesProlongees = prolongeVertices(vertices)
#
curveprol = geompy.MakePolyline(verticesProlongees, False)
if trace:
name="polyProl_%d"%aShape
geompy.addToStudy(curveprol, name)
#
extruprol = geompy.MakePrismVecH2Ways(curveprol, normal, 10)
if trace:
name="extruProl_%d"%aShape
geompy.addToStudy(extruprol, name)
#
partition = geompy.MakePartition([face], [extruprol], [], [], geompy.ShapeType["FACE"], 0, [], 0)
partitions.append(partition)
if trace:
name="partition_%d"%aShape
geompy.addToStudy(partition, name)
pass
#
centreSphere = geompy.MakeCDG(shapeDefaut)
geompy.addToStudy(centreSphere, "cdg_defaut")
ccurves = geompy.MakeCompound(curves)
gravCenter = geompy.MakeCDG(ccurves)
geompy.addToStudy(gravCenter, "cdg_curves")
for i in range(len(partitions)):
if trace:
logging.debug(" --- original shape %s", origShapes[i])
dists = []
facesToSort = []
subFaces = geompy.ExtractShapes(partitions[i], geompy.ShapeType["FACE"], True)
for aFace in subFaces:
cdg = geompy.MakeCDG(aFace)
distance = geompy.MinDistance(cdg, centreSphere)
dists.append(distance)
facesToSort.append(aFace)
if trace:
logging.debug("distance = %s", distance)
pass
pass
if len(dists) > 0:
minDist = min(dists)
for j,d in enumerate(dists):
if d == minDist:
aFace = facesToSort[j]
name="decoupe_%d"%origShapes[i]
geompy.addToStudy(aFace, name)
decoupes.append(aFace)
break
pass
pass
facesDefaut = decoupes[0]
if len(decoupes) > 1:
facesDefaut = geompy.MakePartition(decoupes, [], [], [], geompy.ShapeType["FACE"], 0, [], 0)
geompy.addToStudy(facesDefaut, "facesDefaut")
shells=[]
if len(decoupes) > 1: # plusieurs faces de defaut
subFaces = geompy.ExtractShapes(facesDefaut, geompy.ShapeType["FACE"], True)
# --- regroupe les subFaces en shells connectes
theFaces = list(subFaces) # copy
while len(theFaces) > 0:
logging.debug("------- len(theFaces) %s" , len(theFaces))
theFace = theFaces[0]
logging.debug(" start with face %s",theFaces[0])
theFaces[0:1] = []
aShell = [theFace]
toAdd =[theFace]
while len(toAdd) > 0:
toAdd = []
toRemove = []
for i in range(len(theFaces)):
logging.debug(" try %s", theFaces[i])
for aFace in aShell:
logging.debug(" with %s", aFace)
try:
edge = geompy.GetSharedShapesMulti([aFace, theFaces[i]], geompy.ShapeType["EDGE"])
edgeShared = True
except:
edgeShared = False
if edgeShared:
if theFaces[i] not in toAdd:
toAdd.append(theFaces[i])
toRemove.append(i)
logging.debug(" --- add %s", theFaces[i])
aShell += toAdd
for k in sorted(toRemove, reverse=True):
theFaces[k:k+1] = []
theShell = geompy.MakeShell(aShell)
name = "theShell%d"%len(shells)
geompy.addToStudy(theShell,name)
shells.append(theShell)
#
distances = []
for aShell in shells: # --- trouver le shell en contact avec la fissure
distances.append(geompy.MinDistance(aShell, shapeDefaut))
minDist = min(distances)
for index in range(len(distances)):
if distances[index] == minDist:
break
theShellDefaut = shells[index]
#
else: # --- une seule face de defaut
subFaces = [facesDefaut]
theShellDefaut = geompy.MakeShell(subFaces)
if trace:
geompy.addToStudy(theShellDefaut,"theShellDefaut")
theFaces = geompy.ExtractShapes(theShellDefaut, geompy.ShapeType["FACE"], True)
distances = []
for aFace in theFaces:
distances.append(geompy.MinDistance(aFace, centreSphere))
minDist = min(distances)
for index in range(len(distances)):
if distances[index] == minDist:
break
centreDefaut = geompy.MakeProjection(centreSphere, theFaces[index])
if trace:
geompy.addToStudy(centreDefaut, "centreDefaut")
normalDefaut = geompy.GetNormal(subFaces[index], centreDefaut)
if trace:
geompy.addToStudy(normalDefaut, "normalDefaut")
extrusionDefaut = geompy.MakePrismVecH(theShellDefaut, normalDefaut, -lgExtrusion)
info = geompy.ShapeInfo(extrusionDefaut)
logging.debug("shape info %s", info)
if (info['SOLID'] > 1) or (info['COMPOUND'] > 0) :
solids = geompy.ExtractShapes(extrusionDefaut, geompy.ShapeType["SOLID"], True)
solid0 = solids[0]
for i in range(1,len(solids)):
solid0 = geompy.MakeFuse(solid0, solids[i])
extrusionDefaut = solid0
if trace:
geompy.addToStudy(extrusionDefaut, "extrusionDefaut")
return facesDefaut, centreDefaut, normalDefaut, extrusionDefaut