diff --git a/README.md b/README.md index 96b1ca2..f51277b 100644 --- a/README.md +++ b/README.md @@ -1,143 +1,103 @@ # Boîte à créneaux pour Inkscape -Extension Inkscape 1.x générant des pièces de boîte à découper au laser. Les parois s'assemblent par queues d'aronde droites (finger joints) à bords complémentaires, garantissant des ajustements serrés et réguliers. +Extension Inkscape 1.x qui génère le patron d'une boîte à découper au laser. Les faces s'assemblent par queues d'aronde droites (créneaux, _finger joints_) dont la largeur est paramétrable. Chaque pièce est un objet indépendant, déplaçable seul pour optimiser le placement sur la plaque. -## Caractéristiques +## Table des matières -- **Boîte fermée ou ouverte** : 6 pièces (avant, arrière, gauche, droite, fond, couvercle) ou 5 (sans couvercle) -- **Dimensions intérieures ou extérieures** : le calcul compense automatiquement l'épaisseur -- **Créneaux paramétrables** : largeur 0 (défaut = 3 × épaisseur) ou valeur explicite, ajustée à un nombre impair par bord -- **Compensation du kerf** : défaut 0,1 mm, élargit les créneaux, rétrécit les encoches pour un assemblage serré -- **Mise en page** : espacement entre pièces configurable, centrage automatique sur la vue -- **Apparence** : couleur et épaisseur du trait réglables -- **Étiquettes optionnelles** : nom de chaque pièce en texte bleu, gravé avec les créneaux +- [Fonctionnalités](#fonctionnalités) +- [Installation](#installation) +- [Utilisation](#utilisation) + - [En ligne de commande](#en-ligne-de-commande) +- [Le kerf : compensation du trait laser](#le-kerf--compensation-du-trait-laser) + - [Le problème](#le-problème) + - [Ce que fait l'extension](#ce-que-fait-lextension) + - [Mesurer son kerf](#mesurer-son-kerf) + - [Régler l'ajustement](#régler-lajustement) +- [Structure du projet](#structure-du-projet) -## Structure des pièces +## Fonctionnalités -Chaque pièce est un chemin SVG indépendant, placé dans le calque courant : -- Sélectionnable et déplaçable individuellement -- Nommée selon sa fonction (Avant, Arrière, etc.) -- Polygone fermé à bords orthogonaux - -### Convention d'emboîtement - -Garantit des bords complémentaires jumeaux : - -| Pièce | Haut | Droite | Bas | Gauche | -|-------|------|--------|-----|--------| -| Avant | Mâle | Mâle | Mâle | Mâle | -| Arrière | Mâle | Mâle | Mâle | Mâle | -| Gauche | Mâle\* | Femelle | Mâle | Femelle | -| Droite | Mâle\* | Femelle | Mâle | Femelle | -| Fond | Femelle | Femelle | Femelle | Femelle | -| Couvercle | Femelle | Femelle | Femelle | Femelle | - -\* Haut mâle si couvercle présent, bord lisse si boîte ouverte. - -- **Bord mâle** : créneaux extrêmes en saillie -- **Bord femelle** : créneaux extrêmes en creux -- **Coin plein** : si aucun bord adjacent n'est femelle +- Boîte **fermée** (6 pièces : avant, arrière, gauche, droite, fond, couvercle) ou **ouverte** (5 pièces, bord haut des côtés droit) +- Dimensions saisies **intérieures** ou **extérieures** (l'épaisseur est ajoutée automatiquement en mode intérieur) +- Largeur des créneaux paramétrable ; `0` = **3 × l'épaisseur** (défaut). La largeur est ajustée pour obtenir un nombre impair de créneaux par bord +- Compensation du **kerf** (défaut 0,1 mm), voir [section dédiée](#le-kerf--compensation-du-trait-laser) +- Chaque pièce = un chemin SVG fermé, nommé (Avant, Fond…), placé directement dans le calque courant : sélectionnable et déplaçable individuellement +- Pièces disposées en grille, espacement réglable, centrées sur la vue +- Couleur et épaisseur du trait réglables (défaut : rouge, 0,1 mm) +- Étiquettes optionnelles (texte bleu). Désactivées par défaut : le laser graverait le texte +- Message d'erreur si une dimension est trop petite (minimum 5 × l'épaisseur en dimension extérieure) ## Installation -### Via script PowerShell (recommandé) +Copier `box_maker.inx`, `box_maker.py` et `box_core.py` dans `%APPDATA%\inkscape\extensions\boxMaker\`, puis redémarrer Inkscape. + +## Utilisation + +1. Menu **Extensions > AlexDesign > Boîte à créneaux…** +2. Régler les paramètres, cocher **Aperçu en direct** si besoin +3. **Appliquer** + +### En ligne de commande + +Avec le Python d'Inkscape (PowerShell) : ```powershell -# Fermer Inkscape au préalable -.\deploy.ps1 -# ou avec options : -.\deploy.ps1 -Uninstall -.\deploy.ps1 -Force # Ignore la vérification Inkscape ouvert -.\deploy.ps1 -FolderName 'ma-boite' # Dossier personnalisé -``` - -Copie `box_maker.inx`, `box_maker.py`, `box_core.py` dans `%APPDATA%\inkscape\extensions\boxMaker/`. - -### Installation manuelle - -Copier les trois fichiers dans `%APPDATA%\inkscape\extensions\boxMaker/` (créer le dossier s'il n'existe pas). Inkscape explore récursivement ce répertoire. - -## Utilisation dans Inkscape - -1. Démarrer Inkscape -2. Menu **Extensions > Découpe laser > Boîte à créneaux…** -3. Configurer les paramètres (voir tableau ci-dessous) -4. Cliquer **Appliquer** - -### Paramètres - -| Paramètre | Défaut | Plage | Description | -|-----------|--------|-------|-------------| -| **Longueur (mm)** | 100 | 5–5000 | Dimension avant/arrière | -| **Largeur (mm)** | 80 | 5–5000 | Dimension gauche/droite | -| **Hauteur (mm)** | 50 | 5–5000 | Dimension haut/bas | -| **Les dimensions sont** | Extérieures | Extérieures / Intérieures | Mode calcul | -| **Boîte fermée** | ✓ | ✓ / ☐ | Avec couvercle | -| **Épaisseur matière (mm)** | 3 | 0,5–50 | MDF, plexiglas, etc. | -| **Largeur créneaux (mm)** | 0 | 0–500 | 0 = auto (3 × épaisseur) | -| **Kerf (mm)** | 0,1 | 0–2 | Compensation laser | -| **Espacement (mm)** | 5 | 0–100 | Entre les pièces | -| **Épaisseur trait (mm)** | 0,1 | 0,001–5 | Largeur du vecteur | -| **Couleur trait** | #FF0000 (rouge) | Couleur RGB | Pour la découpe laser | -| **Nommer les pièces** | ☐ | ✓ / ☐ | Texte gravé (bleu) | - -**Notes sur les paramètres :** -- Largeur créneaux 0 calcule automatiquement la meilleure approximation pour un nombre impair de créneaux par bord -- Kerf = 0,1 mm typique pour lasers CO₂ ; ajuster selon le matériau et la machine -- Les dimensions trop petites relatif à l'épaisseur lèvent une erreur (minimum 5 × épaisseur recommandé) -- Étiquettes : texte gravé en bleu, pas de contour, à vérifier avant découpe - -## Tests - -```bash -python -m pytest tests/ -``` - -Validations : -- Nombre impair de créneaux par bord -- Complémentarité des bords mâles/femelles -- Dimensions et orthogonalité des pièces -- Compensation du kerf -- Absence de chevauchements en mise en page - -## Utilisation CLI - -```bash -# Environnement Python d'Inkscape $env:PYTHONPATH = "C:\Program Files\Inkscape\share\inkscape\extensions" - -# Génération SVG & "C:\Program Files\Inkscape\bin\python.exe" box_maker.py ` - --length=100 ` - --width=80 ` - --height=50 ` - --thickness=3 ` - --finger=9 ` - --kerf=0.1 ` - --dim_type=exterior ` - --lid ` - --gap=5 ` - --stroke_color=0xff0000ff ` - --stroke_width=0.1 ` - --labels ` - entree.svg > sortie.svg + --length=100 --width=80 --height=50 --thickness=3 ` + --kerf=0.1 --dim_type=interior --lid=false --labels=true ` + --stroke_color=4278190335 entree.svg > sortie.svg ``` -Le module `box_core` est indépendant d'Inkscape (Python pur, longueurs en mm). +Les options booléennes exigent une valeur (`--lid=true` / `--lid=false`). La couleur est un entier RGBA (`4278190335` = `0xff0000ff`, rouge). -## Modules +## Le kerf : compensation du trait laser -| Fichier | Rôle | -|---------|------| -| `box_maker.inx` | Définition de l'interface Inkscape | -| `box_maker.py` | Extension Inkscape, intégration SVG | -| `box_core.py` | Géométrie pur Python, indépendant d'Inkscape | -| `deploy.ps1` | Script d'installation PowerShell | -| `tests/test_box_core.py` | Tests unitaires géométrie | +### Le problème -## Repère de coordonnées +Le faisceau laser n'a pas une largeur nulle : il vaporise une bande de matière, le **kerf** (typiquement 0,05 à 0,3 mm selon la machine, la lentille, la matière et son épaisseur). Cette bande est centrée sur le trait du dessin, donc chaque bord découpé recule de **kerf / 2** : -- Origine (0, 0) : coin haut-gauche de la pièce -- **x** : vers la droite -- **y** : vers le bas (SVG) -- Tous les bords sont orthogonaux (horizontaux/verticaux uniquement) +- une pièce de 100 mm sort à 100 − kerf ; +- un créneau de 9 mm sort à 9 − kerf ; +- une encoche de 9 mm sort à 9 + kerf. + +Au montage, chaque créneau a donc un jeu d'un kerf complet dans son encoche : la boîte tient mal, voire pas du tout sans colle. + +### Ce que fait l'extension + +Chaque contour est décalé **vers l'extérieur de kerf / 2** avant d'être dessiné (`offset_orthogonal` dans `box_core.py`). Sur le dessin : + +| Élément | Cote dessinée | Cote après découpe | +| --------------- | ------------- | ------------------ | +| Pièce de 100 mm | 100 + kerf | 100 mm | +| Créneau de 9 mm | 9 + kerf | 9 mm | +| Encoche de 9 mm | 9 − kerf | 9 mm | + +Après passage du laser, les pièces retrouvent leurs cotes nominales et les créneaux remplissent exactement les encoches. Conséquence visible dans Inkscape : les pièces mesurent kerf de plus que les dimensions saisies, c'est normal. + +### Mesurer son kerf + +1. Dessiner un carré de 20 mm, le découper avec les réglages habituels (puissance, vitesse, matière). +2. Mesurer le carré au pied à coulisse : kerf = 20 − cote mesurée. + Pour plus de précision, découper une rangée de 10 carrés de 10 mm jointifs : kerf = (100 − longueur totale mesurée des 10 carrés) / 10. + +### Régler l'ajustement + +- **kerf = valeur mesurée** : ajustement exact, montage à frottement. +- **kerf plus grand** : plus serré (montage au maillet, sans colle). Attention au bois, qui gonfle avec l'humidité. +- **kerf plus petit** : du jeu (montage facile, collage). +- **kerf = 0** : pas de compensation, cotes du dessin = cotes nominales. + +Le kerf dépend de la matière : refaire la mesure en changeant de matériau ou d'épaisseur. + +## Structure du projet + +``` +. +├── box_maker.inx # Interface de l'extension (paramètres, menu) +├── box_maker.py # Extension inkex : conversion en SVG, placement dans le calque +├── box_core.py # Géométrie pure Python (mm) : créneaux, kerf, mise en page +├── deploy.ps1 # Installation / désinstallation dans Inkscape +└── tests/ + └── test_box_core.py # Tests unitaires de la géométrie +``` diff --git a/deploy.ps1 b/deploy.ps1 index 73ed86a..b6bbc00 100644 --- a/deploy.ps1 +++ b/deploy.ps1 @@ -105,4 +105,4 @@ if (Test-Path -LiteralPath $pycache) { Write-Host "" Write-Host "Extension déployée dans $destination" -ForegroundColor Green -Write-Host "Redémarrez Inkscape, puis : Extensions > Découpe laser > Boîte à créneaux..." +Write-Host "Redémarrez Inkscape, puis : Extensions > AlexDesign > Boîte à créneaux..."