173 lines
7.3 KiB
Markdown
173 lines
7.3 KiB
Markdown
# Remplissage motif relief — extension Inkscape
|
|
|
|
<table>
|
|
<tr>
|
|
<td width="50%" valign="top">
|
|
<img src="docs/capture-desktop.png" alt="Cinq formes (rectangle, cercle, courbe, rectangle troué, ellipse) remplies par le motif de Y en relief, le trou restant vide" 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é sur un motif de référence. 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>
|
|
|
|
## 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
|
|
|
|

|
|
|
|
| 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 des paramètres du README
|
|
docs/capture-desktop.png Image de présentation du README (rendu de tests/data/shapes.svg)
|
|
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`.
|