Skript zum Abrufen von x-, y-Positionen aus einem Pfad in einem Vektorbild

Wenn jemand früher eine wissenschaftliche Grafik hatte, hatten die Leser nur Zugriff auf das gerasterte Bild. Wenn Sie also die Rohdaten aus dem Diagramm erhalten möchten, können Sie so etwas wie DataThief oder Webplotdigitizer auf einem gerasterten Bild wie dem folgenden verwenden.

Beispiel für ein Rasterbild

Heutzutage verlangen wissenschaftliche Veröffentlichungen in der Regel, dass die Autoren Plots im Vektorformat (pdf oder eps) einreichen. Das bedeutet, dass Sie das Diagramm direkt im Illustrator öffnen und die geplotteten Daten sehen können (normalerweise als ein Pfadobjekt?). Abbildung 5a von hier ist beispielsweise ein Vektordiagramm, auf das über das pdf (unten wiedergegeben) zugegriffen werden kann.

Aus der referenzierten pdf-Abbildung 5a

Meine Fragen sind folgende:

  1. Was sind die üblichen Objekttypen für eine Linie in einem XY-Diagramm (siehe Abbildung 5a im obigen PDF )?
  2. Was ist der beste Weg, um ein Skript über das Objekt auszuführen (in Illustrator oder einem anderen Programm), um die genaue Position der Punkte der Linie zu erhalten?

Bearbeiten: Ich habe diese Frage bereits gesehen, aber anstatt nur einen einzelnen Punkt mit dem Objekt zu verknüpfen, wollte ich die absolute Position aller Unterpunkte (falls das Sinn macht). Auf diese Weise kann ich das Diagramm anhand der Positionen der Achsenbeschriftungen neu erstellen.

Antworten (1)

Der übliche Objekttyp für ein Diagramm in einer Vektorgrafik ist ein Pfad ( in der Illustrator-JavaScript-API pathItem genannt). Es könnte eine verbundene unregelmäßige Linie, eine glatte Bezier-Kurve und manchmal getrennte gerade Linien sein. Hängt vom Programm ab, das den Graphen erzeugt.

Ich habe ein kleines Skript geschrieben, um Ihnen den Einstieg in das Extrahieren der Punkte aus einem Diagramm zu erleichtern:

#target illustrator

// the current selection
var selection = app.activeDocument.selection;

// create a txt-file for the data
var file = File.saveDialog('Save a comma-separated list of the x and y coordinates of the points of the current selection, relative to the coordinate system of the artboard.', 'Comma-separated values:*.csv');

// enable writing to the file
file.open('w')

// iterate through each selected item
for (var i = 0; i < selection.length; i++) {
  var item = selection[i];

  // check if selection is a PathItem
  if (item.typename === "PathItem") {

    // every PathItem has a list of pathPoints
    var points = item.pathPoints;

    // iterate through each pathPoint of the item
    for (var j = 0; j < points.length; j++) {

      // the point in document coordinates, relative to the center of the whole document
      var documentPoint = points[j].anchor;

      // the point converted to artboard coordinates, relative to where you have placed the origin of the coordinate system
      var artboardPoint = app.activeDocument.convertCoordinate(documentPoint, app.coordinateSystem, CoordinateSystem.ARTBOARDCOORDINATESYSTEM);

      // write the artboard coordinates to the file
      file.write(artboardPoint[0] + "," + artboardPoint[1] + "\n");
    }
  }
}

// stop writing to the file and save it
file.close();

Das Skript erstellt eine .csv-Datei, die eine durch Kommas getrennte Liste der x- und y-Koordinaten der Punkte der aktuellen Auswahl relativ zum Koordinatensystem der Zeichenfläche enthält.

Ich würde empfehlen, zuerst den Ursprung des Zeichenflächenlineals zum Ursprung des Diagramms zu verschieben, dann nur das Diagramm selbst auszuwählen und das Skript auszuführen.

Wenn Ihr Diagramm aus separaten Linien besteht, erhalten Sie viele doppelte Punkte. Sie können sie in der CSV-Datei entfernen oder Ihr Diagramm zuerst mit meinem Skript aus dieser Antwort "aufräumen" oder die beiden Skripte integrieren.

Das sieht nach genau dem aus, was ich will, werde es ausprobieren, sobald ich nach Hause komme
Zusätzliche Frage, was passiert, wenn die Kurve mehr als segmentierte Linien ist und so etwas wie Bezierkurven enthält?
Das Skript ignoriert die Kurve und gibt nur die Koordinate des Ankerpunkts zurück.
Ich verstehe, gibt es eine saubere Möglichkeit zu sagen, ob der Pfad zwischen zwei Ankern eine gerade Linie, eine Bezierkurve usw. ist?
Die beiden Kontrollpunkte eines pathPoints werden in den Eigenschaften "rightDirection" und "leftDirection" gespeichert. Wenn sie sich vom "Anker" unterscheiden, ist es eine Kurve, wenn sie gleich sind, ist es eine gerade Linie. Weitere Informationen finden Sie in der Dokumentation .