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

  • Автор темы Автор темы Slx1
  • Дата начала Дата начала

Slx1

Топикстартер
15 лет на форуме
Сообщения
946
Реакции
106
Коллеги, а для иллюстратора такой скрипт сложно сделать?
 
Зачем?
С предварительной группировкой-разгруппировкой можно экшн записать

Вот:
Объекты могут находиться на разных слоях, группировка-разгруппировка переместит их на один слой. Я бы воспользовался функцией установки позиции. Да и макрос попроще будет
 
Это расценивать как предложение работы? ;) На самом деле скрипт совсем элементарный, абсолютно аналогичный кореловскому, просто в адобовском скриптинге нет команды центрирования, надо вычислить центр страницы, потом центр выделения, а потом все выделенные обьекты подвинуть на смещение между ними. Чуть сложнее, чем в кореле, но непринципиально.
 
Пока что главное условие - завтра. Ибо я уже уехал домой и пишу с утюга.;) Если никто до утра не набросает
 
  • Спасибо
Реакции: NatalieRedFox_333
купи нормальный утюг
 
На самом деле, в реале все оказалось сложнее, как обычно, индусы рогаток навставляли на каждом шагу, но в итоге получилось как то так:
Код:
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];
           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!");
 
  • Спасибо
Реакции: NatalieRedFox_333 и Slx1
На самом деле, в реале все оказалось сложнее, как обычно, индусы рогаток навставляли на каждом шагу, но в итоге получилось как то так:

Круто спасибо, работает... но не совсем:
Снимок экрана 2017-10-19 в 11.15.41.png
 
Что именно не работает?
 
  • Спасибо
Реакции: NatalieRedFox_333
Ага увидел коллизию. Правда, пока не пойму причину. Адобовский скриптинг - это сплошное минное поле, в каждой мелочи кроется потенциальная засада :(
 
  • Спасибо
Реакции: NatalieRedFox_333 и LiKER
Попробуйте вот так
Код:
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!");
 
У меня при использование этого скрипта для одной монтажной области все отлично, но вот если использовать для 100 монтажных областей то не центрует точно:
 
У меня при использование этого скрипта для одной монтажной области все отлично, но вот если использовать для 100 монтажных областей то не центрует точно:
Ну какбэ фраза ad.artboards[ad.artboards.getActiveArtboardIndex()] намекает на то что скрипт центрирует на активном артборде