1 # -*- coding: utf-8 -*-
6 from geomsmesh import geompy
7 from geomsmesh import smesh
9 def calculePointsAxiauxPipe(edgesFondFiss, edgesIdByOrientation, facesDefaut,
10 centreFondFiss, wireFondFiss, wirePipeFiss,
11 lenSegPipe, rayonPipe, nbsegCercle, nbsegRad):
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é)
22 # --- option de maillage selon le rayon de courbure du fond de fissure
24 for edff in edgesFondFiss:
25 lenEdgeFondExt += geompy.BasicProperties(edff)[0]
28 for filling in facesDefaut:
29 disfond.append(geompy.MinDistance(centreFondFiss, filling))
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)
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()
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))
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
70 if geompy.MinDistance(point, vertcx) < 1.1*rayonPipe: # les quatre coins sont plus loin
73 centres.append(vertcx)
74 origins.append(vertpx)
77 # geompy.addToStudyInFather(wireFondFiss, vertcx, name)
79 # geompy.addToStudyInFather(wireFondFiss, vertpx, name)
81 # geompy.addToStudyInFather(wireFondFiss, plan, name)
83 # --- maillage du pipe étendu, sans tenir compte de l'intersection avec la face de peau
85 logging.debug("nbsegCercle %s", nbsegCercle)
87 # -----------------------------------------------------------------------
88 # --- points géométriques
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
97 vec1 = geompy.MakeVector(vertcx, vertpx)
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)
103 gptdsk.append(points)
104 pt = geompy.MakeTranslationVectorDistance(vertcx, vec1, 1.5*rayonPipe)
105 rayon = geompy.MakeLineTwoPnt(vertcx, pt)
106 raydisks[0].append(rayon)
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)
115 ray = geompy.MakeRotation(rayon, normal, angle)
116 raydisks[k+1].append(ray)
118 gptsdisks.append(gptdsk)
120 return (centres, gptsdisks, raydisks)