-
- wireFondFiss = geompy.MakeWire(edgesInside, 1e-07)
-
- disque = geompy.MakeDiskPntVecR(centreFondFiss, tangentFondFiss, rayonPipe)
- [vertex] = geompy.ExtractShapes(disque, geompy.ShapeType["VERTEX"], False)
- vertproj = geompy.MakeProjection(vertex, planfiss)
- vec1 = geompy.MakeVector(centreFondFiss, vertex)
- try:
- # si centreFondFiss et vertproj sont proches: exception. Angle = +- 90°
- vec2 = geompy.MakeVector(centreFondFiss, vertproj)
- angle = geompy.GetAngleRadians(vec1, vec2)
- except:
- # on utilise la projection du centre sur la peau pour avoir un vecteur non nul
- vertproj = geompy.MakeProjection(centreFondFiss, facePeau)
- vec2 = geompy.MakeVector(centreFondFiss, vertproj)
- angle = geompy.GetAngleRadians(vec1, vec2)
- sommetAxe = geompy.MakeTranslationVector(centreFondFiss, tangentFondFiss)
- pm = produitMixte(centreFondFiss, vertex, vertproj, sommetAxe)
- if pm > 0:
- disque = geompy.MakeRotation(disque, tangentFondFiss, angle)
- else:
- disque = geompy.MakeRotation(disque, tangentFondFiss, -angle)
- [vertexReference] = geompy.ExtractShapes(disque, geompy.ShapeType["VERTEX"], False)
-
- pipeFondFiss = geompy.MakePipe(disque, wireFondFiss)
- pipeFondFiss = geompy.MakePartition([pipeFondFiss], [planfiss, wireFondFiss, planBord1, planBord2], [], [], geompy.ShapeType["SOLID"], 0, [], 0)
- #pipe = geompy.MakePipe(disque, WirePorteFondFissure)
- #pipe = geompy.MakePartition([pipe],[fillingFaceExterne], [], [], geompy.ShapeType["SOLID"], 0, [], 0)
- #pipes = geompy.ExtractShapes(pipe, geompy.ShapeType["SOLID"], False)
- #pipesSorted, volmin, volmax = sortSolids(pipes)
- #pipeFondFiss = pipesSorted[-1]
- #pipeFondFiss = geompy.MakePartition([pipeFondFiss], [planfiss, wireFondFiss, planBord1, planBord2], [], [], geompy.ShapeType["SOLID"], 0, [], 0)
-
- geompy.addToStudy( disque, 'disque')
- geompy.addToStudy( wireFondFiss, 'wireFondFiss')
- geompy.addToStudy( pipeFondFiss, 'pipeFondFiss')
-
- VerticesEndFondFiss = findWireEndVertices(wireFondFiss)
- for i, v in enumerate(VerticesEndFondFiss):
- name = "vertexEndFondFiss_%d"%i
- geompy.addToStudyInFather(wireFondFiss, v, name)
- VerticesEndPipeFiss = []
- for v in VerticesEndFondFiss:
- VerticesEndPipeFiss.append(geompy.GetInPlace(pipeFondFiss, v))
- for i, v in enumerate(VerticesEndPipeFiss):
- name = "vertexEndPipeFiss_%d"%i
- geompy.addToStudyInFather(pipeFondFiss, v, name)
-
- geompy.addToStudyInFather(pipeFondFiss, VerticesEndPipeFiss[0], "PFOR")
- geompy.addToStudyInFather(pipeFondFiss, VerticesEndPipeFiss[1], "PFEX")
- if geompy.MinDistance(VerticesEndPipeFiss[0], verticesOutCercles[0]) > geompy.MinDistance(VerticesEndPipeFiss[0], verticesOutCercles[1]):
- a = verticesOutCercles[0]
- verticesOutCercles[0] = verticesOutCercles[1]
- verticesOutCercles[1] = a
- geompy.addToStudyInFather(facePeau, verticesOutCercles[0], "THOR")
- geompy.addToStudyInFather(facePeau, verticesOutCercles[1], "THEX")
-
- [facesPipeInside, facesPipeOutside, facesPipeOnside] = extractionOrientee(fillingFaceExterne, pipeFondFiss, centreFondFiss, "FACE", 0.1, "pipe_bord_")
- [edgesPipeInside, edgesPipeOutside, edgesPipeOnside] = extractionOrientee(fillingFaceExterne, pipeFondFiss, centreFondFiss, "EDGE", 0.1, "pipe_bord_")
- disqueInt1 = geompy.GetInPlaceByHistory(pipeFondFiss, planBord1)
- disqueInt2 = geompy.GetInPlaceByHistory(pipeFondFiss, planBord2)
- disques = facesPipeOnside + [disqueInt1, disqueInt2]
- edgesDiskInt = geompy.ExtractShapes(disqueInt1, geompy.ShapeType["EDGE"], False)
- edgesDiskInt = edgesDiskInt +geompy.ExtractShapes(disqueInt2, geompy.ShapeType["EDGE"], False)
- edgesSorted, minlg, maxlg = sortEdges(edgesDiskInt) # 4 rayons, 2 demi cercles
-
- centre = geompy.MakeVertexOnSurface(planfiss, 0.5, 0.5)
- refpoint = geompy.MakeTranslationVector(centre, geompy.GetNormal(planfiss,centre))
- geompy.addToStudy(refpoint, 'refpoint')
- [facesPipeInplan, facesPipeOutplan, facesPipeOnplan] = extractionOrientee(planfiss, pipeFondFiss, refpoint, "FACE", 0.1, "pipe_plan_")
- [edgesPipeInplan, edgesPipeOutplan, edgesPipeOnplan] = extractionOrientee(planfiss, pipeFondFiss, refpoint, "EDGE", 0.1, "pipe_plan_")
-
- # --- rayon disques = (edgesPipeOnside inter edgesPipeOnplan) + rayons disque internes
- # demi cercles = edgesPipeOnside moins edgesPipeOnplan + demi cercles disque internes
- # generatrices = edgesPipeOnplan moins rayon disques (3 grandes et 6 petites)
- edgesIdPipeOnside = getSubshapeIds(pipeFondFiss, edgesPipeOnside)
- edgesIdPipeOnplan = getSubshapeIds(pipeFondFiss, edgesPipeOnplan)
- rayons = []
- demiCercles = []
- for i, edgeId in enumerate(edgesIdPipeOnside):
- if edgeId in edgesIdPipeOnplan:
- rayons.append(edgesPipeOnside[i])
- else:
- demiCercles.append(edgesPipeOnside[i])
- demiCerclesExternes = demiCercles
- rayons = rayons + edgesSorted[:4] # les 4 plus petits sont les rayons
- demiCercles = demiCercles + edgesSorted[4:] # les suivants sont les arcs de cercle
- rayonsId = getSubshapeIds(pipeFondFiss, rayons)
- generatrices = []
- for i, edgeId in enumerate(edgesIdPipeOnplan):
- if edgeId not in rayonsId:
- generatrices.append(edgesPipeOnplan[i])
-
- # --- generatrices en contact avec la face fissure externe au pipe
- generFiss = []
- for edge in generatrices:
- distance = geompy.MinDistance(vertexReference, edge)
- logging.debug("distance %s", distance)
- if distance < 1.e-5:
- generFiss.append(edge)
- break
- for edge in generatrices:
- distance = geompy.MinDistance(generFiss[0], edge)
- logging.debug("distance %s", distance)
- if distance < 1.e-5:
- generFiss.append(edge)
- groupGenerFiss = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
- geompy.UnionList(groupGenerFiss, generFiss)
- geompy.addToStudyInFather(pipeFondFiss, groupGenerFiss, "GenFiss")
-
- # --- demi cercles externes regroupés
- groupsDemiCerclesPipe = []
- for i, vertex in enumerate(verticesEdgePeauFiss):
- demis = []
- for edge in demiCerclesExternes:
- if geompy.MinDistance(vertex, edge) < 0.1:
- demis.append(edge)
- group = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
- geompy.UnionList(group, demis)
- name = "Cercle%d"%i
- geompy.addToStudyInFather(pipeFondFiss, group , name)
- groupsDemiCerclesPipe.append(group)
-
- # --- faces fissure dans le pipe
-
- facesFissinPipe = []
- generFissId = getSubshapeIds(pipeFondFiss, generFiss)
- logging.debug("generatrice fissure %s", generFissId)
- for face in facesPipeOnplan:
- edges =geompy.ExtractShapes(face, geompy.ShapeType["EDGE"], False)
- edgesId = getSubshapeIds(pipeFondFiss, edges)
- logging.debug(" edges %s", edgesId)
- for i,edgeId in enumerate(edgesId):
- if edgeId in generFissId:
- logging.debug("face found")
- facesFissinPipe.append(face)
- name = "faceFissInPipe_%d"%i
- geompy.addToStudyInFather(pipeFondFiss, face, name)
- break
- groupFaceFissInPipe = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["FACE"])
- geompy.UnionList(groupFaceFissInPipe, facesFissinPipe)
- name = "FaceFissInPipe"
- geompy.addToStudyInFather(pipeFondFiss, groupFaceFissInPipe , name)
-
- # --- edges de fond de fissure
-
- edgesFondFiss = []
- for i, edge in enumerate(edgesInside):
- anEdge = geompy.GetInPlace(pipeFondFiss, edge)
- logging.debug(" edge %s ", anEdge)
- edgesFondFiss.append(anEdge)
- name ="edgeFondFissure_%d"%i
- geompy.addToStudyInFather(pipeFondFiss, anEdge, name)
- groupEdgeFondFiss = geompy.CreateGroup(pipeFondFiss, geompy.ShapeType["EDGE"])
- geompy.UnionList(groupEdgeFondFiss, edgesFondFiss)
- name = "FONDFISS"
- geompy.addToStudyInFather(pipeFondFiss, groupEdgeFondFiss , name)
-
- # -------------------------------------------------------------------------
- # --- maillage
-
- # --- edges de bord face defaut à respecter
-
- aFilterManager = smesh.CreateFilterManager()
- nbAdded, internalBoundary, _NoneGroup = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [ ])
- criteres = []
- unCritere = smesh.GetCriterion(SMESH.EDGE,SMESH.FT_FreeBorders,SMESH.FT_Undefined,0)
- criteres.append(unCritere)
- filtre = smesh.GetFilterFromCriteria(criteres)
- bordsLibres = internalBoundary.MakeGroupByFilter( 'bords', filtre )
- smesh.SetName(bordsLibres, 'bordsLibres')
-
- # --- pour aider l'algo hexa-tetra a ne pas mettre de pyramides a l'exterieur des volumes replies sur eux-memes
- # on designe les faces de peau en quadrangles par le groupe "skinFaces"
-
- skinFaces = internalBoundary.CreateEmptyGroup( SMESH.FACE, 'skinFaces' )
- nbAdd = skinFaces.AddFrom( internalBoundary.GetMesh() )