Les différentes étapes pour coder un dessin avec AxiDraw

Art

Vous souhaitez dessiner avec précision mais vous n’avez pas le coup de main ? Vous désirez représenter plusieurs fois des images ou textes à l’identique ? L’AxiDraw est fait pour vous !

Qu’est ce que l’AxiDraw ?

Dans le cadre de notre projet libre de fin d’année en NSI, nos professeurs, Monsieur Robert et Monsieur Clemente, nous ont présenté l’AxiDraw qui permet de dessiner un projet que l’on a imaginé.

L’AxiDraw est une machine composée de deux moteurs et d’un bras automatisé au bout duquel il est possible d’ajouter différents types d’outils de graphisme.

Son fonctionnement est assez simple : il suffit de programmer les traits que l’on souhaite tracer, à l’aide du logiciel « Inskape » ou avec du langage python, et l’AxiDraw réalise alors notre modèle au format SVG (Scalable Vector Graphics).

Par où commencer ?

Au préalable, il est primordial de définir parfaitement le rendu final désiré.

Il existe différentes façons de le faire. Pour ma part, j’ai choisi de dessiner mon modèle à la main mais on peut aussi préparer son projet à l’aide de logiciels comme Paint.

J’ai donc dessiné une maison sur une feuille à petits carreaux afin de respecter plus facilement une échelle donnée. En effet, notre réalisation ne devait pas être supérieure à un cadre défini par une abscisse comprise entre 20 et 1040 pixels et une ordonnée comprise entre 20 et 730 pixels.

Programme et fonctions de codage

Une fois mon modèle prêt, il ne restait plus qu’à passer au codage !

Nos professeurs nous ont fourni un programme où de nombreux paramètres étaient déjà prédéfinis, comme la bordure de la feuille, la vitesse de l’AxiDraw ou encore différentes fonctions (pouvant tracer une succession de segments par exemple). J’ai donc utilisé ce programme et je l’ai inséré dans l’IDE Thonny. J’ai ensuite installé la bibliothèque Pyaxidraw et Pillow afin que ce dernier puisse fonctionner.

J’ai alors pu commencer réellement la programmation de mon dessin.

Tout d’abord, il était nécessaire de convertir toutes les longueurs, sur ma feuille en centimètres, en pixels. A partir des valeurs obtenues, j’ai alors défini les points délimitant les segments que je souhaitais tracer.

J’ai notamment utilisé la fonction « segments », qui permet de tracer une succession de segments en fonction d’une liste d’abscisses et d’ordonnées de points successifs, comme présentée ci dessous:

def segments(points:list):
    for i in range(len(points) - 1):
        if not coord_in_cadre(points[i][0],points[i][1]) or not coord_in_cadre(points[i+1][0],points[i+1][1]):
            global dessin_valide
            dessin_valide = False
            print("Segments ne pouvant être tracés")
            return        
    if axi_connect and dessin_valide:
        for i in range(len(points)):
            points[i][0], points[i][1] = points[i][0] * 8.267 / 793.7, points[i][1] * 8.267 / 793.7
        ad.goto(points[0][0], points[0][1])
        ad.draw_path(points) 
        ad.penup() 
    else:
        for i in range(len(points)-1): 
            draw.line((points[i][0], points[i][1], points[i+1][0], points[i+1][1]), fill = black)

ma_liste = [(926.25,661.5625),(958.75,661.5625),(975,593.125),(910,593.125),(926.25,661.5625)]
segments(ma_liste)

Cet extrait de code permet, une fois la fonction « segments » définie, de produire très simplement et d’un seul trait l’image suivante:

D’autres fonctions comme celles traçant des cercles, des rectangles ou des paraboles m’ont aussi été très utiles.

Utilisation de boucles for

Lors de la réalisation de mon dessin, j’ai veillé à utiliser des motifs qui se répétaient afin de réduire le nombre de lignes de code et ainsi, me faciliter le travail.

J’ai donc par exemple utilisé la boucle for i in range() afin de créer un panneau de bois sur la façade de la maison en soustrayant une même longueur à la hauteur du rectangle à chaque incrémentation :

def rectangle(x_depart,y_depart,delta_x,delta_y):
    polygone([[x_depart,y_depart],[x_depart + delta_x,y_depart],[x_depart + delta_x,y_depart + delta_y],[x_depart,y_depart + delta_y]])

for i in range(9):
    rectangle(568.75,319.375,113.75, 91.25 - 11.40625*i)

Image associée :

J’ai aussi voulu dessiner des platebandes d’herbe avec des boucles for i in range() mais ne sachant pas comment coder un demi-cercle, j’ai utilisé la fonction parabole, ce qui a d’ailleurs donné un rendu plus réaliste. Afin de donner un effet de profondeur à la succession de paraboles, l’ordonnée du point initiant la parabole devait être différente de l’ordonnée du point terminant la parabole. Pour cela, il fallait veiller à ajouter la bonne valeur à chaque incrémentation. En effet, il ne fallait donc plus ajouter l’écart exact entre les deux abscisses (ici 6) mais cette valeur moins 1 (ce qui revenait à ajouter 5).

def parabole1(x_depart, y_depart):
    return[(a+x_depart,a**2+y_depart) for a in range(-3,3)]

for i in range(37):
    segments(parabole1(341.25+5*i,638.75))
    
for i in range(26):
    segments(parabole1(480+5*i,604))

Image associée :

Rendu final :

Après ces petites explications, je vous partage le rendu final de mon travail qui peut être réalisé par l’AxiDraw que nous avons la chance d’avoir au Lycée Louis Pasteur d’Avignon !

Merci pour votre lecture.

Télécharger le .py :

Et pour finir, vous pouvez télécharger mon projet afin que vous puissiez le découvrir plus en détail !