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

Так стоп, всё понял.
Буду конкретно эту операцию проводить на CS6. Creold был первым, ему отправлю 2000. _MBK_ отправлю 1000. Всем спасибо, сейчас отпишусь в лички.
 
  • Спасибо
Реакции: ~RA~
Да мы как-то помогали вроде открыто не из-за денег. Тем более другие пользователи форума может тоже найдут в узких задачах полезным для себя скрипт.
 
  • Спасибо
Реакции: lakma
var topItem = currGroup.pageItems[0];
А еще не хватает случая, что внутри группы может быть вложено еще куча групп. И тогда верхний объект не путь с заливкой. Надо рекурсивно найти какой одиночный путь является верхним.

У _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;
  }
})();
 
  • Спасибо
Реакции: siv05 и lakma
А Live эффект это разве одно и то же с панелью?
У меня он вообще все объекты обесцвечивает, да и не обьединяет совсем.
 
  • Спасибо
Реакции: lakma
А Live эффект это разве одно и то же с панелью?
В большинстве случаев да, достаточно через эффект + экспанд получать результат слияния, вырезания. В отдельных специфичных кейсах бывает, когда стабильней через генерацию экшена Pathfinder правильней результат. Я навскидку не вспомню случаи, но они есть.

Скрипт с эффектом я протестировал уже на Маке, Виндовс и еще в версиях от CS6 до 2026. На тестовых группах проблем не возникло. Интересно в какой тестовой среде и на каком файле ты запускал. Может в личку файл

Еще у скриптов с методом applyEffect c XML кодом эффектом бывает, что экран между командами скрипта не успевает обновиться и пропускает шаги. Но здесь скрипт через executeMenuCommand обращается к типовым командам и не должно быть сбоя
 
Последнее редактирование:
  • Спасибо
Реакции: lakma
Скинул _MBK_ 2000 руб.
Creold отправил меня в благотворительный фонд "Дари еду". Сейчас разберусь, как им пожертвовать и тоже скину деньги.
Ребята, спасибо большое.
 
Интересно в какой тестовой среде и на каком файле ты запускал.
На CS6, это минимальная версия, которая есть у меня под рукой.
Рисую наугад три разноцветных прямоугольника, группирую. После применения Pathfinder-Unite с панели - результат правильный.
Через меню Effect-Pathfinder-Add - обьекты обесцвечиваются и, по сути, не обьединяются, надо плющить.
 
Этот код жёстко подвесил иллюстратор 2024
Кстати интересно почему. Попробуй из этого фрагмента кода
JavaScript:
executeMenuCommand("deselectall");
       redraw();
while (activeDocument.groupItems.length>0)
{
activeDocument.groupItems[0].selected=true;
MyUnity();         // <--------------------------------- Эту
redraw();
executeMenuCommand("deselectall");
       redraw();
}
оставить только указанную строку, затем выделить группу и вызвать скрипт
 
оставить только указанную строку
Нужно перед
executeMenuCommand('deselectall');
поставить
executeMenuCommand('ungroup');
результатом работы может быть группа, у тебя зацикливается
while (activeDocument.groupItems.length > 0)
 
наугад три разноцветных прямоугольника
Все тоже самое на CS6 + Win10 и не обесцвечивается, не обрывается выполнение. Даже по сути вот те переменные, в которые я сохраняю оформление, нафиг не нужны (чрезмерная перестраховка). Потому что через эффект + экспанд, как и обычный паффайндер, итак результат получает цвета верхнего объекта. Можно было бы тратить время и искать, почему на разных компьютерах такие простые команды дали разный результат или может мы как-то по-разному рисуем. Но как будто трата времени. Два варианта скрипта с экшеном и без итак есть
 
Последнее редактирование:
  • Спасибо
Реакции: lakma
Да, ребята. Всё работает. Результат предсказуемый, работает стабильно, приятно посмотреть.
 
результатом работы может быть группа, у тебя зацикливается
У меня не зацикливается, поскольку простые группы, результат опреации Unite один шейп, по условию задачи должно быть так.
Как у Жени не знаю
 
Гммм, точно, как то не подумал об этом
 
почему на разных компьютерах
Я думаю на разных версиях иллюстратора
Через такой костыль на 2024 работает нормально. Это скорее всего медленней, чем сохранять свойства верхнего объекта.
Код:
function main(){
    if (app.documents.length == 0) return;
    var doc = app.activeDocument;
    
    app.executeMenuCommand('deselectall');
    while (doc.groupItems.length > 0){
        doc.groupItems [doc.groupItems.length - 1].selected = true;
        app.executeMenuCommand("Live Pathfinder Divide");
        app.executeMenuCommand('expandStyle');
        app.executeMenuCommand("Live Pathfinder Add");
        app.executeMenuCommand('expandStyle');
        app.executeMenuCommand('ungroup');
        app.executeMenuCommand('deselectall');
    }
}

main();
 
Я думаю на разных версиях иллюстратора
Через такой костыль на 2024 работает нормально. Это скорее всего медленней, чем сохранять свойства верхнего объекта.
Код:
function main(){
    if (app.documents.length == 0) return;
    var doc = app.activeDocument;
   
    app.executeMenuCommand('deselectall');
    while (doc.groupItems.length > 0){
        doc.groupItems [doc.groupItems.length - 1].selected = true;
        app.executeMenuCommand("Live Pathfinder Divide");
        app.executeMenuCommand('expandStyle');
        app.executeMenuCommand("Live Pathfinder Add");
        app.executeMenuCommand('expandStyle');
        app.executeMenuCommand('ungroup');
        app.executeMenuCommand('deselectall');
    }
}

main();
Входит в бесконечный цикл.
Работает, если так:
JavaScript:
(function () {
  if (!app.documents.length || !app.selection.length) return;

  var doc = app.activeDocument;
  var docSel = doc.selection;
  var targetGroups = [];

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

  if (!targetGroups.length) return;

  var stylesArchive = [];

  for (var g = 0; g < targetGroups.length; g++) {
    var currGroup = targetGroups[g];
    var topItem = currGroup.pageItems[0];
    
    stylesArchive.push({
      groupRef: currGroup,
      fillColor: (topItem.hasOwnProperty('filled') && topItem.filled) ? topItem.fillColor : null,
      strokeColor: (topItem.hasOwnProperty('stroked') && topItem.stroked) ? topItem.strokeColor : null,
      strokeWidth: topItem.hasOwnProperty('strokeWidth') ? topItem.strokeWidth : 0,
      opacity: topItem.opacity,
      blendMode: topItem.blendingMode
    });
  }

  for (var s = 0; s < stylesArchive.length; s++) {
    var currentData = stylesArchive[s];
    
    doc.selection = null;
    currentData.groupRef.selected = true;

    app.redraw();

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

      if (doc.selection.length > 0) {
        for (var p = 0; p < doc.selection.length; p++) {
          var resultItem = doc.selection[p];
          
          if (currentData.fillColor) {
            resultItem.filled = true;
            resultItem.fillColor = currentData.fillColor;
          } else {
            resultItem.filled = false;
          }
          
          if (currentData.strokeColor) {
            resultItem.stroked = true;
            resultItem.strokeColor = currentData.strokeColor;
            resultItem.strokeWidth = currentData.strokeWidth;
          } else {
            resultItem.stroked = false;
          }
          
          resultItem.opacity = currentData.opacity;
          resultItem.blendingMode = currentData.blendMode;
        }
      }
    } catch (error) {}
  }

  doc.selection = null;
  for (var r = 0; r < stylesArchive.length; r++) {
    try {
      stylesArchive[r].groupRef.selected = true;
    } catch (e) {}
  }
 
  app.redraw();
})();
 
Я думаю на разных версиях иллюстратора
Через такой костыль на 2024 работает нормально. Это скорее всего медленней, чем сохранять свойства верхнего объекта.
Код:
function main(){
    if (app.documents.length == 0) return;
    var doc = app.activeDocument;
   
    app.executeMenuCommand('deselectall');
    while (doc.groupItems.length > 0){
        doc.groupItems [doc.groupItems.length - 1].selected = true;
        app.executeMenuCommand("Live Pathfinder Divide");
        app.executeMenuCommand('expandStyle');
        app.executeMenuCommand("Live Pathfinder Add");
        app.executeMenuCommand('expandStyle');
        app.executeMenuCommand('ungroup');
        app.executeMenuCommand('deselectall');
    }
}

main();
А зачем там Live Pathfinder Divide?