Created
July 7, 2011 16:11
-
-
Save moluapple/1069865 to your computer and use it in GitHub Desktop.
Datasets Magic
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The swf file packaged in zxp extension can be downloaded from http://k.min.us/ibyxIm.zxp