[AI CC-CC2021] Split Path

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Топикстартер
Сообщения
2 089
Реакции
145
вот нашла....можно вместо Pathfinder юзать....)))
Код:
//@target illustrator
$.localize = true; // Enabling automatic localization

// Global variables
var SCRIPT_NAME = 'SplitPath',
    SCRIPT_VERSION = 'v.1.1';
    AI_VER = parseInt(app.version);

// EN-RU localized messages
var LANG_ERR_DOC = { en: 'Error\nOpen a document and try again.',
                     ru: 'Ошибка\nОткройте документ и запустите скрипт.'},
    LANG_ERR_SELECT = { en: 'Error\nPlease, select two or more objects.',
                        ru: 'Ошибка\nВыделите 2 или более объекта.'},
    LANG_ERR_VER = { en: 'Error\nSorry, script only works in Illustrator CS6 and above.',
                     ru: 'Ошибка\nСкрипт работает в Illustrator CS6 и выше.'},
    LANG_ERR_FILL = { en: 'Error\nPlease, fill the mask object in any color.',
                      ru: 'Ошибка\nДобавьте объекту для вырезания любую заливку цветом.'},
    LANG_ERR_INTERSECT_O = { en: 'Error\nTo use Intersect add in selection atleast one opened path.',
                             ru: 'Ошибка\nДля использования метода Пересечение добавьте хотя бы 1 незамкнутую линию.'},
    LANG_ERR_INTERSECT_C = { en: 'Error\nTo use Intersect add in selection atleast one closed path.',
                             ru: 'Ошибка\nДля использования метода Пересечение добавьте хотя бы 1 замкнутую линию.'},
    LANG_MINUS = { en: 'Minus Front', ru: 'Минус верхний'},
    LANG_INTERSECT = { en: 'Intersect', ru: 'Пересечение'},
    LANG_OK = { en: 'Ok', ru: 'Готово'},
    LANG_CANCEL = { en: 'Cancel', ru: 'Отмена'};

var isFilled = isOpened = isClosed = false;

function main() {
  if (app.documents.length == 0) {
    alert(LANG_ERR_DOC);
    return;
  }

  if (selection.length == 0) {
    alert(LANG_ERR_SELECT);
    return;
  }

  if (AI_VER < 16) {
    alert(LANG_ERR_VER);
    return;
  }

  checkFill(selection);

  // Create Main Window
  var dialog = new Window('dialog', SCRIPT_NAME + ' ' + SCRIPT_VERSION, undefined);
  dialog.orientation = 'column';
  dialog.alignChild = ['fill', 'center'];

  // Split method
  var method = dialog.add('group');
  method.orientation = 'row';
  method.alignChild = 'fill';
  method.margins = [0, 10, 0, 10];
  var minusRadio = method.add('radiobutton', undefined, LANG_MINUS);
  var intersectRadio = method.add('radiobutton', undefined, LANG_INTERSECT);
  minusRadio.value = true;

  // Buttons
  var btns = dialog.add('group');
  btns.alignChild = 'fill';
  btns.orientation = 'row';
  var cancel = btns.add('button', undefined, LANG_CANCEL, {name: 'cancel'});
  var ok = btns.add('button', undefined, LANG_OK, {name: 'ok'});
  ok.active = true;

  var copyright = dialog.add('statictext', undefined, '\u00A9 Sergey Osokin, sergosokin.ru');
  copyright.justify = 'center';
  copyright.enabled = false;

  ok.onClick = okClick;

  function okClick() {
    if (!isFilled) {
      alert(LANG_ERR_FILL);
      return;
    }

    if (intersectRadio.value && !isOpened) {
      alert(LANG_ERR_INTERSECT_O);
      return;
    }

    if (intersectRadio.value && !isClosed) {
      alert(LANG_ERR_INTERSECT_C);
      return;
    }

    try {
      if (minusRadio.value) { minusFront(); }
      else { intersect(); }
    } catch (e) {
      // showError(e);
    }

    dialog.close();
  }

  cancel.onClick = function () {
    dialog.close();
  }

  dialog.center();
  dialog.show();
}

// Minus Front method
function minusFront() {
  releaseGroups(selection);
  cutPaths();
}

// Intersect method
function intersect() {
  var saveSel = [],
      saveFill = [];

  releaseGroups(selection);
  saveState(saveSel, saveFill);
  addTopRectangle();

  selection = null;
  restore(saveFill);

  rectIntersect = activeDocument.pageItems.getByName(SCRIPT_NAME);
  rectIntersect.selected = true;

  // Create a intersect mask
  app.executeMenuCommand('group');
  app.executeMenuCommand('Live Pathfinder Minus Back');
  app.executeMenuCommand('expandStyle');
  app.executeMenuCommand('ungroup');

  // Place the intersect mask over the lines
  app.executeMenuCommand('group');
  selection[0].move(saveSel[0], ElementPlacement.PLACEBEFORE);
  app.executeMenuCommand('ungroup');

  restore(saveSel);
  cutPaths();
}

// Searching unfilled objects
function checkFill(arr) {
  for (var i = 0; i < arr.length; i++) {
    var currItem = arr[i];
    try {
      switch (currItem.typename) {
        case 'GroupItem':
          checkFill(currItem.pageItems);
          break;
        case 'PathItem':
          if (currItem.filled) { isFilled = true; }
          if (currItem.closed) { isClosed = true; }
          if (!currItem.closed) { isOpened = true; }
          break;
        case 'CompoundPathItem':
          if (currItem.pathItems[0].filled && currItem.pathItems[0].closed) { isFilled = true; }
          if (currItem.pathItems[0].closed) { isClosed = true; }
          if (!currItem.pathItems[0].closed) { isOpened = true; }
          break;
        default:
          break;
      }
    } catch (e) { }
  }

  return [isFilled, isClosed, isOpened];
}

function getChildAll(arr) {
  var childsArr = [];
  if (Object.prototype.toString.call(arr) === '[object Array]') {
    childsArr.push.apply(childsArr, arr);
  } else {
    for (var i = 0; i < arr.pageItems.length; i++) {
      childsArr.push(arr.pageItems[i]);
    }
  }
  if (arr.layers) {
    for (var l = 0; l < arr.layers.length; l++) {
      childsArr.push(arr.layers[l]);
    }
  }
  return childsArr;
}

// Ungroup array
function releaseGroups(arr) {
  var childArr = getChildAll(arr);

  if (childArr.length < 1) {
    arr.remove();
    return;
  }

  for (var i = 0; i < childArr.length; i++) {
    var currItem = childArr[i];
    try {
      if (currItem.parent.typename !== 'Layer') {
        currItem.move(arr, ElementPlacement.PLACEBEFORE);
      }
      if (currItem.typename === 'GroupItem' || currItem.typename === 'Layer') {
        releaseGroups(currItem);
      }
    } catch (e) { }
  }
  app.redraw();
}

function saveState(sel, fills) {
  for (var i = 0; i < selection.length; i++) {
    var currItem = selection[i];
    try {
      switch (currItem.typename) {
        case 'PathItem':
          if (currItem.filled && currItem.closed) { fills.push(currItem); }
          if (!currItem.closed) { sel.push(currItem); }
          break;
        case 'CompoundPathItem':
          var zeroItem = currItem.pathItems[0];
          if (zeroItem.filled && zeroItem.closed) { fills.push(currItem); }
          if (!zeroItem.closed) { sel.push(currItem); }
          break;
        default:
          break;
      }
    } catch (e) { }
  }

  return [sel, fills];
}

function cutPaths() {
  app.executeMenuCommand('Make Planet X');
  app.executeMenuCommand('Expand Planet X');
  selection[0].groupItems[selection[0].groupItems.length - 1].remove();
  app.executeMenuCommand('ungroup');
}

function addTopRectangle() {
  if (selection instanceof Array) {
    // Used code from FitArtboardToArt.jsx by Darryl Zurn
    var initBounds = selection[0].visibleBounds;
    for (var i = 1; i < selection.length; i++) {
      var groupBounds = selection[i].visibleBounds;
      if (groupBounds[0] < initBounds[0]) {
        initBounds[0] = groupBounds[0];
      }
      if (groupBounds[1] > initBounds[1]) {
        initBounds[1] = groupBounds[1];
      }
      if (groupBounds[2] > initBounds[2]) {
        initBounds[2] = groupBounds[2];
      }
      if (groupBounds[3] < initBounds[3]) {
        initBounds[3] = groupBounds[3];
      }
    }
  }

  var top = initBounds[1] + 1,
      left = initBounds[0] - 1,
      width = initBounds[2] - initBounds[0] + 2,
      height = initBounds[1] - initBounds[3] + 2;

  var rect = activeDocument.activeLayer.pathItems.rectangle(top, left, width, height);
  rect.name = SCRIPT_NAME;
  rect.filled = true;
  rect.strokeColor = new NoColor();
}

function restore(arr) {
  for (var i = 0; i < arr.length; i++) {
    arr[i].selected = true;
  }
}

function showError(e) {
  if (confirm(scriptName + ': an unknown error has occurred.\n' +
    'Would you like to see more information?', true, 'Unknown Error')) {
    alert(e + ': on line ' + e.line, 'Script Error', true);
  }
}

try {
  main();
} catch (e) {
  // showError(e);
}
 

Вложения

  • Untitled.jpg
    Untitled.jpg
    66.4 КБ · Просм.: 98
  • Untitled.jpg
    Untitled.jpg
    138.2 КБ · Просм.: 92

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Топикстартер
Сообщения
2 089
Реакции
145
и резать тоже умеет...)))
 

Вложения

  • Untitled.jpg
    Untitled.jpg
    130.5 КБ · Просм.: 77

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Топикстартер
Сообщения
2 089
Реакции
145
вот...
 

Вложения

  • Untitled.jpg
    Untitled.jpg
    55.8 КБ · Просм.: 74

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Что "вот"?
И почему "вместо"?
Этот скрипт просто на кнопочки pathfinder нажимает
 

КоньЕстДетей

10 лет на форуме
Сообщения
1 804
Реакции
927
вот нашла....можно вместо Pathfinder юзать....)
Код:
//@target illustrator
$.localize = true; // Enabling automatic localization

// Global variables
var SCRIPT_NAME = 'SplitPath',
    SCRIPT_VERSION = 'v.1.1';
    AI_VER = parseInt(app.version);

// EN-RU localized messages
var LANG_ERR_DOC = { en: 'Error\nOpen a document and try again.',
                     ru: 'Ошибка\nОткройте документ и запустите скрипт.'},
    LANG_ERR_SELECT = { en: 'Error\nPlease, select two or more objects.',
                        ru: 'Ошибка\nВыделите 2 или более объекта.'},
    LANG_ERR_VER = { en: 'Error\nSorry, script only works in Illustrator CS6 and above.',
                     ru: 'Ошибка\nСкрипт работает в Illustrator CS6 и выше.'},
    LANG_ERR_FILL = { en: 'Error\nPlease, fill the mask object in any color.',
                      ru: 'Ошибка\nДобавьте объекту для вырезания любую заливку цветом.'},
    LANG_ERR_INTERSECT_O = { en: 'Error\nTo use Intersect add in selection atleast one opened path.',
                             ru: 'Ошибка\nДля использования метода Пересечение добавьте хотя бы 1 незамкнутую линию.'},
    LANG_ERR_INTERSECT_C = { en: 'Error\nTo use Intersect add in selection atleast one closed path.',
                             ru: 'Ошибка\nДля использования метода Пересечение добавьте хотя бы 1 замкнутую линию.'},
    LANG_MINUS = { en: 'Minus Front', ru: 'Минус верхний'},
    LANG_INTERSECT = { en: 'Intersect', ru: 'Пересечение'},
    LANG_OK = { en: 'Ok', ru: 'Готово'},
    LANG_CANCEL = { en: 'Cancel', ru: 'Отмена'};

var isFilled = isOpened = isClosed = false;

function main() {
  if (app.documents.length == 0) {
    alert(LANG_ERR_DOC);
    return;
  }

  if (selection.length == 0) {
    alert(LANG_ERR_SELECT);
    return;
  }

  if (AI_VER < 16) {
    alert(LANG_ERR_VER);
    return;
  }

  checkFill(selection);

  // Create Main Window
  var dialog = new Window('dialog', SCRIPT_NAME + ' ' + SCRIPT_VERSION, undefined);
  dialog.orientation = 'column';
  dialog.alignChild = ['fill', 'center'];

  // Split method
  var method = dialog.add('group');
  method.orientation = 'row';
  method.alignChild = 'fill';
  method.margins = [0, 10, 0, 10];
  var minusRadio = method.add('radiobutton', undefined, LANG_MINUS);
  var intersectRadio = method.add('radiobutton', undefined, LANG_INTERSECT);
  minusRadio.value = true;

  // Buttons
  var btns = dialog.add('group');
  btns.alignChild = 'fill';
  btns.orientation = 'row';
  var cancel = btns.add('button', undefined, LANG_CANCEL, {name: 'cancel'});
  var ok = btns.add('button', undefined, LANG_OK, {name: 'ok'});
  ok.active = true;

  var copyright = dialog.add('statictext', undefined, '\u00A9 Sergey Osokin, sergosokin.ru');
  copyright.justify = 'center';
  copyright.enabled = false;

  ok.onClick = okClick;

  function okClick() {
    if (!isFilled) {
      alert(LANG_ERR_FILL);
      return;
    }

    if (intersectRadio.value && !isOpened) {
      alert(LANG_ERR_INTERSECT_O);
      return;
    }

    if (intersectRadio.value && !isClosed) {
      alert(LANG_ERR_INTERSECT_C);
      return;
    }

    try {
      if (minusRadio.value) { minusFront(); }
      else { intersect(); }
    } catch (e) {
      // showError(e);
    }

    dialog.close();
  }

  cancel.onClick = function () {
    dialog.close();
  }

  dialog.center();
  dialog.show();
}

// Minus Front method
function minusFront() {
  releaseGroups(selection);
  cutPaths();
}

// Intersect method
function intersect() {
  var saveSel = [],
      saveFill = [];

  releaseGroups(selection);
  saveState(saveSel, saveFill);
  addTopRectangle();

  selection = null;
  restore(saveFill);

  rectIntersect = activeDocument.pageItems.getByName(SCRIPT_NAME);
  rectIntersect.selected = true;

  // Create a intersect mask
  app.executeMenuCommand('group');
  app.executeMenuCommand('Live Pathfinder Minus Back');
  app.executeMenuCommand('expandStyle');
  app.executeMenuCommand('ungroup');

  // Place the intersect mask over the lines
  app.executeMenuCommand('group');
  selection[0].move(saveSel[0], ElementPlacement.PLACEBEFORE);
  app.executeMenuCommand('ungroup');

  restore(saveSel);
  cutPaths();
}

// Searching unfilled objects
function checkFill(arr) {
  for (var i = 0; i < arr.length; i++) {
    var currItem = arr[i];
    try {
      switch (currItem.typename) {
        case 'GroupItem':
          checkFill(currItem.pageItems);
          break;
        case 'PathItem':
          if (currItem.filled) { isFilled = true; }
          if (currItem.closed) { isClosed = true; }
          if (!currItem.closed) { isOpened = true; }
          break;
        case 'CompoundPathItem':
          if (currItem.pathItems[0].filled && currItem.pathItems[0].closed) { isFilled = true; }
          if (currItem.pathItems[0].closed) { isClosed = true; }
          if (!currItem.pathItems[0].closed) { isOpened = true; }
          break;
        default:
          break;
      }
    } catch (e) { }
  }

  return [isFilled, isClosed, isOpened];
}

function getChildAll(arr) {
  var childsArr = [];
  if (Object.prototype.toString.call(arr) === '[object Array]') {
    childsArr.push.apply(childsArr, arr);
  } else {
    for (var i = 0; i < arr.pageItems.length; i++) {
      childsArr.push(arr.pageItems[i]);
    }
  }
  if (arr.layers) {
    for (var l = 0; l < arr.layers.length; l++) {
      childsArr.push(arr.layers[l]);
    }
  }
  return childsArr;
}

// Ungroup array
function releaseGroups(arr) {
  var childArr = getChildAll(arr);

  if (childArr.length < 1) {
    arr.remove();
    return;
  }

  for (var i = 0; i < childArr.length; i++) {
    var currItem = childArr[i];
    try {
      if (currItem.parent.typename !== 'Layer') {
        currItem.move(arr, ElementPlacement.PLACEBEFORE);
      }
      if (currItem.typename === 'GroupItem' || currItem.typename === 'Layer') {
        releaseGroups(currItem);
      }
    } catch (e) { }
  }
  app.redraw();
}

function saveState(sel, fills) {
  for (var i = 0; i < selection.length; i++) {
    var currItem = selection[i];
    try {
      switch (currItem.typename) {
        case 'PathItem':
          if (currItem.filled && currItem.closed) { fills.push(currItem); }
          if (!currItem.closed) { sel.push(currItem); }
          break;
        case 'CompoundPathItem':
          var zeroItem = currItem.pathItems[0];
          if (zeroItem.filled && zeroItem.closed) { fills.push(currItem); }
          if (!zeroItem.closed) { sel.push(currItem); }
          break;
        default:
          break;
      }
    } catch (e) { }
  }

  return [sel, fills];
}

function cutPaths() {
  app.executeMenuCommand('Make Planet X');
  app.executeMenuCommand('Expand Planet X');
  selection[0].groupItems[selection[0].groupItems.length - 1].remove();
  app.executeMenuCommand('ungroup');
}

function addTopRectangle() {
  if (selection instanceof Array) {
    // Used code from FitArtboardToArt.jsx by Darryl Zurn
    var initBounds = selection[0].visibleBounds;
    for (var i = 1; i < selection.length; i++) {
      var groupBounds = selection[i].visibleBounds;
      if (groupBounds[0] < initBounds[0]) {
        initBounds[0] = groupBounds[0];
      }
      if (groupBounds[1] > initBounds[1]) {
        initBounds[1] = groupBounds[1];
      }
      if (groupBounds[2] > initBounds[2]) {
        initBounds[2] = groupBounds[2];
      }
      if (groupBounds[3] < initBounds[3]) {
        initBounds[3] = groupBounds[3];
      }
    }
  }

  var top = initBounds[1] + 1,
      left = initBounds[0] - 1,
      width = initBounds[2] - initBounds[0] + 2,
      height = initBounds[1] - initBounds[3] + 2;

  var rect = activeDocument.activeLayer.pathItems.rectangle(top, left, width, height);
  rect.name = SCRIPT_NAME;
  rect.filled = true;
  rect.strokeColor = new NoColor();
}

function restore(arr) {
  for (var i = 0; i < arr.length; i++) {
    arr[i].selected = true;
  }
}

function showError(e) {
  if (confirm(scriptName + ': an unknown error has occurred.\n' +
    'Would you like to see more information?', true, 'Unknown Error')) {
    alert(e + ': on line ' + e.line, 'Script Error', true);
  }
}

try {
  main();
} catch (e) {
  // showError(e);
}
Чет не понял чем это принципиально от Divide отличается?
1626922320686.png
 

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Топикстартер
Сообщения
2 089
Реакции
145

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Топикстартер
Сообщения
2 089
Реакции
145
Последнее редактирование:

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Топикстартер
Сообщения
2 089
Реакции
145
app.executeMenuCommand('group');
app.executeMenuCommand('Live Pathfinder Minus Back');
app.executeMenuCommand('expandStyle');
app.executeMenuCommand('ungroup');
так это команды а не кнопочки....))) а вообще скрипт не мой,что нашла то и выложила )
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
так это команды а не кнопочки....) а вообще скрипт не мой,что нашла то и выложила )
Это команды нажатия на пункты меню. А я тебе говорил про доступ к кнопочкам соответствующей панельки - чувствуешь разницу?
 
  • Спасибо
Реакции: NatalieRedFox_333

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Топикстартер
Сообщения
2 089
Реакции
145
Это команды нажатия на пункты меню. А я тебе говорил про доступ к кнопочкам соответствующей панельки - чувствуешь разницу?
конечно чувствую.... :D ты ж сказал на
Этот скрипт просто на кнопочки pathfinder нажимает
 

NatalieRedFox_333

Чего мне бояться? - подумала Красная Шапочка...)))
Топикстартер
Сообщения
2 089
Реакции
145
ладно...не нравится не юзайте, мне пригодится на всякий случай ))):)