Bonjour à tous,

J'ai récupéré les coordonnées des nœuds du maillage suivant sur Abaqus (surface avec maillage affinée)

Nom : Capture.JPG
Affichages : 1097
Taille : 82,8 Ko

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:

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] ]
Voici ce que j'aimerais obtenir:

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] ]
Représenté comme des matrices pour visualiser plus facilement.
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