Outils pour utilisateurs

Outils du site


issue180:inkscape

This month doesn’t just mark 15 years of Full Circle Magazine – I also celebrate a full decade of writing these Inkscape columns! Many thanks to everyone who has read any of them over the years, and I hope you’ve found them useful. One thing I’ve always tried to do is to explain the underlying reasons for some of the oddities and limitations in the way Inkscape operates, and this month is no different. Having described the operation of the Measure Segments LPE last time, in this instalment I’m going to look behind the curtain at how this effect differs quite radically from those that came before it. Please note, however, that this is just for information and education – you don’t actually need anything in this instalment to simply use the LPE in the way it was intended. First, a quick reminder of how Live Path Effects worked historically. An LPE was applied to a single path, and produced a single path as its output. The output path would replace the source path in the image. Here’s a very simple example: the Roughen LPE, when applied to the two-node path on the left, produces the multi-node path on the right. Looking at this in the XML editor, we can see that there’s still only a single path object, but as well as a multi-node “d” attribute, it also contains an “original-d” attribute (in the “inkscape” namespace”) which has only the two nodes of the original path.

Ce mois-ci ne marque pas seulement les 15 ans du magazine Full Circle ; je célèbre également une décennie complète de rédaction de ces chroniques sur Inkscape ! Un grand merci à tous ceux qui les ont lues au fil des ans ; j'espère que vous les avez trouvées utiles. Une chose que j'ai toujours essayé de faire est d'expliquer les raisons sous-jacentes de certaines bizarreries et limitations dans la façon dont Inkscape fonctionne et ce mois-ci n'est pas différent. Après avoir décrit le fonctionnement de l'effet de mesure de segments (LPE) la dernière fois, dans cet épisode, je vais regarder derrière le rideau et voir en quoi cet effet diffère radicalement de ceux qui l'ont précédé. Notez cependant qu'il ne s'agit que d'une information et d'un enseignement - vous n'avez besoin de rien dans cet épisode pour utiliser le LPE de la manière dont il a été conçu.

Tout d'abord, un bref rappel du fonctionnement historique des Live Path Effects (Effets de chemin interactifs). Un LPE était appliqué à un seul chemin, et produisait un seul chemin en sortie. Le chemin de sortie remplaçait le chemin source dans l'image. Voici un exemple très simple : le LPE Agitation, lorsqu'il est appliqué au chemin à deux nœuds à gauche, produit le chemin à plusieurs nœuds à droite.

En regardant cela dans l'éditeur XML, nous pouvons voir qu'il n'y a toujours qu'un seul objet chemin, mais qu'en plus d'un attribut « d » à plusieurs nœuds, il contient également un attribut « original-d » (dans l'espace de noms « inkscape ») qui ne contient que les deux nœuds du chemin original.

This is a pretty clever way to implement LPEs. Inkscape understands the extra attributes in its own namespace, so is able to treat the effect as a live, editable feature, while other SVG renderers, such as web browsers, will still show the result of the LPE since it’s just a normal “d” attribute like you would find on any SVG path object. This approach does, however, come with one big limitation. Because the output is just a single path, it can be given only one style. Even if that path appears to be multiple separate shapes, it’s actually just a single SVG path element, with gaps in the shape described by the “d” attribute (i.e. with sub-paths). If we look at the same two-node path with the “Ruler” path effect applied instead, you can see that the result gives the appearance of numerous small paths. While it would be nice to be able to style the ruler’s tick marks separately from the main spine of the shape, that simply isn’t possible because, despite appearances, the output is still just a single path, with a single style. With the release of version 1.0, Inkscape has added the ability for path effects such as “Measure Segments” to break this historical limitation. No longer is an LPE limited to one path in, one path out. Let’s apply “Measure Segments” to the same two-node path:

C'est une façon très intelligente d'implémenter les LPE. Inkscape comprend les attributs supplémentaires dans son propre espace de noms ; il est donc capable de traiter l'effet comme un élément vivant et modifiable, tandis que d'autres moteurs de rendu SVG, comme les navigateurs Web, afficheront toujours le résultat du LPE puisqu'il s'agit simplement d'un attribut « d » normal comme vous le trouveriez sur n'importe quel objet de chemin SVG.

Cette approche comporte toutefois une limite importante. Comme la sortie n'est qu'un seul chemin, on ne peut lui donner qu'un seul style. Même si ce chemin semble être constitué de plusieurs formes distinctes, il s'agit en fait d'un seul élément de chemin SVG, avec des espaces dans la forme décrits par l'attribut « d » (c'est-à-dire avec des sous-chemins). Si nous regardons le même chemin à deux nœuds avec l'effet de chemin « Règle » appliqué à la place, vous pouvez voir que le résultat donne l'apparence de nombreux petits chemins. Bien qu'il soit agréable de pouvoir styliser les marques de la règle séparément de l'épine dorsale de la forme, ce n'est tout simplement pas possible car, malgré les apparences, le résultat est toujours un seul chemin, avec un seul style.

Avec la sortie de la version 1.0, Inkscape a ajouté la possibilité pour les effets de chemin tels que « Mesurer les segments » de briser cette limitation historique. Un LPE n'est plus limité à un chemin d'entrée, un chemin de sortie. Appliquons « Mesurer les segments » au même chemin à deux nœuds :

Immediately we can see that there are multiple styles being applied here. Our original path maintains the thicker style we used when drawing it, but the lines added by the LPE are significantly thinner. How is this possible? Quite simply, the lines added by the LPE are no longer just sub-paths in a “d” attribute, but are additional SVG <path> and <text> elements in their own right. A quick look at the XML editor shows the difference. You might like to refer back to the earlier screenshot of this dialog, where the top section shows we just have a single layer with a single path in it. Now take a look at the document structure after applying this LPE: In addition to our original path, we now have three extra <path> elements (two leader lines and one measurement line), plus a <text> element to hold the measured value. Because these are separate SVG elements, you can obviously select them individually in order to style each of them differently… can’t you? The answer to that question isn’t the straightforward yes or no you might expect, so let’s delve a little deeper still. Intuitively, you might try to click on one of the new elements on the canvas in order to select it, but you’ll find that your clicks are in vain. Dragging a rubber band selection box doesn’t work either. The only thing you can select is the original path. Having selected that path, you can change its style as normal. As you’ve surmised by now, however, doing so will modify only the original path itself, not any of the elements added by the LPE. For example, note the difference in behaviour between the Ruler LPE and the Measure Segments LPE when I set a red stroke color on the original path.

Nous pouvons immédiatement constater que plusieurs styles sont appliqués ici. Notre chemin d'origine conserve le style plus épais que nous avons utilisé pour le dessiner, mais les lignes ajoutées par le LPE sont nettement plus fines. Comment est-ce possible ? Tout simplement parce que les lignes ajoutées par le LPE ne sont plus seulement des sous-chemins dans un attribut « d , mais des éléments SVG <path> et <text> supplémentaires à part entière. Un rapide coup d'œil à l'éditeur XML montre la différence. Vous pouvez vous référer à la capture d'écran précédente de ce dialogue, où la section supérieure montre que nous avons juste un seul calque avec un seul chemin dans celui-ci. Maintenant, regardez la structure du document après avoir appliqué cet LPE :

En plus de notre chemin d'origine, nous avons maintenant trois éléments <path> supplémentaires (deux lignes de tête et une ligne de mesure), plus un élément <text> pour contenir la valeur mesurée. Comme il s'agit d'éléments SVG distincts, vous pouvez évidemment les sélectionner individuellement afin de leur donner un style différent… n'est-ce pas ? La réponse à cette question n'est pas le oui ou le non direct auquel on pourrait s'attendre, alors creusons un peu plus profondément encore.

Intuitivement, vous pourriez essayer de cliquer sur l'un des nouveaux éléments du canevas afin de le sélectionner, mais vous constaterez que vos clics sont vains. Faire glisser une boîte de sélection élastique ne fonctionne pas non plus. La seule chose que vous pouvez sélectionner est le chemin d'origine. Après avoir sélectionné ce chemin, vous pouvez modifier son style comme d'habitude. Toutefois, comme vous l'avez deviné, cette opération ne modifiera que le chemin d'origine lui-même, et non les éléments ajoutés par le LPE. Par exemple, notez la différence de comportement entre la règle LPE et la mesure de segments LPE lorsque je définis une couleur de trait rouge sur le chemin d'origine.

As you’ll know from last month’s instalment, the color, font, line thickness, and other aspects of the Measure Segments LPE are set as part of the effect’s parameters, split between the “General” and “Options” tabs. Should we wish to make the dimensions match the color of the original path, for example, we’ll need to manually set it via the “Color and opacity” control in the “Options” tab. There’s no means of linking or inheriting styles, though, so if you subsequently change the stroke color of the original path, you’ll have to also remember to manually alter the LPE parameters to suit. If we can’t select the new elements using the mouse on the canvas, is there another approach we could use? Selecting individual elements within the XML editor does still work, and selects the corresponding item on the canvas when you do so. Even with that selection made, mouse interactions are restricted: you can drag the resize handles, but still can’t drag the object itself to move it (though using the cursor keys will work); you also can’t click on the object in order to switch to the rotate/skew handles or other modes now available with the selection box. You can change the style though, as demonstrated by this image of a multi-colored dimension line, complete with gradients and a different font.

Comme vous l'avez appris dans l'article du mois dernier, la couleur, la police, l'épaisseur du trait et d'autres aspects du LPE Mesurer des segments LPE sont définis dans les paramètres de l'effet, répartis entre les onglets « Général » et « Options ». Si nous souhaitons que les dimensions correspondent à la couleur du chemin d'origine, par exemple, nous devrons le régler manuellement via le contrôle « Couleur et opacité » dans l'onglet « Options ». Il n'existe cependant aucun moyen de lier ou d'hériter des styles, donc si vous modifiez par la suite la couleur du trait du chemin d'origine, vous devrez également penser à modifier manuellement les paramètres du LPE en conséquence.

Si nous ne pouvons pas sélectionner les nouveaux éléments à l'aide de la souris sur le canevas, y a-t-il une autre approche que nous pouvons utiliser ? La sélection d'éléments individuels dans l'éditeur XML fonctionne toujours et sélectionne l'élément correspondant sur le canevas. Même avec cette sélection, les interactions avec la souris sont limitées : vous pouvez faire glisser les poignées de redimensionnement, mais vous ne pouvez toujours pas faire glisser l'objet lui-même pour le déplacer (bien que l'utilisation des touches du curseur fonctionne) ; vous ne pouvez pas non plus cliquer sur l'objet pour passer aux poignées de rotation/d'inclinaison ou aux autres modes désormais disponibles avec la boîte de sélection. Vous pouvez cependant modifier le style, comme le montre cette image d'une ligne de dimension multicolore, avec des gradients et une police différents.

There’s just one problem with this approach, and it’s something of a deal-breaker. The “L” in LPE stands for “Live” because the output from an LPE is calculated dynamically whenever the original path changes, or the parameters are adjusted. This means that any manipulation of the original path – even just nudging the position of one of the nodes – or any changes to the LPE parameters, will cause the output to be recalculated and all your manual changes to be discarded. You might think that this is okay, so long as you do your changes last, and then don’t touch the object again, but the LPE output is also calculated when your file is loaded from disk: save the file, and reopen it later, and your manual changes are gone. There’s simply no way to manually edit the parts of the LPE such that Inkscape won’t throw your changes away at some point. The reason that these new elements are not selectable on the canvas is that they’re all created in a “locked” state. The ability to lock objects has been in Inkscape for a long time, but has generally been a poor substitute for keeping objects arranged in suitable layers and locking the whole layer instead. This is because a locked object is difficult to unlock again – after all, you can’t select it with the mouse to indicate which object you want to unlock. This situation improved with the release of Inkscape 1.0, which added an “Unlock Objects Below” entry to the context menu (see part 101 of this series for more details). Perhaps we could use that to allow easier editing of the individual components of our dimension line?

Il n'y a qu'un seul problème avec cette approche et il s'agit d'une sorte de rupture de contrat. Le « L » de LPE signifie « Live » (en direct), car la sortie d'un LPE est calculée dynamiquement chaque fois que le chemin original change ou que les paramètres sont ajustés. Cela signifie que toute manipulation de la trajectoire d'origine - même s'il s'agit simplement de modifier la position de l'un des nœuds un chouïa - ou toute modification des paramètres du LPE entraînera un nouveau calcul de la sortie et la suppression de toutes vos modifications manuelles. Vous pourriez penser que cela n'est pas grave, tant que vous effectuez vos modifications en dernier et que vous ne touchez plus à l'objet, mais la sortie du LPE est également calculée lorsque votre fichier est chargé depuis le disque : sauvegardez le fichier et rouvrez-le plus tard, et vos modifications manuelles sont perdues. Il n'y a tout simplement aucun moyen de modifier manuellement les parties du LPE de telle sorte qu'Inkscape ne supprime pas vos modifications à un moment donné.

La raison pour laquelle ces nouveaux éléments ne sont pas sélectionnables sur le canevas est qu'ils sont tous créés dans un état « verrouillé ». La possibilité de verrouiller des objets existe depuis longtemps dans Inkscape, mais elle s'est généralement révélée être un piètre substitut au maintien des objets dans des couches appropriées et au verrouillage de la couche entière. En effet, un objet verrouillé est difficile à déverrouiller à nouveau - après tout, vous ne pouvez pas le sélectionner avec la souris pour indiquer quel objet vous voulez déverrouiller. Cette situation s'est améliorée avec la sortie d'Inkscape 1.0, qui a ajouté une entrée « Déverrouiller les objets ci-dessous » au menu contextuel (voir la partie 101 de cette série pour plus de détails). Peut-être pourrions-nous l'utiliser pour faciliter l'édition des composants individuels de notre ligne de cote ?

Sure enough, right-clicking on the dimension, and selecting the Unlock option from the context menu, does make the individual elements selectable with the mouse. Now they can be individually styled, and can even be clicked on to switch to the rotate/skew handles and other selection box modes. Internally, what has happened is that the “sodipodi:insensitive” attribute has been removed from each element’s SVG node, which allows Inkscape to treat these elements like any normal selectable, movable, and editable objects… right until you edit the original path, alter the LPE parameters, or save and load the file. Unfortunately, just unlocking these objects isn’t enough to break their connection to the Live effect. So what’s the solution? Is there a way that we can style the individual parts of the dimension lines beyond the limited options provided in the LPE parameters? Well, there is… but only in a way that removes their link to the original path. For example, do you want to style the leader lines as dashes, or with a different thickness to the arrowed dimension line? It’s possible, but only by also losing the live update of the text value when you move or modify the path.

Il suffit de cliquer avec le bouton droit de la souris sur la dimension et de sélectionner l'option Déverrouiller dans le menu contextuel pour que les éléments individuels puissent être sélectionnés avec la souris. Ils peuvent maintenant être stylisés individuellement, et peuvent même être cliqués pour passer aux poignées de rotation/d'inclinaison et aux autres modes de boîte de sélection. En interne, l'attribut « sodipodi:insensitive » a été supprimé du nœud SVG de chaque élément, ce qui permet à Inkscape de traiter ces éléments comme n'importe quel objet normal sélectionnable, déplaçable et modifiable… jusqu'à ce que vous modifiiez le chemin d'origine, que vous changiez les paramètres LPE ou que vous sauvegardiez et chargiez le fichier. Malheureusement, le simple déverrouillage de ces objets ne suffit pas à rompre leur lien avec l'effet Live.

Quelle est donc la solution ? Existe-t-il un moyen de styliser les parties individuelles des lignes de dimension au-delà des options limitées fournies par les paramètres LPE ? Eh bien, oui… mais seulement d'une manière qui supprime leur lien avec la trajectoire d'origine. Par exemple, voulez-vous donner un style aux lignes de repère sous forme de tirets ou avec une épaisseur différente de celle de la ligne de cote fléchée ? C'est possible, mais seulement si vous perdez également la mise à jour en direct de la valeur du texte lorsque vous déplacez ou modifiez le chemin.

The way to achieve this is to use the Path > Object to Path menu entry. Historically, this has been the mechanism used to “fix” the output of an LPE, collapsing all the “live” parts of the effect chain to produce just a plain and simple SVG path that has the same appearance as the final LPE output. With the Measure Segments LPE, you can still use this same menu entry to “fix” the LPEs output, except this time the command’s name becomes something of a misnomer: you are no longer converting the object into a <path> element, but rather breaking the link between the original path and the various generated <path> and <text> elements. In other words, choosing this option doesn’t actually convert your object into a path, but it does convert it into separate editable objects. Naturally, this means that the elements are no longer “live”, so you do lose all the auto-updating that is so useful in an effect like this. For most people, all this talk of styling parts of the Measure Segments LPE will be somewhat academic. In the vast majority of cases, the normal output from the effect will be sufficient, and the parameters it provides will give enough flexibility to style the new elements well enough. If more complex adjustments are needed, then using Object to Path will usually suffice, even if it does mean sacrificing live updates of the dimensions. It would be great if Inkscape offered a means to indicate that an element has been manually styled, but that you still want the position and text content to update, but perhaps that’s too niche a requirement to warrant the development time.

Pour ce faire, il faut utiliser l'entrée de menu Chemin > Objet vers Chemin. Historiquement, c'est le mécanisme utilisé pour « fixer » la sortie d'un LPE, en réduisant toutes les parties « vivantes » de la chaîne d'effets pour produire un simple chemin SVG qui a la même apparence que la sortie finale du LPE. Avec le LPE Mesurer des segments, vous pouvez toujours utiliser cette même entrée de menu pour « corriger » la sortie des LPE, sauf que cette fois, le nom de la commande devient quelque peu erroné : vous ne convertissez plus l'objet en un élément <chemin>, mais vous brisez le lien entre le chemin d'origine et les divers éléments <chemin> et <texte> générés. En d'autres termes, le choix de cette option ne convertit pas réellement votre objet en un chemin, mais il le convertit en objets éditables distincts. Naturellement, cela signifie que les éléments ne sont plus « vivants », et vous perdez donc toute la mise à jour automatique qui est si utile dans un effet comme celui-ci.

Pour la plupart des gens, toute cette discussion sur le style des parties du LPE des segments de mesure sera quelque peu théorique. Dans la grande majorité des cas, la sortie normale de l'effet sera suffisante et les paramètres qu'il fournit donneront suffisamment de flexibilité pour styliser les nouveaux éléments de manière satisfaisante. Si des ajustements plus complexes sont nécessaires, l'utilisation de Objet en chemin sera généralement suffisante, même si cela implique de sacrifier les mises à jour en direct des dimensions. Ce serait formidable si Inkscape offrait un moyen d'indiquer qu'un élément a été stylisé manuellement, mais que vous souhaitez toujours que la position et le contenu du texte soient mis à jour, mais c'est peut-être une exigence trop « de niche » pour justifier le temps de développement.

Even if you don’t want to style the dimension parts, however, there’s one significant aspect of this LPE’s approach that you should be aware of, because the behaviour is quite surprising, and could easily catch you unawares. The behaviour of Measure Segments with regard to layers is, in my opinion, broken. Let’s take another look at the new elements in the XML editor. This is the same content as the earlier screenshot, but I’ve cropped it to just show the relevant detail. Notice that “path144” is indented compared with the rest of the elements? That’s the original path to which we’ve applied the LPE, and it’s indented because it is a child of the Inkscape layer (the <g> element above it). The newly created <path> and <text> elements, however, are not indented because they are siblings of the layer. This means that they live alongside the layer, not inside it, in the XML structure. Now let’s see what happens when we hide the layer.

Cependant, même si vous ne voulez pas styliser les parties de dimension, il y a un aspect important de l'approche de ce LPE dont vous devez être conscient, car le comportement est très surprenant, et pourrait facilement vous prendre au dépourvu. Le comportement de Mesurer des segments par rapport aux calques est, à mon avis, cassé.

Regardons à nouveau les nouveaux éléments dans l'éditeur XML. Il s'agit du même contenu que la capture d'écran précédente, mais je l'ai recadrée pour ne montrer que les détails pertinents.

Remarquez-vous que « path144 » est en retrait par rapport au reste des éléments ? C'est le chemin original auquel nous avons appliqué le LPE, et il est en retrait parce qu'il est un enfant du calque Inkscape (l'élément <g> au-dessus). Les éléments <path> et <text> nouvellement créés, cependant, ne sont pas en retrait car ils sont frères et sœurs du calque. Cela signifie qu'ils vivent à côté du calque, et non à son intérieur, dans la structure XML. Voyons maintenant ce qui se passe lorsque nous masquons le calque.

The original line is hidden, but the dimension elements are not. They all live at the top level of the SVG, not within the same layer as the path they’re associated with, so aren’t affected by hiding the layer itself. This happens regardless of how deeply nested your original path is. Consider trying to create a technical drawing showing different views of an object: common sense would tell you to put each view in a separate layer so they can be turned on and off individually, but doing so will still leave the dimensions visible. In the following example the left hand image shows a simple technical drawing of a cylinder, while the right hand one shows the result of hiding the “Top View” layer. It’s not exactly what most people would expect. There is a solution to this issue, but it’s not pretty. You can unlock the generated dimension content (right-click > Unlock Objects Below) – though you may need to do this multiple times for each part of the content. Then you need to select all the parts. Finally you can move them into the right layer using the Layer > Move Selection to Layer… menu option. Doing this will cause Inkscape to re-run the LPE, locking the objects again, but they will now be on the correct layer. The good news is that, once they’ve been moved, they tend to stay put. Further changes to the path or the LPE parameters won’t suddenly break them back out to the top level again. It would be much better, though, if Inkscape simply created them in the same layer as the original path by default.

La ligne originale est cachée, mais les éléments de dimension ne le sont pas. Ils se trouvent tous au niveau supérieur du SVG, pas dans le même calque que le chemin auquel ils sont associés, et ne sont donc pas affectés par le masquage du calque lui-même. Cela se produit indépendamment de la profondeur de l'imbrication de votre chemin original. Essayez de créer un dessin technique montrant différentes vues d'un objet : le bon sens voudrait que vous placiez chaque vue dans un calque distinct afin de pouvoir les activer et les désactiver individuellement, mais les dimensions resteront visibles. Dans l'exemple suivant, l'image de gauche montre le simple dessin technique d'un cylindre, tandis que l'image de droite montre le résultat du masquage du calque « Vue du dessus ». Ce n'est pas exactement ce à quoi la plupart des gens s'attendent.

Il existe une solution à ce problème, mais elle n'est pas très jolie. Vous pouvez déverrouiller le contenu de la dimension générée (clic droit > Déverrouiller les objets ci-dessous) - bien que vous deviez peut-être le faire plusieurs fois pour chaque partie du contenu. Ensuite, vous devez sélectionner toutes les parties. Enfin, vous pouvez les déplacer dans le bon calque en utilisant l'option de menu Calque > Déplacer la sélection vers le calque…. Inkscape réexécutera alors le LPE, verrouillant à nouveau les objets, mais ils se trouveront désormais sur le bon calque. La bonne nouvelle est qu'une fois qu'ils ont été déplacés, ils ont tendance à rester en place. De nouvelles modifications du chemin ou des paramètres LPE ne les ramèneront pas soudainement au niveau supérieur. Ce serait cependant bien mieux si Inkscape les créait simplement dans le même calque que le chemin d'origine par défaut.

Last month we looked at how to use this effect in practical terms. This time we’ve examined some of the technical details behind it. Now that the genie is out of the bottle, it’s likely that future LPEs will also create new elements rather than just single paths, so understanding what’s happening, and how they’re different from older LPEs, might be a useful skill to add to your Inkscape repertoire.

Le mois dernier, nous avons examiné comment utiliser cet effet en termes pratiques. Cette fois-ci, nous nous sommes penchés sur les détails techniques qui le sous-tendent. Maintenant que le génie est sorti de la lampe, il est probable que les futurs LPE créeront également de nouveaux éléments plutôt que de simples chemins. Comprendre ce qui se passe, et en quoi ils sont différents des anciens LPE, pourrait être une compétence utile à ajouter à votre répertoire Inkscape.

issue180/inkscape.txt · Dernière modification : 2022/05/09 12:28 de andre_domenech