3D STL
Deux points d'entrée, un standard de sortie : un STL étanche, un script paramétrique qui le régénère, et une table de tranchage qui garantit une impression réussie.
| Entrée | Route | Bibliothèque |
|---|---|---|
| Dimensions, un objet décrit, un croquis en mots | Route géométrique | scripts/partlib.py |
| Une photo ou un fichier image | Route image | scripts/imagelib.py |
Configuration pour la route géométrique :
pip install trimesh shapely manifold3d --break-system-packages -q
La route image nécessite uniquement Pillow et numpy — pas de bibliothèque de maillage, pas de booléens.
Route géométrique
1. Fixer les dimensions avant la modélisation
La majeure partie des reprises ici provient de l'ambiguïté, pas d'une mauvaise géométrie. Reformulez la pièce dans un petit tableau (dimension → valeur → source) et marquez tout ce que vous avez supposé. Surveillez particulièrement :
- Taille extérieure vs. entraxes de montage. « 87 mm de large » et « 87 mm entre les vis » sont des pièces différentes — elles diffèrent d'une épaisseur de paroi. Demandez.
- Une troisième dimension manquante. Un profilé plus une épaisseur ne donne que deux des trois ; choisissez une profondeur raisonnable, dites-le, et faites-en un indicateur.
- Intention des fixations. « Vis de 5 mm » peut signifier des trous de dégagement pour des vis métalliques M5, des broches filetées imprimées, ou un insert à chaud. Trois modèles différents.
- Matériel existant. Si la pièce s'accouple avec quelque chose qui existe déjà, son entraxe de trous et son épaisseur de matière sont des contraintes, pas des préférences.
Posez au maximum la ou les deux questions qui changent la géométrie ; supposez le reste, énoncez la supposition, et avancez.
2. Modéliser avec la bibliothèque
scripts/partlib.py fournit des constructeurs de profilés, extrude, threaded_rod,
threaded_pin, hex_nut, place et finish. Importez-la plutôt que de
réinventer le calcul de maillage — l'hélice du filetage est facile à obtenir de manière subtilement erronée.
scripts/example_handle.py est un exemple complet de pièce (poignée en pont + broches filetées intégrées +
écrou correspondant). Copiez-le comme squelette pour une nouvelle pièce.
Écrivez le modèle comme un script paramétrique avec des flags argparse, jamais des nombres codés en dur. L'utilisateur demandera une variante dans les minutes qui suivent, et la réponse doit être une seule ligne de commande plutôt qu'un nouveau modèle. Remettez le script avec le STL.
3. Recettes de pièces courantes
| Pièce | Construite à partir de |
|---|---|
| Poignée en pont, support ⊓ | bridge_profile + extrude |
| Plaque plate avec trous | polygone shapely avec anneaux intérieurs + extrude |
| Broche, goujon, boulon | threaded_pin, puis place sur son axe |
| Écrou, douille filetée | hex_nut, ou soustraire threaded_rod(clearance=…) |
| Entretoise, bague | deux cercles concentriques + extrude |
| Crochet, équerre en L | polygone de la vue latérale + extrude, à plat sur le plateau |
| Boîtier | boîte extérieure moins boîte intérieure ; rebord avec un jeu de 0,15 mm |
Tout ce qui n'est pas listé reste un polygone, une extrusion et un booléen.
Route image
scripts/imagelib.py convertit une image en champ de hauteur et assemble un
solide explicite en grille de sommets — surface supérieure, fond plat, quatre parois latérales. Il n'utilise
pas de moteur booléen, ce qui explique pourquoi il ne tombe pas en panne sur des images grandes ou étranges.
python3 imagelib.py photo.jpg --mode lithophane --width 100 \
--out stl_output/lithophane.stl
python3 imagelib.py logo.png --mode relief --width 80 --base 2 \
--out stl_output/relief.stl
| Mode | Correspondance | z typique |
|---|---|---|
relief | les pixels clairs montent | 0,6 → 4,0 mm, souvent sur une plaque --base |
lithophane | les pixels foncés sont épais, donc cela brille en rétroéclairage | 0,8 → 3,0 mm, sans base |
--resdéfinit les échantillons sur le bord long (par défaut 200). Une résolution au-delà d'environ 0,4 mm par échantillon est gaspillée — la buse ne peut pas l'imprimer, et le fichier gonfle. Augmentez-la uniquement pour les grandes impressions.- Le contraste est automatiquement étiré au chargement ; une photo plate et à faible contraste produit une impression plate et décevante. Dites-le plutôt que de l'imprimer.
- Les lithophanes préfèrent les visages et les sujets à fort contraste. Les paysages et les scènes chargées se transforment en bouillie.
check()vérifie que chaque arête apparaît exactement deux fois dans des directions opposées. Un simple comptage laisserait passer une paroi cousue à l'envers, ce qui produit un STL « valide » que le slicer retourne. Exécutez-le, signalez-le.
Finitions, pour les deux routes
Vérifiez d'abord : finish() (géométrie) et check() (image) rapportent la boîte englobante,
l'étanchéité et le nombre de triangles. Comparez la boîte englobante avec les
dimensions demandées — cela détecte immédiatement les erreurs de signe et de conversion d'unités. Ne présentez
jamais un maillage qui n'est pas étanche.
Pour tout ce qui n'est pas visuellement évident — filetages, courbes, assemblages — effectuez un aperçu rapide avec matplotlib et regardez-le. Vingt secondes valent mieux qu'une impression de six heures d'une mauvaise forme.
Lisez references/design-rules.md avant de choisir l'orientation, le pas de vis ou les
jeux. Il couvre la résistance dans le sens des couches, les profils de filetage imprimables, les tolérances d'ajustement,
les pièces dérivées d'images et les modes de défaillance qui méritent d'être nommés.
La réponse doit contenir :
- Un tableau des dimensions, y compris les valeurs supposées.
- Toute décision prise pour le compte de l'utilisateur, avec sa raison. Si une fonctionnalité demandée est mécaniquement fragile, construisez ce qu'ils ont demandé et nommez la faiblesse avec une alternative concrète — ne remplacez jamais en silence.
- Une table de tranchage : hauteur de couche, parois, remplissage, supports (exactement où), matériau, et quelle face va sur le plateau et pourquoi.
- La commande en une ligne pour régénérer avec des nombres différents.
- Tout ce qui doit être confirmé avec le matériel existant avant impression.
Livrez les fichiers STL dans /mnt/user-data/outputs/ sur claude.ai, ou dans un
dossier stl_output/ dans le répertoire de travail courant dans Claude Code, et
présentez-les avec le script générateur. Les scripts se trouvent dans le dossier scripts/ de ce skill ;
appelez-les par leur chemin complet ou copiez-les à côté du script de la pièce.
Sur Windows, utilisez python au lieu de python3.
Assemblages multi-pièces
Lorsque des pièces s'accouplent (broche et écrou, couvercle et boîte, moitiés de charnière) :
- générez les deux à partir de paramètres partagés dans un seul script — une valeur de jeu qui vit dans deux fichiers dérivera
- dérivez la pièce femelle à partir de la même fonction que la pièce mâle, décalée d'un jeu, afin qu'elles ne puissent pas diverger
- indiquez combien de chaque pièce imprimer, et suggérez une pièce de rechange pour la petite
- lorsqu'un ajustement est incertain, proposez un test de tolérance : imprimez la petite pièce avec deux jeux et gardez celui qui tourne.