Restar rutas, automatizado (usando un script)

Tengo más de 100 archivos SVG , cada uno con algunas rutas cerradas (con curvas Bezier), como esta:

Ejemplo 1

Me gustaría hacer lo siguiente:

  1. seleccione la primera ruta (inferior)
  2. duplicarlo
  3. mover el duplicado por una cantidad (x, y)

ejemplo2

  1. reste el duplicado de la ruta original.

ejemplo3

Y guarda el SVG.

¿Hay alguna manera de que pueda hacer esto automáticamente?

Tecnologías que miré:

  • Inkscape : por lo que puedo ver, solo puede escribir scripts en Python que manipulen la jerarquía de nodos SVG directamente, no puede llamar a la función de resta de ruta incorporada.
  • Illustrator : traté de registrar los pasos en una acción, pero parece que no puedo seleccionar la ruta inferior automáticamente, solo puede seleccionar objetos en una acción por nombre.
  • Affinity Designer : no admite secuencias de comandos.
  • CorelDRAW : arruinó el ancho/alto del SVG de inmediato, no buscó más.
  • Scribus : excelente secuencias de comandos con Python, pero parece que no puede encontrar la función de Python para la operación de ruta de resta (todos los demás pasos funcionan).
  • Biblioteca Clipper (C ++, C # y Delphi) : no admite curvas, solo líneas rectas + necesitaría escribir el análisis SVG usted mismo.

Estoy buscando una solución utilizando cualquier herramienta de edición de vectores programable, complemento o combinación de lenguaje de programación + biblioteca.

Si bien Scribus podría estar muy cerca de poder hacer lo que desea (agregar las operaciones de ruta al scripter sería bastante fácil), realmente se siente como la herramienta incorrecta para usar... ¡Realmente espero que Inkscape llegue pronto!
@ale - ¿Por qué crees eso? Descubrí Scribus hace solo unos días, pero como programador que trabaja con Python todos los días, quedé muy impresionado con su función de secuencias de comandos. Parece súper poderoso. Usé Inkscape para todo mi trabajo de vectores hasta ahora, pero se siente genial poder controlar todo en un script de Python. Cuando dices adding the path operations to the scripter would be rather easy, ¿te refieres a los desarrolladores de Scribus? ¿O para un usuario que amplía el código fuente de Scribus? ¿O hacerlo con la versión actual en Python de alguna manera?
Scribus es una herramienta WYSISWYG para crear un diseño y producir un PDF para imprimir. Por supuesto, puede usarlo debido a la incrustación ordenada de Python, pero su objetivo es manipular los SVG. Con respecto a la extensión del scripter: necesita habilidades (muy) básicas de c ++ y un poco de lectura de código ...
Lo siento, no es una respuesta sino una pregunta: Obtuviste la mayoría de los pasos en Scribus. ¿Cómo seleccionas el más bajo de tus tres objetos, por favor? Experimenté y parece ser el primero mencionado en el archivo .sla, pero ¿qué identificador usarías de la API, por favor? Y cuando no hay un martillo, podemos usar incluso una llave dinamométrica para sacar esos pernos oxidados... Y la cerveza también tiene razón, en teoría. Solo Scribus en estos días puede hacer muchas más cosas que solo preparar productos impresos: estamos cocinando contenido de WhatsApp en Scribus, es una herramienta muy dinámica y bien respaldada.
martin, no lo he probado, pero puedes consultar la posición de todos los elementos en la página y averiguar cuál es el "inferior"... puedes echar un vistazo al script "exportar todo el texto", debería ser ordenar los elementos por coordenadas.
@Martin Zaske: no estoy seleccionando el objeto más bajo, sino el inferior (en el eje Z), que es la primera ruta en un SVG (no estoy familiarizado con el formato .SLA que mencionó). (En realidad, Scribus agrupa automáticamente todos los objetos en el SVG, por lo que primero debe desagruparlos. Pero después de eso, es getAllObjects()[0].)
Gracias, acabo de aprender algo útil para un día lluvioso. sla es la extensión para documentos normales de Scribus (fuente).

Respuestas (3)

Debería poder hacer esto usando las acciones de Illustrator con un truco extraño.

Esto funcionaría suponiendo que las formas en sus archivos sean de un color diferente al que se muestra en la imagen proporcionada.

  1. Comienza a grabar tu acción.
  2. Agregue un rectángulo y dele un trazo (lo eliminará más adelante)
  3. Con su nuevo rectángulo aún seleccionado, haga clic enSelect -> Next Object Below
  4. Haga clic Select -> Next Object Belowvarias veces más
  5. Haga clic Object -> Transform -> Movey configure el desplazamiento deseado
  6. Haga clic en el botón Copiar en el cuadro de diálogo Mover
  7. Hacer clicSelect -> Same -> Fill & Stroke
  8. Haga clic Subtracten la caja de herramientas de Pathfinder
  9. Haga clic Select -> Next Object Abovevarias veces
  10. Presiona tu deletellave
  11. Guardar el documento
  12. Deja de grabar la acción.

Luego puede usar el script por lotes para ejecutarlo en todos sus archivos.

O simplemente puede seleccionar el objeto con un script y luego llamar a la acción.
Esta era una forma de hacerlo sin secuencias de comandos. Estaba tratando de mostrar cómo hacerlo con solo acciones, ya que puede ser difícil ingresar a las secuencias de comandos si no está familiarizado con ellas.
Me sorprende descubrir que esta solución... realmente funciona. Rápido y sucio. ¡Gracias!
¡Feliz de ayudar! La secuencia de comandos es realmente el camino a seguir, pero para algo que solo usará una vez, también podría hacer una acción rápida.

En Inkscape, también puede llamar verbos desde la línea de comandos.

El único problema es que no toman parámetros (todavía), por lo que puedes hacer, por ejemplo, cosas como

inkscape --select=rect3680 --verb=EditDuplicate --verb=SelectionInset --select=rect3680 --verb=SelectionDiff --verb FileSave --verb FileQuit drawing-2.svg

pero el "3. mover el duplicado por una cantidad (x, y)" es en realidad la parte más difícil

Lo olvidé, "seleccionar el objeto más bajo" puede ser algo así como inkscape --verb=EditSelectNext si no conoce su id.

Tal vez con esto se resuelva el problema: https://two.js.org/

no es compatible con la operación diff
svgjs.com es otra opción (sin diferencias)