[AI CC-CC2022] Неправильно работает скрипт внутри операции (action)

...изза какого то внутреннего индобага группировка обьектов выводит группируемые обьекты из коллекции pathItems слоя, чего, вообще говоря, по логике здорового человека, происходить не должно.
наверное, не должно. Но в логике Illustrator_Scripting_Reference_JavaScript_2015.pdf, на стр. 79 во вступлении к GroupItem, это прописано явным образом. Возможно, это связано с тем что для формата PDF слой - это просто некая именованная глобальная группа - и как и список содержимого группы выдает только первый уровень вложения объектов, так и у слоя. Другое дело Документ - через него любой pageItem доступен...
 
наверное, не должно. Но в логике Illustrator_Scripting_Reference_JavaScript_2015.pdf, на стр. 79 во вступлении к GroupItem, это прописано явным образом. Возможно, это связано с тем что для формата PDF слой - это просто некая именованная глобальная группа - и как и список содержимого группы выдает только первый уровень вложения объектов, так и у слоя. Другое дело Документ - через него любой pageItem доступен...
Ну с этой точки зрения, вероятно да, хотя по мне, создание ситуации, при которой невозможно отследить родительские связи слоя с дочерними обьектами без танца с бубном, несколько порочно.
 
Возможно, это связано с тем что для формата PDF слой - это просто некая именованная глобальная группа - и как и список содержимого группы выдает только первый уровень вложения объектов, так и у слоя
при чем тут PDF?
 
как пример структурной организации объектов. Так-то можно конечно обобщить на вообще деревья, но скорее всего, чтобы не переделывать вообще все, программисты Адобы использовали сходные подходы и в своем PDF и в Illustrator ExtendScript.
 
интересный ход мысли. а как вы с этой точки зрения объясните тот факт, что при дублировании группы она не появляется в activeDocument.groupItems, но появляется в activeDocument.activeLayer.groupItems? )

Код:
var actLayer = app.activeDocument.layers[0];
var myGroup = app.activeDocument.groupItems[0];
for(var i=0;i<10;i++)
{
var newGroup = myGroup.duplicate( actLayer, ElementPlacement.PLACEATBEGINNING );
$.writeln(app.activeDocument.groupItems.length+":"+actLayer.groupItems.length);
}

1:2
1:3
1:4
1:5
1:6
1:7
1:8
1:9
1:10
1:11
 
ну а если серьезно, то в indesign сделано по-человечески: pageItems возвращает объекты на верхнем уровне, без вложенных, но есть еще свойство allPageItems, где есть все объекты дерева. в иллюстраторе же логика модели скриптинга несколько хаотична - видимо, разные люди в разное время делали обертки, и не особо парились на тему унификации
 
ну а если серьезно, то в indesign сделано по-человечески: pageItems возвращает объекты на верхнем уровне, без вложенных, но есть еще свойство allPageItems, где есть все объекты дерева. в иллюстраторе же логика модели скриптинга несколько хаотична - видимо, разные люди в разное время делали обертки, и не особо парились на тему унификации
полностью согласен
 
я так и не смог начать им нормально пользоваться, тк при достижении определенного количества объектов в документе скрипт и иллюстратор зависают.
Но Вы так и не обозначили тогда границы задачи. Например в простом случае, когда известно что заливки и линии объектов не будут градиентами и все будет в RGB лучше/проще вообще уйти от использования app.executeMenuCommand, а получать значения скриптом и раскидать по группам в зависимости от значений и принадлежности к артборду.
 
Последнее редактирование:
Но Вы так и не обозначили тогда границы задачи. Например в простом случае, когда известно что заливки и линии объектов не будут градиентами и все будет в RGB лучше/проще вообще уйти от использования app.executeMenuCommand, а получать значения скриптом и раскидать по группам в зависимости от значений и принадлежности к артборду.
Привет! Спасибо еще раз за скрипт, никаких претензий к нему не имею, он на малое количество объектов работает отлично. Если что, я в принципе уже рад пользоваться тем, что есть, но думал, что может найдется еще какое-то решение при работе с большим количеством объектов.
 
какое-то решение при работе с большим количеством объектов.
Надо сперва понять, что именно портится с большим количеством обьектов. Для начала повставляйте redrawов побольше
 

Не по теме:
Видимо не добиться мне от Вас граничных условий ...

при работе с большим количеством объектов.
Если не нужно стремиться к полному повторению результата работы "Find Fill & Stroke menu item", и вам плевать как будут названы группы в панели слоев, то можно так :
JavaScript:
#target Illustrator
var doc = app.activeDocument;
var ab = doc.artboards;
for (var a=0; a < ab.length; a++) {
    ab.setActiveArtboardIndex (a);
    doc.selectObjectsOnActiveArtboard();
    sel = doc.selection;
    for (var i=0; i < sel.length; i++) {
        n = "Ab" + String(a) + "_" + String(sel[i].strokeWidth) + sepColorName (sel[i]);
        try {nGroup = doc.groupItems.getByName(n)} catch (e) {nGroup = doc.groupItems.add()};
        sel[i].moveToBeginning(nGroup);
        nGroup.name = n;
    };
};

doc.selection = null;

function sepColorName (obj) {
    switch (obj.fillColor.typename) {
      case "GrayColor":
        scnf = "GRAY" + String(obj.fillColor.gray);
        break;
      case "CMYKColor":
        scnf = "CMYK" + String(obj.fillColor.cyan) + String(obj.fillColor.magenta) + String(obj.fillColor.yellow) + String(obj.fillColor.black);
        break;
      case "RGBColor":
         scnf = "RGB" + String(obj.fillColor.red) + String(obj.fillColor.green) + String(obj.fillColor.blue);
        break;
      case "SpotColor":
         scns = "SPOT" + String(obj.fillColor.spot.name) + String(obj.fillColor.tint);
        break;
      default:
         scnf = "NOT DEFINED";
    };
    switch (obj.strokeColor.typename) {
      case "GrayColor":
        scns = "GRAY" + String(obj.strokeColor.gray);
        break;
      case "CMYKColor":
        scns = "CMYK" + String(obj.strokeColor.cyan) + String(obj.strokeColor.magenta) + String(obj.strokeColor.yellow) + String(obj.strokeColor.black);
        break;
      case "RGBColor":
         scns = "RGB" + String(obj.strokeColor.red) + String(obj.strokeColor.green) + String(obj.strokeColor.blue);
        break;
      case "SpotColor":
         scns = "SPOT" + String(obj.strokeColor.spot.name) + String(obj.strokeColor.tint);
        break;
      default:
         scns = "NOT DEFINED";
    };
    scn = scnf + scns;
    return scn;
};
Можно сортировать и градиентную заливку по этому же принципу, но пока она валится в одну кучу группу. Можете попробовать разобраться и добавить сами...
 
  • Спасибо
Реакции: Skvoznyak

Не по теме:
Видимо не добиться мне от Вас граничных условий ...


Если не нужно стремиться к полному повторению результата работы "Find Fill & Stroke menu item", и вам плевать как будут названы группы в панели слоев, то можно так :
JavaScript:
#target Illustrator
var doc = app.activeDocument;
var ab = doc.artboards;
for (var a=0; a < ab.length; a++) {
    ab.setActiveArtboardIndex (a);
    doc.selectObjectsOnActiveArtboard();
    sel = doc.selection;
    for (var i=0; i < sel.length; i++) {
        n = "Ab" + String(a) + "_" + String(sel[i].strokeWidth) + sepColorName (sel[i]);
        try {nGroup = doc.groupItems.getByName(n)} catch (e) {nGroup = doc.groupItems.add()};
        sel[i].moveToBeginning(nGroup);
        nGroup.name = n;
    };
};

doc.selection = null;

function sepColorName (obj) {
    switch (obj.fillColor.typename) {
      case "GrayColor":
        scnf = "GRAY" + String(obj.fillColor.gray);
        break;
      case "CMYKColor":
        scnf = "CMYK" + String(obj.fillColor.cyan) + String(obj.fillColor.magenta) + String(obj.fillColor.yellow) + String(obj.fillColor.black);
        break;
      case "RGBColor":
         scnf = "RGB" + String(obj.fillColor.red) + String(obj.fillColor.green) + String(obj.fillColor.blue);
        break;
      case "SpotColor":
         scns = "SPOT" + String(obj.fillColor.spot.name) + String(obj.fillColor.tint);
        break;
      default:
         scnf = "NOT DEFINED";
    };
    switch (obj.strokeColor.typename) {
      case "GrayColor":
        scns = "GRAY" + String(obj.strokeColor.gray);
        break;
      case "CMYKColor":
        scns = "CMYK" + String(obj.strokeColor.cyan) + String(obj.strokeColor.magenta) + String(obj.strokeColor.yellow) + String(obj.strokeColor.black);
        break;
      case "RGBColor":
         scns = "RGB" + String(obj.strokeColor.red) + String(obj.strokeColor.green) + String(obj.strokeColor.blue);
        break;
      case "SpotColor":
         scns = "SPOT" + String(obj.strokeColor.spot.name) + String(obj.strokeColor.tint);
        break;
      default:
         scns = "NOT DEFINED";
    };
    scn = scnf + scns;
    return scn;
};
Можно сортировать и градиентную заливку по этому же принципу, но пока она валится в одну кучу группу. Можете попробовать разобраться и добавить сами...
Привет, вот только сейчас смог потестировать скрипт, при активации пишет ошибку -
Error 21: undefined не является объектом. Line: 19 ->
switch (obj.fillColor.typename) {
Возможно что-то не так запускаю или что-то предварительно не выделяю в документе, но вроде пробовал по-всякому.
 
Этот скрипт предполагает, что выделены только простые шейпы, у групп, компаундов и прочих типов свойства fillColor просто нет, на что скрипт и ругается.
 
  • Спасибо
Реакции: Drawer
у всех?
неверный подход
Не, мы знаем что самый верный
к Натали надо обратиться
Но Вы не откликались :( и мы решали в меру своих возможностей ;(
Очень ждем Ваш вариант :)
решению данной задачи

Не по теме:
Сама задача для меня загадка кстати до сих пор :) ТС упорно скрывает цели и граничные условия
 
Последнее редактирование:
Этот скрипт предполагает, что выделены только простые шейпы, у групп, компаундов и прочих типов свойства fillColor просто нет, на что скрипт и ругается.
да, все работает, только жалко, что он не взаимодействует с составным контуром.

Я все-таки сделал action из индусского скрипта и указал, чтобы он проходил по всем артбордам отдельно, вот файл - для сообщения2 . Довольно замысловато вышло

Предварительно нужно в документе всё разгруппировать и убрать обтравочные маски (делается скриптом).
Затем снова нужно сгруппировать все объекты, только уже внутри каждого отдельного артборда (делается скриптом)
Затем выделить мышкой в слоях самую нижнюю получившуюся группу и запустить action

Единственный минус этого экшена, что он делает все очень долго, например на 100 артбордов уйдет пол часа, если не больше. Но самое главное, что работает
 
Последнее редактирование:
да, все работает, только жалко, что он не взаимодействует с составным контуром.

Я все-таки сделал action из индусского скрипта и указал, чтобы он проходил по всем артбордам отдельно, вот файл - для сообщения2 . Довольно замысловато вышло

Предварительно нужно в документе всё разгруппировать и убрать обтравочные маски (делается скриптом).
Затем снова нужно сгруппировать все объекты, только уже внутри каждого отдельного артборда (делается скриптом)
Затем выделить мышкой в слоях самую нижнюю получившуюся группу и запустить action

Единственный минус этого экшена, что он делает все очень долго, например на 100 артбордов уйдет пол часа, если не больше. Но самое главное, что работает
"Затем снова нужно сгруппировать все объекты, только уже внутри каждого отдельного артборда (делается скриптом)" Имею ввиду, чтобы внутри каждого артборда была только 1 группа со всеми находящими объектами внутри этого артборда
 
ну я не специалист к сожалению) просто хотел сделать так, чтобы это вообще работало
Ну в таком случае есть три варианта -
1 Обратиться за помошью к проффесионалу в этом деле, например - _MBK_
2 Попробовать получить уже готовый продукт
3 Дальше мучить свой комп , тк эта задача весьма неординарная....
 
Ну в таком случае есть три варианта -
1 Обратиться за помошью к проффесионалу в этом деле, например - _MBK_
2 Попробовать получить уже готовый продукт
3 Дальше мучить свой комп , тк эта задача весьма неординарная....
ну мне наверное и экшена хватит, но если есть какой-то нетрудный вариант сократить время работы экшена до пары минут (сейчас, еще раз повторюсь, на 100 артбордов +30 минут уходит), например уже в виде скрипта, то буду рад.
 
Последнее редактирование: