А еще не хватает случая, что внутри группы может быть вложено еще куча групп. И тогда верхний объект не путь с заливкой. Надо рекурсивно найти какой одиночный путь является верхним.var topItem = currGroup.pageItems[0];
(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;
}
})();
В большинстве случаев да, достаточно через эффект + экспанд получать результат слияния, вырезания. В отдельных специфичных кейсах бывает, когда стабильней через генерацию экшена Pathfinder правильней результат. Я навскидку не вспомню случаи, но они есть.А Live эффект это разве одно и то же с панелью?
На CS6, это минимальная версия, которая есть у меня под рукой.Интересно в какой тестовой среде и на каком файле ты запускал.
Кстати интересно почему. Попробуй из этого фрагмента кодаЭтот код жёстко подвесил иллюстратор 2024
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 под Win есть чем запускатьдля вызова по клавишам

Все тоже самое на CS6 + Win10 и не обесцвечивается, не обрывается выполнение. Даже по сути вот те переменные, в которые я сохраняю оформление, нафиг не нужны (чрезмерная перестраховка). Потому что через эффект + экспанд, как и обычный паффайндер, итак результат получает цвета верхнего объекта. Можно было бы тратить время и искать, почему на разных компьютерах такие простые команды дали разный результат или может мы как-то по-разному рисуем. Но как будто трата времени. Два варианта скрипта с экшеном и без итак естьнаугад три разноцветных прямоугольника
У меня не зацикливается, поскольку простые группы, результат опреации Unite один шейп, по условию задачи должно быть так.результатом работы может быть группа, у тебя зацикливается
Когда в группу попадают непересекающиеся объекты, результатом Юнайт будет группа, от неё и нужно избавится.поскольку простые группы
Я думаю на разных версиях иллюстраторапочему на разных компьютерах
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();
(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 работает нормально
Покажи свой тестовый файлик.
А зачем там Live Pathfinder Divide?Я думаю на разных версиях иллюстратора
Через такой костыль на 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();