/*
Author: Alexander Ladygin (i@ladygin.pro)
Program version: Adobe Illustrator CS5+
Name: griddder.jsx;
Copyright (c) 2018
www.ladyginpro.ru
*/
$.errorMessage = function (err) {alert(err + '\n' + err.line);};
function LA(obj, callback, reverse) {if (!callback) {if (obj instanceof Array) {return obj;}else {var arr = $.getArr(obj);if (arr === obj) {if ($.isColor(obj)) {return obj;}else {return [obj];}}return arr;}}else if (callback instanceof Function) {var arr = $.getArr(obj);if (arr === obj) {arr = [obj];}if (reverse) {var i = arr.length;while (i--) callback(arr[i], i, arr);}else {for (var i = 0; i < arr.length; i++) callback(arr[i], i, arr);}return arr;}}
$.each = function (object, callback, reverse) {try {if (object && object.length) {var l = object.length;if (!reverse) for (var i = 0; i < l; i++) callback(object[i], i, object);else while (l--) callback(object[l], l, object);}return $;}catch (e) {$.errorMessage('$.each() - error: ' + e);}};
Object.prototype.each = function (callback, reverse) {if (this.length) $.each(this, callback, reverse);return this;};
Object.prototype.getChildsByFilter = function (filterCallback, returnFirst) {filterCallback = filterCallback instanceof Function ? filterCallback : function () { return true; };var arr = [], items = LA(this),l = items.length;for (var i = 0; i < l; i++) {if (items[i].typename === 'GroupItem') {arr = arr.concat(LA(items[i].pageItems).getChildsByFilter(filterCallback));}else if (filterCallback(items[i])) {arr.push(items[i]);if (returnFirst) return arr;}}return arr;};
$.isArr = function (a) {if ((!a)|| (typeof a === 'string')|| (a.typename === 'Document')|| (a.typename === 'Layer')|| (a.typename === 'PathItem')|| (a.typename === 'GroupItem')|| (a.typename === 'PageItem')|| (a.typename === 'CompoundPathItem')|| (a.typename === 'TextFrame')|| (a.typename === 'TextRange')|| (a.typename === 'GraphItem')|| (a.typename === 'Document')|| (a.typename === 'Artboard')|| (a.typename === 'LegacyTextItem')|| (a.typename === 'NoNNativeItem')|| (a.typename === 'Pattern')|| (a.typename === 'PlacedItem')|| (a.typename === 'PluginItem')|| (a.typename === 'RasterItem')|| (a.typename === 'MeshItem')|| (a.typename === 'SymbolItem')) {return false;}else if (!a.typename && !(a instanceof Array)) {return false;}else {return true;}};
$.getArr = function (obj, attr, value, exclude) {var arr = [];function checkExclude (item) {if (exclude !== undefined) {var j = exclude.length;while (j--) if (exclude[j] === item) return true;}return false;}if ($.isArr(obj)) {for (var i = 0; i < obj.length; i++) {if (!checkExclude(obj[i])) {if (attr) {if (value !== undefined) {arr.push(obj[i][attr][value]);}else {arr.push(obj[i][attr]);}}else {arr.push(obj[i]);}}}return arr;}else if (attr) {return obj[attr];}else {return obj;}};
$.isColor = function (color) {if ((color.typename === 'GradientColor')|| (color.typename === 'PatternColor')|| (color.typename === 'CMYKColor')|| (color.typename === 'SpotColor')|| (color.typename === 'GrayColor')|| (color.typename === 'LabColor')|| (color.typename === 'RGBColor')|| (color.typename === 'NoColor')) {return true;}else {return false;}};
$.appName = {indesign: (BridgeTalk.appName.toLowerCase() === 'indesign'),photoshop: (BridgeTalk.appName.toLowerCase() === 'photoshop'),illustrator: (BridgeTalk.appName.toLowerCase() === 'illustrator')};
$.color = function (a, v) {if (a) {if (typeof a === 'string') {a = a.toLowerCase();}}else {return undefined;}if ((a === 'hex') && $.appName.illustrator) {if (!v) {return new RGBColor();}else {if (v === 'random') return $.color('rgb', v);else return $.hexToColor(v, 'RGB');}}else if ((a === 'cmyk') || (a === 'cmykcolor')) {var c = new CMYKColor(), b = [];if (v) {b = b.concat(v);if (typeof v === 'string' && v.toLowerCase() === 'random') {b = [Math.floor(Math.random() * 100), Math.floor(Math.random() * 100), Math.floor(Math.random() * 100), Math.floor(Math.random() * 100)];}else {for (var i = 0; i < b.length; i++) {if (b[i] === 'random') {b[i] = Math.floor(Math.random() * 100);}}}c.cyan = parseInt(b[0]);c.magenta = parseInt(b[1]);c.yellow = parseInt(b[2]);c.black = parseInt(b[3]);}return c;}else if ((a === 'rgb') || (a === 'rgbcolor') || ((a === 'hex') && $.appName.photoshop)) {var c = new RGBColor(), b = [];if (v) {b = b.concat(v);if (typeof v === 'string' && v.toLowerCase() === 'random') {b = [Math.floor(Math.random() * 255), Math.floor(Math.random() * 255), Math.floor(Math.random() * 255)];}else {for (var i = 0; i < b.length; i++) {if (b[i] === 'random') {b[i] = Math.floor(Math.random() * 100);}}}if ($.appName.photoshop) {if (a !== 'hex' || (typeof v === 'string' && v.toLowerCase() === 'random')) {c.red = parseInt(b[0]);c.green = parseInt(b[1]);c.blue = parseInt(b[2]);}else {c.hexValue = b[0];}}else if ($.appName.illustrator) {c.red = parseInt(b[0]);c.green = parseInt(b[1]);c.blue = parseInt(b[2]);}}return c;}else if ((a === 'gray') || (a === 'grayscale') || (a === 'grayscale') || (a === 'graycolor')) {var c = new GrayColor(), b = [];if (v) {b = b.concat(v);if (typeof v === 'string' && v.toLowerCase() === 'random') {b = Math.floor(Math.random() * 100);}c.gray = parseInt(b[0] || b);}return c;}else if ((a === 'lab') || (a === 'labcolor')) {var c = new LabColor(), value, b = [];if (v) {b = b.concat(v);if (typeof v === 'string' && v.toLowerCase() === 'random') {b = [Math.floor(Math.random() * 100), Math.floor(-128 + Math.random() * 256), Math.floor(-128 + Math.random() * 256)];}else {for (var i = 0; i < b.length; i++) {if (i === 0) {if (b[i] === 'random') {b[i] = Math.floor(Math.random() * 100);}}else {if (b[i] === 'random') {b[i] = Math.floor(-128 + Math.random() * 256);}}}}c.l = parseInt(b[0]);c.a = parseInt(b[1]);c.b = parseInt(b[2]);}return c;}else if ((a === 'spot') || (a === 'spotcolor')) {var c = new SpotColor(), b = [];if (v) {b = b.concat(v);c.tint = parseInt(b[1]);}return c;}else if ((a === 'gradient') || (a === 'Gradient') || (a === 'GradientColor')) {var c = app.activeDocument.gradients.add(), g = new GradientColor(), b = [];if (v) {b = b.concat(v);for (var i = 0; i < b.length; i++) {c.gradientStops[i].color = $.color(b[i][0], b[i][1]);}g.gradient = c;}return g;}else if ((a === 'no') || (a === 'nocolor')) {return new NoColor();}};
$.toHex = function (color, hash) {if (color.typename !== 'RGBColor' && $.appName.illustrator) {color = $.convertColor(color, 'RGB');}return (hash ? '#' : '') + to(color.red) + to(color.green) + to(color.blue);function to(val) {var hex = val.toString(16);return hex.length === 1 ? '0' + hex : hex;}};
$.hexToColor = function (color, type) {color = color.toLowerCase();color = correct(color);function correct(a) {var l, b = '000000';if (a[0] === '#') {a = a.slice(1);}l = a.length;a = a + b.slice(l);return a;}return $.convertColor($.color('rgb', [parseInt((gc(color)).slice(0, 2), 16), parseInt((gc(color)).slice(2, 4), 16), parseInt((gc(color)).slice(4, 6), 16)]), type || 'rgb');function gc(h) {return (h.slice(0, 1) === '#') ? h.slice(1, 7) : h;}};
$.isColor = function (color) {if ((color.typename === 'GradientColor')|| (color.typename === 'PatternColor')|| (color.typename === 'CMYKColor')|| (color.typename === 'SpotColor')|| (color.typename === 'GrayColor')|| (color.typename === 'LabColor')|| (color.typename === 'RGBColor')|| (color.typename === 'NoColor')) {return true;}else {return false;}};
$.getColorValues = function (color) {if (color === undefined) {return undefined;}else if (color.typename === 'CMYKColor') {return [color.cyan, color.magenta, color.yellow, color.black];}else if (color.typename === 'RGBColor') {return [color.red, color.green, color.blue];}else if (color.typename === 'LabColor') {return [color.l, color.a, color.b];}else if (color.typename === 'SpotColor') {return [color.spotl, color.tint];}else if (color.typename === 'GrayColor') {return [color.gray];}else if (color.typename === 'NoColor') {return undefined;}else if (color.typename === 'GradientColor') {var colors = [], gradients = color.gradient.gradientStops;for (var i = 0; i < gradients.length; i++) {colors = colors.concat(gradients[i].color.getColorValues());}return colors;}};
CMYKColor.prototype.getColorValues = function () {return $.getColorValues(this);};
RGBColor.prototype.getColorValues = function () {return $.getColorValues(this);};
GrayColor.prototype.getColorValues = function () {return $.getColorValues(this);};
LabColor.prototype.getColorValues = function () {return $.getColorValues(this);};
NoColor.prototype.getColorValues = function () {return $.getColorValues(this);};
$.getUnits = function (val, def) {try {return 'px,pt,mm,cm,in,pc'.indexOf(val.slice(-2)) > -1 ? val.slice(-2) : def;}catch (e) {$.errorMessage('check units: " ' + e + ' "');}};
$.convertUnits = function (obj, b) {if (obj === undefined) {return obj;}if (b === undefined) {b = 'px';}if (typeof obj === 'number') {obj = obj + 'px';}if (typeof obj === 'string') {var unit = $.getUnits(obj),val = parseFloat(obj);if (unit && !isNaN(val)) {obj = val;}else if (!isNaN(val)) {obj = val; unit = 'px';}}if ($.appName.illustrator) {if (((unit === 'px') || (unit === 'pt')) && (b === 'mm')) {obj = parseFloat(obj) / 2.83464566929134;}else if (((unit === 'px') || (unit === 'pt')) && (b === 'cm')) {obj = parseFloat(obj) / (2.83464566929134 * 10);}else if (((unit === 'px') || (unit === 'pt')) && (b === 'in')) {obj = parseFloat(obj) / 72;}else if ((unit === 'mm') && ((b === 'px') || (b === 'pt'))) {obj = parseFloat(obj) * 2.83464566929134;}else if ((unit === 'mm') && (b === 'cm')) {obj = parseFloat(obj) * 10;}else if ((unit === 'mm') && (b === 'in')) {obj = parseFloat(obj) / 25.4;}else if ((unit === 'cm') && ((b === 'px') || (b === 'pt'))) {obj = parseFloat(obj) * 2.83464566929134 * 10;}else if ((unit === 'cm') && (b === 'mm')) {obj = parseFloat(obj) / 10;}else if ((unit === 'cm') && (b === 'in')) {obj = parseFloat(obj) * 2.54;}else if ((unit === 'in') && ((b === 'px') || (b === 'pt'))) {obj = parseFloat(obj) * 72;}else if ((unit === 'in') && (b === 'mm')) {obj = parseFloat(obj) * 25.4;}else if ((unit === 'in') && (b === 'cm')) {obj = parseFloat(obj) * 25.4;}return parseFloat(obj);}else if ($.appName.photoshop) {return parseFloat(obj);}};
String.prototype.getUnits = function () {try {var str = this.slice(-2),u = ['px', 'pt', 'mm', 'cm', 'in', 'pc'];for (var i = 0; i < u.length; i++) {if (str === u[i]) {return u[i];}}return false;}catch (e) {$.errorMessage('check units: " ' + e + ' "');}};
String.prototype.convertUnits = function (b) {return $.convertUnits(this.toString(), b);};
String.prototype.hexEncode = function () {var s = unescape(encodeURIComponent(this)), h = '';for (var i = 0; i < s.length; i++) h += s.charCodeAt(i).toString(16);return h;};
String.prototype.hexDecode = function () {var s = '';for (var i = 0; i < this.length; i += 2) s += String.fromCharCode(parseInt(this.substr(i, 2), 16));return decodeURIComponent(escape(s));};
Object.prototype.extend = function (userObject, deep) {try {for (var key in userObject) {if (this.hasOwnProperty(key)) {if (deep&& this[key] instanceof Object&& !(this[key] instanceof Array)&& userObject[key] instanceof Object&& !(userObject[key] instanceof Array)) {this[key].extend(userObject[key], deep);}else this[key] = userObject[key];}}return this;}catch (e) {$.errorMessage('$.objectParser() - error: ' + e);}};
Object.prototype.getNearby = function (prevOrNext) {var parent = this.parent,items = parent.pageItems,l = items.length;prevOrNext = prevOrNext || 'next';for (var i = 0; i < l; i++) {if (items[i] === this) {return (((prevOrNext === 'next') && (i + 1 < l)) ? items[i + 1] : (((prevOrNext === 'prev') && (i - 1 >= 0)) ? items[i - 1] : undefined));}}}
function parseMargin (value, ifErrReturnValue) {value = (typeof value === 'string' ? value.split(' ') : (value instanceof Array ? value : ''));if (!value.length) return ifErrReturnValue !== undefined ? ifErrReturnValue : [0, 0, 0, 0];if (value.length === 2) {value[2] = value[0];value[3] = value[1];}else if (value.length < 4) {var val = value[value.length - 1];for (var i = value.length; i < 4; i++) {value[i] = val;}}for (var i = 0; i < value.length; i++) {value[i] = $.convertUnits(value[i], 'px');}return value;}
function getBounds (items, bounds) {bounds = bounds || 'geometricBounds'; bounds = (bounds && bounds.toLowerCase().indexOf('bounds') === -1) ? bounds += 'Bounds' : bounds;var l = items.length, x = [], y = [], w = [], h = [];for (var i = 0; i < l; i++) {x.push(items[i][bounds][0]);y.push(items[i][bounds][1]);w.push(items[i][bounds][2]);h.push(items[i][bounds][3]);};return [Math.min.apply(null, x), Math.max.apply(null, y), Math.max.apply(null, w), Math.min.apply(null, h)];}
Object.prototype.align = function (preset, userOptions) {var obj = LA(this),options = {bounds: 'geometric',margin: '0 0 0 0',artboard: activeDocument.artboards.getActiveArtboardIndex(),object: {node: undefined,offset: 'outline',bounds: 'geometric'},}.extend(userOptions || {}, true);function process(item, obj_length) {var rect = activeDocument.artboards[options.artboard].artboardRect,m = options.margin, distance = 0,gb = item.geometricBounds, vb = item.visibleBounds,w = item.width / 2, h = item.height / 2,offset = options.object.offset.slice(0, 1).toLowerCase();if (options.bounds.slice(0, 1).toLowerCase() === 'v') {distance = vb[2] - gb[2];}if (!options.object || !options.object.node) {if (preset === 'top') {item.position = [item.position[0], rect[1] - distance - m[0]];}else if (preset === 'right') {item.position = [rect[2] - (w * 2) - distance - m[1], item.position[1]];}else if (preset === 'bottom') {item.position = [item.position[0], rect[3] + (h * 2) + distance + m[2]];}else if (preset === 'left') {item.position = [rect[0] + distance + m[3], item.position[1]];}else if (preset === 'vcenter') {item.position = [item.position[0], (rect[3] + rect[1]) / 2 + h];}else if (preset === 'hcenter') {item.position = [(rect[2] + rect[0]) / 2 - w, item.position[1]];}else if (preset === 'topleft') {item.position = [rect[0] + distance + m[3], rect[1] - distance - m[0]];}else if (preset === 'topcenter') {item.position = [(rect[2] + rect[0]) / 2 - w, rect[1] - distance - m[0]];}else if (preset === 'topright') {item.position = [rect[2] - (w * 2) - distance - m[1], rect[1] - distance - m[0]];}else if (preset === 'middleright') {item.position = [rect[2] - (w * 2) - distance - m[2], (rect[3] + rect[1]) / 2 + h];}else if (preset === 'bottomright') {item.position = [rect[2] - (w * 2) - distance - m[1], rect[3] + (h * 2) + distance + m[2]];}else if (preset === 'bottomcenter') {item.position = [(rect[2] + rect[0]) / 2 - w, rect[3] + (h * 2) + distance + m[2]];}else if (preset === 'bottomleft') {item.position = [rect[0] + distance + m[3], rect[3] + (h * 2) + distance + m[2]];}else if (preset === 'middleleft') {item.position = [rect[0] + distance + m[3], (rect[3] + rect[1]) / 2 + h];}else if (preset === 'center') {item.position = [(rect[2] + rect[0]) / 2 - w, (rect[3] + rect[1]) / 2 + h];}}else {if ((obj_length === 1) || (options.object.node === 'current') || (item !== options.object.node)) {var obn = options.object.node;if (!obn.typename && obn instanceof Array) {var b = bgeo = getBounds(obn, 'geometricBounds');if (options.object.bounds.slice(0, 1).toLowerCase() === 'v') {b = getBounds(obn, 'visibleBounds');bgeo[2] = b[2] - b[0];}var objt = b[1], objl = b[0],objw = b[2] - b[0], objh = b[1] - b[3],node_distance = 0, distance_count, ow = w, oh = h, count = -2;}else if (options.object.node.typename !== 'Artboard') {if (options.object.node === 'current') {var obn = item;}var b = bgeo = obn.geometricBounds,objt = obn.top, objl = obn.left,objw = obn.width, objh = obn.height,node_distance = 0, distance_count, ow = w, oh = h, count = -2;if (options.object.bounds.slice(0, 1).toLowerCase() === 'v') {b = obn.visibleBounds;}}else {var b = bgeo = obn.artboardRect,objt = b[1], objl = b[0],objw = b[2] - b[0], objh = -b[3],node_distance = 0, ow = w, oh = h, count = -2;}if (offset === 'i') {var ow = 0, oh = 0, count = 2;}else {for (var i = 0; i < m.length; i++) {m[i] = -m[i];}}if (offset !== 'i') {distance_count = -distance;}function getpos() {return {top: b[1] + distance + node_distance - m[0] - (oh * count),right: b[2] + distance + node_distance - m[1] - (ow * count),bottom: b[3] - distance - node_distance + m[2] + (oh * count),left: b[0] - distance - node_distance + m[3] + (ow * count)}}if (preset === 'top') {item.position = [item.position[0], getpos().top];}else if (preset === 'right') {offset === 'i' ? ow = w : ow = 0;item.position = [getpos().right, item.position[1]];}else if (preset === 'bottom') {offset === 'i' ? oh = h : oh = 0;item.position = [item.position[0], getpos().bottom];}else if (preset === 'left') {item.position = [getpos().left, item.position[1]];}else if (preset === 'vcenter') {item.position = [item.position[0], bgeo[1] - (objh / 2) + h];}else if (preset === 'hcenter') {item.position = [bgeo[0] + (objw / 2) - w, item.position[1]];}else if (preset === 'topleft') {item.position = [getpos().left, getpos().top];}else if (preset === 'topcenter') {item.position = [bgeo[0] + (objw / 2) - w, getpos().top];}else if (preset === 'topright') {offset === 'i' ? ow = w : ow = 0;item.position = [getpos().right, getpos().top];}else if (preset === 'middleright') {offset === 'i' ? ow = w : ow = 0;item.position = [getpos().right, bgeo[1] - (objh / 2) + h];}else if (preset === 'bottomright') {offset === 'i' ? ow = w : ow = 0;offset === 'i' ? oh = h : oh = 0;item.position = [getpos().right, getpos().bottom];}else if (preset === 'bottomcenter') {offset === 'i' ? oh = h : oh = 0;item.position = [bgeo[0] + (objw / 2) - w, getpos().bottom];}else if (preset === 'bottomleft') {offset === 'i' ? oh = h : oh = 0;item.position = [getpos().left, getpos().bottom];}else if (preset === 'middleleft') {item.position = [getpos().left, bgeo[1] - (objh / 2) + h];}else if (preset === 'center') {item.position = [bgeo[0] + (objw / 2) - w, bgeo[1] - (objh / 2) + h];}}}}options.margin = parseMargin(options.margin);for (var i = 0; i < obj.length; i++) {process(obj[i], obj.length);}return this;};
Object.prototype.appendTo = function (relativeObject, elementPlacement) {var obj = LA(this), i = obj.length;if (typeof elementPlacement === 'string' && elementPlacement.length) {switch (elementPlacement.toLowerCase()) {case 'inside': elementPlacement = 'INSIDE'; break;case 'begin': elementPlacement = 'PLACEATBEGINNING'; break;case 'end': elementPlacement = 'PLACEATEND'; break;case 'before': elementPlacement = 'PLACEBEFORE'; break;case 'after': elementPlacement = 'PLACEAFTER'; break;default: elementPlacement = '';}}while (i--) {if (obj[i].parent !== relativeObject && obj[i] !== relativeObject) {if (!elementPlacement) obj[i].moveToBeginning(relativeObject);else obj[i].move(relativeObject, ElementPlacement[elementPlacement]);}}return this;};
Object.prototype.group = function (options) {var obj = LA(this),g = obj[0].parent.groupItems.add();this.appendTo(g);return g;};
Object.prototype.ungroup = function () {var arr = [], obj = LA(this);for (var i = 0; i < obj.length; i++) {if (obj[i].typename === 'GroupItem') {var j = obj[i].pageItems.length;while (j--) {arr = arr.concat(obj[i].pageItems[0]);obj[i].pageItems[0].moveBefore(obj[i]);}obj[i].remove();}else {arr = arr.concat(obj[i]);}}return arr;};
Object.prototype.getExactSize = function (property, bounds) {bounds = bounds || 'geometricBounds';bounds = (bounds && bounds.toLowerCase().indexOf('bounds') === -1) ? bounds += 'Bounds' : bounds;var values = [],item = this,bounds = item[bounds],propertyArr = property.replace(/ /g, '').split(','),i = propertyArr.length;if (bounds) {while (i--) {if (propertyArr[i] === 'width') values.push(bounds[2] - bounds[0]);if (propertyArr[i] === 'height') values.push(bounds[1] - bounds[3]);}}return values.length === 1 ? values[0] : values;};
var scriptName = 'Griddder',
copyright = ' \u00A9 www.ladyginpro.ru',
settingFile = {
name: scriptName + '__setting.json',
folder: Folder.myDocuments + '/LA_AI_Scripts/'
},
$margins = '0',
$cropMarksColor = {
type: 'CMYKColor',
values: [0, 0, 0, 100]
};
function checkEffects() {
var testPath = activeDocument.pathItems.add(),
value = (testPath.applyEffect instanceof Function);
testPath.remove();
return value;
}
var effectsEnabled = checkEffects();
Object.prototype.griddder = function (userOptions) {
try {
var options = {
columns: 1,
rows: 1,
gutter: {
columns: 0,
rows: 0
},
group: 'only_cropmarks',
align: 'center',
bounds: 'visible',
fitToArtboard: false,
margin: '0mm 0mm 0mm 0mm',
cropMarks: {
size: 5,
offset: 0,
position: 'relative',
enabled: false,
attr: {
strokeWidth: 1,
strokeColor: {
type: 'cmyk',
values: [100, 100, 100, 100]
}
}
}
}.extend(userOptions || {}, true);
options.align = options.align.toLowerCase();
// convert units
options.gutter.rows = $.convertUnits(options.gutter.rows, 'px');
options.gutter.columns = $.convertUnits(options.gutter.columns, 'px');
options.cropMarks.size = $.convertUnits(options.cropMarks.size, 'px');
options.cropMarks.offset = $.convertUnits(options.cropMarks.offset, 'px');
options.cropMarks.attr.strokeWidth = $.convertUnits(options.cropMarks.attr.strokeWidth, 'px');
var groupItems,
cropMarksGroup,
items = LA(this),
collection = [],
marksCollection = [],
columns = options.columns,
rows = options.rows,
gutter = options.gutter,
align = options.align,
fitToArtboard = options.fitToArtboard,
bounds = options.bounds,
art = activeDocument.artboards[activeDocument.artboards.getActiveArtboardIndex()],
margin = parseMargin(options.margin),
marksPos = (options.cropMarks.position.toLowerCase().slice(0, 1) === 'r' ? options.cropMarks.offset : 0),
marksPoscolumns = (options.cropMarks.position.toLowerCase().slice(0, 1) === 'r' ? gutter.rows / 2 : 0),
marksPosrows = (options.cropMarks.position.toLowerCase().slice(0, 1) === 'r' ? options.cropMarks.offset + gutter.columns : 0);
if (!columns && !rows && !fitToArtboard) return this;
function createCropMark(coords) {
var mark = cropMarksGroup.pathItems.add();
mark.setEntirePath(coords);
mark.filled = false;
mark.strokeColor = $.color(options.cropMarks.attr.strokeColor.type, options.cropMarks.attr.strokeColor.values);
mark.strokeWidth = options.cropMarks.attr.strokeWidth;
marksCollection.push(mark);
}
function getItemMask(obj) {
var itemMask = obj.getChildsByFilter(function (mask) { return mask.clipping; }, true);
return itemMask.length ? itemMask[0] : obj;
}
items.each(function (item, counter, arr) {
var itemMask = getItemMask(item),
itemSize = {
width: itemMask.getExactSize('width', bounds) + gutter.columns,
height: itemMask.getExactSize('height', bounds) + gutter.rows
},
itemBounds = itemMask[bounds + 'Bounds'],
artSize = {
width: (art.artboardRect[2] - art.artboardRect[0]) - margin[1] - margin[3],
height: (-(art.artboardRect[3] - art.artboardRect[1])) - margin[0] - margin[2]
},
isRotate = false,
group = item.group();
cropMarksGroup = options.cropMarks.enabled && options.group !== 'none' ? group.groupItems.add() : group;
if (fitToArtboard) {
// landscape
var landscape = {
columns: Math.floor(artSize.width / itemSize.width),
rows: Math.floor(artSize.height / itemSize.height)
};
landscape.columns = (itemSize.width * landscape.columns) > artSize.width ? landscape.columns - 1 : landscape.columns;
landscape.rows = (itemSize.height * landscape.rows) > artSize.height ? landscape.rows - 1 : landscape.rows;
// portrait
var portrait = {
columns: Math.floor(artSize.width / itemSize.height),
rows: Math.floor(artSize.height / itemSize.width)
};
portrait.columns = (itemSize.height * portrait.columns) > artSize.width ? portrait.columns - 1 : portrait.columns;
portrait.rows = (itemSize.width * portrait.rows) > artSize.height ? portrait.rows - 1 : portrait.rows;
if (portrait.columns * portrait.rows > landscape.columns * landscape.rows) {
isRotate = true;
columns = portrait.columns;
rows = portrait.rows;
}
else {
columns = landscape.columns;
rows = landscape.rows;
}
}
if (isRotate) {
group.rotate(90);
var w = itemSize.width;
itemSize.width = itemSize.height;
itemSize.height = w;
}
var useEffects = (effectsEnabled && __useEffect.value);
for (var i = 0; i < columns; i++) {
for (var j = 0; j < rows; j++) {
var s = (!i && !j ? item : (!effectsEnabled || !__useEffect.value ? item.duplicate() : item)),
bnds = getItemMask(s)[bounds + 'Bounds'];
collection.push(s);
if (!effectsEnabled || !__useEffect.value) {
s.left += (itemSize.width * i);
s.top -= (itemSize.height * j);
} else if (effectsEnabled && __useEffect.value) {
bnds = [
bnds[0] + (itemSize.width * i),
bnds[1] - (itemSize.height * j),
bnds[2] + (itemSize.width * i),
bnds[3] - (itemSize.height * j)
];
}
// columns
if ((options.cropMarks.enabled || (effectsEnabled && __useEffect.value)) && !i) {
// first
if (gutter.rows || !j) createCropMark([
[bnds[0] - (!useEffects ? options.cropMarks.offset : 0), bnds[1] + (!j ? marksPos : 0)],
[bnds[0] - (!useEffects ? options.cropMarks.size : 0) - (!useEffects ? options.cropMarks.offset : 0), bnds[1] + (!j ? marksPos : 0)]
]);
createCropMark([
[bnds[0] - (!useEffects ? options.cropMarks.offset : 0), bnds[3] + (j === rows - 1 ? -marksPos : 0)],
[bnds[0] - (!useEffects ? options.cropMarks.size : 0) - (!useEffects ? options.cropMarks.offset : 0), bnds[3] + (j === rows - 1 ? -marksPos : 0)]
]);
// last
if (gutter.rows || !j) createCropMark([
[bnds[0] + itemSize.width * columns - gutter.rows + (!useEffects ? options.cropMarks.offset : 0), bnds[1] + (!j ? marksPos : 0)],
[bnds[0] + (!useEffects ? options.cropMarks.size : 0) + itemSize.width * columns - gutter.rows + (!useEffects ? options.cropMarks.offset : 0), bnds[1] + (!j ? marksPos : 0)]
]);
// lastEnd
createCropMark([
[bnds[0] + itemSize.width * columns - gutter.rows + (!useEffects ? options.cropMarks.offset : 0), bnds[3] + (j === rows - 1 ? -marksPos : 0)],
[bnds[0] + (!useEffects ? options.cropMarks.size : 0) + itemSize.width * columns - gutter.rows + (!useEffects ? options.cropMarks.offset : 0), bnds[3] + (j === rows - 1 ? -marksPos : 0)]
]);
}
// rows
if ((options.cropMarks.enabled || (effectsEnabled && __useEffect.value)) && !j) {
// first
if (gutter.columns || !i) createCropMark([
[bnds[0] + (!i ? -marksPos : 0), bnds[1] + gutter.columns + (!useEffects ? options.cropMarks.offset : 0) - gutter.columns],
[bnds[0] + (!i ? -marksPos : 0), bnds[1] + gutter.columns + (!useEffects ? options.cropMarks.size : 0) + (!useEffects ? options.cropMarks.offset : 0) - gutter.columns]
]);
createCropMark([
[bnds[2] + (i === columns - 1 ? marksPos : 0), bnds[1] + gutter.columns + (!useEffects ? options.cropMarks.offset : 0) - gutter.columns],
[bnds[2] + (i === columns - 1 ? marksPos : 0), bnds[1] + gutter.columns + (!useEffects ? options.cropMarks.size : 0) + (!useEffects ? options.cropMarks.offset : 0) - gutter.columns]
]);
// last
if (gutter.columns || !i) createCropMark([
[bnds[0] + (!i ? -marksPos : 0), bnds[1] - itemSize.height * rows - (!useEffects ? options.cropMarks.offset : 0) + gutter.columns],
[bnds[0] + (!i ? -marksPos : 0), bnds[1] - itemSize.height * rows - (!useEffects ? options.cropMarks.size : 0) - (!useEffects ? options.cropMarks.offset : 0) + gutter.columns]
]);
// lastEnd
createCropMark([
[bnds[2] + (i === columns - 1 ? marksPos : 0), bnds[1] - itemSize.height * rows - (!useEffects ? options.cropMarks.offset : 0) + gutter.columns],
[bnds[2] + (i === columns - 1 ? marksPos : 0), bnds[1] - itemSize.height * rows - (!useEffects ? options.cropMarks.size : 0) - (!useEffects ? options.cropMarks.offset : 0) + gutter.columns]
]);
}
}
}
if (effectsEnabled && __useEffect.value) {
var createGroup = true;
if (columns > 1) {
item.applyEffect('');
} else {
createGroup = false;
}
if (rows > 1) {
var itemGroup = item;
if (createGroup) {
itemGroup = activeDocument.groupItems.add();
itemGroup.moveBefore(item, ElementPlacement.PLACEBEFORE);
item.moveToBeginning(itemGroup);
}
itemGroup.applyEffect('');
}
}
if (fitToArtboard && !(effectsEnabled && __useEffect.value)) {
group.align('center', {
bounds: 'visible'
});
} else if (!fitToArtboard && typeof options.align === 'string' && options.align.toLowerCase() !== 'none') {
group.align(options.align);
}
if (effectsEnabled && __useEffect.value) {
group.align(fitToArtboard ? 'center' : options.align);
if (!options.cropMarks.enabled) {
marksCollection.each(function (item) {
item.remove();
});
}
}
if (options.group === 'items_and_cropmarks_singly') {
if (options.cropMarks.enabled) {
cropMarksGroup.moveBefore(group);
}
} else if (options.cropMarks.enabled && options.group === 'only_items') {
cropMarksGroup.moveBefore(group);
cropMarksGroup.ungroup();
} else if ((options.group === 'none') || (options.group === 'only_cropmarks')) {
group.ungroup();
}
}, true);
return {
options: options,
group: groupItems,
items: collection,
marks: marksCollection
};
}
catch (e) {
$.errorMessage('griddder() - error: ' + e);
}
};
function inputNumberEvents (ev, _input, min, max, callback){
var step,
_dir = (ev.keyName ? ev.keyName.toLowerCase().slice(0,1) : '#none#'),
_value = parseFloat(_input.text),
units = (',px,pt,mm,cm,in,'.indexOf(_input.text.length > 2 ? (',' + _input.text.replace(/ /g, '').slice(-2) + ',') : ',!,') > -1 ? _input.text.replace(/ /g, '').slice(-2) : '');
min = (min === undefined ? 0 : min);
max = (max === undefined ? Infinity : max);
step = (ev.shiftKey ? 10 : (ev.ctrlKey ? .1 : 1));
if (isNaN(_value)) {
_input.text = min;
}
else {
_value = ( ((_dir === 'u')) ? _value + step : (((_dir === 'd')) ? _value - step : false) );
if (_value !== false) {
_value = (_value <= min ? min : (_value >= max ? max : _value))
_input.text = _value;
if (callback instanceof Function) callback(ev, _value, _input, min, max, units);
else if (units) _input.text = parseFloat(_input.text) + ' ' + units;
}
else if (units) _input.text = parseFloat(_input.text) + ' ' + units;
}
}
function doubleGutters (ev, _value, items) {
if (ev.altKey && ((ev.keyName === 'Left') || (ev.keyName === 'Right'))) {
doubleValues(_value, items);
}
}
function doubleValues (val, items) {
var i = items.length;
while (i--) {
items[i].text = val;
}
}
var win = new Window('dialog', scriptName + copyright),
globalGroup = win.add('group');
globalGroup.orientation = 'column';
globalGroup.alignChildren = ['fill', 'fill'];
with (globalGroup.add('panel')) {
orientation = 'column';
alignChildren = ['fill', 'fill'];
with (add('group')) {
orientation = 'row';
alignChildren = 'fill';
with (add('group')) {
orientation = 'column';
alignChildren = 'left';
var inputSize = [0, 0, 75, 25];
with (add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Columns');
var __columns = add('edittext', inputSize, 4);
__columns.addEventListener('keydown', function(e) { inputNumberEvents(e, __columns, 1, Infinity); doubleGutters(e, this.text, [__columns, __rows]); });
}
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Gutter Cols:');
var __columns_gutter = add('edittext', inputSize, '0 px');
__columns_gutter.addEventListener('keydown', function(e) { inputNumberEvents(e, __columns_gutter, 0, Infinity); doubleGutters(e, this.text, [__columns_gutter, __rows_gutter]); });
}
}
with (add('group')) {
orientation = 'row';
alignChildren = ['fill', 'fill'];
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Rows:');
var __rows = add('edittext', inputSize, 4);
__rows.addEventListener('keydown', function(e) { inputNumberEvents(e, __rows, 1, Infinity); doubleGutters(e, this.text, [__columns, __rows]); });
}
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Gutter Rows:');
var __rows_gutter = add('edittext', inputSize, '0 px');
__rows_gutter.addEventListener('keydown', function(e) { inputNumberEvents(e, __rows_gutter, 0, Infinity); doubleGutters(e, this.text, [__columns_gutter, __rows_gutter]); });
}
}
}
with (add('group')) {
orientation = 'column';
alignChildren = ['fill', 'fill'];
with (add('group')) {
orientation = 'row';
add('statictext', undefined, 'Align:');
var __align = add('dropdownlist', [0, 0, 105, 25], 'None,Center,Top Left,Top Center,Top right,Middle Right,Bottom Right,Bottom Center,Bottom Left,Middle Left'.split(','));
__align.selection = 0;
}
with (add('group')) {
orientation = 'row';
add('statictext', undefined, 'Bounds:');
var __bounds = add('dropdownlist', [0, 0, 90, 25], 'Geometric,Visible'.split(','));
__bounds.selection = 0;
}
with (add('group')) {
orientation = 'row';
add('statictext', undefined, 'Group:');
var __group = add('dropdownlist', [0, 0, 100, 25], 'None,Only Items,Only CropMarks,Items and CropMarks,Items and CropMarks Singly'.split(','));
__group.selection = 0;
}
}
}
}
with (globalGroup.add('panel')) {
orientation = 'column';
alignChildren = 'left';
with (add('group')) {
orientation = 'row';
var __CMEnabled = add('checkbox', [0, 0, 160, 25], 'Crop marks enabled');
__CMEnabled.value = false;
__CMEnabled.onClick = function() {
cmGroup.enabled = this.value;
}
var __useEffect = add('checkbox', undefined, 'Use transform effect?');
__useEffect.enabled = effectsEnabled;
}
with (cmGroup = add('group')) {
orientation = 'column';
alignChildren = 'fill';
enabled = false;
with (add('group')) {
orientation = 'row';
alignChildren = 'fill';
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Size:');
var __cmSize = add('edittext', [0, 0, 65, 25], '5 mm');
__cmSize.addEventListener('keydown', function(e) { inputNumberEvents(e, this, 0, Infinity); });
}
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Weight:');
var __cmWeight = add('edittext', [0, 0, 65, 25], '1 pt');
__cmWeight.addEventListener('keydown', function(e) { inputNumberEvents(e, this, 0.001, Infinity); });
}
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Offset:');
var __cmOffset = add('edittext', [0, 0, 65, 25], '0 mm');
__cmOffset.addEventListener('keydown', function(e) { inputNumberEvents(e, this, 0, Infinity); });
}
with (add('group')) {
orientation = 'column';
alignChildren = 'fill';
add('statictext', undefined, 'Position:');
var __cmPosition = add('dropdownlist', [0, 0, 90, 25], 'Absolute,Relative'.split(','));
__cmPosition.selection = 0;
}
}
with (add('group')) {
orientation = 'row';
alignChildren = 'fill';
var __cmColorType = add('dropdownlist', [0, 0, 170, 25], 'Color type: CMYK Color,Color type: RGB Color'.split(','));
__cmColorType.selection = 0;
__cmColorType.addEventListener('change', function (e) {
var newColorType = this.selection.text.replace('Color type: ', '').replace(/ /g, '');
$cropMarksColor.values = $.convertColor($.color($cropMarksColor.type, $cropMarksColor.values), newColorType).getColorValues();
$cropMarksColor.type = newColorType;
});
var __cmColorButton = add('button', [0, 0, 135, 25], 'Choose color..');
__cmColorButton.onClick = function() {
var $cropMarksColorNew = app.showColorPicker($.color($cropMarksColor.type, $cropMarksColor.values));
$cropMarksColor.type = $cropMarksColorNew.typename;
$cropMarksColor.values = $cropMarksColorNew.getColorValues();
}
}
}
}
with (globalGroup.add('group')) {
margins = 0;
orientation = 'row';
alignChildren = ['fill', 'fill'];
var marginsButton = add('button', undefined, 'margins');
marginsButton.onClick = function() {
$margins = prompt('Enter the margin - top right bottom left. Units mm, px. Separator space', $margins).toLowerCase();
}
var fitToArtButton = add('button', undefined, 'Fit on artboard');
fitToArtButton.helpTip = 'Fit to artboard';
fitToArtButton.onClick = function (e) {
startAction(true);
};
}
with (globalGroup.add('group')) {
margins = 0;
orientation = 'row';
alignChildren = ['fill', 'fill'];
var cancel = add('button', undefined, 'Cancel');
cancel.helpTip = 'Press Esc to Close';
cancel.onClick = function () { win.close(); }
var ok = add('button', undefined, 'OK');
ok.helpTip = 'Press Enter to Run';
ok.onClick = function (e) {
startAction();
};
ok.active = true;
}
function getData ($fitArtboard) {
return {
columns: __columns.text,
rows: __rows.text,
gutter: {
columns: __columns_gutter.text,
rows: __rows_gutter.text,
},
group: __group.selection.text.replace(/ /g, '_').toLowerCase(),
align: __align.selection.text.replace(/ /g, ''),
bounds: __bounds.selection.text.toLowerCase(),
fitToArtboard: !!$fitArtboard,
margin: $margins,
cropMarks: {
size: __cmSize.text,
offset: __cmOffset.text,
position: __cmPosition.selection.text.toLowerCase(),
enabled: __CMEnabled.value,
attr: {
strokeWidth: __cmWeight.text,
strokeColor: {
type: $cropMarksColor.type,
values: $cropMarksColor.values
}
}
}
};
}
function startAction ($fitArtboard) {
selection.griddder(getData($fitArtboard));
win.close();
}
function saveSettings() {
var $file = new File(settingFile.folder + settingFile.name),
data = [
__columns.text,
__rows.text,
__columns_gutter.text,
__rows_gutter.text,
__align.selection.index,
__bounds.selection.index,
__group.selection.index,
__CMEnabled.value,
__cmSize.text,
__cmWeight.text,
__cmOffset.text,
__cmPosition.selection.index,
__useEffect.value
].toString() + '\n' + $cropMarksColor.type + '\n' + $cropMarksColor.values.toString() + '\n' + $margins;
$file.open('w');
$file.write(data);
$file.close();
}
function loadSettings() {
var $file = File(settingFile.folder + settingFile.name);
if ($file.exists) {
try {
$file.open('r');
var data = $file.read().split('\n'),
$main = data[0].split(','),
$cmColorType = data[1],
$cmColorValues = data[2].split(','),
$mrgns = data[3];
__columns.text = $main[0];
__rows.text = $main[1];
__columns_gutter.text = $main[2];
__rows_gutter.text = $main[3];
__align.selection = parseInt($main[4]);
__bounds.selection = parseInt($main[5]);
__group.selection = parseInt($main[6]);
__CMEnabled.value = ($main[7] === 'true');
__cmSize.text = $main[8];
__cmWeight.text = $main[9];
__cmOffset.text = $main[10];
__cmPosition.selection = parseInt($main[11]);
__useEffect.value = ($main[12] === 'true');
$cropMarksColor.type = $cmColorType;
$cropMarksColor.values = $cmColorValues;
$margins = $mrgns;
cmGroup.enabled = __CMEnabled.value;
} catch (e) {}
$file.close();
}
}
win.onClose = function() {
saveSettings();
return true;
}
function checkSettingFolder() {
var $folder = new Folder(settingFile.folder);
if (!$folder.exists) $folder.create();
}
checkSettingFolder();
loadSettings();
win.center();
win.show();