Suppression des transformations dans les fichiers SVG

155

Cela fait un moment que je me débat avec cela et je n'arrive pas à trouver de réponse (qui fonctionne) nulle part. J'ai un fichier SVG qui ressemble à ceci:

<svg

   xmlns:dc="http://purl.org/dc/elements/1.1/"
   ...
   width="72.9375"
   height="58.21875"
   ...>
   ...
   <g
     ...
     transform="translate(10.75,-308.96875)"
     style="...">
     <path
       inkscape:connector-curvature="0"
       d="m -10.254587,345.43597 c 0,-1.41732 0.17692,-2.85384 0.5312502,-3.5625 0.70866,-1.41733 2.14518,-2.82259 3.5625,-3.53125 1.41733,-0.70866 2.11392,-0.70867 3.53125,0 1.41732,0.70866 ... z"
       ... />
  </g>
</svg>

Je souhaite supprimer la transform="..."ligne, mais mon image reste là où je l'ai placée (dans InkScape). Si je supprime manuellement la transformation, l'image se zippe sur une autre partie de l'écran (comme prévu), mais je dois me débarrasser complètement de la transformation et, en même temps, faire en sorte que l'image reste exactement là où je le veux. Existe-t-il un moyen de supprimer / aplatir les transformations en coordonnées de chemin elles-mêmes? (Les seules transformations que j'ai à gérer sont la translation et la mise à l'échelle, pas de matrices.)

Éphémère
la source
1
Ceci est similaire à stackoverflow.com/questions/10126498/…
Erik Dahlström
1
Réticulation

Réponses:

150

Comment supprimer les transformations dans Inkscape

  1. Ouvrez le fichier svg dans Inkscape
  2. Allez dans Edit -> XML Editor
  3. Recherchez les attributs de "transformation" dans les calques et supprimez-les

Comment déplacer tous les objets ensemble sans créer d'autres attributs de transformation

  1. Allez dans Modifier -> Tout sélectionner dans tous les calques
  2. Allez dans Objet -> Transformer

    Dans le panneau Transformer

  3. Décochez Déplacement relatif et cochez Appliquer à chaque objet séparément

  4. Définissez les valeurs horizontales et verticales en fonction de vos besoins et cliquez sur Appliquer
Serge Seletskyy
la source
16
A travaillé pour moi. Les objets doivent être dissociés avant d'être transformés afin que les coordonnées réelles des chemins soient mises à jour.
Rupert Angermeier
8
Hm, après l'avoir mis à 0 et en cliquant sur Appliquer, la transformation apparaît à nouveau dans l'éditeur XML.
escapedcat
7
Dégrouper les objets est nécessaire pour que cela fonctionne pour moi, merci!
Hai Zhang
1
Cela n'a pas fonctionné pour moi. Il aplatira et déplacera l'attribut de transformation vers les feuilles (en fait, tout devient une feuille après le dégroupage), mais il ne supprime pas l'attribut de transformation et ne l'applique pas à la géométrie de point, sans laquelle je suis de retour à la case départ.
Szczepan Hołyszewski
2
IMPORTANT: comme un commentaire ci-dessus expliqué, vous devez dissocier les objets pour que cela fonctionne correctement, sinon l'attribut de transformation sera à nouveau défini automatiquement
Shadow
52

J'ai découvert quel était le problème. J'espérais ne pas avoir à recourir à la réponse de Robert, même si je suis heureux d'avoir confirmation que cela fonctionnerait! En fin de compte, la réponse de Duopixel était en fait la plus proche, même s'il s'avère que quelque chose d'autre se passait également.

Lorsque vous travaillez avec différents chemins dans des documents Inkscape, je pense que son comportement par défaut est de les regrouper sous une <svg:g.../>étiquette. Lors de la modification des chemins dans un groupe, Inkscape ajoutera automatiquement une transformation au groupe pour représenter ces changements. Cependant, si vous ouvrez l'éditeur XML et faites glisser votre chemin en dehors de la <svg:g.../>balise et en faites sa propre <svg:path.../>balise, Inkscape est libre de modifier les points individuels à volonté. En fin de compte, cela s'est avéré être un problème de regroupement même si je ne travaillais qu'avec un seul chemin! J'espère que cela aidera les autres dans des situations similaires.

Éphémère
la source
7
Impressionnant! Je vous remercie! C'est exactement ce qu'il faisait. Je viens de supprimer la balise de groupe en laissant le contenu interne, de la sauvegarder et de la rouvrir dans inkscape. Bien sûr, l'image était en dehors de la zone de visualisation (ou peu importe son nom), mais ensuite, j'ai simplement défini x, y et c'est corrigé. Quelle douleur. Merci d'avoir partagé ça!
johntrepreneur
1
Dans mon cas, j'ai combiné les approches de cette réponse avec une autre de cette réponse .
quasiyoke
Cela devrait être voté et porté au sommet. Cela résout le problème avec élégance et a fonctionné pour moi. Et même si les graphiques sont égarés en dehors du canevas, vous pouvez toujours les redimensionner (Édition> Redimensionner la page en sélection)
mandarin
48

entrez la description de l'image ici

  1. Chargez votre SVG dans Method Draw http://editor.method.ac (Fichier> Ouvrir l'image)
  2. Dissociez vos éléments (Objet> Dissocier les éléments), vous devrez peut-être le faire plusieurs fois.
  3. Sélectionnez votre chemin
  4. Réorientez le chemin (Objet> Réorienter les chemins).
  5. Enregistrez votre image (Fichier> Enregistrer l'image) Si elle apparaît dans une nouvelle fenêtre, vous pouvez faire un clic droit et "Enregistrer l'image sous ..."
méthode d'action
la source
1
Il n'y a aucun objet> réorienter les chemins. De quelle version parlez-vous?
0__
1
@ 0__ Si cet élément de menu est désactivé, cela signifie que votre chemin est toujours dans un groupe. Dissociez à nouveau.
methodofaction
37

Il existe une extension d'Inkscape appelée Apply Transforms qui recalcule les chemins avec leurs transformations. C'est exactement ce que je cherchais.

Après l'avoir installé, vous le trouverez sous Extensions> Modifier le chemin> Appliquer la transformation .


crédits: forum Inkscape> Supprimez toutes les transformations tout en restant en place

piotr_cz
la source
Cette extension a été mise à jour et fonctionne maintenant aussi pour les rects, du moins dans mes tests.
sil
Absolument. La puissance que vous donne ce petit plugin est incommensurable!
brett
23

Pour les groupes, le regroupement peut faire le travail rapidement. Sélectionnez le groupe et appuyez sur Ctrl + Maj + G (dégroupe) puis sur Ctrl + G (groupe).

Pour certains objets qui ont un problème similaire, les spirales et les étoiles par exemple, le moyen le plus rapide est d'appuyer sur Ctrl + Alt + C (du trait au chemin) - cela convertit cependant l'objet en un chemin pur et supprime tous les attributs supplémentaires, tels que sodipodi: cx, sodipodi: révolutions et ainsi de suite.

UTF_or_Death
la source
23

Ouvrez votre svg sur Inkscape :

  • Sélectionnez le groupe qui contient toutes les transformations dont vous souhaitez vous débarrasser
  • Appuyez sur CTRL+ U(dissocier)
  • Appuyez sur CTRL+ G(groupe à nouveau)

De cette façon, vous vous débarrasserez des transformations appliquées au groupe et elles seront transférées vers les chemins contenus dans ce groupe.

rmartrenado
la source
1
Parfait! Cela a fonctionné dans Inkscape 1.0
Wizard of Ogz
14

D'après mon expérience, si vous utilisez Inkscape, il suffit de déplacer légèrement l'élément de chemin (par exemple avec les touches de curseur), et Inkscape supprimera l'attribut de transformation et ajustera les données de chemin en conséquence. (Gênant si vous voulez réellement conserver l'attribut de transformation.)

Ainsi, vous pouvez simplement sélectionner le chemin (assurez-vous que c'est le chemin et non le groupe environnant), appuyez sur les touches de curseur droite et gauche, et vous avez terminé.

Thomas W
la source
1
Cela ne semble pas fonctionner pour un élément <g>. J'essaye de me débarrasser de l'attribut de transformation.
Max Spring
5
Essayez peut-être de dissocier d'abord et de regrouper ensuite.
Thomas W
1
Wow, a fonctionné comme un charme! Cela devrait être la réponse acceptée. Aucun outil supplémentaire nécessaire, aucune étape compliquée. Les autres réponses ne fonctionnent pas si le chemin est imbriqué dans une transformation <g>et que je souhaite conserver la transformation sur le <g>.
tomekwi
Ne fonctionne pas non plus pour un chemin créé par l'outil cercle
sdaau
1
La meilleure réponse. Peut-être qu'une source de confusion est l'option Préférences> Transformations> Stocker les transformations, que je ne vois pas mentionnée ailleurs ici. Il doit être défini sur "optimisé". Ensuite, il suffit de dissocier, déplacer, regrouper et échouer les transformations.
Mr5o1
13

Alors que je préfère Inkscape, Affinity Designer (~ 40 $ / Mac) m'a épargné des heures d'efforts lorsque je travaille avec Android Vector Drawables.

Ouvrez un fichier SVG, fichier -> Exporter -> SVG -> Plus -> Aplatir les transformations fonctionnaient très bien.

Concepteur d'affinité

snodnipper
la source
12

SVGO est un excellent outil de ligne de commande open-source pour cela et un tas d'autres optimisations. Il existe une excellente interface utilisateur Web en ligne appelée SVGOMG.

Les options pertinentes dans ce cas sont moveGroupAttrsToElems(SVGOMG: Move group attrs to elements) pour déplacer les transformattributs des groupes d'éléments de chemin, plus convertPathData(SVGOMG: Round/rewrite paths) pour aplatir transformen d.

Rob Hogan
la source
1
SVGO est incroyable. Cela devrait vraiment être la réponse acceptée, d'autant plus que stackoverflow est du point de vue du programmeur, et c'est de loin la meilleure solution pour un programmeur développant un site contenant des SVG. Mettre cela dans votre pipeline de déploiement est bien meilleur que d'avoir à apprendre à vos artistes à supprimer les transformations à la main (ou à le faire vous-même) et à obtenir un rapport de bogue chaque fois qu'ils oublient
UTF_or_Death
3
Sauf que ça ne marche plus. Je me souviens que cela fonctionnait mieux une fois, mais voyez ce problème à propos de cette fonctionnalité exacte github.com/svg/svgo/issues/624 pour SVGO
morewry
9

Il faut mentionner qu'il existe le mode "Optimisé" dans les préférences:

Préférences d'Inkscape> Transformations> Transformation de magasin> Optimisé

Ce qui est censé minimiser transformautant que possible l'occurrence des attributs (mais ne le fait pas)

Cela semble être activé par défaut de toute façon.

Selon une discussion , un cas où ce mode optimisé manque de zèle est lorsque la page est redimensionnée . Cela entraîne l'application d'une translatetransformation à l' <g>élément de couche . Il semble que l'évacuation des enfants vers une autre couche soit la meilleure solution pour le moment.

Evgeni Sergeev
la source
2
Pour redimensionner la page sans créer de translatetransformations gênantes sur chaque calque, essayez d'ouvrir le .svgfichier dans un éditeur de texte et de manipuler les attributs de hauteur et de largeur qui apparaissent en haut.
févrierEncre
7

Inkscape a la possibilité d'effacer les données de transformation tout en laissant la valeur de l'objet non modifiée.

Dans Inkscape, sélectionnez l'objet et le menu «Chemin», «Simplifier». Maintenant, vous allez supprimer les transformations.

Kumar
la source
16
Cependant, cela modifiera le contour de vos chemins et réduira le nombre de sommets dans les formes complexes.
Charlie
1
Cela rend souvent le balisage plus important qu'avant les transformations.
Charlie
6

Dans ce cas, ajoutez simplement la translation aux valeurs m pour chaque enfant, donc -10,254587 + 10,75 = -0,504587 et -308,96875 + 345,43597 = 36,46722.

Puisque tous les termes de l'exemple sont relatifs (c'est-à-dire en minuscules), c'est tout. Si certains d'entre eux étaient absolus (majuscules), par exemple M ou C, ils devraient également être ajustés.

Pour l'échelle, vous multipliez essentiellement toutes les valeurs enfants par l'échelle.

Robert Longson
la source
Je l'ai fait, mais dans l'éditeur XML d'Inkspace (ou tout autre éditeur), la transformation est toujours ajoutée. Bizarre.
escapedcat
1
De quelle manière ajusteriez-vous C si vous aviez les 2 sous-chemins, par exemple M 8,0 12,0 C 11,3 13,1 14,9 13,55 16,0 13,0 C 2,4 9,8 2,8 10,2 8,0 12,0 C 7,6 7,8 7,6 8,1 5,0 9,0 et M 3,0 5,0 C 2,4 5,5 3,3 6,4 5,0 7,0 Lequel vous voulez vous transformer en un seul chemin?
Installation le
@Anton utilisez le bouton Poser une question si vous avez une question qui n'est pas couverte par les réponses existantes. Il est difficile de demander et de répondre dans les commentaires car le formatage disponible est très limité.
Robert Longson
2
@RobertLongson et bien vous l'avez couvert. Tout ce que je souhaite, c'est que vous élaboriez "Si certains étaient absolus (majuscules), par exemple M ou C, ils devraient également être ajustés."
Installation le
6
  1. Sélectionnez les éléments en question
  2. Objet> Dissocier (répéter jusqu'à ce que tout soit dissocié; voir l'éditeur XML pour les nœuds imbriqués)
  3. Chemin> Objet en chemin (convertit les polygones en chemins)
  4. Objet> Transformer> Décocher le déplacement relatif> Appliquer
Charlie
la source
Ne semble pas fonctionner dans Inkscape 0.91. Le <g>avec l' transformattribut reste tel qu'il était. De plus, mon objet (tout comme celui montré dans la question ici) est déjà un chemin.
OR Mapper
Pouvez-vous coller un lien vers votre SVG?
Charlie
5

Pour supprimer l'attribut de transformation d'un gélément (groupe) dans Inkscape, vous pouvez déplacer le groupe vers son emplacement final, le dissocier puis regrouper tous les éléments. Maintenant, un nouveau groupe a été créé et si vous ne le déplacez pas à nouveau, aucun attribut de transformation ne lui sera attaché.

magnésium
la source
4

Si quelqu'un atterrit ici à la recherche d'une solution pour le faire dans Sketch 3, sélectionnez le calque, puis cliquez sur Calque-> Chemins-> Aplatir.

Joel Worsham
la source
3

Je l'ai trouvé:

  • Définissez la taille de page souhaitée *
  • Si votre calque actuel a une transformation (vérifiez avec l'éditeur XML, c'est le groupe supérieur sous l'élément SVG), créez un nouveau calque et déplacez tous les objets dessus
  • Dissocier tous les groupes (cela peut ne pas être nécessaire, YMMV)
  • Sélectionnez tous les objets et appliquez une transformation nulle (telle qu'une mise à l'échelle de 100% 100% ou une flèche vers la droite + une flèche vers la gauche) tout en ayant la transformation Store: optimisée dans les préférences / transformations
  • Si vous deviez annuler des groupes, vous pouvez maintenant les regrouper
  • Enregistrez une copie en tant que SVG optimisé et définissez la précision numérique souhaitée

*: Ou au moins placez les objets là où vous en avez besoin, par rapport au coin supérieur gauche de la page. Il est malheureux que les coordonnées SVG font référence au coin supérieur gauche, tandis qu'Inkscape redimensionne la page par rapport au coin inférieur gauche!

Tobia
la source
J'avais besoin de l'astuce "passer à un autre calque" car la transformation que je voulais abaisser était sur le <g> d'un calque. Le système de coordonnées d'Inkscape est assez ennuyeux.
Mutant Bob
3

J'ai pu me débarrasser d'une matrix(...)transformation (due à la mise en miroir) en combinant le chemin avec un rectangle puis en supprimant les nœuds du rectangle. La translate(...)partie est restée cependant.

Emily L.
la source
C'est la seule solution que j'ai trouvée aussi. Combinez avec un nouveau chemin propre, puis supprimez la partie inutile.
Márton Tamás
2

Dans mon cas, enregistrer en SVG optimisé a résolu le problème. Donc, dans Inkscape, utilisez:

Fichier -> Enregistrer sous ... -> SVG optimisé.

Michał Stochmal
la source
Quel était votre problème BTW? Je suis venu ici après avoir tout essayé. Mais le problème persiste encore.
Sahu V Kumar
@VishalKumarSahu Je n'ai pas pu importer l'icône de mon application Android (SVG) en tant qu'actif car l' transformattribut n'était pas pris en charge par Android Studio.
Michał Stochmal
Oui et c'est le même cas sur le Web aussi. La transformation crée un problème dans la sortie mais est très utile lors de la disposition des objets en tant que groupe. Je dois faire des calculs pour résoudre le but.
Sahu V Kumar
2

Cela fonctionne si vous utilisez Inkscape:

  1. Tout sélectionner et dissocier
  2. Enregistrer sous "Svg optimisé (* .svg)"

Dans tous les cas que j'ai essayé, cela a supprimé tous les attributs de transformation. Je ne sais pas si cela fonctionne pour des SVG plus complexes.

Max888
la source
1

J'ai essayé la solution publiée ici, à savoir supprimer les balises de groupe dans le fichier SVG et le rouvrir dans Inkscape (0.48.3.1 dans mon cas). Hélas, après avoir traduit à nouveau les chemins en utilisant le mode de sélection et de transformation (F1) et l'avoir sauvegardé, les balises de groupe sont réapparues! Inkscape enregistre toutes les transformations appliquées au chemin dans un élément de groupe environnant. À moins que vous n'utilisiez l'outil de sélection de nœud de chemin (F2), appuyez sur ctrl + a et déplacez les nœuds du chemin à leur bon endroit. Après avoir fait cela à la place et enregistré par la suite, Inkscape n'a pas ajouté les balises de groupe, car cette traduction s'appliquait directement au modèle de chemin. J'espère que cela t'aides.

Skadi2k3
la source
1

Dans mon cas, les groupes sont en fait causés par des couches. La suppression de tous les calques du document a supprimé le groupe et la transformation (éventuellement combinés avec le dégroupage d'objets et leur regroupement, etc. comme dans Suppression des transformations dans les fichiers SVG (réponse-35490189 de @Charlie ci-dessus))

Jamie Pate
la source
0

Mon problème spécifique concernait les symboles définis en dehors de la page, nécessitant ainsi une transformation à afficher sur la page.

Pour déplacer les symboles sur la page sans nécessiter de transformation, j'ai dû suivre ces étapes dans Inkscape:

  1. Ouvrez la fenêtre Symboles (Maj + Ctrl + Y)
  2. Supprimez le symbole de la bibliothèque de documents. (Il y a un bouton pour cela dans la fenêtre.)
  3. Maintenant, le graphique apparaît dans le document, en dehors des limites de la page.
  4. Dissociez le graphique. (C'est une étape vitale!)
  5. Déplacez le graphique à l'intérieur de la limite de la page.
  6. Ajoutez le graphique à la bibliothèque de symboles.
Peter
la source
0

Cela semble aléatoire, mais rien d'autre que j'ai essayé n'a fonctionné, alors vous allez au hasard pour une autre personne. Certains de mes chemins avaient une sorte de marge autour d'eux qui ne pouvait être vue qu'en les sélectionnant ( exemple). Je pense que cela a été créé lorsque j'ai collé un calque à partir d'un autre fichier inkscape et l'ai fait pivoter de 90 degrés. Cela a fait un remplissage de motif sur les formes ont une transformation différente (lignes espacées plus loin). Cela a également rendu les objets d'alignement ne fonctionnant pas comme prévu. L'utilisation de Apply Transform mentionnée par @Piotr_cz a résolu le problème de transformation, mais l'étrange marge est restée. Je me suis accidentellement débarrassé de celui-ci en modifiant le Flou sur le contour sur n'importe quelle valeur et en le remettant à zéro.

Jim
la source
0

D'une manière ou d'une autre, je n'ai eu de chance avec aucune des approches. S'il y a une <defs>section dans votre svg et des utilisations comme celle-ci:

<g transform="matrix( *** ) "><use xlink:href="#***"/></g>

vous devrez peut-être supprimer toutes les utilisations et tout retirer de la section defs. Ensuite, vous pouvez utiliser inkscape pour tout placer correctement, puis appliquer des transformations à l'aide du plugin mentionné. J'espère que ça aide quelqu'un.

k102
la source
0

J'ai eu ce problème pendant des années. La solution est clairement de pouvoir jouer dynamiquement avec les transformations dans le navigateur, si cela ne va pas être "corrigé" dans inkscape.

Un utilisateur Mc sur les forums d'Inkscape m'a donné cette solution .

La solution génère la transformation actuelle entre un élément SVG et son élément racine SVG, puis renvoie un ensemble complet d'informations BBox en fonction du total des transformations.

Il serait également possible de changer facilement à quel élément les calculs sont relatifs, si vous souhaitez effectuer un travail de navigateur entre deux parties du même fichier SVG.

Enfin, je peux avoir une fenêtre SVG panoramique.

Jay Day Zee
la source
0

Inkscape 1.0 sur Kubuntu 20.04

Bien que ce fil soit assez ancien, j'aimerais publier mon expérience / solution. Je suis tombé sur ce problème en essayant de créer un modèle pour l'atelier TechDrawing de FreeCAD. Ces modèles ne doivent contenir aucune transformation.

Dans mon cas, j'ai dû ajouter un logo d'entreprise à partir d'un fichier .svg externe (entièrement réalisé avec Inkscape). Ce logo contient des éléments graphiques et textuels. Lors de la copie de ce logo dans le modèle, des transformations ont été créées, ce qui a empêché le modèle de fonctionner correctement dans FreeCAD.

  • Premièrement, cette solution proposée sur www.freecadweb.org / ... ne fonctionne pas pour moi. C'est pourquoi j'ai cherché sur le Web et trouvé cette discussion.

  • Deuxièmement, aucune des solutions suggérées ci-dessus n'a fonctionné pour moi, mais elles m'ont mis sur la bonne voie. La réponse de Charlie était proche, mais Objet> Transformer> Décocher le mouvement relatif> Appliquer ne montrait aucune différence.

Ce qui a fonctionné pour moi était:

  1. Comme mentionné par d'autres, dissociez tout.
  2. Convertir des objets texte en chemin - cela m'a semblé essentiel dans mon cas!
  3. Supprimez toutes les transformations existantes dans l'éditeur XML et observez ce qui se passe avec les objets associés. Dans mon cas, les éléments correspondants ont changé de position.
  4. Corrigez ces modifications manuellement mais ne regroupez rien.
  5. Enregistrer comme svg normal (normal = aucune optimisation ou d'autres paramètres spéciaux ont été utilisés)

Fonctionne très bien lorsque j'utilise ce modèle dans FreeCAD.


Un détail étrange: bien que ma solution suggère que les éléments de texte étaient le problème dans mon cas, cela ne peut pas être aussi simple. En fait, le document de base (celui dans lequel j'ai copié le logo) contient beaucoup d'éléments de texte, et je n'en ai converti aucun. Cela pourrait donc être la combinaison de "source externe" et d' éléments de texte. Je poste simplement ce détail comme un indice aux autres, qui pourraient avoir des problèmes connexes.

Monsieur le cul
la source