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

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

* без теста не могу пока утверждать, что плагин всё сделает, как надо
 
Какая бурная дискуссия! Не думал, что данная тема вызовет столько шума. Если интересно, то я сам решил задачу так.
Код:
// Функция нормализации составного контура
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(), но работает. А что еще надо?
 
Последнее редактирование:
Убирает даже сложенные в группы группы.
 
А мой то вариант чем плох? И безо всяких вызовов меню
 
Ну покажите скриншоты тогда. У меня, при тестировании вашего варианта, группы остаются.
И первую строку я позволил себе поправить var cmp=app.activeDocument.selection[0];
 
Последнее редактирование:
Не сочтите за наглость, но...
screenshot-01.png
 
Гм странно, внутри CompaundPath вложены pathItems которые на самом деле groupItems, но ведут себя именно как pathItems и typename у них соответствующие.
Я подумаю над этими индийскими чудесами завтра 'hmmm'
 
Да, я тоже с этим столкнулся. И не придумал ничего лучшего, чем executeMenuCommand().
 
Так вы четче формулируете суть бага, а то два дня понадобилось, чтобы понять в чем корень зла
 
Я задачу вроде понятно обрисовал. По началу вообще не знал как у ней подступиться. А баг этот уже в процессе решения вылез.
 
В общем на свежую голову разобрался. Суть бага состоит в том, что индусы поленились добавлять в класс 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
Да, работает. Согласен, такой вариант реализации лучше моего, так как не привязан к executeMenuCommand() и соответственно будет работать и в ранних версиях Illustrator. Спасибо, _МВК_.
 
Внутри групп не найдет так compound paths
 
Да, предполагается, что compaundpath верхнего уровня. Но в принципе поправить недолго
 
Внутри групп не найдет так compound paths
Внутри групп не бывает compaund path, только path. Compaund path только один. Поэтому ничего править не надо. Если сомневаетесь, найдите и покажите пример того, о чем вы говорите.
 
Последнее редактирование:
Это группа из двух составных контуров. А в самом составном контуре могут быть только контуры, иногда сгруппированные. Вот я о чем.