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

Gadalka

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

Нужен простой скриптик для Иллюстратора:
Имеем выделенный объект, нужно поставить его в начало координат. Но вместе со всем нескрытым и незаблокированным содержимым.
Поясню как мне приходится это делать сейчас: имеется выделенный объект, запоминаем его координаты, выделяем всё, вычитаем в палитре Transform координаты первоначально выделенного объекта (по X и по Y поочерёдно).
Если ничего не выделено, то выделить всё и поставить координаты по 0.
Координаты по верхнему левому углу. Если будет возможность выбора -- вообще прекрасно.
 
Последнее редактирование модератором:

Nindzzya

Участник
Сообщения
19
Реакции
8
@Gadalka, не особо понял тебя. Пришли скрины до и после этой операции на почту.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Пришли скрины до и после этой операции на почту.
А чего сложного?
Есть выделенный объект. Для начала хотя бы поставьте его скриптом в начало координат листа (это реально две строчки кода)
 

Gadalka

Топикстартер
R.I.P.
Сообщения
2 530
Реакции
868
Нарисуйте два квадратика, один внутри другого, примерно посередине листа.
Выделите внутренний квадратик и поставьте его в начало координат. Так, чтобы сохранилось его относительное положение внутри большего квадрата.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Выделите внутренний квадратик и поставьте его в начало координат. Так, чтобы сохранилось его относительное положение внутри большего квадрата.
'otbline''otbline''otbline'
Это как? Такого не может быть, потому что не может быть никогда
Без перемещения второго квадратика
 

Gadalka

Топикстартер
R.I.P.
Сообщения
2 530
Реакции
868

Gadalka

Топикстартер
R.I.P.
Сообщения
2 530
Реакции
868
1.png 2.png 3.png
 

Gadalka

Топикстартер
R.I.P.
Сообщения
2 530
Реакции
868
Там может быть отнюдь не прямоугольник.
И не всегда хочется выделять все объекты из которых состоит то, по чему хочется обрезать.
И артбордов может быть много.
И стоять оно может далеко от текущего артборда.

Хотя, может и проще.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Там может быть отнюдь не прямоугольник.
С этого момент поподробнее - как быть в случае не-прямоугольника? 'hmmm'
И не всегда хочется выделять все объекты из которых состоит то по чему хочется обрезать.
Ну так для работы скрипта ж выделять надо все равно?
 

Gadalka

Топикстартер
R.I.P.
Сообщения
2 530
Реакции
868
как быть в случае не-прямоугольника?
Выделяем несколько объектов, смотрим на палитру Tranform -- получаем координаты и размер ограничивающего прямоугольника. Если где-то 0 (например выделена одна линия), то ставим её в ноль (вместе со всем остальным), иначе обрезаем (или выставляем) артбоард по ограничивающему прямоугольнику.
Ну так для работы скрипта ж выделять надо все равно?
Если ничего не выделено -- ставим всё содержимое в 0. Или выделяем всё и поступаем как если бы выделение уже было

Направляющие пока не рассматриваем.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Так?
Код:
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;
    }
}
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Я предвидел это ;) Так?
Код:
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;
    }
}
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Да, чуть не забыл >=CS6
 

Gadalka

Топикстартер
R.I.P.
Сообщения
2 530
Реакции
868
CS5 :(
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Тогда такой вариант
Код:
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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Тогда так
Код:
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

Gadalka

Топикстартер
R.I.P.
Сообщения
2 530
Реакции
868
Супер!
@_MBK_, ты, как обычно, лучший!

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