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

almastu

15 лет на форуме
Сообщения
535
Реакции
90
...изза какого то внутреннего индобага группировка обьектов выводит группируемые обьекты из коллекции pathItems слоя, чего, вообще говоря, по логике здорового человека, происходить не должно.
наверное, не должно. Но в логике Illustrator_Scripting_Reference_JavaScript_2015.pdf, на стр. 79 во вступлении к GroupItem, это прописано явным образом. Возможно, это связано с тем что для формата PDF слой - это просто некая именованная глобальная группа - и как и список содержимого группы выдает только первый уровень вложения объектов, так и у слоя. Другое дело Документ - через него любой pageItem доступен...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
наверное, не должно. Но в логике Illustrator_Scripting_Reference_JavaScript_2015.pdf, на стр. 79 во вступлении к GroupItem, это прописано явным образом. Возможно, это связано с тем что для формата PDF слой - это просто некая именованная глобальная группа - и как и список содержимого группы выдает только первый уровень вложения объектов, так и у слоя. Другое дело Документ - через него любой pageItem доступен...
Ну с этой точки зрения, вероятно да, хотя по мне, создание ситуации, при которой невозможно отследить родительские связи слоя с дочерними обьектами без танца с бубном, несколько порочно.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Возможно, это связано с тем что для формата PDF слой - это просто некая именованная глобальная группа - и как и список содержимого группы выдает только первый уровень вложения объектов, так и у слоя
при чем тут PDF?
 

almastu

15 лет на форуме
Сообщения
535
Реакции
90
как пример структурной организации объектов. Так-то можно конечно обобщить на вообще деревья, но скорее всего, чтобы не переделывать вообще все, программисты Адобы использовали сходные подходы и в своем PDF и в Illustrator ExtendScript.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
интересный ход мысли. а как вы с этой точки зрения объясните тот факт, что при дублировании группы она не появляется в 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
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
ну а если серьезно, то в indesign сделано по-человечески: pageItems возвращает объекты на верхнем уровне, без вложенных, но есть еще свойство allPageItems, где есть все объекты дерева. в иллюстраторе же логика модели скриптинга несколько хаотична - видимо, разные люди в разное время делали обертки, и не особо парились на тему унификации
 

almastu

15 лет на форуме
Сообщения
535
Реакции
90
ну а если серьезно, то в indesign сделано по-человечески: pageItems возвращает объекты на верхнем уровне, без вложенных, но есть еще свойство allPageItems, где есть все объекты дерева. в иллюстраторе же логика модели скриптинга несколько хаотична - видимо, разные люди в разное время делали обертки, и не особо парились на тему унификации
полностью согласен
 

Drawer

Участник
Сообщения
1 814
Реакции
798
я так и не смог начать им нормально пользоваться, тк при достижении определенного количества объектов в документе скрипт и иллюстратор зависают.
Но Вы так и не обозначили тогда границы задачи. Например в простом случае, когда известно что заливки и линии объектов не будут градиентами и все будет в RGB лучше/проще вообще уйти от использования app.executeMenuCommand, а получать значения скриптом и раскидать по группам в зависимости от значений и принадлежности к артборду.
 
Последнее редактирование:

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
Но Вы так и не обозначили тогда границы задачи. Например в простом случае, когда известно что заливки и линии объектов не будут градиентами и все будет в RGB лучше/проще вообще уйти от использования app.executeMenuCommand, а получать значения скриптом и раскидать по группам в зависимости от значений и принадлежности к артборду.
Привет! Спасибо еще раз за скрипт, никаких претензий к нему не имею, он на малое количество объектов работает отлично. Если что, я в принципе уже рад пользоваться тем, что есть, но думал, что может найдется еще какое-то решение при работе с большим количеством объектов.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
какое-то решение при работе с большим количеством объектов.
Надо сперва понять, что именно портится с большим количеством обьектов. Для начала повставляйте redrawов побольше
 

Drawer

Участник
Сообщения
1 814
Реакции
798

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

при работе с большим количеством объектов.
Если не нужно стремиться к полному повторению результата работы "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

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2

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


Если не нужно стремиться к полному повторению результата работы "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) {
Возможно что-то не так запускаю или что-то предварительно не выделяю в документе, но вроде пробовал по-всякому.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Этот скрипт предполагает, что выделены только простые шейпы, у групп, компаундов и прочих типов свойства fillColor просто нет, на что скрипт и ругается.
 
  • Спасибо
Реакции: Drawer

Drawer

Участник
Сообщения
1 814
Реакции
798
у всех?
неверный подход
Не, мы знаем что самый верный
к Натали надо обратиться
Но Вы не откликались :( и мы решали в меру своих возможностей ;(
Очень ждем Ваш вариант :)
решению данной задачи

Не по теме:
Сама задача для меня загадка кстати до сих пор :) ТС упорно скрывает цели и граничные условия
 
Последнее редактирование:

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
Этот скрипт предполагает, что выделены только простые шейпы, у групп, компаундов и прочих типов свойства fillColor просто нет, на что скрипт и ругается.
да, все работает, только жалко, что он не взаимодействует с составным контуром.

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

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

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

Ant-3

Участник
Топикстартер
Сообщения
57
Реакции
2
да, все работает, только жалко, что он не взаимодействует с составным контуром.

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

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

Единственный минус этого экшена, что он делает все очень долго, например на 100 артбордов уйдет пол часа, если не больше. Но самое главное, что работает
"Затем снова нужно сгруппировать все объекты, только уже внутри каждого отдельного артборда (делается скриптом)" Имею ввиду, чтобы внутри каждого артборда была только 1 группа со всеми находящими объектами внутри этого артборда
 

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Сообщения
2 089
Реакции
145
ну я не специалист к сожалению) просто хотел сделать так, чтобы это вообще работало
Ну в таком случае есть три варианта -
1 Обратиться за помошью к проффесионалу в этом деле, например - _MBK_
2 Попробовать получить уже готовый продукт
3 Дальше мучить свой комп , тк эта задача весьма неординарная....
 

Ant-3

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