Скрипт для помещения объекта в начало координат

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

Gadalka

Топикстартер
R.I.P.
Сообщения
2 530
Реакции
869
Комментарий модератора: В ответ на этот пост:
Ищу кому нужно написать скрипты для InDesign, Photoshop, Illustrator. Я начинающий, хочу в этом попрактиковаться. Почта: nindzzya@gmail.com

Нужен простой скриптик для Иллюстратора:
Имеем выделенный объект, нужно поставить его в начало координат. Но вместе со всем нескрытым и незаблокированным содержимым.
Поясню как мне приходится это делать сейчас: имеется выделенный объект, запоминаем его координаты, выделяем всё, вычитаем в палитре Transform координаты первоначально выделенного объекта (по X и по Y поочерёдно).
Если ничего не выделено, то выделить всё и поставить координаты по 0.
Координаты по верхнему левому углу. Если будет возможность выбора -- вообще прекрасно.
 
Последнее редактирование модератором:
@Gadalka, не особо понял тебя. Пришли скрины до и после этой операции на почту.
 
Пришли скрины до и после этой операции на почту.
А чего сложного?
Есть выделенный объект. Для начала хотя бы поставьте его скриптом в начало координат листа (это реально две строчки кода)
 
Нарисуйте два квадратика, один внутри другого, примерно посередине листа.
Выделите внутренний квадратик и поставьте его в начало координат. Так, чтобы сохранилось его относительное положение внутри большего квадрата.
 
Выделите внутренний квадратик и поставьте его в начало координат. Так, чтобы сохранилось его относительное положение внутри большего квадрата.
'otbline''otbline''otbline'
Это как? Такого не может быть, потому что не может быть никогда
Без перемещения второго квадратика
 
1.png 2.png 3.png
 
Там может быть отнюдь не прямоугольник.
И не всегда хочется выделять все объекты из которых состоит то, по чему хочется обрезать.
И артбордов может быть много.
И стоять оно может далеко от текущего артборда.

Хотя, может и проще.
 
Там может быть отнюдь не прямоугольник.
С этого момент поподробнее - как быть в случае не-прямоугольника? 'hmmm'
И не всегда хочется выделять все объекты из которых состоит то по чему хочется обрезать.
Ну так для работы скрипта ж выделять надо все равно?
 
как быть в случае не-прямоугольника?
Выделяем несколько объектов, смотрим на палитру Tranform -- получаем координаты и размер ограничивающего прямоугольника. Если где-то 0 (например выделена одна линия), то ставим её в ноль (вместе со всем остальным), иначе обрезаем (или выставляем) артбоард по ограничивающему прямоугольнику.
Ну так для работы скрипта ж выделять надо все равно?
Если ничего не выделено -- ставим всё содержимое в 0. Или выделяем всё и поступаем как если бы выделение уже было

Направляющие пока не рассматриваем.
 
Так?
Код:
if (documents.length > 0) {
    if (app.selection.length>0)
    {
     executeMenuCommand("group"); 
     var r=app.selection[0].visibleBounds;
    
     executeMenuCommand("ungroup"); 
     app.activeDocument.artboards[0].artboardRect=r;
    }
}
 
Я предвидел это ;) Так?
Код:
if (documents.length > 0) {
    if (app.selection.length>0)
    {
     executeMenuCommand("group");
     var r=app.selection[0].visibleBounds;
    
     executeMenuCommand("undo");
     app.activeDocument.artboards[0].artboardRect=r;
    }
}
 
Да, чуть не забыл >=CS6
 
CS5 :(
 
Тогда такой вариант
Код:
function GetBounds()
{
      var bnd=app.selection[0].geometricBounds;
      for (var i=1;i<app.selection.length;i++)
      {
          if (bnd[0]>app.selection[i].geometricBounds[0]) bnd[0]=app.selection[i].geometricBounds[0];
          if (bnd[1]<app.selection[i].geometricBounds[1]) bnd[1]=app.selection[i].geometricBounds[1];
          if (bnd[2]<app.selection[i].geometricBounds[2]) bnd[2]=app.selection[i].geometricBounds[2];
          if (bnd[3]>app.selection[i].geometricBounds[3]) bnd[3]=app.selection[i].geometricBounds[3];
      }
 
      return bnd;
}

if (documents.length > 0) {
    if (app.selection.length>0)
    {
    
     app.activeDocument.artboards[0].artboardRect=GetBounds();
    }
}
 
  • Спасибо
Реакции: Haka3aTe/|b и Gadalka
Тогда так
Код:
function GetBounds()
{
      var bnd=app.selection[0].geometricBounds;
      for (var i=1;i<app.selection.length;i++)
      {
          if (bnd[0]>app.selection[i].geometricBounds[0]) bnd[0]=app.selection[i].geometricBounds[0];
          if (bnd[1]<app.selection[i].geometricBounds[1]) bnd[1]=app.selection[i].geometricBounds[1];
          if (bnd[2]<app.selection[i].geometricBounds[2]) bnd[2]=app.selection[i].geometricBounds[2];
          if (bnd[3]>app.selection[i].geometricBounds[3]) bnd[3]=app.selection[i].geometricBounds[3];
      }
 
      return bnd;
}

if (documents.length > 0) {
    if (app.selection.length>0)
    with (app.activeDocument)
    {
    
     artboards[artboards.getActiveArtboardIndex()].artboardRect=GetBounds();
    }
}
 
  • Спасибо
Реакции: Gadalka
Супер!
@_MBK_, ты, как обычно, лучший!

Кстати: при помощи этого скрипта можно выставлять размеры монтажных областей с точностью до третьего (а может и более) знака после запятой. Вот такой побочный эффект.