Ich habe eine Reihe von Objekten auf einer Zeichenfläche und möchte die X/Y-Positionen von allen wissen. Es wäre in Ordnung, entweder Pixelwerte oder ein % von den Seiten der Zeichenfläche zu haben.
Wichtig ist, dass ich nicht einfach auf jedes einzelne klicken und dann die in ihren Positionsfeldern gespeicherten Werte kopieren möchte. Idealerweise könnte ich eine Liste erstellen von:
object_name : x_position, y_position
Werte. Hat jemand eine Idee, wie ich so etwas in Illustrator oder Inkscape erreichen könnte?
Sie können dies auch mit Illustrator-Skripten tun, mit der gleichen Einschränkung wie die Antwort von @Wrzlprmft, dass sich Objekte auf der obersten Ebene befinden müssen. (Sie können die for-Schleife für Gruppen, zusammengesetzte Pfade usw. wiederholen, wenn Sie möchten. Dies ist immerhin ein kurzes Beispiel):
#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();
Das Skript fragt nach dem Dateinamen und legt Daten darin ab (ohne Warnung!). Zum Ausführen legen Sie eine .jsx -Datei ein und ziehen Sie sie per Drag-and-Drop in den Illustrator oder verwenden Sie das ExtendScript-Toolkit.
Wenn Sie in den Quellcode Ihrer SVG-Datei schauen (mit einem Texteditor öffnen), finden Sie hauptsächlich Folgendes:
<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)" />
Diese Zeilen beginnen mit x=
und y=
enthalten genau das, wonach Sie suchen. Sie können jetzt ein Skript schreiben, um sie zu extrahieren, z. B. mit einem in Inkscape gespeicherten SVG funktioniert Folgendes für mich (für andere SVGs müssen Sie möglicherweise etwas anpassen):
grep " x=\"\| y=\"" drawing.svg | sed "s/[^\"]*\"//;s/\".*//" | paste -d '\t' - -
Beachten Sie, dass das obige möglicherweise nicht funktioniert, wenn die Objekte zu einer transformierten Gruppe gehören oder anderweitig speziell sind.
@joojaa hat hier eine fantastische Antwort gegeben. Ich habe es verwendet, um das folgende Skript zu schreiben. Ich habe es so formatiert, dass es JSON mit einem Array von Pfaden ausspuckt, jedes ein Objekt mit einem Pfadnamen (der Name Ihres Pfads im Ebenenbedienfeld) und ein Array von x/y-Punkten auf diesem Pfad.
Um genau die richtigen Zahlen für die Ausgabe zu erhalten, müssen Sie ein wenig mit der Position Ihrer Zeichenfläche rechnen, da die Dinge sonst versetzt werden.
Ich habe JSON verwendet, da ich wollte, dass diese Zahlen in ein grafisches Javascript eingespeist werden - aber es ist ziemlich einfach, sie beliebig zu formatieren. Die kommentierte Website ist übrigens ziemlich nützlich:
#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();
Ilan
joojaa
Choldgraf
joojaa