Cómo obtener la posición x/y de múltiples puntos en una mesa de trabajo

Tengo un montón de objetos en una mesa de trabajo y me gustaría saber las posiciones X/Y de todos ellos. Estaría bien tener valores de píxeles o un % de los lados de la mesa de trabajo.

Es importante destacar que no quiero simplemente hacer clic en cada uno y luego copiar los valores almacenados en sus campos de posición. Idealmente podría generar una lista de:

object_name : x_position, y_position

valores. ¿Alguien tiene una idea de cómo podría lograr algo como esto en Illustrator o Inkscape?

un archivo SVG tiene (esta; probablemente) información incrustada
¿Qué consideras un objeto? ¿Es una ruta compuesta de un grupo de rutas? ¿Qué considera que es su posición, la esquina superior de una BB, el centro de los vértices individuales, etc. @Ilan sí, pero no necesariamente de la manera que él espera? Se podría hacer fácilmente un adscripto.
Soy bastante flexible en términos de lo que quiero decir exactamente con la posición "x, y", porque siempre puedo traducirlo por mi cuenta si no es justo lo que quiero. Idealmente, sería el punto central de un objeto (por ejemplo, un círculo, y quiero el centro del círculo). No estoy seguro de si eso está calificado como un "camino" o no. Si toda esa información se almacena en el archivo SVG, entonces parece que podría ser bastante fácil...
Toda la información se almacena en el svg, solo que los datos son un árbol. Entonces, si tiene grupos, es difícil decirlo directamente desde el archivo. porque cada grupo se mide en coordenadas locales.

Respuestas (3)

También puede hacer esto con las secuencias de comandos de Illustrator, con la misma advertencia que la respuesta de @ Wrzlprmft de que los objetos deben estar en el nivel superior. (puede repetir el bucle for para rutas compuestas de grupos, etc. si lo desea. Después de todo, este es un ejemplo rápido):

#target illustrator

var sel = app.activeDocument.selection; 
var file = File.saveDialog('save centers', 'center:*.txt');
file.open('w')

for(var i = 0; i < sel.length; i++){
      if(sel[i].typename == "PathItem"){
          var obj = sel[i];
          var center = obj.position
          center[0] -= obj.width/2.0;
          center[1] += obj.height/2.0;  
          file.write(obj.name+" : "+center[0]  + ", "+center[1]+"\n"); 
      }
}

file.close();

El script solicita el nombre del archivo y volca los datos en él (¡sin previo aviso!). Para ejecutar, coloque un archivo .jsx y arrastre y suelte en Illustrator o use el kit de herramientas extendScript.

Si busca en la fuente de su SVG (ábralo con un editor de texto), encontrará principalmente cosas como esta:

<rect
   style="opacity:0.57009343;color:#000000;fill:#3f3790"
   id="rect2996"
   width="10.714286"
   height="52.857143"
   x="282.85715"
   y="155.16518"
   transform="translate(242.40625,114.78125)" />

Esas líneas que comienzan con x=y y=contienen exactamente lo que está buscando. Ahora puede escribir un script para extraerlos, por ejemplo, con un SVG guardado en Inkscape, lo siguiente funciona para mí (para otros SVG, es posible que necesite algunos ajustes):

grep " x=\"\| y=\"" drawing.svg | sed "s/[^\"]*\"//;s/\".*//" | paste -d '\t' - -

Tenga en cuenta que lo anterior puede no funcionar si los objetos pertenecen a un grupo transformado o son especiales.

¡Solo si rect no pertenece a un grupo transformado! Tampoco hay nombre de objeto.

@joojaa dio una respuesta fantástica aquí. Lo usé para escribir el siguiente script. Lo formateé para escupir JSON con una serie de rutas, cada una de ellas un objeto con un nombre de ruta (el nombre de su ruta en el panel de capas) y una serie de puntos x/y en esa ruta.

Para obtener exactamente los números correctos para la salida, debe hacer un poco de matemáticas con la posición de su mesa de trabajo, ya que de lo contrario las cosas se compensan.

Utilicé JSON porque quería que estos números se incluyeran en algún javascript gráfico, pero es bastante fácil formatearlos de la forma que desee. El sitio web comentado es bastante útil por cierto:

#target illustrator
// help here
// https://illustrator-scripting-guide.readthedocs.io/jsobjref/PathItems/

var doc = app.activeDocument; 
var sel = doc.selection; 
var activeAB = doc.artboards[doc.artboards.getActiveArtboardIndex()]; // get active AB
var docLeft = activeAB.artboardRect[0];
var docTop = activeAB.artboardRect[1]; 

var file = File.saveDialog('save centers', 'center:*.txt');
file.open('w')

file.write('{"paths": [\n'); 

for(var i = 0; i < sel.length; i++){
    if(sel[i].typename == 'PathItem'){

        var obj = sel[i];
        var pathLen = obj.pathPoints.length;

        file.write('{\n'); 
        file.write('"name":"' + obj.name + '","points":[\n'); 
        for ( j = 0; j < pathLen; j++ ) {
            var center = obj.pathPoints[j].anchor;
            var x = parseFloat(Math.abs(docLeft)) + parseFloat(center[0].toFixed(4));
            var y = docTop - center[1].toFixed(4);
            file.write('['+ x + ', ' + y + ']');
            if(j < pathLen - 1) {
                file.write(',');
            }
        }

        file.write(']}\n'); 
        if(i < sel.length - 1) {
            file.write(',');
        }
    }
}

file.write(']\n}\n'); 

file.close();