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

severnik

Участник
Топикстартер
Сообщения
110
Реакции
2
В иллюстраторе есть функция для трансформации отдельно каждого объекта в выбранном. Там можно смещать, масштабировать и поворачивать.
Можно ли как-то массово наклонять (функция Shear) каждый объекта в выбранном, чтоб каждый объект изменялся так же как отдельно выбранный?
 
Можно,если действия применяемые для одного обьекта записать в Action.
В последствии эти действия можно будет применить к любым выделенным обьектам.
Вопрос задан так,что понять трудно,поэтому ответил так,как понял задачу.
 
массово ≠ поштучно
Да, нужно выделить и наклонить все объекты за раз, как при выделении по отдельности, как это делается с остальными операциями в "Трансформировать каждый" (Alt+Shift+Ctrl+D).
Может скрипт есть или иной какой способ?
 
Последнее редактирование:
Выделить все обьекты и Objеct --- Transform --- Shear ,чем не подходит?
Ну результат то разный выйдет :) Видимо так не устраивает.
Но таки да, хотелось бы услышать всю боль и глубину проблемы, дабы найти оптимальное решение.
 
Ну результат то разный выйдет :) Видимо так не устраивает.
Но таки да, хотелось бы услышать всю боль и глубину проблемы, дабы найти оптимальное решение.
Да, все объекты послетают со своих мест. Впринципе, можно их вернуть выравниванием и распределением обратно.
Думал, может существует иной способ применить массовый наклон, как в "Трансформировать каждый".
 
Последнее редактирование:
существует иной способ
Ну... так то вот:
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
Использование экшна в данном случае некошерно.
Наклон - аффинное преобразование, можно обойтись матрицей.
 
Вся беда в том,что при Shear происходит смещение через центр обьекта (или группы обьектов) отсюда и происходит смещение в сторону от нижнего основания обьекта о чем и говорит ТС.
 
В данном случае группа воспринимается тоже как один объект.
А кто сказал что надо по другому? :) Выдели не группу...
Использование экшна в данном случае некошерно
Администрация, удалите мой скрипт пожалуйста :)
Наклон - аффинное преобразование, можно обойтись матрицей.
Вот где аффинное преобразование, а где иллюстраторовский доступ из скрипта к маске непрозрачности например? Ты уверен, что всегда нужно будет работать только с объектами которые доступны функции трансформации из скриптинга?
 
Последнее редактирование:
  • Спасибо
Реакции: _MBK_
Ну... так то вот:
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 (выбор оси и её угла)?
 
Вот где аффинное преобразование, а где иллюстраторовский доступ из скрипта к маске непрозрачности например? Ты уверен, что всегда нужно будет работать только с объектами которые доступны функции трансформации из скриптинга?
Да, универсальное решение лучше.
Можно, наверное, ускорить обработку, отключив перерисовку на время работы скрипта, если это возможно в AI.
 
А где можно посмотреть, как обратиться в коде к остальным параметрам из окна Shear (выбор оси и её угла)?
В коде никак, выбирайте в панели трансформации все это, относительно того что там выбрано он и трансформирует. Про угол не понял, он же в окошке UI скрипта задается...
 
Кстати, нашёл ещё способ, который делает то же, что и скрипт.
Если наклон задавать через панель инструментов Трансформирование, то наклон происходит как надо, каждого объекта.
1664729142690.png
 
через панель инструментов Трансформирование, то наклон происходит как надо, каждого объекта.
Нет. Наклон делается выделенной группе объектов вкупе, что не есть тоже самое. Именно из этого меню я и брал макрос для наклона :)
 
Последнее редактирование:
Нет. Наклон делается выделенной группе объектов вкупе, что не есть тоже самое. Именно из этого меню я и брал макрос для наклона :)
Да, согласен. У меня изначально обекты стояли в одном ряду и разница была не заметна. А разлёт выделенной группы как раз и происходил при выборе оси наклона. Если менять только угол в одном ряду, то разницы нет.
Если же объекты стоят матрицей, то разница в обработке скриптом сразу видна.