[webデザイン]イラレの書き出しで困らない為のスクリプトをご紹介
Penseur
2018.01.16
web制作でイラレを使われる方の悩みでよくあるのが、
アセットで書き出ししたときはマスク部分も書き出されてしまうので
マスク分の透明部分ができてしまい、非常に厄介である。
という経験を1度はされたことがあるとは思います。
そこで、弊社の新人プログラマーに頼み込んで
「マスク付きでも選択したオブジェクトをアートボード」に書き出すスクリプトを作ってもらい、
ショートカットキーで動くようにSPAiというソフトウェアを使用したら、楽々に切り出しができるではありませんか!
この喜びを誰かに共有しなければ!一刻も早く!!!!!
というわけで、社内共有して書き出しの効率化を図っております。
がまだベータ版の為、不具合も少々ありますが気にならない程度です。
書き出しに困っている方がおられましたら、
以下に、ソースを記載しますのでコピペしていただきテキストエディタ等で
適当な名前をつけて、拡張子は.jsxで保存してください。
//選択されたオブジェクトを格納
var selectedObj = activeDocument.selection;
function reduceAppearances(){
var ac = '/version 3'
+ '/name [ 6'
+ ' 657870616e64'
+ ']'
+ '/isOpen 0'
+ '/actionCount 1'
+ '/action-1 {'
+ ' /name [ 6'
+ ' 657870616e64'
+ ' ]'
+ ' /keyIndex 0'
+ ' /colorIndex 0'
+ ' /isOpen 0'
+ ' /eventCount 1'
+ ' /event-1 {'
+ ' /useRulersIn1stQuadrant 0'
+ ' /internalName (adobe_commandManager)'
+ ' /localizedName [ 33'
+ ' e383a1e3838be383a5e383bce9a085e79baee381abe382a2e382afe382bbe382'
+ ' b9'
+ ' ]'
+ ' /isOpen 0'
+ ' /isOn 1'
+ ' /hasDialog 0'
+ ' /parameterCount 3'
+ ' /parameter-1 {'
+ ' /key 1769238125'
+ ' /showInPalette 4294967295'
+ ' /type (ustring)'
+ ' /value [ 11'
+ ' 657870616e645374796c65'
+ ' ]'
+ ' }'
+ ' /parameter-2 {'
+ ' /key 1818455661'
+ ' /showInPalette 4294967295'
+ ' /type (ustring)'
+ ' /value [ 27'
+ ' e382a2e38394e382a2e383a9e383b3e382b9e38292e58886e589b2'
+ ' ]'
+ ' }'
+ ' /parameter-3 {'
+ ' /key 1668114788'
+ ' /showInPalette 4294967295'
+ ' /type (integer)'
+ ' /value 148'
+ ' }'
+ ' }'
+ '}';
var tmp = File(Folder.desktop + "/tmpSet1.aia");
tmp.open('w');
tmp.write(ac);
tmp.close();
app.loadAction(tmp);
app.doScript("expand", "expand", false);
app.unloadAction("expand","");
tmp.remove();
}
//アートボード用rectを生成する関数
var newRect = function(x, y, width, height) {
var l = 0;
var t = 1;
var r = 2;
var b = 3;
var rect = [];
rect[l] = x;
rect[t] = y;
rect[r] = width + x;
rect[b] = -(height - rect[t]);
return rect;
};
//パスのオブジェクトに行う処理
function pathItemsProcess(items) {
var itemsLength = items.length;
for(var i=0;i < itemsLength; i++) {
if(process(items[i])) {
return items[i];
}
}
return false;
}
//グループのオブジェクトに行う処理
function groupItemsProcess(items) {
var itemsLength = items.length;
var clippingPath;
for(var i=0;i < itemsLength; i++) {
if(items[i].clipped) {
return pathItemsProcess(items[i].pathItems);
}
if(items[i].groupItems.length > 0) {
clippingPath = groupItemsProcess(items[i].groupItems);
}
}
return clippingPath;
}
//処理自体
function process(item) {
return item.clipping;
}
//クリッピングパスを見つけ出してそのオブジェクトを返す
function findClippingPath(obj) {
var groupItemsLength = obj.groupItems ? obj.groupItems.length : 0;
var clippingPath;
if(obj.clipped) {
clippingPath = pathItemsProcess(obj.pathItems);
return clippingPath;
}
if(groupItemsLength) {
clippingPath = groupItemsProcess(obj.groupItems);
}
if(clippingPath) {
return clippingPath;
} else {
return obj;
}
}
//アートボードを追加する
function addArtbord(obj) {
var artboard = activeDocument.artboards.add(activeDocument.artboards[0].artboardRect);
var baseObj = findClippingPath(obj);
var flag = false;
var groupItemsLength = obj.groupItems ? obj.groupItems.length : 0;
var pathItemsLength = obj.pathItems ? obj.pathItems.length : 0;
var i=0;
if(baseObj != obj) {
for(i=0; i < groupItemsLength; i++) {
if(obj.groupItems[i] != baseObj.parent && (obj.groupItems[i].width > baseObj.width || obj.groupItems[i].height > baseObj.height)) {
flag = true;
break;
}
}
for(i=0; i < pathItemsLength; i++) {
if(obj.pathItems[i] != baseObj.parent && (obj.pathItems[i].width > baseObj.height || obj.pathItems[i].width > baseObj.height)) {
flag = true;
break;
}
}
if(flag) {
var missObj = baseObj.parent.duplicate(obj.parent,ElementPlacement.INSIDE);
var basePos = baseObj.parent.parent;
var baseWidth = Math.ceil(baseObj.width.toFixed(1));
var baseHeight = Math.ceil(baseObj.height.toFixed(1));
var baseX = Math.round(baseObj.position[0]);
var baseY = Math.round(baseObj.position[1]);
baseObj.parent.remove();
var x = 0;
var y = 0;
var xw = 0;
var yh = 0;
obj.position = [ Math.round(obj.position[0]), Math.round(obj.position[1]) ];
if(baseX > obj.position[0]) {
x = obj.position[0];
} else {
x = baseX;
}
if(baseY > obj.position[1]) {
y = baseY;
} else {
y = obj.position[1];
}
if(baseX + baseWidth > obj.position[0] + obj.width) {
xw = baseX + baseWidth;
} else {
xw = obj.position[0] + obj.width;
}
if(baseHeight - baseY < obj.height - obj.position[1]) {
yh = -(obj.height - obj.position[1]);
} else {
yh = -(baseHeight - baseY);
}
artboard.artboardRect = [x,y,xw,yh];
missObj.move(basePos,ElementPlacement.INSIDE);
return;
}
}
baseObj.position = [ Math.round(baseObj.position[0]), Math.round(baseObj.position[1]) ];
artboard.artboardRect = newRect(baseObj.position[0],baseObj.position[1],Math.ceil(baseObj.width.toFixed(1)),Math.ceil(baseObj.height.toFixed(1)));
//baseObj.position = [ Math.round(baseObj.position[0]), Math.round(baseObj.position[1]) ];
//var missObj = baseObj.parent.duplicate(obj.parent,ElementPlacement.INSIDE);
//baseObj.parent.remove();
//artboard.artboardRect = newRect(baseObj.position[0],baseObj.position[1],Math.ceil(baseObj.width.toFixed(1)),Math.ceil(baseObj.height.toFixed(1)));
//artboard.artboardRect = newRect(obj.position[0],obj.position[1],Math.ceil(obj.width.toFixed(1)),Math.ceil(obj.height.toFixed(1)));
}
/*
var effect = '<LiveEffect name="Adobe Drop Shadow"><Dict data="R horz 0 I blnd 1 R opac 0 R dark 0 B pair 0 I csrc 0 R vert 0 R blur 0 B usePSLBlur 0 I Adobe Effect Expand Before Version 16 "/></LiveEffect>';
for( i=0; i<selectedObj.length; i++ ) {
selectedObj[i].applyEffect(effect);
}
*/
//選択したオブジェクトにアピアランスの分割をかける
//reduceAppearances();
app.executeMenuCommand('expandStyle');
//メイン処理
if( selectedObj.length == 0 ) {
alert("アートボード書き出しオブジェクトを選択してください。");
} else {
for( i=0; i<selectedObj.length; i++ ) {
addArtbord(selectedObj[i]);
//selectedObj[i].isIsolated = true;
}
}
/*
var zigzag = '<LiveEffect name="Adobe Zigzag">'
+ '<Dict data="R roundness 0 R relAmount 4.026 R amount 4.026 R absoluteness 1 R ridges 17 " />'
+ '</LiveEffect>';
var trans = '<LiveEffect name="Adobe Transform">'
+ '<Dict data="B transformPatterns 1 B transformObjects 1 R moveH_Pts 8 B randomize 0 '
+ 'I numCopies 90 B scaleLines 1 R scaleH_Percent 100 I pinPoint 4 R scaleH_Factor 1 R moveV_Pts 0 '
+ 'B reflectY 0 R rotate_Radians 0 R scaleV_Factor 1 '
+ 'R scaleV_Percent 100 B reflectX 0 R rotate_Degrees 0 " /></LiveEffect>';
var clr = app.activeDocument.gradients[1];
var pt = [[40,-328],[40,-470]];
tg = app.activeDocument.pathItems.add();
var pt0 = tg.pathPoints.add();
pt0.anchor = pt[0];
pt0.leftDirection = pt[0];
pt0.rightDirection = pt[0];
var pt1 = tg.pathPoints.add();
pt1.anchor = pt[1];
pt1.leftDirection = pt[1];
pt1.rightDirection = pt[1];
tg.strokeColor = app.activeDocument.swatches.getByName('色あせた空').color;
tg.strokeColor.origin = [50,-352];
tg.strokeColor.angle = 0;
tg.strokeColor.length = 5.66929133858138;
tg.strokeColor.hiliteAngle = 0;
tg.strokeColor.hiliteLength = 0;
tg.fillColor = app.activeDocument.swatches[0].color;
tg.strokeWidth = 5.66929133858138;
tg.strokeDashes = [0,8];
tg.strokeCap = StrokeCap.PROJECTINGENDCAP;
tg.strokeJoin = StrokeJoin.MITERENDJOIN;
tg.strokeDashOffset = 0;
tg.applyEffect(zigzag);
tg.applyEffect(trans);
*/
※まだベータ版の為、不具合が発生する場合もございますので使用は自己責任でお願いいたします。
使い方は簡単で、作成したxxxx.jsxを
/Applications/Adobe Illustrator CC 2017/Presets/ja_JP/スクリプト/
に格納することで使用することができます。
またSPAiを使用することでショートカットキーで発動しますので、
非常に作業効率が計れます!
アセットで書き出ししたときはマスク部分も書き出されてしまうので
マスク分の透明部分ができてしまい、非常に厄介である。
という経験を1度はされたことがあるとは思います。
そこで、弊社の新人プログラマーに頼み込んで
「マスク付きでも選択したオブジェクトをアートボード」に書き出すスクリプトを作ってもらい、
ショートカットキーで動くようにSPAiというソフトウェアを使用したら、楽々に切り出しができるではありませんか!
この喜びを誰かに共有しなければ!一刻も早く!!!!!
というわけで、社内共有して書き出しの効率化を図っております。
がまだベータ版の為、不具合も少々ありますが気にならない程度です。
書き出しに困っている方がおられましたら、
以下に、ソースを記載しますのでコピペしていただきテキストエディタ等で
適当な名前をつけて、拡張子は.jsxで保存してください。
//選択されたオブジェクトを格納
var selectedObj = activeDocument.selection;
function reduceAppearances(){
var ac = '/version 3'
+ '/name [ 6'
+ ' 657870616e64'
+ ']'
+ '/isOpen 0'
+ '/actionCount 1'
+ '/action-1 {'
+ ' /name [ 6'
+ ' 657870616e64'
+ ' ]'
+ ' /keyIndex 0'
+ ' /colorIndex 0'
+ ' /isOpen 0'
+ ' /eventCount 1'
+ ' /event-1 {'
+ ' /useRulersIn1stQuadrant 0'
+ ' /internalName (adobe_commandManager)'
+ ' /localizedName [ 33'
+ ' e383a1e3838be383a5e383bce9a085e79baee381abe382a2e382afe382bbe382'
+ ' b9'
+ ' ]'
+ ' /isOpen 0'
+ ' /isOn 1'
+ ' /hasDialog 0'
+ ' /parameterCount 3'
+ ' /parameter-1 {'
+ ' /key 1769238125'
+ ' /showInPalette 4294967295'
+ ' /type (ustring)'
+ ' /value [ 11'
+ ' 657870616e645374796c65'
+ ' ]'
+ ' }'
+ ' /parameter-2 {'
+ ' /key 1818455661'
+ ' /showInPalette 4294967295'
+ ' /type (ustring)'
+ ' /value [ 27'
+ ' e382a2e38394e382a2e383a9e383b3e382b9e38292e58886e589b2'
+ ' ]'
+ ' }'
+ ' /parameter-3 {'
+ ' /key 1668114788'
+ ' /showInPalette 4294967295'
+ ' /type (integer)'
+ ' /value 148'
+ ' }'
+ ' }'
+ '}';
var tmp = File(Folder.desktop + "/tmpSet1.aia");
tmp.open('w');
tmp.write(ac);
tmp.close();
app.loadAction(tmp);
app.doScript("expand", "expand", false);
app.unloadAction("expand","");
tmp.remove();
}
//アートボード用rectを生成する関数
var newRect = function(x, y, width, height) {
var l = 0;
var t = 1;
var r = 2;
var b = 3;
var rect = [];
rect[l] = x;
rect[t] = y;
rect[r] = width + x;
rect[b] = -(height - rect[t]);
return rect;
};
//パスのオブジェクトに行う処理
function pathItemsProcess(items) {
var itemsLength = items.length;
for(var i=0;i < itemsLength; i++) {
if(process(items[i])) {
return items[i];
}
}
return false;
}
//グループのオブジェクトに行う処理
function groupItemsProcess(items) {
var itemsLength = items.length;
var clippingPath;
for(var i=0;i < itemsLength; i++) {
if(items[i].clipped) {
return pathItemsProcess(items[i].pathItems);
}
if(items[i].groupItems.length > 0) {
clippingPath = groupItemsProcess(items[i].groupItems);
}
}
return clippingPath;
}
//処理自体
function process(item) {
return item.clipping;
}
//クリッピングパスを見つけ出してそのオブジェクトを返す
function findClippingPath(obj) {
var groupItemsLength = obj.groupItems ? obj.groupItems.length : 0;
var clippingPath;
if(obj.clipped) {
clippingPath = pathItemsProcess(obj.pathItems);
return clippingPath;
}
if(groupItemsLength) {
clippingPath = groupItemsProcess(obj.groupItems);
}
if(clippingPath) {
return clippingPath;
} else {
return obj;
}
}
//アートボードを追加する
function addArtbord(obj) {
var artboard = activeDocument.artboards.add(activeDocument.artboards[0].artboardRect);
var baseObj = findClippingPath(obj);
var flag = false;
var groupItemsLength = obj.groupItems ? obj.groupItems.length : 0;
var pathItemsLength = obj.pathItems ? obj.pathItems.length : 0;
var i=0;
if(baseObj != obj) {
for(i=0; i < groupItemsLength; i++) {
if(obj.groupItems[i] != baseObj.parent && (obj.groupItems[i].width > baseObj.width || obj.groupItems[i].height > baseObj.height)) {
flag = true;
break;
}
}
for(i=0; i < pathItemsLength; i++) {
if(obj.pathItems[i] != baseObj.parent && (obj.pathItems[i].width > baseObj.height || obj.pathItems[i].width > baseObj.height)) {
flag = true;
break;
}
}
if(flag) {
var missObj = baseObj.parent.duplicate(obj.parent,ElementPlacement.INSIDE);
var basePos = baseObj.parent.parent;
var baseWidth = Math.ceil(baseObj.width.toFixed(1));
var baseHeight = Math.ceil(baseObj.height.toFixed(1));
var baseX = Math.round(baseObj.position[0]);
var baseY = Math.round(baseObj.position[1]);
baseObj.parent.remove();
var x = 0;
var y = 0;
var xw = 0;
var yh = 0;
obj.position = [ Math.round(obj.position[0]), Math.round(obj.position[1]) ];
if(baseX > obj.position[0]) {
x = obj.position[0];
} else {
x = baseX;
}
if(baseY > obj.position[1]) {
y = baseY;
} else {
y = obj.position[1];
}
if(baseX + baseWidth > obj.position[0] + obj.width) {
xw = baseX + baseWidth;
} else {
xw = obj.position[0] + obj.width;
}
if(baseHeight - baseY < obj.height - obj.position[1]) {
yh = -(obj.height - obj.position[1]);
} else {
yh = -(baseHeight - baseY);
}
artboard.artboardRect = [x,y,xw,yh];
missObj.move(basePos,ElementPlacement.INSIDE);
return;
}
}
baseObj.position = [ Math.round(baseObj.position[0]), Math.round(baseObj.position[1]) ];
artboard.artboardRect = newRect(baseObj.position[0],baseObj.position[1],Math.ceil(baseObj.width.toFixed(1)),Math.ceil(baseObj.height.toFixed(1)));
//baseObj.position = [ Math.round(baseObj.position[0]), Math.round(baseObj.position[1]) ];
//var missObj = baseObj.parent.duplicate(obj.parent,ElementPlacement.INSIDE);
//baseObj.parent.remove();
//artboard.artboardRect = newRect(baseObj.position[0],baseObj.position[1],Math.ceil(baseObj.width.toFixed(1)),Math.ceil(baseObj.height.toFixed(1)));
//artboard.artboardRect = newRect(obj.position[0],obj.position[1],Math.ceil(obj.width.toFixed(1)),Math.ceil(obj.height.toFixed(1)));
}
/*
var effect = '<LiveEffect name="Adobe Drop Shadow"><Dict data="R horz 0 I blnd 1 R opac 0 R dark 0 B pair 0 I csrc 0 R vert 0 R blur 0 B usePSLBlur 0 I Adobe Effect Expand Before Version 16 "/></LiveEffect>';
for( i=0; i<selectedObj.length; i++ ) {
selectedObj[i].applyEffect(effect);
}
*/
//選択したオブジェクトにアピアランスの分割をかける
//reduceAppearances();
app.executeMenuCommand('expandStyle');
//メイン処理
if( selectedObj.length == 0 ) {
alert("アートボード書き出しオブジェクトを選択してください。");
} else {
for( i=0; i<selectedObj.length; i++ ) {
addArtbord(selectedObj[i]);
//selectedObj[i].isIsolated = true;
}
}
/*
var zigzag = '<LiveEffect name="Adobe Zigzag">'
+ '<Dict data="R roundness 0 R relAmount 4.026 R amount 4.026 R absoluteness 1 R ridges 17 " />'
+ '</LiveEffect>';
var trans = '<LiveEffect name="Adobe Transform">'
+ '<Dict data="B transformPatterns 1 B transformObjects 1 R moveH_Pts 8 B randomize 0 '
+ 'I numCopies 90 B scaleLines 1 R scaleH_Percent 100 I pinPoint 4 R scaleH_Factor 1 R moveV_Pts 0 '
+ 'B reflectY 0 R rotate_Radians 0 R scaleV_Factor 1 '
+ 'R scaleV_Percent 100 B reflectX 0 R rotate_Degrees 0 " /></LiveEffect>';
var clr = app.activeDocument.gradients[1];
var pt = [[40,-328],[40,-470]];
tg = app.activeDocument.pathItems.add();
var pt0 = tg.pathPoints.add();
pt0.anchor = pt[0];
pt0.leftDirection = pt[0];
pt0.rightDirection = pt[0];
var pt1 = tg.pathPoints.add();
pt1.anchor = pt[1];
pt1.leftDirection = pt[1];
pt1.rightDirection = pt[1];
tg.strokeColor = app.activeDocument.swatches.getByName('色あせた空').color;
tg.strokeColor.origin = [50,-352];
tg.strokeColor.angle = 0;
tg.strokeColor.length = 5.66929133858138;
tg.strokeColor.hiliteAngle = 0;
tg.strokeColor.hiliteLength = 0;
tg.fillColor = app.activeDocument.swatches[0].color;
tg.strokeWidth = 5.66929133858138;
tg.strokeDashes = [0,8];
tg.strokeCap = StrokeCap.PROJECTINGENDCAP;
tg.strokeJoin = StrokeJoin.MITERENDJOIN;
tg.strokeDashOffset = 0;
tg.applyEffect(zigzag);
tg.applyEffect(trans);
*/
※まだベータ版の為、不具合が発生する場合もございますので使用は自己責任でお願いいたします。
使い方は簡単で、作成したxxxx.jsxを
/Applications/Adobe Illustrator CC 2017/Presets/ja_JP/スクリプト/
に格納することで使用することができます。
またSPAiを使用することでショートカットキーで発動しますので、
非常に作業効率が計れます!