209 lines
10 KiB
Markdown
209 lines
10 KiB
Markdown
# Remplissage motif Y fléché — extension Inkscape
|
||
|
||
<table>
|
||
<tr>
|
||
<td width="50%" valign="top">
|
||
<img src="docs/capture-desktop.png" alt="Une forme courbe percée d'un trou et un cercle, remplis par l'extension d'un réseau de Y fléchés découpé au contour" width="420">
|
||
</td>
|
||
<td valign="top">
|
||
|
||
Extension Inkscape 1.x qui remplit la surface d'une forme fermée avec un motif
|
||
géométrique de « Y fléchés » : un réseau triangulaire de Y identiques (bras à 0°,
|
||
120° et 240°), chaque bras se terminant par un chevron dont les barbes sont
|
||
parallèles aux deux autres bras. La pointe de chaque flèche vient se loger dans le
|
||
« V » arrière du Y voisin, ce qui produit l'effet de chevrons imbriqués.
|
||
|
||
</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
|
||
|
||
- Remplissage de `path`, `rect`, `circle`, `ellipse`, `polygon` (les groupes
|
||
sélectionnés sont explorés ; `line` et `polyline` sont ignorées)
|
||
- Deux modes au bord de la forme : **découpe géométrique** des traits sur le
|
||
contour, ou **motifs entiers uniquement** avec marge réglable
|
||
- Gestion des trous : les sous-chemins internes sont exclus (règle pair-impair)
|
||
- Proportions réglables : période, longueur des bras et des barbes (en % de la
|
||
période), rotation, épaisseur et couleur du trait
|
||
- Ancrage du réseau sur l'origine du document (motif continu d'une forme à
|
||
l'autre) ou au centre de chaque forme
|
||
- Un chemin par motif, sans attribut `transform` sur les chemins : SVG directement
|
||
exploitable par les logiciels de découpe laser
|
||
- Motifs ordonnés en serpentin, ligne par ligne, pour limiter les déplacements à vide
|
||
- Index spatial des arêtes du contour : plusieurs milliers de motifs en une fraction
|
||
de seconde
|
||
- Interface traduite en français et en anglais, selon la langue d'Inkscape
|
||
(anglais pour toute autre langue)
|
||
- Script de déploiement PowerShell (installation, mise à jour, désinstallation)
|
||
|
||
## Installation
|
||
|
||
Aucune dépendance externe : l'extension utilise `inkex`, fourni avec Inkscape.
|
||
|
||
### Windows — script de déploiement
|
||
|
||
Inkscape fermé, depuis le dossier du projet :
|
||
|
||
```powershell
|
||
.\deploy.ps1 # copie vers %APPDATA%\inkscape\extensions\yArrowPattern
|
||
.\deploy.ps1 -Uninstall # retire le sous-dossier de l'extension
|
||
.\deploy.ps1 -Force # passe outre le contrôle « Inkscape ouvert »
|
||
```
|
||
|
||
### Installation manuelle
|
||
|
||
Copier `y_pattern.inx`, `y_pattern.py`, `pattern_core.py` et les dossiers `locale/`
|
||
et `images/` dans un sous-dossier (par exemple `yArrowPattern`) du dossier des extensions
|
||
utilisateur, puis redémarrer Inkscape :
|
||
|
||
- 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 fermées.
|
||
2. **Extensions → AlexDesign → Remplissage motif Y fléché…**
|
||
(*Y Arrow Pattern Fill…* avec une interface en anglais)
|
||
3. Régler les paramètres, puis **Appliquer**. L'onglet **Schéma** illustre chaque
|
||
paramètre.
|
||
|
||
Le résultat est placé dans un groupe « Motif Y fléché » juste au-dessus de la forme.
|
||
|
||
Conseils :
|
||
|
||
- motif trop serré ou trop lâche → ajuster la **période** ; les proportions
|
||
restent identiques
|
||
- traits qui se touchent → réduire l'épaisseur ou la longueur des bras (l'écart
|
||
entre une pointe et le Y suivant vaut `100 % − bras`)
|
||
- en mode « motifs entiers », la demi-épaisseur du trait est ajoutée à la marge
|
||
pour que rien ne déborde du contour
|
||
- en mode découpe, les extrémités coupées en biais peuvent dépasser du contour
|
||
d'au plus une demi-épaisseur de trait
|
||
|
||
## Paramètres
|
||
|
||

|
||
|
||
| Paramètre | Défaut | Rôle |
|
||
| ---------------------------- | ------- | ------------------------------------------------------------- |
|
||
| Période | 10.0 | Distance entre les centres de deux Y voisins |
|
||
| Longueur des bras | 83 % | En pourcentage de la période |
|
||
| Longueur des barbes | 33 % | En pourcentage de la période ; 0 donne des Y simples |
|
||
| Rotation du motif | 0° | Sens anti-horaire |
|
||
| Épaisseur du trait | 0.5 | Largeur du trait |
|
||
| Unité | mm | Unité de la période, de l'épaisseur et de la marge |
|
||
| Couleur du trait | #b3b3b3 | Couleur et opacité |
|
||
| Bord de la forme | Découpe | Découpe au contour, ou motifs entiers uniquement |
|
||
| Marge au contour | 0.0 | Mode « motifs entiers » seulement |
|
||
| Ancrage du réseau | Document| Origine du document, ou centre de chaque forme |
|
||
| Finesse d'échantillonnage | 0.2 | Précision de l'aplatissement des courbes de Bézier |
|
||
| Conserver la forme d'origine | oui | Sinon la forme source est supprimée |
|
||
|
||
Les valeurs par défaut (83 % / 33 %) reproduisent les proportions du motif
|
||
d'origine.
|
||
|
||
## Structure du projet
|
||
|
||
```text
|
||
y_pattern.inx Description de la boîte de dialogue Inkscape
|
||
y_pattern.py Extension : lecture de la sélection, aplatissement des
|
||
chemins, écriture des motifs dans le SVG
|
||
pattern_core.py Noyau géométrique sans dépendance à inkex
|
||
deploy.ps1 Déploiement / désinstallation sous Windows
|
||
test_pattern.py Tests pytest
|
||
i18n.py Chaîne de traduction : extraction, mise à jour, compilation
|
||
po/ Catalogues source : modèle .pot, en.po, fr.po
|
||
locale/ Catalogues compilés (.mo) chargés par Inkscape
|
||
images/ Schéma anglais de l'onglet « Diagram » (déployé)
|
||
tests/data/shapes.svg Formes d'exemple (rectangle, cercle, courbe, forme trouée)
|
||
docs/ Images du README, SVG des schémas et leur générateur
|
||
(non déployés)
|
||
```
|
||
|
||
API de `pattern_core.py` (utilisable seule, hors Inkscape) :
|
||
|
||
| Fonction | Rôle |
|
||
| ----------------------------------------------- | -------------------------------------------------------- |
|
||
| `motif_polylines(cx, cy, arm, barb, angle)` | Polylignes d'un Y fléché |
|
||
| `lattice_centers(bbox, period, angle, reach)` | Centres du réseau triangulaire, en ordre serpentin |
|
||
| `EdgeIndex(rings)` | Index spatial du contour : appartenance, intersections |
|
||
| `clip_polyline(polyline, index)` | Morceaux d'une polyligne intérieurs au contour |
|
||
| `motif_fits(polylines, index, clearance)` | Motif entier intérieur, à distance minimale du bord |
|
||
| `fill_pattern(rings, period, …)` | Remplissage complet, renvoie une liste de motifs |
|
||
| `polylines_to_d(polylines)` | Données `d` d'un chemin SVG |
|
||
| `parse_color(value)` | Décode la couleur RGBA transmise par Inkscape |
|
||
|
||
## Développement
|
||
|
||
```powershell
|
||
python -m venv .venv
|
||
.venv\Scripts\activate # Linux/macOS : source .venv/bin/activate
|
||
pip install pytest
|
||
python -m pytest test_pattern.py -q
|
||
```
|
||
|
||
Résultat attendu : **23 passés, 3 ignorés** (tests de bout en bout sautés quand
|
||
`inkex` n'est pas importable). Pour les exécuter :
|
||
|
||
```powershell
|
||
pip install lxml tinycss2 cssselect2 cssselect
|
||
$env:PYTHONPATH = 'C:\Program Files\Inkscape\share\inkscape\extensions'
|
||
python -m pytest test_pattern.py -q # 26 passés
|
||
```
|
||
|
||
Les tests couvrent la géométrie du motif (barbes parallèles aux bras, voisins à une
|
||
période), la couverture du réseau, l'absence de croisement entre motifs voisins aux
|
||
proportions par défaut, la découpe (y compris à travers un trou), la marge du mode
|
||
« motifs entiers » et la continuité du motif entre deux formes adjacentes.
|
||
|
||
### Traductions
|
||
|
||
Les textes source du `.inx` et des appels `_()` de `y_pattern.py` sont en anglais ;
|
||
Inkscape les traduit avec le catalogue `yarrowpattern` (attribut
|
||
`translationdomain` du `.inx`) trouvé dans `locale/<langue>/LC_MESSAGES/`.
|
||
`i18n.py` n'a besoin que de Python (ni `xgettext` ni `msgfmt`) :
|
||
|
||
```powershell
|
||
python i18n.py # tout : extract + update + compile
|
||
python i18n.py extract # po/yarrowpattern.pot depuis le .inx et le .py
|
||
python i18n.py update # reporte les nouveaux textes dans po/en.po et po/fr.po
|
||
python i18n.py compile # po/*.po -> locale/*/LC_MESSAGES/yarrowpattern.mo
|
||
```
|
||
|
||
Après modification d'un texte d'interface : lancer `python i18n.py`, compléter les
|
||
`msgstr` vides de `po/fr.po` (liste affichée par la commande), relancer
|
||
`python i18n.py`, puis redéployer. `po/en.po` est rempli automatiquement avec les
|
||
textes source. Ajouter une langue : l'ajouter à `LANGUAGES` dans `i18n.py`.
|
||
Le test `test_translations_up_to_date_and_complete` échoue si un catalogue est
|
||
incomplet ou si un `.mo` n'a pas été recompilé.
|
||
|
||
### Schéma des paramètres
|
||
|
||
Le schéma existe en deux versions, produites à partir de `pattern_core` (même
|
||
géométrie que l'extension) :
|
||
|
||
- `docs/parametres.png` : version française du README (1400 px) ;
|
||
- `images/parameters_en.png` : version anglaise, textes agrandis, affichée à
|
||
900 × 694 px dans l'onglet **Schéma** / **Diagram** de la boîte de dialogue.
|
||
Inkscape ne traduit pas le chemin d'une `<image>` : cet onglet montre la version
|
||
anglaise quelle que soit la langue.
|
||
|
||
```powershell
|
||
python docs/schema_parametres.py # les deux versions (ou : fr, en)
|
||
```
|
||
|
||
Le script écrit les SVG dans `docs/` puis les exporte en PNG avec
|
||
`C:\Program Files\Inkscape\bin\inkscape.com`. Il faut passer par `inkscape.com` : la
|
||
commande `inkscape` installée par Chocolatey rend la main avant la fin de l'export.
|