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

  • Автор темы Автор темы Gadalka
  • Дата начала Дата начала
На самом деле, лучше пользоваться первоначальным вариантом на CS6, ибо костыль с
GetBounds() - лукавство,чреватое, сходу не придумаю чем 'hmmm'
 
лукавство,чреватое, сходу не придумаю чем
Вот этим:
2017-07-04 15-38-48 Adobe Illustrator.png ?
Но это при выделении вертикальной (или горизонтальной) прямой линии.
Потестирую в работе. Наложение эффектов правильной работе не мешает.
 
Код:
function GetBounds()
 {
          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];
      }

Код:
{
    bnd[0] = Math.min(bnd[0], app.selection[i].geometricBounds[0]);
    bnd[1] = Math.min(bnd[1], app.selection[i].geometricBounds[1]);
    bnd[2] = Math.max(bnd[2], app.selection[i].geometricBounds[2]);
    bnd[3] = Math.max(bnd[3], app.selection[i].geometricBounds[3]);
}
 
  • Спасибо
Реакции: 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];
      }
      if (bnd[0]==bnd[2]) bnd[0]-=1;
      if (bnd[1]==bnd[3]) bnd[1]+=1;
      return bnd;
}

if (documents.length > 0) {
    if (app.selection.length>0)
    with (app.activeDocument)
    {
    
     artboards[artboards.getActiveArtboardIndex()].artboardRect=GetBounds();
    }
}
 
  • Спасибо
Реакции: Gadalka
высоконаруженные скрипты
Ну тут же ж вопрос принципа ;)
Хочешь - попробуй прогони тест скорости Math.min и обычного сравнения
Я не проверял но с чисто теоретической точки зрения, второй вариант будет более скоростным ;)
 
Ну тут же ж вопрос принципа
Короче -- значит, красивее! :D

Хочешь - попробуй прогони тест скорости Math.min и обычного сравнения

Challenge accepted!

Код:
#target indesign

function fakeArray (count) {
    var res = [];
    while (res.length < count) {
        var gb = [
            Math.random() * 100,
            Math.random() * 100,
            Math.random() * 100,
            Math.random() * 100,
        ]
        res.push(gb);
    }
    return res;
}

function sortIF (arr) {
    var timer = $.hiresTimer;
    var res = arr[0];
    for (var i = 1; i < arr.length; i++) {
        if (arr[i][0] < res[0]) { res[0] = arr[i][0] };
        if (arr[i][1] < res[1]) { res[1] = arr[i][1] };
        if (arr[i][2] > res[2]) { res[2] = arr[i][2] };
        if (arr[i][3] > res[3]) { res[3] = arr[i][3] };
    }
    var timer = $.hiresTimer;
    return timer;
}

function sortMath (arr) {
    var timer = $.hiresTimer;
    var res = arr[0];
    for (var i = 1; i < arr.length; i++) {
        res[0] = Math.min(res[0], arr[i][0]);
        res[1] = Math.min(res[1], arr[i][1]);
        res[2] = Math.max(res[2], arr[i][2]);
        res[3] = Math.max(res[3], arr[i][3]);
    }
    var timer = $.hiresTimer;
    return timer;
}

function main () {
    var gbarr = fakeArray(100000);
    $.writeln('IF sorting:' + sortIF(gbarr));
    $.writeln('Math sorting:' + sortMath(gbarr));
}

main();

В моем случае на массиве из 100 000 элементов сортировка через Math медленнее аж на 0.64 секунды! Пользователи несомненно будут в ярости от такого падения быстродействия! 'hell'
 
  • Спасибо
Реакции: dumbm1
Добавлю чуть чуть, дабы не потерять
Скрипт обрезает БЕЗ учёта толщины обводки и эффектов (мне обычно как раз так и нужно),
Alt+OAA->S обрезает с учётом толщины обводки и эффектов (для логотипов это предпочтительнее)
Это зло еще не так с большой руки - если в скрипте вместо geometricBounds использовать controlBounds - будет обрезать с учетом