""" punch-guide — build123d 4 pièces : superieure, inferieure, couvercle, (bac) Exporte chaque pièce en STEP et STL dans ./exports/ """ from build123d import * # ───────────────────────────────────────────────────────────────────────────── # PARAMÈTRES — modifier ici uniquement # ───────────────────────────────────────────────────────────────────────────── # Fente (guide tract) — face droite, centrée en Y fente_largeur = 152.0 # mm — largeur de la fente fente_profondeur = 60.0 # mm — profondeur (longueur de la rainure) fente_section = 2.0 # mm — hauteur de la section (épaisseur papier + jeu) fente_z = 15.0 # mm — hauteur depuis le fond intérieur du chapeau # Cavité perforatrice cav_largeur = 100.0 # mm — X cav_profondeur = 85.0 # mm — Y cav_hauteur = 55.0 # mm — profondeur de creusement depuis le dessus cav_offset_y = 30.0 # mm — décalage en Y depuis la paroi arrière # Trou d'évacuation (confettis) evac_taille = 48.0 # mm — côté du carré (45 + jeu) evac_offset_x = 40.0 # mm — depuis paroi gauche intérieure evac_offset_y = 50.0 # mm — depuis paroi arrière intérieure # Parois epaisseur_paroi = 5.0 # mm epaisseur_fond = 10.0 # mm # Emboîtement emboitement_profondeur = 10.0 # mm emboitement_jeu = 0.3 # mm # Couvercle couvercle_epaisseur = 3.0 # mm couvercle_ouv_largeur = 70.0 # mm — ouverture X couvercle_ouv_profondeur = 50.0 # mm — ouverture Y # Bac bac_hauteur = 50.0 # mm # ───────────────────────────────────────────────────────────────────────────── # DIMENSIONS DÉRIVÉES # ───────────────────────────────────────────────────────────────────────────── chapeau_int_x = max(cav_largeur, fente_profondeur) chapeau_int_y = max(cav_profondeur + cav_offset_y, fente_largeur) chapeau_ext_x = chapeau_int_x + 2 * epaisseur_paroi chapeau_ext_y = chapeau_int_y + 2 * epaisseur_paroi chapeau_ext_z = epaisseur_fond + cav_hauteur # Position de la cavité dans le chapeau cav_x = (chapeau_ext_x - cav_largeur) / 2 # centrée en X cav_y = epaisseur_paroi + cav_offset_y # paroi arrière + offset # Fente fente_y = (chapeau_ext_y - fente_largeur) / 2 # centrée en Y sur la face fente_z_abs = epaisseur_fond + fente_z # hauteur absolue depuis le bas # Bac bac_ext_x = chapeau_ext_x - 2 * emboitement_jeu bac_ext_y = chapeau_ext_y - 2 * emboitement_jeu # Couvercle couv_ext_x = chapeau_ext_x + 2 * (epaisseur_paroi + emboitement_jeu) couv_ext_y = chapeau_ext_y + 2 * (epaisseur_paroi + emboitement_jeu) couv_ext_z = couvercle_epaisseur + emboitement_profondeur offset_couv = epaisseur_paroi + emboitement_jeu cav_centre_x = offset_couv + epaisseur_paroi + chapeau_int_x / 2 cav_centre_y = offset_couv + epaisseur_paroi + cav_offset_y + cav_profondeur / 2 # ───────────────────────────────────────────────────────────────────────────── # HELPER — boîte à l'origine, coin bas-gauche en (0,0,0) # build123d centre les Box sur l'origine par défaut, # on les translate pour les aligner comme en OpenSCAD. # ───────────────────────────────────────────────────────────────────────────── def box(x, y, z): """Boîte pleine, coin bas-gauche-avant en (0,0,0).""" return Box(x, y, z).translate((x/2, y/2, z/2)) # ───────────────────────────────────────────────────────────────────────────── # PARTIE SUPÉRIEURE (chapeau) # ───────────────────────────────────────────────────────────────────────────── def make_superieure(): # 1. Corps principal corps = box(chapeau_ext_x, chapeau_ext_y, chapeau_ext_z) # 2. Lèvre d'emboîtement (cadre périphérique en bas) levre_bloc = box(chapeau_ext_x, chapeau_ext_y, emboitement_profondeur) levre_vide = box( chapeau_ext_x - 2 * epaisseur_paroi, chapeau_ext_y - 2 * epaisseur_paroi, emboitement_profondeur + 1 ).translate((epaisseur_paroi, epaisseur_paroi, 0)) levre = levre_bloc - levre_vide levre = levre.translate((0, 0, -emboitement_profondeur)) base = corps + levre # 3. Cavité perforatrice (ouverte vers le haut) cavite = box(cav_largeur, cav_profondeur, cav_hauteur + 1) cavite = cavite.translate((cav_x, cav_y, epaisseur_fond)) # 4. Fente latérale (débouche sur la face droite, X max) fente = box(fente_profondeur + 1, fente_largeur, fente_section) fente = fente.translate(( chapeau_ext_x - fente_profondeur, fente_y, fente_z_abs )) # 5. Trou d'évacuation (perce le fond depuis en dessous) evac = box(evac_taille, evac_taille, epaisseur_fond + 2) evac = evac.translate(( epaisseur_paroi + evac_offset_x, epaisseur_paroi + evac_offset_y, -1 )) return base - cavite - fente - evac # ───────────────────────────────────────────────────────────────────────────── # PARTIE INFÉRIEURE (bac) # ───────────────────────────────────────────────────────────────────────────── def make_inferieure(): # 1. Bloc de base bac = box(bac_ext_x, bac_ext_y, bac_hauteur) # 2. Vidage intérieur (ouvert par le haut) vide = box( bac_ext_x - 2 * epaisseur_paroi, bac_ext_y - 2 * epaisseur_paroi, bac_hauteur ).translate((epaisseur_paroi, epaisseur_paroi, epaisseur_fond)) return bac - vide # ───────────────────────────────────────────────────────────────────────────── # COUVERCLE # ───────────────────────────────────────────────────────────────────────────── def make_couvercle(): # 1. Bloc de base bloc = box(couv_ext_x, couv_ext_y, couv_ext_z) # 2. Évidement intérieur (lèvre qui coiffe le chapeau) vide_levre = box( couv_ext_x - 2 * epaisseur_paroi, couv_ext_y - 2 * epaisseur_paroi, emboitement_profondeur + 1 ).translate((epaisseur_paroi, epaisseur_paroi, -1)) # 3. Ouverture rectangulaire centrée sur la cavité ouverture = box(couvercle_ouv_largeur, couvercle_ouv_profondeur, couvercle_epaisseur + 2) ouverture = ouverture.translate(( cav_centre_x - couvercle_ouv_largeur / 2, cav_centre_y - couvercle_ouv_profondeur / 2, emboitement_profondeur - 1 )) return bloc - vide_levre - ouverture # ───────────────────────────────────────────────────────────────────────────── # EXPORT # ───────────────────────────────────────────────────────────────────────────── import os os.makedirs("exports", exist_ok=True) pieces = { "superieure": make_superieure, "inferieure": make_inferieure, "couvercle": make_couvercle, } for nom, fn in pieces.items(): print(f"Construction : {nom}...") piece = fn() export_step(piece, f"exports/{nom}.step") export_stl(piece, f"exports/{nom}.stl") print(f" → exports/{nom}.step / .stl") print("Terminé.")