Bonjour à tous,
J'ai récupéré les coordonnées des nœuds du maillage suivant sur Abaqus (surface avec maillage affinée)
Après les avoir stockés dans une liste, j'aimerais pouvoir les trier afin de les manipuler aisément. Attention: petite subtilité, il faudrait que ça soit trié selon 2 critères d'importance équivalente (ici, x et y) afin d'obtenir un tri qui a du sens par rapport à l'image ci-dessus.
Voici un exemple basique de ce j'obtiens:
Voici ce que j'aimerais obtenir:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 coord = [ [1,0,2],[5,9,4],[4,1,5], [6,3,9],[10,4,12],[8,2,9], [0,9,1],[3,1,3],[7,10,8] ]
Représenté comme des matrices pour visualiser plus facilement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 coord = [ [8,2,9],[10,4,12],[7,10,8], [4,1,5],[9,3,9],[5,9,4], [1,0,2],[3,1,3],[0,9,1] ]
Méthode de tri souhaité: Y croissant de gauche vers droite / X croissant de bas en haut (afin d'être cohérent par rapport aux référentiel de l'image)
Là où c'est compliqué pour moi, c'est quand il y a des croisements, ex dans la matrice souhaitée: A(1,1)=[8,2,9] et B(3,2)=[3,1,3] -> on remarque que By < Ay. Pourtant le tri est correct car fidèle aux coordonnées de la surface (voir image)
Autre ex: A(1,1)=[8,2,9] et C(2,2)=[9,3,9] -> on remarque que Cx > Ax. Pourtant le tri est correct car fidèle aux coordonnées de la surface (voir image)
Voilà, j'espère avoir été claire, n'hésitez à me demander des détails.
J'attends vos réponses avec impatience
P.S: j'ai déjà longuement réfléchi au pb. Pour ceux qui estimerait ne pas avoir à faire le travail à ma place, sachez que j'ai déjà codé quelques lignes. C'est de le fouilli, ça fonctionne... mais pas tout le temps (selon comment on affine le maillage) ! D'où mon appel à l'aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 n1=mdb.models['Verzahnung'].rootAssembly.sets['SET-SURFACE'] xyz_koor = [] for i in range(0,len(n1.nodes)): xyz_koor.append([n1.nodes[i].coordinates[0],n1.nodes[i].coordinates[1],n1.nodes[i].coordinates[2],0]) xyz_koor=sorted({tuple(x): x for x in xyz_koor}.values(),key=lambda a_entry: a_entry[1],reverse=True) diff=0 for i in range(1,len(xyz_koor)-1): if abs(xyz_koor[i][1]-xyz_koor[i-1][1])>diff: diff=abs(xyz_koor[i][1]-xyz_koor[i-1][1]) breite=abs(xyz_koor[0][1]-xyz_koor[-1][1]) x_punkte=[] y_punkte=[] z_punkte=[] hohe=0 for i in range(0,len(xyz_koor)): if abs(xyz_koor[i][1]-xyz_koor[0][1])<0.2*diff: hohe+=1 lange=len(xyz_koor)/hohe n=0 for i in range(0,lange): for j in range(lange*hohe,lange*hohe+hohe): xyz_koor[n][3] = i+1 n+=1 for i in range(0,len(xyz_koor)): for k in range(0,hohe): if abs(xyz_koor[i][1]-xyz_koor[-1][1]-k*(1.0/(hohe-1))*breite)<=0.48*diff: x_punkte.append(xyz_koor[i][0]) y_punkte.append(xyz_koor[i][1]) z_punkte.append(xyz_koor[i][2]) for i in range(1,int((len(x_punkte)-1))): #Sortierung nach X-koor for j in range(i,-1,-1): if abs(y_punkte[j]-y_punkte[j-1])<diff and x_punkte[j]>x_punkte[j-1]: x_punkte[j],x_punkte[j-1]=x_punkte[j-1],x_punkte[j] y_punkte[j],y_punkte[j-1]=y_punkte[j-1],y_punkte[j] z_punkte[j],z_punkte[j-1]=z_punkte[j-1],z_punkte[j] for i in range(0,len(y_punkte)): #Korrektur schlechter Punkte if y_punkte[i]<min(y_punkte)+0.45*breite and y_punkte[i]>min(y_punkte)+0.01*breite and y_punkte[i]<y_punkte[i+1] and x_punkte[i]>x_punkte[i+1]: y_punkte[i]=y_punkte[i]+0.8*diff if y_punkte[i]>min(y_punkte)+0.55*breite and y_punkte[i]<min(y_punkte)+0.99*breite and y_punkte[i]>y_punkte[i+1] and x_punkte[i]>x_punkte[i+1]: y_punkte[i]=y_punkte[i]-0.8*diff n2 = a.instances['ZR1_instance'].nodes koor_load = x_punkte[i],y_punkte[i],z_punkte[i] nodes1 = n2.getClosest(coordinates=(koor_load ,)) x_punkte[i]=n2[nodes1[0].label-1].coordinates[0] y_punkte[i]=n2[nodes1[0].label-1].coordinates[1] z_punkte[i]=n2[nodes1[0].label-1].coordinates[2]
Bonne soirée
Partager