Eliminar transformaciones en archivos SVG

155

He estado luchando con esto por un tiempo, y parece que no puedo encontrar una respuesta (que funcione) en ningún lado. Tengo un archivo SVG que se ve así:

<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>

Quiero eliminar la transform="..."línea, pero aún así mi imagen permanece donde la he colocado (en InkScape). Si elimino manualmente la transformación, la imagen se comprime en otra parte de la pantalla (como se esperaba), pero necesito deshacerme por completo de la transformación y, al mismo tiempo, hacer que la imagen permanezca exactamente donde la quiero. ¿Hay alguna forma de eliminar / aplanar las transformaciones en las coordenadas de la ruta? (Las únicas transformaciones con las que tengo que lidiar son traducir y escalar, sin matrices).

Efímera
fuente
1
Esto es similar a stackoverflow.com/questions/10126498/…
Erik Dahlström
1
Enlaces cruzados

Respuestas:

149

Cómo eliminar transformaciones en Inkscape

  1. Abrir archivo svg en Inkscape
  2. Vaya a Editar -> Editor XML
  3. Encuentre atributos de "transformación" en capas y elimínelos

Cómo mover todos los objetos en conjunto sin crear otros atributos de transformación

  1. Vaya a Editar -> Seleccionar todo en todas las capas
  2. Vaya a Objeto -> Transformar

    En el panel Transformar

  3. Desmarque Movimiento relativo y marque Aplicar a cada objeto por separado

  4. Establezca valores horizontales y verticales según sus necesidades y haga clic en Aplicar
Serge Seletskyy
fuente
16
Trabajó para mi. Los objetos deben desagruparse antes de transformarse para que se actualicen las coordenadas reales de las rutas.
Rupert Angermeier
8
Hm, después de establecerlo en 0 y hacer clic en aplicar, la transformación aparece nuevamente en el editor XML.
escapedcat
77
Desagrupar los objetos es necesario para que esto funcione para mí, ¡gracias!
Hai Zhang
1
No funciono para mi. Se aplanará y moverá el atributo de transformación a hojas (en realidad todo se convierte en una hoja después de desagrupar), pero no ELIMINARÁ el atributo de transformación y lo APLICARÁ A LA GEOMETRÍA DE PUNTOS, sin lo cual volveré al punto de partida.
Szczepan Hołyszewski
2
IMPORTANTE: como se explicó en un comentario anterior, debe desagrupar los objetos para que esto funcione correctamente, de lo contrario, el atributo de transformación se establecerá nuevamente automáticamente
Shadow
52

Resolví cuál era el problema. ¡Esperaba no tener que recurrir a la respuesta de Robert, aunque me alegra que me confirmen que funcionaría! Al final, la respuesta de Duopixel fue en realidad la más cercana, aunque resulta que también estaba sucediendo algo más.

Cuando trabajas con diferentes rutas en documentos de Inkscape, creo que su comportamiento predeterminado es agruparlos bajo una <svg:g.../>etiqueta. Al modificar rutas en un grupo, Inkscape agregará automáticamente una transformación al grupo para representar estos cambios. Sin embargo, si abre el editor XML y arrastra su ruta fuera de la <svg:g.../>etiqueta y la convierte en su propia <svg:path.../>etiqueta, Inkscape puede editar los puntos individuales a voluntad. ¡Al final resultó ser un problema de agrupación a pesar de que solo estaba trabajando con una ruta! Espero que esto ayude a otros en situaciones similares.

Efímera
fuente
77
¡Increíble! ¡Gracias! Eso es exactamente lo que estaba haciendo. Acabo de eliminar la etiqueta de grupo dejando el contenido interno, la guardé y la volví a abrir en Inkscape. Por supuesto, la imagen estaba fuera del cuadro de vista (o como se llame), pero luego configuré la x, y y está arreglada. Que dolor. ¡Gracias por compartir esto!
johntrepreneur
1
En mi caso, he combinado enfoques de esta respuesta con otro de esa respuesta .
cuasiyoke
Esto debería ser votado y llevado a la cima. Esto resuelve el problema con elegancia y funcionó para mí. E incluso si los gráficos están fuera de lugar del lienzo, siempre puede cambiar su tamaño (Editar> Cambiar el tamaño de la página a la selección)
mandarín
48

ingrese la descripción de la imagen aquí

  1. Cargue su SVG en Method Draw http://editor.method.ac (Archivo> Abrir imagen)
  2. Desagrupe sus elementos (Objeto> Desagrupar elementos) puede que tenga que hacer esto más de una vez.
  3. Selecciona tu camino
  4. Reorientar la ruta (Objeto> Reorientar rutas).
  5. Guarde su imagen (Archivo> Guardar imagen) Si aparece en una nueva ventana, puede hacer clic derecho y "Guardar imagen como ..."
método de acción
fuente
1
No hay Objeto> Reorientar rutas. ¿A qué versión te refieres?
0__
1
@ 0__ Si este elemento del menú está desactivado, significa que su ruta aún está dentro de un grupo. Desagrupar de nuevo.
methodofaction
37

Existe una extensión de Inkscape llamada Apply Transforms que vuelve a calcular las rutas con sus transformaciones. Esto es exactamente lo que he estado buscando.

Después de instalarlo, encontrará el menú en Extensiones> Modificar ruta> Aplicar transformación .


créditos: foro de Inkscape> Eliminar todas las transformaciones mientras se mantiene en su lugar

piotr_cz
fuente
Esta extensión se ha actualizado y ahora también funciona para los rectificadores, al menos en mis pruebas.
sil
Absolutamente. ¡El poder que le brinda este pequeño complemento es inconmensurable!
brett
23

Para los grupos, la reagrupación puede hacer el trabajo rápidamente. Seleccione el grupo y presione Ctrl + Shift + G (degroup) y luego Ctrl + G (group).

Para algunos objetos que tienen un problema similar, espirales y estrellas, por ejemplo, la forma rápida es presionar Ctrl + Alt + C (trazo a ruta); sin embargo, esto convierte el objeto en una ruta pura y elimina todos los atributos adicionales, tales como sodipodi: cx, sodipodi: revoluciones, etc.

UTF_o_Death
fuente
23

Abre tu svg en Inkscape :

  • Seleccione el grupo que contiene todas esas transformaciones de las que desea deshacerse
  • Presione CTRL+ U(desagrupar)
  • Presione CTRL+ G(agrupar nuevamente)

De esta forma, se deshará de las transformaciones aplicadas al grupo y se transferirán a las rutas que se encuentran dentro de este grupo.

rmartrenado
fuente
1
¡Perfecto! Esto funcionó en Inkscape 1.0
Wizard of Ogz
14

En mi experiencia, si está usando Inkscape, es suficiente mover ligeramente el elemento de ruta (por ejemplo, con las teclas del cursor), e Inkscape eliminará el atributo de transformación y ajustará los datos de ruta en consecuencia. (Molesto si realmente desea mantener el atributo de transformación).

Por lo tanto, simplemente puede seleccionar la ruta (asegúrese de que sea la ruta y no el grupo circundante), presione la tecla de cursor derecha e izquierda, y listo.

Thomas W
fuente
1
Esto no parece funcionar para un elemento <g>. Estoy tratando de deshacerme del atributo transform.
Max Spring
55
Tal vez intente desagrupar primero y reagrupar después.
Thomas W
1
¡Guau, funcionó como un encanto! Esta debería ser la respuesta aceptada. No se necesitan herramientas adicionales, ni pasos complicados. Otras respuestas no funcionan si la ruta está anidada en una transformación <g>y quiero mantener la transformación en <g>.
tomekwi
Tampoco funciona para una ruta creada por la herramienta de círculo
sdaau
1
La mejor respuesta Tal vez una fuente de confusión es la opción Preferencias> Transformaciones> Transformaciones de tienda, que no veo mencionado en otra parte aquí. Debe establecerse en "optimizado". Luego, solo se desagrupan, se mueven, se reagrupan y se eliminan las transformaciones de error.
Mr5o1
13

Si bien prefiero Inkscape, Affinity Designer (~ $ 40 / Mac) me ahorró horas de esfuerzo al trabajar con Android Vector Drawables.

Abra un SVG, Archivo -> Exportar -> SVG -> Más -> Acoplar transformaciones funcionó muy bien.

Diseñador de afinidad

snodnipper
fuente
12

SVGO es una excelente herramienta de línea de comandos de código abierto para esta y muchas otras optimizaciones. Hay una IU web en línea igualmente excelente porque se llama SVGOMG

Las opciones relevantes en este caso son moveGroupAttrsToElems(SVGOMG: Move group attrs to elements) para mover transformlos atributos de los grupos de elementos de la ruta, además de convertPathData(SVGOMG: Round/rewrite paths) para aplanar transformen d.

Rob Hogan
fuente
1
SVGO es increíble. Esta realmente debería ser la respuesta aceptada, especialmente porque stackoverflow es para el punto de vista del programador, y esta es, con mucho, la mejor solución para un programador que desarrolla un sitio que contiene SVG. Poner esto en su canal de implementación es mucho mejor que tener que enseñar a sus artistas a eliminar las transformaciones a mano (o tener que hacerlo usted mismo) y obtener un informe de error cada vez que lo olviden
UTF_or_Death
3
Excepto que esto ya no funciona. Recuerdo que funcionó mejor una vez, pero vea este problema sobre esta característica exacta github.com/svg/svgo/issues/624 para SVGO
morewry
9

Cabe mencionar que existe el modo "Optimizado" en las preferencias:

Preferencias de Inkscape> Transformaciones> Transformación de tienda> Optimizado

Lo que se supone que minimiza la aparición de transformatributos tanto como sea posible (pero no lo hace).

Esto parece estar activado por defecto de todos modos.

Según una discusión , una instancia en la que este modo Optimizado carece de celo es cuando se cambia el tamaño de la página . Esto hace translateque se aplique una transformación al <g>elemento de capa . Parece que evacuar a los niños a otra capa es la mejor solución en este momento.

Evgeni Sergeev
fuente
2
Para cambiar el tamaño de la página sin crear translatetransformaciones molestas en cada capa, intente abrir el .svgarchivo en un editor de texto y manipule los atributos de alto y ancho que aparecen en la parte superior.
februaryInk
7

Inkscape tiene la opción de borrar los datos de transformación pero aún así no se modifica el valor del objeto.

En Inkscape, seleccione el objeto y el menú 'Ruta', 'Simplificar'. Ahora, tendrá las transformaciones eliminadas.

Kumar
fuente
16
Sin embargo, alterará el contorno de sus caminos y reducirá el número de vértices en formas complejas.
Charlie
1
Esto a menudo hace que el marcado sea más grande que antes de las transformaciones.
Charlie
6

En este caso, simplemente agregue la traducción a los valores m para cada hijo, de modo que -10.254587 + 10.75 = -0.504587 y -308.96875 + 345.43597 = 36.46722.

Dado que todos los términos en el ejemplo son relativos (es decir, minúsculas) eso es todo. Si alguno fuera absoluto (mayúscula), por ejemplo, M o C, también tendrían que ajustarse.

Para la escala, básicamente multiplicaría todos los valores secundarios por la escala.

Robert Longson
fuente
Lo hice, pero en el editor XML de Inkspace (o cualquier otro editor) la transformación aún se agrega. Extraño.
escapedcat
1
¿De qué manera ajustaría C si tuviera las 2 subrutas, por ejemplo, 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 y M 3.0 5.0 C 2.4 5.5 3.3 6.4 5.0 7.0 Qué quieres transformarte en un solo camino?
Configuración
@Anton use el botón de hacer preguntas si tiene una pregunta que no está cubierta por las respuestas existentes. Es difícil preguntar y responder en los comentarios ya que hay un formato muy limitado disponible.
Robert Longson
2
@RobertLongson, bueno, lo cubriste. Todo lo que deseo es que elabore "Si alguno fuera absoluto (mayúscula), por ejemplo, M o C, también tendrían que ajustarse".
Configuración
6
  1. Seleccione los elementos en cuestión.
  2. Objeto> Desagrupar (repita hasta que todo esté desagrupado; vea el editor XML para nodos anidados)
  3. Ruta> Objeto a ruta (convierte polígonos en rutas)
  4. Objeto> Transformar> Desmarcar movimiento relativo> Aplicar
Charlie
fuente
No parece funcionar en Inkscape 0.91. El <g>con el transformatributo permanece tal como estaba. Además, mi objeto (al igual que el que se muestra en la pregunta aquí) ya es un camino.
O Mapper
¿Puedes pegar un enlace a tu SVG?
Charlie
5

Para eliminar el atributo de transformación de un gelemento (grupo) en Inkscape, puede mover el grupo a su lugar final, desagruparlo y luego reagrupar todos los elementos. Ahora se ha creado un nuevo grupo, y si no lo mueve de nuevo, no obtendrá un atributo de transformación adjunto.

Mcnesio
fuente
4

Si alguien aterriza aquí buscando una solución para hacer esto en Sketch 3, seleccione la capa y luego haga clic en Capa-> Trazados-> Acoplar.

Joel Worsham
fuente
3

Lo encontré:

  • Establezca el tamaño de página deseado *
  • Si su capa actual tiene una transformación (consulte con el editor XML, es el grupo superior debajo del elemento SVG), luego cree una nueva capa y mueva todos los objetos a ella
  • Desagrupar cualquier grupo (esto puede no ser necesario, YMMV)
  • Seleccione todos los objetos y aplique una transformación nula (como escala en 100% 100%, o flecha derecha + flecha izquierda) mientras tiene transformación de Tienda: Optimizado en Preferencias / Transformaciones
  • Si tuvo que deshacer algún grupo, ahora puede reagruparlos
  • Guarde una copia como SVG optimizado y configure la precisión numérica deseada

*: O al menos coloque los objetos donde los necesite, en relación con la esquina superior izquierda de la página. ¡Es lamentable que las coordenadas SVG hagan referencia a la esquina superior izquierda, mientras que Inkscape cambia el tamaño de la página en relación con la esquina inferior izquierda!

Tobia
fuente
Necesitaba el truco "mover a otra capa" ya que la transformación que quería presionar estaba en la capa <g>. El sistema de coordenadas de Inkscape es bastante molesto.
Bob mutante
3

Pude deshacerme de una matrix(...)transformación (debido a la duplicación) combinando la ruta con un rectángulo y luego eliminando los nodos del rectángulo. La translate(...)parte se quedó sin embargo.

Emily L.
fuente
Esta es la única solución que encontré también. Combine con una nueva ruta limpia, luego elimine la parte innecesaria.
Márton Tamás
2

En mi caso, guardar como SVG optimizado resolvió el problema. Entonces, en el uso de Inkscape:

Archivo -> Guardar como ... -> SVG optimizado.

Michał Stochmal
fuente
¿Cuál fue tu problema por cierto? Vine aquí después de intentarlo todo. Pero el problema persiste.
Sahu V Kumar
@VishalKumarSahu No pude importar el icono de mi aplicación de Android (SVG) como un activo debido a que transformAndroid Studio no admite el atributo.
Michał Stochmal
Sí, y es el mismo caso en la web también. La transformación crea un problema en la salida, pero es bastante útil durante la disposición de los objetos como grupo. Tengo que hacer cálculos para resolver el propósito.
Sahu V Kumar
2

Esto funciona si está utilizando Inkscape:

  1. Selecciona todo y desagrupa
  2. Guardar como "Svg optimizado (* .svg)"

En todos los casos que he intentado, esto ha eliminado cualquier atributo de transformación. No estoy seguro si funciona para SVG más complejo.

Max888
fuente
1

Probé la solución publicada aquí, a saber, eliminar las etiquetas de grupo en el archivo SVG y volver a abrirlo en Inkscape (0.48.3.1 en mi caso). Por desgracia, después de traducir los caminos nuevamente usando el modo de selección y transformación (F1) y guardarlos, ¡las etiquetas de grupo reaparecieron! Inkscape guarda todas las transformaciones aplicadas a la ruta en un elemento de grupo circundante. A menos que use la herramienta de selección de nodo de ruta (F2), presione ctrl + a y mueva los nodos de la ruta a su lugar correcto. Después de hacer esto y guardarlo, Inkscape no agregó las etiquetas de grupo, porque esta traducción se aplicó directamente al modelo de ruta. Espero que esto ayude.

Skadi2k3
fuente
1

En mi caso, los grupos en realidad son causados ​​por capas. La eliminación de todas las capas en el documento eliminó el grupo y la transformación (posiblemente combinado con objetos de desagrupación y reagrupación, etc., como en Eliminar transformaciones en archivos SVG (respuesta-35490189 de @Charlie arriba))

Jamie Pate
fuente
0

Mi problema específico fue con los símbolos que se definieron fuera de la página, lo que requiere que se muestre una transformación en la página.

Para mover los símbolos a la página sin requerir una transformación, tuve que seguir estos pasos en Inkscape:

  1. Abra la ventana de símbolos (Shift + Ctrl + Y)
  2. Elimine el símbolo de la biblioteca de documentos. (Hay un botón para eso en la ventana).
  3. Ahora el gráfico aparece en el documento, fuera del límite de la página.
  4. Desagrupa el gráfico. (¡Este es un paso vital!)
  5. Mueva el gráfico dentro del límite de la página.
  6. Agregue el gráfico nuevamente a la biblioteca de símbolos.
Peter
fuente
0

Esto parece aleatorio, pero nada más que intenté funcionó, así que aquí tienes otra persona aleatoria. Algunos de mis caminos tenían una especie de margen a su alrededor que solo se podía ver al seleccionarlos ( ejemplo). Creo que esto se creó cuando pegué una capa de otro archivo inkscape y la giré 90 grados. Esto hizo que un patrón de relleno en las formas tuviera una transformación diferente (líneas espaciadas más separadas). También hizo que los objetos de alineación no funcionen como se esperaba. El uso de la aplicación de transformación mencionada por @Piotr_cz solucionó el problema de transformación, pero el margen extraño permaneció. Accidentalmente lo eliminé cambiando el Blur on Stroke a cualquier valor y volviéndolo a cero.

Jim
fuente
0

De alguna manera no tuve suerte con ninguno de los enfoques. Si hay una <defs>sección en su svg y usos como este:

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

Puede que tenga que eliminar todos los usos y sacar todo de la sección defs. Luego, puede usar inkscape para colocar todo de la manera correcta y luego aplicar transformaciones utilizando el complemento mencionado. Espero que ayude a alguien.

k102
fuente
0

He tenido este problema por años. La solución es claramente poder jugar dinámicamente con transformaciones en el navegador, si no se va a "arreglar" en inkscape.

Un usuario Mc en los foros de Inkscape me dio esta solución .

La solución construye la transformación actual entre un elemento SVG y su elemento raíz SVG, y luego devuelve un conjunto completo de información BBox basada en el total de las transformaciones.

También sería posible cambiar fácilmente a qué elemento se refieren los cálculos, en caso de que desee hacer en el trabajo del navegador entre dos partes del mismo archivo SVG.

Finalmente, puedo tener una vista panorámica SVG.

Jay Day Zee
fuente
0

Inkscape 1.0 en Kubuntu 20.04

Aunque este hilo es bastante antiguo, me gustaría publicar mi experiencia / solución. Me encontré con este problema al intentar crear una plantilla para el banco de trabajo TechDrawing de FreeCAD. Estas plantillas no deben contener ninguna transformación.

En mi caso, tuve que agregar el logotipo de una empresa desde un archivo externo .svg (hecho completamente con Inkscape). Ese logotipo contiene elementos gráficos y de texto. Al copiar ese logotipo en la plantilla, se crearon transformaciones que hicieron que la plantilla no funcionara correctamente en FreeCAD.

  • Primero, esta solución sugerida en www.freecadweb.org / ... no funciona para mí. Es por eso que busqué en la web y encontré esta discusión.

  • En segundo lugar, ninguna de las soluciones sugeridas anteriormente funcionó para mí, pero me pusieron en el camino correcto. La respuesta de Charlie se acercó, pero Objeto> Transformar> Desmarcar movimiento relativo> Aplicar no mostró ninguna diferencia.

Lo que funcionó para mí fue:

  1. Como lo mencionaron otros, desagrupe todo.
  2. Convierta objetos de texto en ruta, ¡eso parecía ser esencial en mi caso!
  3. Elimine todas las transformaciones existentes en xml-Editor y observe lo que sucede con los objetos relacionados. En mi caso, los elementos correspondientes cambiaron su posición.
  4. Corrija estos cambios manualmente pero no agrupe nada.
  5. Guardar como svg normal (normal = no se utilizó optimización u otras configuraciones especiales)

Funciona bien cuando uso esa plantilla en FreeCAD.


Un detalle extraño: aunque mi solución connota que los elementos de texto fueron el problema en mi caso, no puede ser tan fácil. De hecho, el documento base (en el que copié el logotipo) contiene muchos elementos de texto y no convertí ninguno de ellos. Por lo tanto, podría ser la combinación de "fuente externa" y elementos de texto. Simplemente publico este detalle como una pista para otros, que podrían tener problemas relacionados.

Mr.Bum
fuente