# -*- coding: utf-8 -*-
-# Copyright (C) 2014-2020 EDF R&D
+# Copyright (C) 2014-2021 EDF R&D
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
+"""Préparation maillage du pipe"""
import logging
import math
from .geomsmesh import geompy
from .geomsmesh import smesh
+from .putName import putName
+
def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut,
centreFondFiss, wireFondFiss, wirePipeFiss,
- lenSegPipe, rayonPipe, nbsegCercle, nbsegRad):
- """preparation maillage du pipe :
+ lenSegPipe, rayonPipe, nbsegCercle, nbsegRad, \
+ nro_cas=-1):
+ """Préparation maillage du pipe :
- détections des points a respecter : jonction des edges/faces constituant
la face de fissure externe au pipe
"""
logging.info('start')
+ logging.info("Pour le cas n°%d", nro_cas)
# --- option de maillage selon le rayon de courbure du fond de fissure
lenEdgeFondExt = 0
meshFondExt = smesh.Mesh(wireFondFiss)
algo1d = meshFondExt.Segment()
hypo1d = algo1d.Adaptive(lgmin, lgmax, deflexion) # a ajuster selon la profondeur de la fissure
+ putName(algo1d.GetSubMesh(), "wireFondFiss", i_pref=nro_cas)
+ putName(algo1d, "algo1d_wireFondFiss", i_pref=nro_cas)
+ putName(hypo1d, "hypo1d_wireFondFiss", i_pref=nro_cas)
+
is_done = meshFondExt.Compute()
text = "calculePointsAxiauxPipe meshFondExt.Compute"
if is_done:
for nodeId in allNodeIds:
xyz = meshFondExt.GetNodeXYZ(nodeId)
#logging.debug("nodeId %s, coords %s", nodeId, str(xyz))
- pt = geompy.MakeVertex(xyz[0], xyz[1], xyz[2])
- u, PointOnEdge, EdgeInWireIndex = geompy.MakeProjectionOnWire(pt, wireFondFiss) # u compris entre 0 et 1
+ point = geompy.MakeVertex(xyz[0], xyz[1], xyz[2])
+ parametre, _, EdgeInWireIndex = geompy.MakeProjectionOnWire(point, wireFondFiss) # parametre compris entre 0 et 1
edgeOrder = edgesIdByOrientation[EdgeInWireIndex]
- ptGSdic[(edgeOrder, EdgeInWireIndex, u)] = pt
- #logging.debug("nodeId %s, u %s", nodeId, str(u))
+ ptGSdic[(edgeOrder, EdgeInWireIndex, parametre)] = point
+ #logging.debug("nodeId %s, parametre %s", nodeId, str(parametre))
usort = sorted(ptGSdic)
logging.debug("nombre de points obtenus par deflexion %s",len(usort))
normals = list()
for edu in usort:
ied = edu[1]
- u = edu[2]
+ parametre = edu[2]
vertcx = ptGSdic[edu]
- norm = geompy.MakeTangentOnCurve(edgesFondFiss[ied], u)
- plan = geompy.MakePlane(vertcx, norm, 3*rayonPipe)
+ norm = geompy.MakeTangentOnCurve(edgesFondFiss[ied], parametre)
+ plan = geompy.MakePlane(vertcx, norm, 3.*rayonPipe)
part = geompy.MakePartition([plan], [wirePipeFiss], list(), list(), geompy.ShapeType["VERTEX"], 0, list(), 0)
liste = geompy.ExtractShapes(part, geompy.ShapeType["VERTEX"], True)
if len(liste) == 5: # 4 coins du plan plus intersection recherchée
# --- points géométriques
gptsdisks = list() # vertices géométrie de tous les disques
- raydisks = [list() for i in range(nbsegCercle)]
- for i, centres_i in enumerate(centres): # boucle sur les disques
+ raydisks = [list() for _ in range(nbsegCercle)]
+ for indice, centres_i in enumerate(centres): # boucle sur les disques
gptdsk = list() # vertices géométrie d'un disque
vertcx = centres_i
- vertpx = origins[i]
- normal = normals[i]
+ vertpx = origins[indice]
+ normal = normals[indice]
vec1 = geompy.MakeVector(vertcx, vertpx)
points = [vertcx] # les points du rayon de référence
+ dist_0 = rayonPipe/float(nbsegRad)
for j in range(nbsegRad):
- pt = geompy.MakeTranslationVectorDistance(vertcx, vec1, (j+1)*float(rayonPipe)/nbsegRad)
- points.append(pt)
+ point = geompy.MakeTranslationVectorDistance(vertcx, vec1, (j+1)*dist_0)
+ points.append(point)
gptdsk.append(points)
- pt = geompy.MakeTranslationVectorDistance(vertcx, vec1, 1.5*rayonPipe)
- rayon = geompy.MakeLineTwoPnt(vertcx, pt)
+ point = geompy.MakeTranslationVectorDistance(vertcx, vec1, 1.5*rayonPipe)
+ rayon = geompy.MakeLineTwoPnt(vertcx, point)
raydisks[0].append(rayon)
+ angle_0 = 2.*math.pi/float(nbsegCercle)
for k in range(nbsegCercle-1):
- angle = (k+1)*2*math.pi/nbsegCercle
+ angle = float(k+1)*angle_0
pts = [vertcx] # les points d'un rayon obtenu par rotation
for j in range(nbsegRad):
- pt = geompy.MakeRotation(points[j+1], normal, angle)
- pts.append(pt)
+ point = geompy.MakeRotation(points[j+1], normal, angle)
+ pts.append(point)
gptdsk.append(pts)
ray = geompy.MakeRotation(rayon, normal, angle)
raydisks[k+1].append(ray)