[AI CC-CC2021] Как нормализовать Compound Path?

Linxy

Девушка с битой
10 лет на форуме
Сообщения
2 277
Реакции
3 836
Мне по стартовому посту не было очевидно, что нужно получить в итоге. Если просто почистить пути, не используя ручной труд, то плагин в помощь*, если нужно так проделать с рядом файлов, то может его вызов получится записать в экшн. Но если это только одна из кучи функций в каком-то скрипте, который ещё много чего делает, то тут вам уже карты в руки.

* без теста не могу пока утверждать, что плагин всё сделает, как надо
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Какая бурная дискуссия! Не думал, что данная тема вызовет столько шума. Если интересно, то я сам решил задачу так.
Код:
// Функция нормализации составного контура
function normaliseCompoundPath() {
  app.executeMenuCommand('noCompoundPath');
  var selected = app.activeDocument.selection;
  for (var i=0; i < selected.length; i++) {
    if (selected[i].typename === 'GroupItem') {
      app.executeMenuCommand('ungroup');
    }
  };
  app.executeMenuCommand('compoundPath');
};
Естественно, сам контур при этом должен быть выделен.
Несколько топорно, использовав executeMenuCommand(), но работает. А что еще надо?
 
Последнее редактирование:

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Убирает даже сложенные в группы группы.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 189
Реакции
10 844
А мой то вариант чем плох? И безо всяких вызовов меню
 

_MBK_

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

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Ну покажите скриншоты тогда. У меня, при тестировании вашего варианта, группы остаются.
И первую строку я позволил себе поправить var cmp=app.activeDocument.selection[0];
 
Последнее редактирование:

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Не сочтите за наглость, но...
screenshot-01.png
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 189
Реакции
10 844
Гм странно, внутри CompaundPath вложены pathItems которые на самом деле groupItems, но ведут себя именно как pathItems и typename у них соответствующие.
Я подумаю над этими индийскими чудесами завтра 'hmmm'
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Да, я тоже с этим столкнулся. И не придумал ничего лучшего, чем executeMenuCommand().
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 189
Реакции
10 844
Так вы четче формулируете суть бага, а то два дня понадобилось, чтобы понять в чем корень зла
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Я задачу вроде понятно обрисовал. По началу вообще не знал как у ней подступиться. А баг этот уже в процессе решения вылез.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 189
Реакции
10 844
В общем на свежую голову разобрался. Суть бага состоит в том, что индусы поленились добавлять в класс CompoundPathItem список дочерних групп, в итоге снаружи отсутствует доступ к всем субконтурам, которые объединены в группы и компаунды. Я даже, примерно предполагаю, почему так вышло, вспоминается старый советский анекдот, когда одна группа коммунальщиков копает ямы, а за ней идет другая, которая их закапывает, а группа, сажающая деревья на работу не вышло. Так и тут - вероятно, изначально предполагалось, что внутри компаунда не должно было быть никаких вложенных групп (что правильно и логично), но группа индусов, которые должны были за этим следить, накурилась гашиша и забила на данное действие. И так до последнего актуального CC. Но пытливый ум всегда нвйдет решение, по счастью, доступ к утонувшим субконтурам есть из самого документа. В итоге, правильный рабочий код выглядит так:
JavaScript:
function getParent(item)
{
    var prnt=null;
    var superprnt=item.parent;
    while (superprnt && (superprnt.typename!="Layer") )
    {
        prnt=superprnt;
        superprnt=superprnt.parent;
    }
    return prnt;
}
var cmp=app.selection[0];

for (var i=activeDocument.pathItems.length-1; i>=0;i--)
{
  if (getParent(app.activeDocument.pathItems[i])==cmp)
  {
      app.activeDocument.pathItems[i].move(cmp,ElementPlacement.PLACEATEND);
  }
}
 
  • Спасибо
Реакции: mnemonix и romaya

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Да, работает. Согласен, такой вариант реализации лучше моего, так как не привязан к executeMenuCommand() и соответственно будет работать и в ранних версиях Illustrator. Спасибо, _МВК_.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Внутри групп не найдет так compound paths
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 189
Реакции
10 844
Да, предполагается, что compaundpath верхнего уровня. Но в принципе поправить недолго
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Внутри групп не найдет так compound paths
Внутри групп не бывает compaund path, только path. Compaund path только один. Поэтому ничего править не надо. Если сомневаетесь, найдите и покажите пример того, о чем вы говорите.
 
Последнее редактирование:

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Это группа из двух составных контуров. А в самом составном контуре могут быть только контуры, иногда сгруппированные. Вот я о чем.