Python3 : Coder un filetage / pas de vis en 3D (fichier OBJ)

<< retour accueil

Mon problème était de créer un pas de vis sur un objet avant de l’imprimer sur une imprimante 3D. Or, il est impossible de créer un pas de vis à partir des formes de bases telles que brique, sphère, cylindre ou tore.

 
exemple de vis

Je me suis penché sur les fichiers OBJ qui permettent de définir des objets 3D dans des fichiers TXT. Leur structure est très simple, et adaptée pour pouvoir le programmer en python, c’est ce que je vous propose ici.

Structure d’un fichier OBJ :
La version minimaliste ressemble à ceci : 

o triangle # nom de l’objet (on peut en definir plusieurs dans le meme fichier OBJ
v 0.0 0.0 0.0 # coordonnees x, y, z du point v1=n°1
v 0.0 1.0 0.0 # v2=n°2
v 0 0 1  # v3=n°3
f 1 2 3 # = face (surface définie par les points v1, v2, v3


 
C’est tout ce dont nous aurons besoin ici
[ On peut également définir les valeurs de texture (vt) et de la normale à la surface (vn). D’ailleurs, j’ai mis le calcul de la valeur de la normale dans le programme (def normale(x0,y0,z0,x1,y1,z1,x2,y2,z2)) que je n’ai pas exploité.
D’autres sites parlent de vt et vn queje n’aborde pas ici]

Dans ce programme, il y a donc 3 parties

1/ nom de l’objet :
o suivi du nom de l’objet défini ensuite 

2/ la série de points de l’objet
v est suivi des coordonnées x, y, z de ce point
la premiere ligne sera le point numéro 1, la deuxieme ligne, le point numéro 2…
 

3/ la definitions des surfaces (triangles)
f (face) sera suivi des 3 points définis précedemment, ainsi « f 1 2 3 » definira le triangle formé par les points v1, v2 et v3 

il faut entrer les différents paramètres
R0, R1, biais, plat, pas, nbfacette (nombre de facettes par tour), nbtour (nombre de tours de vis)
dimensions du filetage
 
Changez le dossier de destination en fonction de votre environnement : dest = open("C:/Python38/filetage.obj", "w")

Voici le >> code python à télécharger


# créé par uncledens , http://uncledens.chez-alice.fr/

from math import sin, cos, pi 

def normale(x0,y0,z0,x1,y1,z1,x2,y2,z2):
    vx1,vy1,vz1=x1-x0,y1-y0,z1-z0
    vx2,vy2,vz2=x2-x0,y2-y0,z2-z0
    nx,ny,nz=vy1*vz2-vz1*vy2 , vz1*vx2-vx1*vz2 , vx1*vy2-vy1*vx2
    # on normalise
    nl=(nx**2+ny**2+nz**2)**0.5
    nx,ny,nz= nx/nl , ny/nl , nz/nl
    c=[nx,ny,nz]
    return c 

def coordonnees (r, angle, delta):
    global pas
    z=int((pas*angle/(2*pi)+delta)*100)/100
    x=int(r*cos(angle)*100)/100
    y=int(r*sin(angle)*100)/100
    c=[x,y,z]
    return c 

R0, R1 = 4, 6
pas=7
biais, plat = 1, 2
nbfacette=72
angle0=2*pi/nbfacette
nbtour=10
v=[]
f=[]
t=4*nbfacette
for i in range(nbtour*nbfacette):
    angle=i*2*pi/nbfacette
    c=coordonnees(R0,angle,0)
    v.append(c)
    c=coordonnees(R1,angle,biais)
    v.append(c)
    c=coordonnees(R1,angle,biais+plat)
    v.append(c)
    c=coordonnees(R0,angle,2*biais+plat)
    v.append(c)
    ii=i*4+1
    f.append([ii,ii+1,ii+4])
    f.append([ii+1,ii+5,ii+4])

    f.append([ii+1,ii+2,ii+6])
    f.append([ii+1,ii+6,ii+5]) 

    f.append([ii+2,ii+3,ii+6])
    f.append([ii+3,ii+7,ii+6]) 

    f.append([ii+3,ii+t,ii+t+4])
    f.append([ii+3,ii+t+4,ii+7])

i=nbtour*nbfacette
angle=i*2*pi/nbfacette
c=coordonnees(R0,angle,0)
v.append(c)
c=coordonnees(R1,angle,biais)
v.append(c)
c=coordonnees(R1,angle,biais+plat)
v.append(c)
c=coordonnees(R0,angle,2*biais+plat)
v.append(c)

for i in range(nbtour*nbfacette,nbtour*nbfacette+2):
    angle=i*2*pi/nbfacette
    c=coordonnees(R0,angle,pas)
    v.append(c) 

nbv=len(v)-1
txt="o vis\n"
for t in v:
    txt+="v "+str(t[0])+" "+str(t[1])+" "+str(t[2])+"\n"
for t in f:
    t0=t[0]
    if t0<nbv:
        t1=t[1]
        if t1<nbv:
            t2=t[2]
            if t2<nbv:
                txt+="f "+str(t[0])+" "+str(t[1])+" "+str(t[2])+"\n" 

dest = open("C:/Python38/filetage.obj", "w")
dest.write(txt)
dest.close()