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

lakma

Топикстартер
10 лет на форуме
Сообщения
35
Реакции
3
Может кто подскажет ещё с одним инструментом. Нужен скрипт, который сводит каждую группу объектов в сцене в один объект (свести каждую группу в один compound path с сохранением цвета, прозрачности и режима наложения верхнего объекта внутри группы, как в штатном инструменте Adobe Illustrator).
 

Вложения

  • 2026 июн 02 05 06 01.jpg
    2026 июн 02 05 06 01.jpg
    31.4 КБ · Просм.: 46
На скрине разве компаунды?
 
  • Спасибо
Реакции: lakma
А похоже справа на результат работы Pathfinder > Unite. Слияние объектов, не как у Compound Path. А слева похоже на группы с обтравочными масками Clipping Group, а это уже совсем не то, что обычная группа объектов
 
  • Спасибо
Реакции: lakma
А похоже справа на результат работы Pathfinder > Unite. Слияние объектов, не как у Compound Path. А слева похоже на группы с обтравочными масками Clipping Group, а это уже совсем не то, что обычная группа объектов
Упс. Да, Pathfinder имелся ввиду.
И нужен Pathfinder, объединить.
 
Последнее редактирование:
А слева точно группы? Или группы с обтравочными масками? Или возможны обе ситуации, что и группы, и обтравочные группы должны скриптом обрабатываться. Потому что для обтравочных групп достаточно вытащить шейп самой маски и перекрасить в цвет, прозрачность верхнего объекта, без всяких Pathfinder
 
Или группы с обтравочными масками?
А где там обтравочные маски?
По моему, достаточно смоделировать экшн, выделяющий группы и выполняющий Unity, свойства и так унаследуются от верхнего обьекта.
 
А где там обтравочные маски?
Группа 2 и 3 в правом углу элементы похожи на прямоугольники с обводкой наружу и включенным оверпринтом. А раз часть прямоугольника с обводкой не видна, как обрезана, я предполагаю, что это группы с масками
 
  • Спасибо
Реакции: lakma
Извиняюсь, что ввёл в заблуждение. Перепутал pathfinder с compound path. Есть множество групп объектов, без обтравочных масок и обводок. Каждую группу нужно объединить в один объект pathfinder.
 
Заплачу 2000 руб переводом по СБП или на карту за скрипт. Отпишусь в теме, кто взялся за решение проблемы.
 
Да там слияние не особо сложное. Только у скриптов нет доступа к панели Pathfinder и делается это через эффект Pathfinder > Add и потом Expand Style. Ну и временно берем из группы оформление верхнего объекта, чтобы потом накинуть на результат
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 topItem = currGroup.pageItems[0];
    var fill = topItem.fillColor;
    var opacity = topItem.opacity;
    var blendMode = topItem.blendingMode;

    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];
        resultItem.fillColor = fill;
        resultItem.opacity = opacity;
        resultItem.blendingMode = blendMode;
        results.push(resultItem);
      }
    } catch (e) {}
  }

  app.selection = results;
})();
 

Вложения

  • 2026-06-02 10.43.30.gif
    2026-06-02 10.43.30.gif
    154.4 КБ · Просм.: 19
  • Спасибо
Реакции: lakma
Да там слияние не особо сложное. Только у скриптов нет доступа к панели Pathfinder и делается это через эффект Pathfinder > Add и потом Expand Style. Ну и временно берем из группы оформление верхнего объекта, чтобы потом накинуть на результат
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 topItem = currGroup.pageItems[0];
    var fill = topItem.fillColor;
    var opacity = topItem.opacity;
    var blendMode = topItem.blendingMode;

    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];
        resultItem.fillColor = fill;
        resultItem.opacity = opacity;
        resultItem.blendingMode = blendMode;
        results.push(resultItem);
      }
    } catch (e) {}
  }

  app.selection = results;
})();
На гифке не похоже, что в центральной группе соблюдено условие
с сохранением цвета, прозрачности и режима наложения верхнего объекта
 
временно берем из группы оформление верхнего объекта
Ага, странное поведение Pathfinder в скрипте, если верхний объект без обводки, то результат получает стиль верхнего объекта, если с обводкой – теряется заливка.
 
Да там слияние не особо сложное. Только у скриптов нет доступа к панели Pathfinder и делается это через эффект Pathfinder > Add и потом Expand Style. Ну и временно берем из группы оформление верхнего объекта, чтобы потом накинуть на результат
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 topItem = currGroup.pageItems[0];
    var fill = topItem.fillColor;
    var opacity = topItem.opacity;
    var blendMode = topItem.blendingMode;

    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];
        resultItem.fillColor = fill;
        resultItem.opacity = opacity;
        resultItem.blendingMode = blendMode;
        results.push(resultItem);
      }
    } catch (e) {}
  }

  app.selection = results;
})();
Вылетает в ошибку. У меня старый Иллюстратор. CS5
 

Вложения

  • 2026 июн 02 11 07 59.jpg
    2026 июн 02 11 07 59.jpg
    13.3 КБ · Просм.: 9
Последнее редактирование:
JavaScript:
#target illustrator

var mm=2.834645669;

var startpath= File($.fileName).parent;


var haserror=false;
var errfolder="";



function toSystemPath(path)
{
    if ((path instanceof File) || (path instanceof Folder)) fl=path;
    else
     fl=new File(path);
    return fl.fsName;//path.toString().slice(1,2)+":"+path.toString().slice(2);
}


function MyUnity(){
    
    
      String.prototype.hexEncode = function(){
      //http://stackoverflow.com/questions/21647928/javascript-unicode-string-to-hex
        var hex = '';
        for(var i=0;i<this.length;i++) {
            hex += ''+this.charCodeAt(i).toString(16);
        }
        return hex;
      };
    
    
      function writeFile(fileDestStr, contents){
      var newFile = File(fileDestStr);
      newFile.open('w');
      newFile.write(contents);
      newFile.close();
      };
    
    
      var actionStr = [
"/version 3",
"/name [ 5",
"    5365742032",
"]",
"/isOpen 1",
"/actionCount 1",
"/action-1 {",
"    /name [ 8",
"        416374696f6e2031",
"    ]",
"    /keyIndex 0",
"    /colorIndex 0",
"    /isOpen 1",
"    /eventCount 1",
"    /event-1 {",
"        /useRulersIn1stQuadrant 0",
"        /internalName (ai_plugin_pathfinder)",
"        /localizedName [ 10",
"            5061746866696e646572",
"        ]",
"        /isOpen 0",
"        /isOn 1",
"        /hasDialog 0",
"        /parameterCount 1",
"        /parameter-1 {",
"            /key 1851878757",
"            /showInPalette -1",
"            /type (enumerated)",
"            /name [ 3",
"                416464",
"            ]",
"            /value 0",
"        }",
"    }",
"}"


      ].join("\n");
    
      
 //     actionStr=actionStr.replace("            /value 8.5039367676","            /value "+Gap);
    
    
      var actionFileDestStr = Folder.desktop + "/MyAction.aia";
      writeFile(actionFileDestStr, actionStr);
      var actionFile = File(actionFileDestStr);
      app.loadAction(actionFile);
      app.doScript("Action 1", "Set 2");
    
      //clean up
      actionFile.remove();
      app.unloadAction("Set 2", '');
    
    }
executeMenuCommand("deselectall");
       redraw();
while (activeDocument.groupItems.length>0)
{
activeDocument.groupItems[0].selected=true;
MyUnity();
redraw();
executeMenuCommand("deselectall");
       redraw();
}
 
  • Спасибо
Реакции: lakma
Угу. Топикстартер под конец такое критическое уточнение выдал =) С версиями ниже CS6 было все грустно в скриптинге. Я в недрах интернета находил даже Adobe CS и некоторые простые скрипты запускал из любопытства
 
  • Спасибо
Реакции: lakma
JavaScript:
#target illustrator

var mm=2.834645669;

var startpath= File($.fileName).parent;


var haserror=false;
var errfolder="";



function toSystemPath(path)
{
    if ((path instanceof File) || (path instanceof Folder)) fl=path;
    else
     fl=new File(path);
    return fl.fsName;//path.toString().slice(1,2)+":"+path.toString().slice(2);
}


function MyUnity(){
   
   
      String.prototype.hexEncode = function(){
      //http://stackoverflow.com/questions/21647928/javascript-unicode-string-to-hex
        var hex = '';
        for(var i=0;i<this.length;i++) {
            hex += ''+this.charCodeAt(i).toString(16);
        }
        return hex;
      };
   
   
      function writeFile(fileDestStr, contents){
      var newFile = File(fileDestStr);
      newFile.open('w');
      newFile.write(contents);
      newFile.close();
      };
   
   
      var actionStr = [
"/version 3",
"/name [ 5",
"    5365742032",
"]",
"/isOpen 1",
"/actionCount 1",
"/action-1 {",
"    /name [ 8",
"        416374696f6e2031",
"    ]",
"    /keyIndex 0",
"    /colorIndex 0",
"    /isOpen 1",
"    /eventCount 1",
"    /event-1 {",
"        /useRulersIn1stQuadrant 0",
"        /internalName (ai_plugin_pathfinder)",
"        /localizedName [ 10",
"            5061746866696e646572",
"        ]",
"        /isOpen 0",
"        /isOn 1",
"        /hasDialog 0",
"        /parameterCount 1",
"        /parameter-1 {",
"            /key 1851878757",
"            /showInPalette -1",
"            /type (enumerated)",
"            /name [ 3",
"                416464",
"            ]",
"            /value 0",
"        }",
"    }",
"}"


      ].join("\n");
   
     
 //     actionStr=actionStr.replace("            /value 8.5039367676","            /value "+Gap);
   
   
      var actionFileDestStr = Folder.desktop + "/MyAction.aia";
      writeFile(actionFileDestStr, actionStr);
      var actionFile = File(actionFileDestStr);
      app.loadAction(actionFile);
      app.doScript("Action 1", "Set 2");
   
      //clean up
      actionFile.remove();
      app.unloadAction("Set 2", '');
   
    }
executeMenuCommand("deselectall");
       redraw();
while (activeDocument.groupItems.length>0)
{
activeDocument.groupItems[0].selected=true;
MyUnity();
redraw();
executeMenuCommand("deselectall");
       redraw();
}
Этот код жёстко подвесил иллюстратор 2024