Salome HOME
poursuite du découpage en fonctions plus simples
[modules/smesh.git] / src / Tools / blocFissure / gmu / calculePointsAxiauxPipe.py
1 # -*- coding: utf-8 -*-
2
3 import logging
4 import math
5
6 from geomsmesh import geompy
7 from geomsmesh import smesh
8   
9 def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut, 
10                             centreFondFiss, wireFondFiss, wirePipeFiss,
11                             lenSegPipe, rayonPipe, nbsegCercle, nbsegRad):
12   """
13   preparation maillage du pipe :
14   - détections des points a respecter : jonction des edges/faces constituant
15     la face de fissure externe au pipe
16   - points sur les edges de fond de fissure et edges pipe/face fissure,
17   - vecteurs tangents au fond de fissure (normal au disque maillé)  
18   """
19   
20   logging.info('start')
21
22   # --- option de maillage selon le rayon de courbure du fond de fissure 
23   lenEdgeFondExt = 0
24   for edff in edgesFondFiss:
25     lenEdgeFondExt += geompy.BasicProperties(edff)[0]
26   
27   disfond = []
28   for filling in facesDefaut:
29     disfond.append(geompy.MinDistance(centreFondFiss, filling))
30   disfond.sort()
31   rcourb = disfond[0]
32   nbSegQuart = 5 # on veut 5 segments min sur un quart de cercle
33   alpha = math.pi/(4*nbSegQuart)
34   deflexion = rcourb*(1.0 -math.cos(alpha))
35   lgmin = lenSegPipe*0.25
36   lgmax = lenSegPipe*1.5               
37   logging.debug("rcourb: %s, lenFond:%s, deflexion: %s, lgmin: %s, lgmax: %s", rcourb, lenEdgeFondExt, deflexion, lgmin, lgmax)  
38
39   meshFondExt = smesh.Mesh(wireFondFiss)
40   algo1d = meshFondExt.Segment()
41   hypo1d = algo1d.Adaptive(lgmin, lgmax, deflexion) # a ajuster selon la profondeur de la fissure
42   isDone = meshFondExt.Compute()
43   
44   ptGSdic = {} # dictionnaire [paramètre sur la courbe] --> point géométrique
45   allNodeIds = meshFondExt.GetNodesId()
46   for nodeId in allNodeIds:
47     xyz = meshFondExt.GetNodeXYZ(nodeId)
48     #logging.debug("nodeId %s, coords %s", nodeId, str(xyz))
49     pt = geompy.MakeVertex(xyz[0], xyz[1], xyz[2])
50     u, PointOnEdge, EdgeInWireIndex = geompy.MakeProjectionOnWire(pt, wireFondFiss) # u compris entre 0 et 1
51     edgeOrder = edgesIdByOrientation[EdgeInWireIndex]
52     ptGSdic[(edgeOrder, EdgeInWireIndex, u)] = pt
53     #logging.debug("nodeId %s, u %s", nodeId, str(u))
54   usort = sorted(ptGSdic)  
55   logging.debug("nombre de points obtenus par deflexion %s",len(usort))
56      
57   centres = []
58   origins = []
59   normals = []      
60   for edu in usort:
61     ied = edu[1]
62     u = edu[2]
63     vertcx = ptGSdic[edu]
64     norm = geompy.MakeTangentOnCurve(edgesFondFiss[ied], u)
65     plan = geompy.MakePlane(vertcx, norm, 3*rayonPipe)
66     part = geompy.MakePartition([plan], [wirePipeFiss], [], [], geompy.ShapeType["VERTEX"], 0, [], 0)
67     liste = geompy.ExtractShapes(part, geompy.ShapeType["VERTEX"], True)
68     if len(liste) == 5: # 4 coins du plan plus intersection recherchée
69       for point in liste:
70         if geompy.MinDistance(point, vertcx) < 1.1*rayonPipe: # les quatre coins sont plus loin
71           vertpx = point
72           break
73       centres.append(vertcx)
74       origins.append(vertpx)
75       normals.append(norm)
76 #      name = "vertcx%d"%i
77 #      geompy.addToStudyInFather(wireFondFiss, vertcx, name)
78 #      name = "vertpx%d"%i
79 #      geompy.addToStudyInFather(wireFondFiss, vertpx, name)
80 #      name = "plan%d"%i
81 #      geompy.addToStudyInFather(wireFondFiss, plan, name)
82
83   # --- maillage du pipe étendu, sans tenir compte de l'intersection avec la face de peau
84       
85   logging.debug("nbsegCercle %s", nbsegCercle)
86   
87   # -----------------------------------------------------------------------
88   # --- points géométriques
89   
90   gptsdisks = [] # vertices géométrie de tous les disques
91   raydisks = [[] for i in range(nbsegCercle)]
92   for i in range(len(centres)): # boucle sur les disques
93     gptdsk = [] # vertices géométrie d'un disque
94     vertcx = centres[i]
95     vertpx = origins[i]
96     normal = normals[i]
97     vec1 = geompy.MakeVector(vertcx, vertpx)
98     
99     points = [vertcx] # les points du rayon de référence
100     for j in range(nbsegRad):
101       pt = geompy.MakeTranslationVectorDistance(vertcx, vec1, (j+1)*float(rayonPipe)/nbsegRad)
102       points.append(pt)
103     gptdsk.append(points)
104     pt = geompy.MakeTranslationVectorDistance(vertcx, vec1, 1.5*rayonPipe)
105     rayon = geompy.MakeLineTwoPnt(vertcx, pt)
106     raydisks[0].append(rayon)
107     
108     for k in range(nbsegCercle-1):
109       angle = (k+1)*2*math.pi/nbsegCercle
110       pts = [vertcx] # les points d'un rayon obtenu par rotation
111       for j in range(nbsegRad):
112         pt = geompy.MakeRotation(points[j+1], normal, angle)
113         pts.append(pt)
114       gptdsk.append(pts)
115       ray = geompy.MakeRotation(rayon, normal, angle)
116       raydisks[k+1].append(ray)
117       
118     gptsdisks.append(gptdsk)
119     
120   return (centres, gptsdisks, raydisks)