Скрипт для получения позиций x,y из пути в векторном изображении

В старые времена, если бы у кого-то был научный график, читатели имели бы доступ только к растровому изображению. Поэтому, если вы хотите получить необработанные данные с графика, вы можете использовать что-то вроде DataThief или Webplotdigitizer для растрового изображения, подобного приведенному ниже.

Пример растрового изображения

В наши дни научные публикации обычно требуют от авторов предоставления графиков в векторном формате (pdf или eps). Это означает, что вы можете напрямую открыть график в иллюстраторе и увидеть отображаемые данные (обычно как какой-то объект пути?). Например, рисунок 5a отсюда представляет собой векторный график, доступный в формате pdf (воспроизведен ниже).

Из указанного PDF-файла Рисунок 5a

Мои вопросы следующие:

  1. Каковы обычные типы объектов для линии на графике XY (см. рисунок 5a в приведенном выше PDF-файле )?
  2. Как лучше всего запустить скрипт над объектом (в Illustrator или другой программе), чтобы получить точное положение точек линии?

Изменить: я уже видел этот вопрос, но вместо того, чтобы просто получить одну точку, связанную с объектом, я хотел установить абсолютное положение всех подпунктов (если это имеет смысл). Таким образом, я могу воссоздать график, используя положения меток осей.

Ответы (1)

Обычный тип объекта для графика в векторной графике — это путь (называемый pathItem в Illustrator JavaScript API). Это может быть одна соединённая рваная линия, плавная кривая Безье, а иногда и отдельные прямые линии. Зависит от программы, генерирующей график.

Я написал небольшой скрипт, чтобы вы начали извлекать точки из графика:

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

Сценарий создает файл .csv, содержащий разделенный запятыми список координат x и y точек текущего выделения относительно системы координат монтажной области.

Я бы рекомендовал сначала перенести начало координат линейки артборда в начало графика, затем выбрать только сам график и запустить скрипт.

Если ваш график состоит из отдельных линий, вы получите много повторяющихся точек. Вы можете удалить их в файле .csv или сначала «очистить» свой график, используя мой скрипт из этого ответа , или интегрировать два скрипта.

Похоже, это именно то, что я хочу, собираюсь попробовать, как только вернусь домой.
Дополнительный вопрос: что происходит, когда кривая представляет собой нечто большее, чем сегментированные линии, и внутри нее есть что-то вроде кривых Безье?
Скрипт игнорирует кривую и возвращает только координату точки привязки.
Понятно, есть ли простой способ определить, является ли путь между двумя якорями прямой линией, кривой Безье и т. д.?
Две контрольные точки pathPoint хранятся в свойствах «rightDirection» и «leftDirection». Если они отличаются от «якоря», это кривая, если они одинаковые, это прямая линия. Вы можете проверить документацию для получения дополнительной информации.