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