Bon. Dans le premier article, j'avais glissé un teasing en mode mystère, façon influenceur qui poste "big news soon 👀" sans rien dire d'autre. Sauf que moi j'avais même pas mis le lien. On va réparer ça aujourd'hui.
Le projet en question, c'est PerfectShelf — un optimiseur de découpe disponible ici : perfectshelf.vi-de-web.fr
Le problème de départ
Je fabrique des meubles. Pas souvent, pas vite, mais j'aime ça. Et à chaque fois que j'attaque un projet, je me retrouve face à la même question existentielle : comment je découpe mes planches pour en perdre le moins possible ? Alors oui, il existe des solutions mais toujours limité a un certains nombre d'usage. Et quand je fais mes tests je dépasse souvent cette limite.
Sur le papier c'est simple. Dans la réalité, avec 6 pièces de dimensions différentes à sortir d'un panneau de 250×122 cm, ça devient vite un casse-tête de niveau "j'aurais dû écouter en cours de maths". Et c'est encore pire quand on a que des chutes de panneaux. Alors j'ai fait ce que tout développeur fera à la place de réfléchir 5 minutes avec un crayon : j'ai codé une app.
Le principe
L'idée c'est du bin packing (terme trouvé après plusieurs recherche sur mon soucis) : un problème d'optimisation qui consiste à caser un maximum de pièces dans un minimum d'espace. En gros, le genre de truc que les chercheurs en informatique adorent et que les menuisiers vivent tous les weekends sans le savoir.
Tu rentres tes dimensions de pièces, la taille de ta planche (ou de ton rouleau de tissu, on y revient juste après), et l'algo te calcule la disposition optimale pour minimiser la chute. La chute, c'est le bout inutilisable qui finit dans un coin du garage et qu'on garde "au cas où" jusqu'au prochain déménagement.
Et la couture là-dedans ?
Ma copine fait de la couture, et elle se posait régulièrement la question de combien de tissu acheter pour un patron. Pas évident : le tissu se vend au mètre linéaire (ou au dizaine de centimètre linéaire), mais les pièces à découper ont des formes et des orientations variées (et parfois un sens, ce qui complique tout). Du coup j'ai adapté l'outil pour couvrir ce cas aussi. Malheureusement il n'y a pas les forme bizarre du genre des demi-lunes qui peuvent s’emboîter mais c'est déjà un bon départ.
Résultat : un seul projet, deux usages. Le bois et le tissu partagent le même problème mathématique — c'est juste la matière première qui change.
Côté technique
C'est du JavaScript, comme teasé dans le premier article. Pas de serveur, pas de base de données, tout tourne dans le navigateur. Ce qui veut dire que vos données de découpe ne transitent nulle part — ce qui est toujours agréable à savoir, même pour des dimensions de planches. Vous pouvez même l'installer sur votre smartphone Android pour l'avoir disponible en mode hors-ligne.
Ce que propose cette outils
Voici les principales fonctionnalités disponible :
L'export du plan de découpe (histoire de pas avoir à recopier sur un bout de papier)
La gestion du trait de scie (le kerf — le bois que la lame grignote à chaque coupe)
Une meilleure gestion des pièces avec le sens de la fibre du bois ou du fils.
Possibilité d'installer l'application sur smartphone.
Et il y a aussi une fonctionnalité pour créer un meuble en fonction de ce que vous voulez mettre dedans (des vinyles, dvd, jeux vidéos...) et cela calcul automatiquement les dimension du meuble. Et en un clic on bascule sur l'outils d'optimisation de découpe.
J'ai détecté deux, trois bugs sur l'export en pdf. Je corrigerais ça quand j'aurais un peu de temps, mais pour le moment je suis sur d'autres projets (Arf encore des teasers).
Essayez-le
Si vous faites de la menuiserie, de la couture, ou juste que vous aimez optimiser des trucs pour le plaisir — c'est par là. C'est gratuit, ça tourne dans le navigateur, et ça m'a déjà économisé au moins une planche. Ce qui, au prix du bois en ce moment, n'est pas rien.
Voilà pour le projet du premier article révélé. Prochain article : probablement un projet meuble avec les plans, ou une des apps Android si Google se décide à valider. On verra qui arrive en premier.