Как получить положение x/y нескольких точек на монтажной области

У меня есть куча объектов на артборде, и я хотел бы знать их положение по осям X/Y. Было бы хорошо либо иметь значения пикселей, либо % от сторон монтажной области.

Важно отметить, что я не хочу просто щелкать каждый, а затем копировать значения, хранящиеся в их полях позиции. В идеале я мог бы создать список из:

object_name : x_position, y_position

ценности. У кого-нибудь есть идеи, как я могу сделать что-то подобное в Illustrator или Inkscape?

файл SVG содержит (вероятно) встроенную информацию
Что вы считаете объектом? Это составной путь группы путей ... Как вы считаете, его положение - верхний угол BB, центр отдельных вершин и т. Д. @Ilan да, но не обязательно так, как он надеется. Можно было легко сделать аскрипт.
Я довольно гибок в том, что именно я подразумеваю под позицией «x, y», потому что я всегда могу перевести ее самостоятельно, если это не то, что я хочу. В идеале это должна быть центральная точка объекта (например, круга, а мне нужен центр круга). Не уверен, что это квалифицируется как «путь» или нет. Если вся эта информация хранится в файле SVG, то это может показаться довольно простым...
Вся информация хранится в svg, просто данные представляют собой дерево. Так что, если у вас есть группы, трудно сказать прямо из файла. потому что каждая группа измеряется в местных координатах.

Ответы (3)

Вы также можете сделать это с помощью сценариев Illustrator с той же оговоркой, что и ответ @Wrzlprmft, что объекты должны быть на верхнем уровне. (вы можете повторить цикл for для составных путей групп и т. д., если хотите. В конце концов, это быстрый пример):

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

Скрипт запрашивает имя файла и выгружает в него данные (без предупреждения!). Для запуска поместите файл .jsx и перетащите его в иллюстратор или используйте инструментарий extendScript.

Если вы посмотрите на источник вашего SVG (откройте его в текстовом редакторе), вы найдете в основном такие вещи:

<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)" />

Эти строки, начинающиеся с x=и y=, содержат именно то, что вы ищете. Теперь вы можете написать некоторый скрипт для их извлечения, например, с SVG, сохраненным в Inkscape, у меня работает следующее (для других SVG вам может потребоваться некоторая настройка):

grep " x=\"\| y=\"" drawing.svg | sed "s/[^\"]*\"//;s/\".*//" | paste -d '\t' - -

Обратите внимание, что описанное выше может не работать, если объекты принадлежат преобразованной группе или являются особыми.

Только если rect не принадлежит преобразованной группе! Также нет имени объекта.

@joojaa дал фантастический ответ здесь. Я использовал его для написания приведенного ниже сценария. Я отформатировал его, чтобы выдать JSON с массивом путей, каждый объект с именем пути (имя вашего пути на панели слоев) и массив точек x/y на этом пути.

Чтобы получить точно правильные числа для вывода, вам нужно немного посчитать с положением вашей монтажной области, поскольку в противном случае все будет смещено.

Я использовал JSON, так как хотел, чтобы эти числа были переданы в какой-то графический javascript, но их довольно легко форматировать так, как вам нравится. Сайт с комментариями довольно полезен, кстати:

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