У меня есть куча объектов на артборде, и я хотел бы знать их положение по осям X/Y. Было бы хорошо либо иметь значения пикселей, либо % от сторон монтажной области.
Важно отметить, что я не хочу просто щелкать каждый, а затем копировать значения, хранящиеся в их полях позиции. В идеале я мог бы создать список из:
object_name : x_position, y_position
ценности. У кого-нибудь есть идеи, как я могу сделать что-то подобное в Illustrator или Inkscape?
Вы также можете сделать это с помощью сценариев 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' - -
Обратите внимание, что описанное выше может не работать, если объекты принадлежат преобразованной группе или являются особыми.
@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();
Илан
джуджа
хольдграф
джуджа