Skip to content

Instantly share code, notes, and snippets.

@moluapple
Created July 7, 2011 16:11
Show Gist options
  • Save moluapple/1069865 to your computer and use it in GitHub Desktop.
Save moluapple/1069865 to your computer and use it in GitHub Desktop.
Datasets Magic
#target illustrator
#targetengine com.adobe.illustrator.demo.flashplayer
try {
var swfFolder = File($.fileName).parent;
} catch (e) {
var swfFolder = File(e.fileName).parent;
}
if (swfFolder != null) {
// Create a resource to describe the ScriptUI window.
var res = "palette { \
text:'变量巫术师 V2.0', \
properties:{ closeOnKey:'OSCmnd+W', resizeable:false}, \
fp: FlashPlayer { \
preferredSize: [380, 380],\
alignment: ['fill', 'fill'] \
} \
}";
// Create new FlashPanel Window object
var flashPanel = new Window(res);
flashPanel.margins = [0, 0, 0, 0];
var flashFile = new File(swfFolder.absoluteURI + '/dataset.swf');
flashPanel.fp.loadMovie(flashFile);
// ExtendScript functions called back from ActionScript
flashPanel.fp.selectfile = selectfile;
flashPanel.fp.getImage = getImage;
flashPanel.fp.runIt = runIt;
flashPanel.fp.helpme = helpme;
flashPanel.fp.datasetMerge = datasetMerge;
flashPanel.fp.exportPDF = exportPDF;
flashPanel.fp.printDs = printDs;
// Display window
flashPanel.show();
}
function btMsg(func) {
var bt = new BridgeTalk();
bt.target = 'illustrator';
bt.body = func;
//$.writeln(bt.body);
bt.onError = flashPanelBridgeTalkErrorHandler;
bt.send();
}
function flashPanelBridgeTalkErrorHandler(btObj) {
alert(btObj.body + '(' + btObj.headers['Error-Code'] + ')');
}
function selectfile() {
return String(File.openDialog('选择 CSV 文件', 'CSV 文件:*.csv'));
}
function getImage() {
return String(new Folder().selectDlg('请选择图像路径:'));
}
function importData(obj) {
csvData = obj.csvData.split('@@');
for (var i = 0, len = csvData.length; i < len; i++) {
csvData[i] = csvData[i].split('||');
}
var errorMsg = '仅能将变量导入已打开的文档,请新建或打开一个文档。';
try {
var docRef = activeDocument;
} catch (e) {
alert(errorMsg);
}
if (docRef) {
var i, j, values, textVar, imgVar, visibilityVar, textRef = [],
imageRef = [],
sub, s = 0;
while (s < csvData[0].length) {
if (csvData[0][s] == 'image') {
sub = s;
break;
}
s++;
}
if (obj.link) {
var files = new Folder(obj.folder).getFiles();
folderImg = docRef.placedItems[docRef.placedItems.length - 1];
imgVar = docRef.variables.add();
imgVar.kind = VariableKind.IMAGE;
imgVar.name = 'FolderImage';
folderImg.contentVariable = imgVar;
folderImg.file = files[0];
}
for (j = 1; j < csvData.length; j++) {
values = csvData[j];
if (obj.link) folderImg.file = files[j - 1];
for (i = 0; i < values.length; i++) {
if (obj.visib && i < docRef.pathItems.length) {
try {
visibilityVar = docRef.variables.getByName('VisualPath_' + (i + 1));
} catch (e) {
visibilityVar = docRef.variables.add();
visibilityVar.kind = VariableKind.VISIBILITY;
docRef.pathItems[i].visibilityVariable = visibilityVar;
visibilityVar.name = 'VisualPath_' + (i + 1);
}
docRef.pathItems[i].hidden = Math.round(Math.random()) ? true : false;
}
if (csvData[0][i] == 'image') {
img = docRef.placedItems[i - sub];
try {
imgVar = docRef.variables.getByName('Image_' + (i - sub + 1));
} catch (e) {
imgVar = docRef.variables.add();
imgVar.kind = VariableKind.IMAGE;
imgVar.name = 'Image_' + (i - sub + 1);
img.contentVariable = imgVar;
}
img.file = new File(values[i]);
} else {
iText = docRef.textFrames[i];
try {
textVar = docRef.variables.getByName(csvData[0][i]);
} catch (e) {
textVar = docRef.variables.add();
textVar.kind = VariableKind.TEXTUAL;
textVar.name = csvData[0][i];
iText.contentVariable = textVar;
}
iText.contents = values[i].replace('\\n', String.fromCharCode(13));
}
}
docRef.dataSets.add();
redraw();
}
docRef.dataSets[0].display();
}
}
function runIt(myoption) {
/**Author: isamuyano
* http://code.google.com/p/csvdatajs/
*/
var CSVData = function (fileObj) {
this.colDelimiter = ',';
this.data = function () {
fileObj.open('r');
var csvData = fileObj.read();
fileObj.close();
return csvData;
}
/**
* CSV data parser
* @param {String} data CSV textdata
* @return {Array} 2d
*/
this.parse = function () {
var data = this.data(),
rows = [],
cols = [],
quated = false,
colStartIndex = 0,
quateCount = 0;
for (i = 0; i < data.length; i++) {
var c = data.charAt(i);
if (c == '"') {
quateCount++;
if (!quated) {
quated = true;
} else {
if (quateCount % 2 == 0) {
if (i == data.length - 1 || data.charAt(i + 1) != '"') {
quated = false;
}
}
}
}
if (!quated) {
if (c == this.colDelimiter) {
var value = data.substring(colStartIndex, i);
value = this.unescape(value);
cols.push(value);
colStartIndex = i + 1;
} else if (c == '\r') {
var value = data.substring(colStartIndex, i);
value = this.unescape(value);
cols.push(value);
i += 1;
colStartIndex = i + 1;
rows.push(cols);
cols = new Array();
} else if (c == '\n') {
var value = data.substring(colStartIndex, i);
value = this.unescape(value);
cols.push(value);
colStartIndex = i + 1;
rows.push(cols.join('||'));
cols = new Array();
}
}
}
return rows.join('@@');
};
/**
* CSV column escape
* @param {String} value Column value
* @return {String} Escaped value
*/
this.escape = function (value) {
value = value.replace(/"/g, '""');
value = '"' + value + '"';
return value;
};
/**
* CSV column unescape
* @param {String} value Column value
* @return {String} Unescaped value
*/
this.unescape = function (value) {
if (value.charAt(0) == '"' && value.charAt(value.length - 1) == '"') {
value = value.substring(1, value.length - 1);
}
value = value.replace(/""/g, '"');
return value;
};
},
Seetings = {
csvData: new CSVData(File(myoption.filename + '')).parse().replace(/\n/g, '\\n'),
folder: myoption.foldername ? Folder(myoption.foldername + "/") : '',
link: myoption.elink,
visib: myoption.visib
};
try {
btMsg(importData.toSource() + '(' + Seetings.toSource() + ');');
} catch (e) {
alert(e);
}
}
function datasetMakeup() {
var trim = 0,
sourceDoc = app.activeDocument,
wh = sourceDoc.width,
ht = sourceDoc.height,
sourceGroup = sourceDoc.groupItems[0],
itemWh = sourceGroup.pageItems[0].width,
itemHt = sourceGroup.pageItems[0].height,
repeatx = Math.floor((wh - trim * 2) / itemWh),
repeaty = Math.floor((ht - trim * 2) / itemHt),
itemPP = repeatx * repeaty,
pages = Math.ceil(sourceDoc.dataSets.length / itemPP),
offsetX = (wh - itemWh * repeatx) / 2,
offsetY = (ht - itemHt * repeaty) / 2,
targetDoc, dupRef, originX, originY, i, d, ab, t, k;
if (pages > 100) {
alert('超过画板上限,可尝试将数据分组载入...');
return
}
targetDoc = app.documents.add(DocumentColorSpace.CMYK, wh, ht, pages, DocumentArtboardLayout.GridByRow, 20.0, Math.round(Math.sqrt(pages)));
sourceDoc.activate();
for (d = 0; d < sourceDoc.dataSets.length; d++) {
sourceDoc.dataSets[d].display();
dupRef = sourceGroup.duplicate();
targetLayer = d === 0 ? targetDoc.layers[0] : targetDoc.layers.add();
dupRef.moveToEnd(targetLayer);
}
targetDoc.layers.add();
sourceDoc.close(SaveOptions.DONOTSAVECHANGES);
ab = 0;
for (i = targetDoc.layers.length - 1; i > 0; i -= itemPP) {
originX = targetDoc.artboards[ab].artboardRect[0];
originY = targetDoc.artboards[ab].artboardRect[1];
k = -1;
for (t = 0; t < itemPP; t++) {
if ((i - t) < 1) break;
if (t % repeatx == 0) {
k++;
}
dupRef = targetDoc.layers[i - t].groupItems[0];
dupRef.left = originX + offsetX + itemWh * (t % repeatx);
dupRef.top = originY - offsetY - itemHt * k;
}
ab++;
}
}
function datasetMerge() {
try {
btMsg(datasetMakeup.toSource() + '();');
} catch (e) {
alert(e);
}
}
function exportPDF() {
var export_PDF = function () {
var PDF = new PDFSaveOptions();
PDF.preserveEditability = false;
PDF.embedAllFonts = true;
PDF.viewAfterSaving = false;
var doc = app.activeDocument;
var dataFolder = new Folder('~/Desktop/Datasets');
if (!dataFolder.exists) dataFolder.create();
for (var i = 0; i < doc.dataSets.length; i++) {
doc.dataSets[i].display();
var myFile = new File(dataFolder + '/' + doc.dataSets[i].name);
doc.saveAs(myFile, PDF);
}
}
try {
btMsg(export_PDF.toSource() + '();');
} catch (e) {
alert(e);
}
}
function printDs() {
var func = function () {
var doc = app.activeDocument;
for (var i = 0; i < doc.dataSets.length; i++) {
doc.dataSets[i].display();
$.sleep(200);
doc.print();
}
}
try {
btMsg(func.toSource() + '();')
} catch (e) {
alert(e);
}
}
function helpme() {
var message = '* CSV文件首行用于命名变量,需符合XML规则(不含空格等特殊字符),链接图数据列放置于最后,一律命名"image",路径参照"C:\\dir\\file.jpg"录入 \
* 请事先创建相应数目占位符对象也即建立好模板再运行脚本(若勾选增选图像源则占位符计数 + 1)。动态可视路径仅供娱乐,数量以数据列数为上限\
* 数据组打印, 请先使用{文件>打印}命令,作好各项打印设置,点击完成后再点按钮执行\
* 合并数据组,根据页面大小将所有数据组拷贝至新文档进行自动拼版,请注意页数需 < AI画板上限\
* 推荐将复杂非变量图形建立为符号,运行合并命令前需绘制定界矩形于最上层,并将所有对象编组\
* 作者: animalia 跳入苹果 2011-7';
return message;
}
@moluapple
Copy link
Author

The swf file packaged in zxp extension can be downloaded from http://k.min.us/ibyxIm.zxp

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment