[AI CS4-CS6] Скрипт сводит каждую группу в документе в один объект.

А зачем там Live Pathfinder Divide?
Divide не ломает цвет объектов в группе, и если добавить после него Add, к результату применяется верхний в аппиренсах цвет заливки верхнего объекта группы, но Divide убивает обводку...
Recording 2026-06-02 143750.gif
 
  • Спасибо
Реакции: lakma
А еще не хватает случая, что внутри группы может быть вложено еще куча групп. И тогда верхний объект не путь с заливкой. Надо рекурсивно найти какой одиночный путь является верхним.

У _MBK_ скрипт сделан через генерацию временного экшена, который вызывает системную команду из панели Pathfinder. Это тоже хорошее решение. Только скрипты, внутри которых вызываются экшены, категорически нельзя внутрь других экшенов добавлять для вызова по клавишам F1..F12, иначе повесит Адоб, так как нет асинхронности выполнения. И я больше люблю скриптами обрабатывать выбранные пользователем объекты, а не весь документ. Потому что пользователь сам контролирует объем обрабатываемых данных. А то случайно запустил скрипт на документе с тысячами объектов и прикурил в ожидании

JavaScript:
(function () {
  if (!app.documents.length || !app.selection.length) {
    return;
  }

  var docSel = app.selection;
  var groups = [];
  var results = [];

  for (var i = 0; i < docSel.length; i++) {
    if (docSel[i].typename === "GroupItem" && docSel[i].pageItems.length) {
      groups.push(docSel[i]);
    }
  }

  if (!groups.length) return;

  for (var g = 0; g < groups.length; g++) {
    var currGroup = groups[g];

    app.executeMenuCommand('deselectall');
    currGroup.selected = true;

    var topPath = findTopPath(currGroup);
    var fillColor = null;
    var opacity = 100;
    var blendMode = BlendModes.NORMAL;
    var strokeColor = null;
    var strokeWeight = 0;

    if (topPath) {
      fillColor = topPath.fillColor;
      opacity = topPath.opacity;
      blendMode = topPath.blendingMode;
      strokeColor = topPath.strokeColor;
      strokeWeight = topPath.strokeWeight;
    } else {
      continue;
    }

    try {
      app.executeMenuCommand('group');
      app.executeMenuCommand('Live Pathfinder Add');
      app.executeMenuCommand('expandStyle');
      app.executeMenuCommand('ungroup');

      if (app.selection.length > 0) {
        var resultItem = app.selection[0];
        if (fillColor) resultItem.fillColor = fillColor;
        resultItem.opacity = opacity;
        resultItem.blendingMode = blendMode;
        if (strokeColor) resultItem.strokeColor = strokeColor;
        if (strokeWeight > 0) resultItem.strokeWeight = strokeWeight;
        results.push(resultItem);
      }
    } catch (e) {}
  }

  app.selection = results;

  function findTopPath(group) {
    for (var i = 0; i < group.pageItems.length; i++) {
      var item = group.pageItems[i];
      var type = item.typename;
      if (type === "PathItem") {
        return item;
      }
      if (type === "CompoundPathItem" && item.pathItems.length) {
        return item.pathItems[0];
      }
      if (type === "GroupItem") {
        var found = findTopPath(item);
        if (found) return found;
      }
    }
    return null;
  }
})();
А как можно модернизировать этот скрипт таким образом, чтобы он склеивал в один объект не группы, а все выделенные объекты, при этом если встречаются в некоторых объектах обводки, то их тоже переводил в объекты не меняя видимого объема? Ну и прозрачности, как в этом скрипте тоже сводил на нет. Попробовал его закинуть в DeepSeek, но у него не получилось реализовать функцию перевода обводок в кривые ни коим образом.
 
Ну да вот эта функция ( app.executeMenuCommand('outline') , но в последней версии Илюстратора она не работает
 
Ок, через экшн работает?
Да. Через экшн работает. А в скрипте нет. Причем бились и DeepSeek и Qwen над этой функцией, но тщетно. Видимо, для версии 30.5.1 Иллюстратора пока нет решения вызова этой функции через скрипт. Могу ошибаться.
 
  • Спасибо
Реакции: siv05
но в последней версии Илюстратора она не работает
В 2024 это работает
Код:
function main(){
    if (app.documents.length == 0) return;
    
    app.executeMenuCommand('selectall');
    app.executeMenuCommand("Live Outline Stroke");
    app.executeMenuCommand('expandStyle');

}
main();
 
  • Спасибо
Реакции: siv05
В 2024 это работает
Код:
function main(){
    if (app.documents.length == 0) return;
   
    app.executeMenuCommand('selectall');
    app.executeMenuCommand("Live Outline Stroke");
    app.executeMenuCommand('expandStyle');

}
main();
Еще такое
app.executeMenuCommand("OffsetPath v22");
Проверил оба варианта. В итоге оба рабочие. Спасибо большое за советы и живое участие. Скрипт облегчил мне работу. До этого пользовался экшеном.
 
  • Спасибо
Реакции: Chiga