- Сообщения
- 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);
}