inkscape.motif.relief/README.md
2026-10-19 20:51:52 +02:00

176 lines
7.3 KiB
Markdown

# Remplissage motif relief — extension Inkscape
<table>
<tr>
<td width="50%" valign="top">
<img src="doc/a57cd56c50f5c5bb0b0601f17f08704a.jpg" alt="Motif de référence : figures en Y en relief sur une grille isométrique" width="420">
</td>
<td valign="top">
Extension Inkscape 1.x qui remplit l'**intérieur** des formes sélectionnées avec un
motif en relief : des figures en « Y » dessinées sur une grille isométrique
(arêtes verticales et à ±30°), relevé fidèle de l'image de référence du dossier
`doc/`. Les traits sont coupés exactement au bord de la forme, trous compris, et le
résultat tient dans un seul chemin par forme.
</td>
</tr>
</table>
> Une capture du résultat dans Inkscape (`docs/capture-desktop.png`) reste à ajouter.
## Sommaire
- [Fonctionnalités](#fonctionnalités)
- [Installation](#installation)
- [Utilisation](#utilisation)
- [Paramètres](#paramètres)
- [Structure du projet](#structure-du-projet)
- [Développement](#développement)
## Fonctionnalités
- Motif périodique (maille hexagonale de 5 arêtes) calculé, pas importé : taille,
rotation et origine réglables.
- Formes gérées : chemins (courbes aplaties), rectangles, cercles, ellipses,
polygones, polylignes, et groupes de ces éléments (transformations prises en
compte). Les chemins composés avec trous restent vides à l'intérieur des trous.
- Deux modes d'origine : centre de chaque forme (motif symétrique) ou origine du
document (motif continu d'une forme à l'autre).
- Segments alignés fusionnés : peu de nœuds, un seul chemin par forme, pas de
`transform` sur les chemins produits.
- Option : tracer aussi le contour de la forme ; option : conserver ou supprimer
la forme d'origine.
- Garde-fou : refus au-delà de 250 000 segments, avec un message d'aide.
- 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
.\deploy.ps1 -Uninstall # désinstalle
.\deploy.ps1 -Force # installe même si Inkscape est ouvert
```
Les fichiers sont copiés dans `%APPDATA%\inkscape\extensions\Remplissage motif relief`.
### Manuelle
Copier `relief_fill.inx`, `relief_fill.py`, `relief_core.py`, `images/` et `locale/`
dans un sous-dossier du dossier d'extensions utilisateur :
| Système | Dossier |
| ------- | ------- |
| Windows | `%APPDATA%\inkscape\extensions\` |
| Linux | `~/.config/inkscape/extensions/` |
| macOS | `~/Library/Application Support/org.inkscape.Inkscape/config/inkscape/extensions/` |
Redémarrer Inkscape après l'installation.
## Utilisation
1. Sélectionner une ou plusieurs formes.
2. Menu **Extensions > AlexDesign > Remplissage motif relief…** (*Relief Pattern Fill*).
3. Régler la longueur d'arête, la rotation et l'origine, puis **Appliquer**.
Le résultat est un groupe « Remplissage relief » placé juste au-dessus de chaque
forme sélectionnée.
**Conseils**
| Symptôme | Réglage |
| -------- | ------- |
| Motif trop fin ou trop dense | Augmenter la longueur d'arête |
| « Trop de traits » | Augmenter la longueur d'arête ou sélectionner une forme plus petite |
| « Aucun trait n'y tient » | Réduire la longueur d'arête |
| Motif discontinu entre deux formes voisines | Choisir l'origine « Origine du document » |
| Texte non rempli | Le convertir d'abord en chemins (Chemin > Objet en chemin) |
## Paramètres
![Schéma des paramètres](docs/parametres.png)
| Paramètre | Défaut | Rôle |
| --------- | ------ | ---- |
| Longueur d'arête | 5 mm | Arête unitaire de la grille ; le motif se répète toutes les 5 arêtes |
| Unité | mm | Unité de la longueur d'arête et de l'épaisseur des traits (mm, cm, px, pt, in) |
| Rotation (degrés, sens horaire) | 0 | Fait tourner le motif autour de l'origine du motif |
| Origine du motif | Centre de chaque forme | Nœud de la grille au centre de chaque forme, ou à l'origine du document |
| Couleur des traits | noir | Couleur (et opacité) des traits |
| Épaisseur des traits | 0,3 | Dans l'unité de l'onglet Motif |
| Dessiner aussi le contour de la forme | non | Ajoute un chemin avec le contour de la forme |
| Conserver la forme d'origine | oui | Sinon la forme sélectionnée est supprimée |
## Structure du projet
```text
relief_fill.inx Boîte de dialogue (textes source en anglais)
relief_fill.py Couche inkex : sélection, unités, aplatissement, écriture SVG
relief_core.py Logique pure, sans inkex : motif, découpe
i18n.py Extraction / mise à jour / compilation des traductions
po/ relief_fill.pot, en.po, fr.po
locale/<lang>/LC_MESSAGES/relief_fill.mo (générés, déployés)
images/parameters_en.png Schéma de l'onglet « Help » (déployé)
docs/schema_parametres.py Générateur du schéma (fr pour le README, en pour le dialogue)
docs/parametres.png Schéma du README
doc/ Image de référence du motif
tests/data/ SVG d'exemple pour les tests de bout en bout
test_relief_fill.py Tests pytest
deploy.ps1 Déploiement / désinstallation Windows
```
API du noyau (`relief_core.py`) :
| Fonction | Rôle |
| -------- | ---- |
| `fill_rings(rings, edge, angle=0, anchor=(0, 0))` | Segments du motif à l'intérieur d'un contour (pair-impair) |
| `pattern_segments(bbox, edge)` | Segments du motif couvrant une boîte, nœud (0, 0) à l'origine |
| `clip_segment(p, q, rings)` | Parties d'un segment situées dans le contour |
| `point_in_rings(point, rings)` | Appartenance au contour, règle pair-impair |
| `rotate_point(point, angle, center)` | Rotation (sens horaire à l'écran) |
| `rings_bbox(rings)` | Boîte englobante |
| `segments_to_polylines(segments)` / `polylines_to_d(polylines)` | Conversion vers les données `d` d'un chemin SVG |
| `parse_color(value)` | Couleur Inkscape (entier RGBA) → `#rrggbb` + opacité |
## Développement
```powershell
python -m venv .venv ; .\.venv\Scripts\Activate.ps1
pip install pytest lxml tinycss2 cssselect2 cssselect
python -m pytest -q # 23 tests passés, 11 ignorés (sans inkex)
$env:PYTHONPATH = 'C:\Program Files\Inkscape\share\inkscape\extensions'
python -m pytest -q # 34 tests passés (avec inkex)
```
Les tests couvrent le noyau (directions, périodicité, fusion des arêtes, découpe,
trous, rotation, ancrage), le bout en bout (formes, courbes, trou, groupe
transformé, échelle de page non standard, options) et la cohérence des
traductions et du `.inx`.
### Traductions
```powershell
python i18n.py # extrait, met à jour et compile ; liste les msgstr manquants
```
Après modification d'un texte du `.inx` ou d'un `_("...")` : lancer `python i18n.py`,
compléter les `msgstr` vides de `po/fr.po`, relancer. Ne jamais éditer les `.mo`.
Pour ajouter une langue : l'ajouter à `LANGUAGES` dans `i18n.py`.
### Schéma des paramètres
```powershell
python docs\schema_parametres.py # fr -> docs/parametres.png, en -> images/parameters_en.png
```
L'export PNG passe par `inkscape.com`. Le schéma est calculé avec les vraies
fonctions de `relief_core`.