[ID CC-CC2021] Скрипт центровки выделенных объектов на странице

Slx1

Топикстартер
15 лет на форуме
Сообщения
944
Реакции
106
Коллеги, огромное спасибо заранее!
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Код:
for(var i=0;i<app.selection.length;i++)
try{
var currObj = app.selection[i];
currObj.move([currObj.parentPage.bounds[3]/2+currObj.parentPage.bounds[1]/2-(currObj.geometricBounds[3]-currObj.geometricBounds[1])/2,
currObj.parentPage.bounds[0]/2+currObj.parentPage.bounds[2]/2-(currObj.geometricBounds[2]-currObj.geometricBounds[0])/2])
    }catch(e){}
 
  • Спасибо
Реакции: Slx1

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
вернее вот так
Код:
var grBounds = app.selection[0].geometricBounds;

for(var i=1;i<app.selection.length;i++)
try{
var currObj = app.selection[i];
grBounds[0]=Math.min(grBounds[0],currObj.geometricBounds[0]);
grBounds[1]=Math.min(grBounds[1],currObj.geometricBounds[1]);
grBounds[2]=Math.max(grBounds[2],currObj.geometricBounds[2]);
grBounds[3]=Math.max(grBounds[3],currObj.geometricBounds[3]);
    }catch(e){}
    
var dx =  currObj.parentPage.bounds[3]/2+currObj.parentPage.bounds[1]/2 - grBounds[3]/2-grBounds[1]/2;   
 var dy =  currObj.parentPage.bounds[0]/2+currObj.parentPage.bounds[2]/2 - grBounds[0]/2-grBounds[2]/2; 
 
for(var i=0;i<app.selection.length;i++)
try{
var currObj = app.selection[i];

currObj.move(undefined,[dx,dy])
    }catch(e){}
 
  • Спасибо
Реакции: Slx1

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Код:
#target indesign


function getSelectionBounds () {
    var bounds = app.selection[0].geometricBounds;
    for (var i = 1; i < app.selection.length; i++) {
        var b = app.selection[i].geometricBounds;
        if (b[0] < bounds[0]) {
            bounds[0] = b[0];
        }
        if (b[1] < bounds[1]) {
            bounds[1] = b[1];
        }
        if (b[2] > bounds[2]) {
            bounds[2] = b[2];
        }
        if (b[3] > bounds[3]) {
            bounds[3] = b[3];
        }
    }
    return bounds;
}

function getCenter (bounds) {
    return [(bounds[1] + (bounds[3] - bounds[1]) / 2), (bounds[0] + (bounds[2] - bounds[0]) / 2)];
}

function moveSelection () {
    var step = eval(arguments[0][0]);
    for (var i = 0; i < app.selection.length; i++) {
        app.selection[i].move(undefined, step);
    }
}

function main () {
    if (app.documents.length == 0) {
        return false;
    }
    if (app.selection.length == 0) {
        return false;
    }
    var page = app.activeWindow.activePage;
    var bounds = getSelectionBounds();
    var sc = getCenter(bounds);
    var pc = getCenter(page.bounds);
    var step = [pc[0] - sc[0], pc[1] - sc[1]];
    app.doScript(moveSelection, ScriptLanguage.JAVASCRIPT, [step.toSource()], UndoModes.FAST_ENTIRE_SCRIPT, 'Center Selection');
}

main();
 
  • Спасибо
Реакции: Slx1

Slx1

Топикстартер
15 лет на форуме
Сообщения
944
Реакции
106
вернее вот так
Код:
var grBounds = app.selection[0].geometricBounds;

for(var i=1;i<app.selection.length;i++)
try{
var currObj = app.selection[i];
grBounds[0]=Math.min(grBounds[0],currObj.geometricBounds[0]);
grBounds[1]=Math.min(grBounds[1],currObj.geometricBounds[1]);
grBounds[2]=Math.max(grBounds[2],currObj.geometricBounds[2]);
grBounds[3]=Math.max(grBounds[3],currObj.geometricBounds[3]);
    }catch(e){}
   
var dx =  currObj.parentPage.bounds[3]/2+currObj.parentPage.bounds[1]/2 - grBounds[3]/2-grBounds[1]/2;  
 var dy =  currObj.parentPage.bounds[0]/2+currObj.parentPage.bounds[2]/2 - grBounds[0]/2-grBounds[2]/2;
 
for(var i=0;i<app.selection.length;i++)
try{
var currObj = app.selection[i];

currObj.move(undefined,[dx,dy])
    }catch(e){}

Спасибо!
Вроде работает, только когда несколько элементов выделено, если один – ошибка)
 

Slx1

Топикстартер
15 лет на форуме
Сообщения
944
Реакции
106
Код:
#target indesign


function getSelectionBounds () {
    var bounds = app.selection[0].geometricBounds;
    for (var i = 1; i < app.selection.length; i++) {
        var b = app.selection[i].geometricBounds;
        if (b[0] < bounds[0]) {
            bounds[0] = b[0];
        }
        if (b[1] < bounds[1]) {
            bounds[1] = b[1];
        }
        if (b[2] > bounds[2]) {
            bounds[2] = b[2];
        }
        if (b[3] > bounds[3]) {
            bounds[3] = b[3];
        }
    }
    return bounds;
}

function getCenter (bounds) {
    return [(bounds[1] + (bounds[3] - bounds[1]) / 2), (bounds[0] + (bounds[2] - bounds[0]) / 2)];
}

function moveSelection () {
    var step = eval(arguments[0][0]);
    for (var i = 0; i < app.selection.length; i++) {
        app.selection[i].move(undefined, step);
    }
}

function main () {
    if (app.documents.length == 0) {
        return false;
    }
    if (app.selection.length == 0) {
        return false;
    }
    var page = app.activeWindow.activePage;
    var bounds = getSelectionBounds();
    var sc = getCenter(bounds);
    var pc = getCenter(page.bounds);
    var step = [pc[0] - sc[0], pc[1] - sc[1]];
    app.doScript(moveSelection, ScriptLanguage.JAVASCRIPT, [step.toSource()], UndoModes.FAST_ENTIRE_SCRIPT, 'Center Selection');
}

main();

Работает! Огромнейшее спасибо!
 

Hoar

12 лет на форуме
Сообщения
149
Реакции
61
Ох, не знаю зачем такие сложности. Наверное нужно )
Если конечно это все полностью автоматически происходит.
Если же вручную, не проще координаты центра страницы вбить? (X Location, Y Location).
 

Skvoznyak

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

Slx1

Топикстартер
15 лет на форуме
Сообщения
944
Реакции
106
один без скрипта не проще отцентровать?

Евгений, спасибо за помощь
Вы правы, один можно и руками отцентровать, но тут вопрос удобства - повесил скрипт на кнопку и на автомате центруешь на потоке все что необходимо
Особенно, в цейтноте, особенно часа в 3 ночи (ну мы все знаем как это бывает '))'
 

Slx1

Топикстартер
15 лет на форуме
Сообщения
944
Реакции
106

Slx1

Топикстартер
15 лет на форуме
Сообщения
944
Реакции
106
Код:
#target indesign


function getSelectionBounds () {
    var bounds = app.selection[0].geometricBounds;
    for (var i = 1; i < app.selection.length; i++) {
        var b = app.selection[i].geometricBounds;
        if (b[0] < bounds[0]) {
            bounds[0] = b[0];
        }
        if (b[1] < bounds[1]) {
            bounds[1] = b[1];
        }
        if (b[2] > bounds[2]) {
            bounds[2] = b[2];
        }
        if (b[3] > bounds[3]) {
            bounds[3] = b[3];
        }
    }
    return bounds;
}

function getCenter (bounds) {
    return [(bounds[1] + (bounds[3] - bounds[1]) / 2), (bounds[0] + (bounds[2] - bounds[0]) / 2)];
}

function moveSelection () {
    var step = eval(arguments[0][0]);
    for (var i = 0; i < app.selection.length; i++) {
        app.selection[i].move(undefined, step);
    }
}

function main () {
    if (app.documents.length == 0) {
        return false;
    }
    if (app.selection.length == 0) {
        return false;
    }
    var page = app.activeWindow.activePage;
    var bounds = getSelectionBounds();
    var sc = getCenter(bounds);
    var pc = getCenter(page.bounds);
    var step = [pc[0] - sc[0], pc[1] - sc[1]];
    app.doScript(moveSelection, ScriptLanguage.JAVASCRIPT, [step.toSource()], UndoModes.FAST_ENTIRE_SCRIPT, 'Center Selection');
}

main();

Коллеги, подсобите плиз)

Какие строчки нужно убрать чтобы центрировалось только по вертикали?)
 

Slx1

Топикстартер
15 лет на форуме
Сообщения
944
Реакции
106
var step = [undefined, pc[1] - sc[1]];
Олег, спасибо!
Но у меня почему то выдает ошибку(

1649727635541.png


Получилось все так:

Код:
#target indesign


function getSelectionBounds () {
    var bounds = app.selection[0].geometricBounds;
    for (var i = 1; i < app.selection.length; i++) {
        var b = app.selection[i].geometricBounds;
        if (b[0] < bounds[0]) {
            bounds[0] = b[0];
        }
        if (b[1] < bounds[1]) {
            bounds[1] = b[1];
        }
        if (b[2] > bounds[2]) {
            bounds[2] = b[2];
        }
        if (b[3] > bounds[3]) {
            bounds[3] = b[3];
        }
    }
    return bounds;
}

function getCenter (bounds) {
    return [(bounds[1] + (bounds[3] - bounds[1]) / 2), (bounds[0] + (bounds[2] - bounds[0]) / 2)];
}

function moveSelection () {
    var step = eval(arguments[0][0]);
    for (var i = 0; i < app.selection.length; i++) {
        app.selection[i].move(undefined, step);
    }
}

function main () {
    if (app.documents.length == 0) {
        return false;
    }
    if (app.selection.length == 0) {
        return false;
    }
    var page = app.activeWindow.activePage;
    var bounds = getSelectionBounds();
    var sc = getCenter(bounds);
    var pc = getCenter(page.bounds);
    var step = [undefined, pc[1] - sc[1]];
    app.doScript(moveSelection, ScriptLanguage.JAVASCRIPT, [step.toSource()], UndoModes.FAST_ENTIRE_SCRIPT, 'Center Selection');
}

main();
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Вместо undefined ноль должен быть. Это я протупил.
 
  • Спасибо
Реакции: Slx1