Скрипт центровки выделенных объектов на странице

seregasss435

Участник
Сообщения
142
Реакции
9
Код:

#target illustrator



// объявление перерменной ad :
var ad = app.activeDocument;




// цикл который обрабатывает все монтажные области согласно тела цикла ( активирование монтажной области: doc.artboards.setActiveArtboardIndex(i);
// выделение объектов на монтажной области: doc.selectObjectsOnActiveArtboard();):

for( i=0; i <100; i++)
{
ad.artboards.setActiveArtboardIndex(i);
ad.selectObjectsOnActiveArtboard();

if ( app.documents.length > 0 ) {

var ad=app.activeDocument;
var ar=ad.artboards[ad.artboards.getActiveArtboardIndex()].artboardRect;
var cX=(ar[0]+ar[2])/2;
var cY=(ar[1]+ar[3])/2;
var cnt=new Array();

var x1=0;
var x2=0;
var y1=0;
var y2=0;
var first=true;
for (var j=0;j<ad.pageItems.length;j++)
{
pi=ad.pageItems[j];
if ((pi.parent.typename=="Layer") && (pi.selected))
{
cnt.push(pi);
if (first || (x1<pi.controlBounds[0])) x1=pi.controlBounds[0];
if (first || (x2>pi.controlBounds[2])) x2=pi.controlBounds[2];
if (first || (y1<pi.controlBounds[3])) y1=pi.controlBounds[3];
if (first || (y2>pi.controlBounds[1])) y2=pi.controlBounds[1];
if (first || (x1<pi.controlBounds[2])) x1=pi.controlBounds[2];
if (first || (x2>pi.controlBounds[0])) x2=pi.controlBounds[0];
if (first || (y1<pi.controlBounds[1])) y1=pi.controlBounds[1];
if (first || (y2>pi.controlBounds[3])) y2=pi.controlBounds[3];
first=false;

}
}
cx=(x1+x2)/2;
cy=(y1+y2)/2;

if (cnt.length)
for (var j=0;j<cnt.length;j++)
{
cnt[j].translate(cX-cx,cY-cy);
}
else alert("No selection!");


} else alert("No document!");


}
 

seregasss435

Участник
Сообщения
142
Реакции
9
У меня задача - имея 100 монтажных областей ( или иное количество пока не указал но пока пытаюсь разобраться как это сделать на другое динамическое количество - если укажите код буду благодарен - правильно ли вместо 100 написать app.activeDocument.length?) выравнивать объекты которые лежат на каждой из них не строго по центру - строго по центру.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Во первых, пользоваться соответствующими тэгами когда постите код
Во вторых, задача не так проста как кажется - артборд это не страница и определить по которому из них объект центрировать не совсем понятно
 

seregasss435

Участник
Сообщения
142
Реакции
9
По поводу тегов ок.
Артборд стандарт 1000 на 1000 пикселей расстояние между арт бордами 20 пикселей
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Ну это понятно - придется всевсевсе артборды перебирать для каждого объекта на предмет принадлежности.
Нельзя просто так взять и определить какой объект на каком артборде находится одной командой, более того один объект может быть на нескольких сразу или внезапно вообще нигде
 

seregasss435

Участник
Сообщения
142
Реакции
9
А как та идея что какой объект определяеться по активной монтажной области - активна монтажная область № 7(координаты вычисляем математически 7*100+20*6+500 по одной оси) - выделить все объекты на активной монтажной области, определить ее позицию, и позицию объекта по активному выделению, а если объекта нету то пропускаем условием ? Сам не реализую, на какой небудь мелочи точно застряну на годы
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Ну я о том и говорю, берем объект и перебираем все монтажные области на предмет принадлежности его по координатам. Координаты объекта известны, координаты монтажной области тоже
Второй вложенный цикл внутри
 

Gad

Сообщения
2 971
Реакции
1 405
Этот некорректно центрует объекты под маской.
Пример но спасибо :) пригодится.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Этот некорректно центрует объекты под маской.
Пример но спасибо :) пригодится.
Под маской никто и не обещал - средствами скриптинга это нетривиально.
Я что-то не вкурил - я разве объявлял тут конкурс на бетатестинг японской бензопилы?
 

Gad

Сообщения
2 971
Реакции
1 405

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
С маской засада следующая. Иллюстратор возвращает размеры объекта, как будто никакой маски нет.
Что делать?

1) находим маскированные объекты - это groupItem со свойством clipped
2) в этой группе находим path, который clipping (могу неточно называть свойства, проверьте в доках)
3) берем размеры от этого path, и центруем группу по ним
 
  • Спасибо
Реакции: Slx1 и Gad

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
1) находим маскированные объекты - это groupItem со свойством clipped
2) в этой группе находим path, который clipping (могу неточно называть свойства, проверьте в доках)
3) берем размеры от этого path, и центруем группу по ним
Маска вовсе не обязательно clipping
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Маска прозрачности например
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Не знаю, но засада скорее всего будет. Да вообще, помимо путей, групп и компаундов в иллюстраторе полно интересных и необычных обьектов, под которые универсально скрипт не подгонишь
 

Slx1

Топикстартер
15 лет на форуме
Сообщения
944
Реакции
106
НУ хотя бы под clipping ;]=
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Все верно, искомое свойство называется clipping
Если у какого то pathItem из группы оно true то вся группа имеет габариты именно этого pathItem