So erhalten Sie die x/y-Position mehrerer Punkte auf einer Zeichenfläche

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?

In eine SVG-Datei sind (diese; wahrscheinlich) Informationen eingebettet
Was betrachtest du als Objekt? Ist es ein zusammengesetzter Pfad einer Pfadgruppe ... Was halten Sie von seiner Position als obere Ecke eines BB, Mittelpunkt einzelner Scheitelpunkte usw. @Ilan ja, aber nicht unbedingt so, wie er es sich erhofft. Ein Askript könnte leicht gemacht werden.
Ich bin ziemlich flexibel, was genau ich mit "x,y"-Position meine, weil ich es immer selbst übersetzen kann, wenn es nicht nur das ist, was ich will. Idealerweise wäre es der Mittelpunkt eines Objekts (z. B. eines Kreises, und ich möchte den Mittelpunkt des Kreises). Ich bin mir nicht sicher, ob das als "Pfad" qualifiziert ist oder nicht. Wenn all diese Informationen in der SVG-Datei gespeichert sind, dann klingt das ganz einfach ...
Alle Informationen werden im SVG gespeichert, nur dass die Daten ein Baum sind. Wenn Sie also Gruppen haben, ist es schwer, dies direkt aus der Datei zu sagen. weil jede Gruppe in lokalen Koordinaten gemessen wird.

Antworten (3)

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.

Nur wenn rect keiner transformierten Gruppe angehört! Auch kein Objektname.

@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();