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?
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.
@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();
Ilán
joojaa
Cholgraf
joojaa