inkscape.hachures/README.md
Alex 9b93ca627b Extension Inkscape de remplissage par hachures optimisées pour le laser
Taux de remplissage en pourcentage, trajet de la tête en serpentin
(plus proche voisin), hachures croisées, interface fr/en, tests et README.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 21:50:29 +02:00

152 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Remplissage par hachures — extension Inkscape
<table>
<tr>
<td width="50%" valign="top">
<img src="docs/exemple.png" alt="Cinq formes (rectangle, cercle, courbe, forme trouée, ellipse) remplies de hachures à 45° avec un taux de remplissage de 25 %" width="420">
</td>
<td valign="top">
Extension Inkscape 1.x qui remplit des formes avec des hachures parallèles pour la gravure laser. Le **taux de remplissage** (pourcentage de noir) fixe l'espacement des traits : plus il est élevé, plus la zone est sombre.
Les traits sont **classés pour la tête du laser** : la fin d'un trait est toujours proche du début du suivant. La tête monte le long d'un trait, redescend le long du suivant, et ainsi de suite en serpentin, sans repartir du même côté. Tous les traits sont écrits dans cet ordre dans un seul chemin.
</td>
</tr>
</table>
## Table des matières
- [Fonctionnalités](#fonctionnalités)
- [Installation](#installation)
- [Utilisation](#utilisation)
- [Paramètres](#paramètres)
- [Structure du projet](#structure-du-projet)
- [Développement](#développement)
## Fonctionnalités
- Remplit n'importe quelle forme fermée : rectangles, cercles, ellipses, chemins à courbes, formes trouées (règle pair-impair : les trous restent vides) et groupes (chaque forme du groupe est traitée).
- **Taux de remplissage** de 1 à 100 % : l'espacement est calculé à partir de la largeur du trait (taux = largeur / pas), donc 100 % donne des traits jointifs.
- **Trajet optimisé** : serpentin sur les formes convexes, plus proche voisin sur les formes concaves ou trouées. Sur un rectangle de 100 × 60 avec un pas de 1, les déplacements à vide tombent à 59 unités, contre 5 900 pour un balayage toujours dans le même sens.
- Angle libre, hachures croisées (seconde passe à 90°, parcourue à partir de l'endroit où la première s'arrête) et alignement des traits soit centré sur chaque forme, soit sur l'origine du document (traits continus d'une forme à l'autre).
- Résultat propre : un groupe nommé « Hachures » contenant un seul chemin « Trajet laser », sans `transform`.
- Largeur du trait en mm, cm, px, pt ou in, indépendante de l'échelle du document.
- Interface traduite en français et en anglais, selon la langue d'Inkscape (anglais pour toute autre langue).
- Script de déploiement Windows (`deploy.ps1`).
## Installation
Aucune dépendance externe : l'extension utilise `inkex`, fourni avec Inkscape.
### Windows
Fermer Inkscape, puis, dans PowerShell, depuis le dossier du projet :
```powershell
.\deploy.ps1 # installe dans %APPDATA%\inkscape\extensions\Hachures
.\deploy.ps1 -Uninstall # désinstalle
.\deploy.ps1 -Force # installe même si Inkscape est ouvert
```
### Manuelle
Copier `hachures.inx`, `hachures.py`, `hachures_core.py`, `images/parameters_en.png` et le dossier `locale/` dans un sous-dossier du répertoire des extensions d'Inkscape, puis redémarrer Inkscape :
| Système | Dossier |
| --- | --- |
| Windows | `%APPDATA%\inkscape\extensions\` |
| Linux | `~/.config/inkscape/extensions/` |
| macOS | `~/Library/Application Support/org.inkscape.Inkscape/config/inkscape/extensions/` |
## Utilisation
1. Sélectionner une ou plusieurs formes (ou un groupe).
2. Ouvrir **Extensions › AlexDesign › Remplissage par hachures…** (*Hatch Fill*).
3. Régler le taux de remplissage et la largeur du trait (celle du faisceau laser), puis valider.
4. Le résultat est placé dans un groupe juste au-dessus de la forme ; la forme d'origine est conservée sauf si l'option est décochée.
**Conseils**
| Symptôme | Réglage |
| --- | --- |
| Zone trop claire ou trop sombre | Modifier le taux de remplissage. |
| Les traits se chevauchent ou laissent des vides | Régler la largeur du trait sur celle du faisceau laser. |
| Message « Trop de traits de hachure » | Augmenter la largeur du trait, baisser le taux ou sélectionner une forme plus petite (limite : 50 000 traits). |
| Motif discontinu entre deux formes voisines | Choisir l'alignement « Origine du document ». |
| Le logiciel du laser réordonne les traits | Désactiver l'optimisation de trajet du logiciel : l'ordre du chemin est déjà optimisé. |
## Paramètres
![Schéma des paramètres](docs/parametres.png)
| Paramètre | Défaut | Rôle |
| --- | --- | --- |
| Taux de remplissage (% de noir) | 30 | Part de la surface noircie, de 1 à 100. Fixe l'espacement des traits. |
| Largeur du trait | 0,2 | Largeur du faisceau laser. |
| Unité | mm | Unité de la largeur du trait (mm, cm, px, pt, in). |
| Angle (degrés) | 45 | Direction des traits, sens anti-horaire : 0 = horizontal, 90 = vertical. |
| Hachures croisées (seconde passe à 90°) | non | Ajoute une passe perpendiculaire ; le pas double pour garder le même taux. |
| Alignement des traits | Centré sur chaque forme | Ou « Origine du document » : traits continus d'une forme à l'autre. |
| Couleur du trait | noir | Couleur des traits dans Inkscape. |
| Conserver la forme d'origine | oui | Sinon, la forme est supprimée. |
## Structure du projet
```text
hachures.inx Boîte de dialogue (textes source en anglais)
hachures.py Couche inkex : sélection, unités, écriture SVG
hachures_core.py Calcul des hachures et du trajet, sans inkex
i18n.py Traductions : extract / update / compile
po/ hachures.pot, en.po, fr.po
locale/<langue>/… Catalogues compilés (.mo)
images/parameters_en.png Schéma de l'onglet « Aide » (déployé)
docs/schema_parametres.py Générateur du schéma des paramètres
docs/parametres.png Schéma français (ce README)
docs/exemple.png Exemple de rendu (ce README)
tests/data/ SVG d'exemple pour les tests de bout en bout
test_hachures.py Tests pytest
deploy.ps1 Déploiement / désinstallation Windows
```
API de `hachures_core` :
| Fonction | Rôle |
| --- | --- |
| `spacing_from_density(density, line_width, cross=False)` | Pas entre les traits pour un taux de remplissage donné. |
| `hatch(rings, spacing, angle=45, cross=False, anchor="shape")` | Hachures d'un contour, classées dans l'ordre laser. |
| `hatch_pass(rings, spacing, angle, anchor, start)` | Un seul jeu de traits parallèles, ordonné. |
| `scan_lines(rings, spacing, phase)` | Intersections des traits avec le contour (pair-impair). |
| `order_lines(lines, spacing, phase, start)` | Ordre et sens de parcours (plus proche voisin sur les extrémités). |
| `travel_length(polylines)` / `cutting_length(polylines)` | Longueur des déplacements à vide / des traits. |
| `flatten_cubic_subpaths(subpaths, tolerance)` | Courbes de Bézier → anneaux de points. |
| `parse_color(value)` / `polylines_to_d(polylines)` | Couleur Inkscape → CSS ; polylignes → données `d`. |
## Développement
```bash
python -m venv .venv && .venv\Scripts\activate
pip install pytest
python -m pytest -q
```
Sans `inkex` : 40 tests passés, 12 ignorés (bout en bout). Avec `inkex` (`PYTHONPATH` vers `C:\Program Files\Inkscape\share\inkscape\extensions`) : 52 tests passés. Ils couvrent le taux de remplissage réel, les trous, le serpentin et la comparaison avec un balayage naïf, les formes concaves, les hachures croisées, l'alignement, l'échelle du document, les traductions et la cohérence `.inx` ↔ arguments.
### Traductions
Les textes source (`.inx` et appels `_()`) sont en anglais. Après toute modification d'un texte :
```bash
python i18n.py # extract + update + compile, liste les msgstr manquants
```
Compléter les `msgstr` vides de `po/fr.po`, puis relancer `python i18n.py`. Pour ajouter une langue, l'ajouter à `LANGUAGES` dans `i18n.py`.
### Schéma des paramètres
```bash
python docs/schema_parametres.py # français (docs/) et anglais (images/)
```
Les formes sont calculées avec `hachures_core` ; l'export PNG passe par `inkscape.com`.