You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

200 lines
8.8 KiB

"""
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é.")