[AI CC2022] Массовый наклон объектов

severnik

Участник
Топикстартер
Сообщения
110
Реакции
2
В иллюстраторе есть функция для трансформации отдельно каждого объекта в выбранном. Там можно смещать, масштабировать и поворачивать.
Можно ли как-то массово наклонять (функция Shear) каждый объекта в выбранном, чтоб каждый объект изменялся так же как отдельно выбранный?
 

ITIT

15 лет на форуме
Сообщения
503
Реакции
194
Можно,если действия применяемые для одного обьекта записать в Action.
В последствии эти действия можно будет применить к любым выделенным обьектам.
Вопрос задан так,что понять трудно,поэтому ответил так,как понял задачу.
 

Jeine

Да здравствует разум! Да сгинет маразм!
15 лет на форуме
Сообщения
7 369
Реакции
6 348

severnik

Участник
Топикстартер
Сообщения
110
Реакции
2
массово ≠ поштучно
Да, нужно выделить и наклонить все объекты за раз, как при выделении по отдельности, как это делается с остальными операциями в "Трансформировать каждый" (Alt+Shift+Ctrl+D).
Может скрипт есть или иной какой способ?
 

ITIT

15 лет на форуме
Сообщения
503
Реакции
194
Последнее редактирование:

Drawer

Участник
Сообщения
1 899
Реакции
837
Выделить все обьекты и Objеct --- Transform --- Shear ,чем не подходит?
Ну результат то разный выйдет :) Видимо так не устраивает.
Но таки да, хотелось бы услышать всю боль и глубину проблемы, дабы найти оптимальное решение.
 

severnik

Участник
Топикстартер
Сообщения
110
Реакции
2
Ну результат то разный выйдет :) Видимо так не устраивает.
Но таки да, хотелось бы услышать всю боль и глубину проблемы, дабы найти оптимальное решение.
Да, все объекты послетают со своих мест. Впринципе, можно их вернуть выравниванием и распределением обратно.
Думал, может существует иной способ применить массовый наклон, как в "Трансформировать каждый".
 
Последнее редактирование:

Drawer

Участник
Сообщения
1 899
Реакции
837
существует иной способ
Ну... так то вот:
JavaScript:
#target Illustrator
/*
#info К выделенным объектам поочередно применяется операция "Shear" из панели "Transform"
*/
if (app.documents.length > 0 ) {
    var doc = app.activeDocument;
    var sel = doc.selection;
    if (sel.length > 0 ) {
        dialog (sel);
    };
};

function dialog (sel) {
    var dialog = new Window("dialog");
        dialog.text = "Set the shear angle";
        dialog.orientation = "row";
        dialog.alignChildren = ["center","top"];
        dialog.spacing = 15;
        dialog.margins = 9;

    var edittext1 = dialog.add('edittext {properties: {name: "edittext1"}}');
        edittext1.text = "0";
        edittext1.preferredSize.width = 40;
        edittext1.alignment = ["center","center"];

    var batOK = dialog.add("button", undefined, undefined, {name: "batOK"});
        batOK.text = "Ok";
        batOK.preferredSize.width = 90; 
        batOK.onClick = function() {
            var angle = edittext1.text;
            angle = angle.replace(',', '.')*1
            if (angle) {
                if (angle > 89.9) {angle = 89.9};
                if (angle < -89.9) {angle = -89.9};
                angle = String(angle.toFixed(1));
                addAction (angle);
                doc.selection = null;
                for ( i = 0; i < sel.length; i++ ) {
                    sel[i].selected = true;
                    redraw ();
                    app.doScript("ScriptAction", "ScriptSet");
                    sel[i].selected = false;
                    redraw ();
                };
                unloadAction("ScriptSet", "");
            };
        };
    dialog.show();
};

function addAction (angle) {
    var ActionString = [ '/version 3',
    '/name [ 9',
    '    536372697074536574',
    ']',
    '/isOpen 1',
    '/actionCount 1',
    '/action-1 {',
    '    /name [ 12',
    '        536372697074416374696f6e',
    '    ]',
    '    /keyIndex 0',
    '    /colorIndex 0',
    '    /isOpen 1',
    '    /eventCount 1',
    '    /event-1 {',
    '        /useRulersIn1stQuadrant 0',
    '        /internalName (ai_plugin_transformPalette)',
    '        /localizedName [ 15',
    '            5472616e73666f726d2050616e656c',
    '        ]',
    '        /isOpen 1',
    '        /isOn 1',
    '        /hasDialog 0',
    '        /parameterCount 2',
    '        /parameter-1 {',
    '            /key 1954115685',
    '            /showInPalette -1',
    '            /type (enumerated)',
    '            /name [ 6',
    '                53686561723a',
    '            ]',
    '            /value 4',
    '        }',
    '        /parameter-2 {',
    '            /key 1986096245',
    '            /showInPalette -1',
    '            /type (unit real)',
    '            /value ' + angle,
    '            /unit 591490663',
    '        }',
    '    }',
    '}'].join('\n');
        var f = new File('~/ScriptSet.aia');
        f.open('w');
        f.write(ActionString);
        f.close();
        loadAction (f);
        f.remove();
        ActionString = null;
};
 
  • Спасибо
Реакции: severnik, ITIT и Jeine

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 267
Реакции
10 857
Использование экшна в данном случае некошерно.
Наклон - аффинное преобразование, можно обойтись матрицей.
 

Jeine

Да здравствует разум! Да сгинет маразм!
15 лет на форуме
Сообщения
7 369
Реакции
6 348

ITIT

15 лет на форуме
Сообщения
503
Реакции
194
Вся беда в том,что при Shear происходит смещение через центр обьекта (или группы обьектов) отсюда и происходит смещение в сторону от нижнего основания обьекта о чем и говорит ТС.
 

Drawer

Участник
Сообщения
1 899
Реакции
837
В данном случае группа воспринимается тоже как один объект.
А кто сказал что надо по другому? :) Выдели не группу...
Использование экшна в данном случае некошерно
Администрация, удалите мой скрипт пожалуйста :)
Наклон - аффинное преобразование, можно обойтись матрицей.
Вот где аффинное преобразование, а где иллюстраторовский доступ из скрипта к маске непрозрачности например? Ты уверен, что всегда нужно будет работать только с объектами которые доступны функции трансформации из скриптинга?
 
Последнее редактирование:
  • Спасибо
Реакции: _MBK_

severnik

Участник
Топикстартер
Сообщения
110
Реакции
2
Ну... так то вот:
JavaScript:
#target Illustrator
/*
#info К выделенным объектам поочередно применяется операция "Shear" из панели "Transform"
*/
if (app.documents.length > 0 ) {
    var doc = app.activeDocument;
    var sel = doc.selection;
    if (sel.length > 0 ) {
        dialog (sel);
    };
};

function dialog (sel) {
    var dialog = new Window("dialog");
        dialog.text = "Set the shear angle";
        dialog.orientation = "row";
        dialog.alignChildren = ["center","top"];
        dialog.spacing = 15;
        dialog.margins = 9;

    var edittext1 = dialog.add('edittext {properties: {name: "edittext1"}}');
        edittext1.text = "0";
        edittext1.preferredSize.width = 40;
        edittext1.alignment = ["center","center"];

    var batOK = dialog.add("button", undefined, undefined, {name: "batOK"});
        batOK.text = "Ok";
        batOK.preferredSize.width = 90;
        batOK.onClick = function() {
            var angle = edittext1.text;
            angle = angle.replace(',', '.')*1
            if (angle) {
                if (angle > 89.9) {angle = 89.9};
                if (angle < -89.9) {angle = -89.9};
                angle = String(angle.toFixed(1));
                addAction (angle);
                doc.selection = null;
                for ( i = 0; i < sel.length; i++ ) {
                    sel[i].selected = true;
                    redraw ();
                    app.doScript("ScriptAction", "ScriptSet");
                    sel[i].selected = false;
                    redraw ();
                };
                unloadAction("ScriptSet", "");
            };
        };
    dialog.show();
};

function addAction (angle) {
    var ActionString = [ '/version 3',
    '/name [ 9',
    '    536372697074536574',
    ']',
    '/isOpen 1',
    '/actionCount 1',
    '/action-1 {',
    '    /name [ 12',
    '        536372697074416374696f6e',
    '    ]',
    '    /keyIndex 0',
    '    /colorIndex 0',
    '    /isOpen 1',
    '    /eventCount 1',
    '    /event-1 {',
    '        /useRulersIn1stQuadrant 0',
    '        /internalName (ai_plugin_transformPalette)',
    '        /localizedName [ 15',
    '            5472616e73666f726d2050616e656c',
    '        ]',
    '        /isOpen 1',
    '        /isOn 1',
    '        /hasDialog 0',
    '        /parameterCount 2',
    '        /parameter-1 {',
    '            /key 1954115685',
    '            /showInPalette -1',
    '            /type (enumerated)',
    '            /name [ 6',
    '                53686561723a',
    '            ]',
    '            /value 4',
    '        }',
    '        /parameter-2 {',
    '            /key 1986096245',
    '            /showInPalette -1',
    '            /type (unit real)',
    '            /value ' + angle,
    '            /unit 591490663',
    '        }',
    '    }',
    '}'].join('\n');
        var f = new File('~/ScriptSet.aia');
        f.open('w');
        f.write(ActionString);
        f.close();
        loadAction (f);
        f.remove();
        ActionString = null;
};
Спасибо, работает.
А где можно посмотреть, как обратиться в коде к остальным параметрам из окна Shear (выбор оси и её угла)?
 

severnik

Участник
Топикстартер
Сообщения
110
Реакции
2
Вот где аффинное преобразование, а где иллюстраторовский доступ из скрипта к маске непрозрачности например? Ты уверен, что всегда нужно будет работать только с объектами которые доступны функции трансформации из скриптинга?
Да, универсальное решение лучше.
Можно, наверное, ускорить обработку, отключив перерисовку на время работы скрипта, если это возможно в AI.
 

Drawer

Участник
Сообщения
1 899
Реакции
837
А где можно посмотреть, как обратиться в коде к остальным параметрам из окна Shear (выбор оси и её угла)?
В коде никак, выбирайте в панели трансформации все это, относительно того что там выбрано он и трансформирует. Про угол не понял, он же в окошке UI скрипта задается...
 

severnik

Участник
Топикстартер
Сообщения
110
Реакции
2
Кстати, нашёл ещё способ, который делает то же, что и скрипт.
Если наклон задавать через панель инструментов Трансформирование, то наклон происходит как надо, каждого объекта.
1664729142690.png
 

Drawer

Участник
Сообщения
1 899
Реакции
837
через панель инструментов Трансформирование, то наклон происходит как надо, каждого объекта.
Нет. Наклон делается выделенной группе объектов вкупе, что не есть тоже самое. Именно из этого меню я и брал макрос для наклона :)
 
Последнее редактирование:

severnik

Участник
Топикстартер
Сообщения
110
Реакции
2
Нет. Наклон делается выделенной группе объектов вкупе, что не есть тоже самое. Именно из этого меню я и брал макрос для наклона :)
Да, согласен. У меня изначально обекты стояли в одном ряду и разница была не заметна. А разлёт выделенной группы как раз и происходил при выборе оси наклона. Если менять только угол в одном ряду, то разницы нет.
Если же объекты стоят матрицей, то разница в обработке скриптом сразу видна.