スポンサーサイト

Tags :
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

3DCGソフト『Blender』のDTPer的な利用法



DTPの制作現場に携わってると時々「この文字を立体的に表現できる?」なんてリクエストを受ける事がありますが、最近ではAdobeのアプリに3D表現の機能が充実してきたので、昔みたいにサードパーティーのプラグインを使ったりしなくてもお手軽に立体表現ができる様になってきました。ただ、どうしても「いかにも」な感じになったり、質感が乏しかったりで、先方が首を縦に振ってくれる物を作るのが難しい場合も有ります。

そこで、フリーの3DCGソフトを使ってIllustrator等で表現するよりもリアルに文字や図形を立体化する方法を紹介したいと思います。3DCGを制作する際にスキルを要する「モデリング」の部分はIllustratorで作ったパスを使うので、あとは表面の質感(マテリアルやテクスチャ)、光源を設定してやる部分さえ何とか出来れば形になると思います。

フリーで使える3DCGソフトとして、自分はいつも『Blender』を使用しています。このソフトはその気になれば本格的な3DCGアニメーションが作れるくらい多機能なんですが、始めは独特なUIに面食らってしまって使い方を覚えるのにかなり苦労しました(慣れると手が勝手に動く様になるんですが)。今回の例では一部の基本的な機能だけを使っているので、『使い方さえ解れば』それほど難しくはないと思います。

BlenderはMac、Windows、Linux等各OS用が用意されていて、UIも全く同じなので違うプラットフォームでも違和感無く使う事が出来ますが、操作は3ボタンマウス必須なのでMacの場合は用意する必要が有るかも知れません。

Blenderの基本的な操作については以下のリンク先が参考になります。
JBDP Blender Documentation 日本語版
チュートリアル(本当に初めての方のために作成したBlenderチュートリアル) - WBS+(Web/Blender Studio+)
BlenderWiki

作業の流れとしては、
・立体化したい文字や図形などをIllustratorで作成し、アウトライン化したパスをファイルとして保存する。
・Illustratorで保存したファイル(パス)をBlenderでインポートする。
・Blender上で、パスの図形に厚みを与え、表面の材質(マテリアルやテクスチャ)を設定する。
・実際に出力するイメージに合わせたカメラアングルや光源の設定をする。
・必要な解像度でレンダリングし、画像ファイルとして出力する。
といった感じになります。ただBlender上での作業は狙った通りのイメージになるまでパラメータを弄りながらある程度試行錯誤する事になると思います。

今回はあくまで「こんな方法もある」といった事を紹介するのが主目的なので具体的な操作については割愛しますが、興味のある方は上記のリンク先等を参照してみてください。作業する上でハマりそうな部分や数値などが参考になりそうな部分はスクリーンショットを載せておきます。

では実際にウチのBlogのタイトル文字を立体化してみます。

まず、立体化したい文字等のアウトラインデータをIllustratorで作成し、『SVG形式』で保存します。A3のアートボード一杯くらいの大きめのサイズで作った方がBlenderでの作業が楽になります。


BlenderにはEPSやAIフォーマットのデータをインポートする機能も用意されてるんですが、いろいろ試した結果SVGで保存したものが一番安定してインポート出来る様でした。


Blenderで、保存したIllustratorのファイルをインポートします。


次に表示されるメニューではInkSpace(.svg)を選択、『Inport Options』は何も選択しない状態でOKすれば問題無くインポート出来ました。




で、インポートされたパスに厚みを付けるんですが、『Curve and Surface』パネル中の『Extrude』で文字の厚み(奥行き)、『Bevel Depth』で角を落とすサイズの値を設定します。Illustratorで作成したパスのサイズが小さいとBlender上で拡大しても小さな数値(0.001とか)で大きく変化するので注意が必要です。


文字のオブジェクトにマテリアルを設定し、光源やカメラを配置してレンダリングします。マテリアルは鏡面加工の金属ぽい質感になるよう設定しました。光源の配置が結構キモになったりするので、いろいろ試行錯誤していきます。


レンダリング結果。ターミネーター風。


今度は別のパスをインポートして下の様な画像をテクスチャとして設定し、レンダリングしてみます。




トランスフォーマー風になりました。


もちろんアングルを自由に変えられますし、このデータをそのまま使ってアニメーションにする事もできます。


実際の制作物ではレンダリングした画像だけで完結するのではなく、別の画像と合成して使う事になる場合もあると思いますが、そんな時は後々作業がやり易い様に、文字のマテリアルを完全に白く飛んでしまう設定にしてレンダリングし、文字部分のマスクとして使える物も作っておきます。

■2009.7.21追記 コメントにて教えていただきましたが、レンダリングの設定でFormatパネルのRGBAをオンにしてPNGで書き出せば、背景が透明に抜けた状態の画像が得られます。

レンダリングした画像を印刷物に使う場合、そのままではネムい仕上がりになってしまう事があるので(テクスチャの解像度が低い場合は特に)、適切なシャープネス処理が必要になります。


以上、非常に大雑把な説明でしたが、スキルを要するモデリングの部分をIllustratorのパスを使う事によって簡略化できるので、3DCGに興味はあるけど敷居が高いと感じてる人もこの辺りから手を付けると良いんではないでしょうか。画像を見ても分かる通りBlender標準のレンダラでも品質の高いレンダリングを行う事が出来ます。自分もほんのさわりの部分しか使ってませんが、Photoshopでのちょっとした合成用素材なんかを作るのにも重宝しています。
スポンサーサイト

JacvaScriptでInDesignやIllustratorのドキュメントに配置されているEPS画像の情報を取得する

じわじわと過去の物にされようとしているEPSですが、まだまだ製版の現場では出力用の画像として幅を利かせてると思います。が、InDesignやIllustratorでは配置されているEPS画像の解像度等の情報をJavaScriptで得るには画像ファイルを直接調べてみるしか無い様なので、そのための関数を書きました。

一応、IllustratorとInDesign両方で動く様になっています。InDesignの場合はEPSクラスのprototypeを拡張する書き方の方が良いかもしれませんが。

InDesignのJavaScript書く時いつも参考にしているサイト InDesign Scripting ReferenceのEPSクラスのプロパティの所に解像度を示す『actualPpi』『effectivePpi』の記述があるので、もしや?と思ったんですけど本当に値を持ってるのか確認できず…(for ~ inでオブジェクトを見たんですが解像度がらみのプロパティは表示されませんでした。ひょっとして英語版との差とかあるんでしょうか)

■使用例
以下の様に、配置された画像を引数として渡します。
/*
	epsObj は処理するEPS画像

	InDesignの場合はallGraphics等で得られるEPSオブジェクト
	Illustratorの場合はPlacedItemオブジェクトを渡す

*/

 //クリエータを得る
var creator = epsInfo.getCreator(epsObj);

//カラーモードを得る
var mode = epsInfo.getMode(epsObj);

 //エンコーディングを得る
var encoding = epsInfo.getEncoding(epsObj);

 //解像度を得る
var ppi = epsInfo.getPpi(epsObj);

//まとめて連想配列で得る
var epsInfoObj = epsInfo.getAll(epsObj);
最近のPhotoshopやIllustratorで保存されたEPSなら対応出来てると思いますが、変な訛りのあるEPSだとちゃんと動作しないかも知れません。処理出来なかった場合はundefinedが返ります。

■動作確認
MacOSX 10.5.7
InDesign CS4
Illustrator CS4
var epsInfo = {
	'parseHeader': function(imgObj) {
		if (imgObj.constructor.name == 'EPS') { 
			var f = new File(imgObj.itemLink.filePath); // InDesign
		} else if (imgObj.constructor.name == 'PlacedItem') {
			var f = new File(imgObj.file); // Illustrator
		} else {
			return [];
		}
		if (!f.open("r")) return [];
		for (var i=0; i<500; i++) {
			var line = f.readln();
			if (line.indexOf("%%Creator", 0) != -1) {
				var creator = line.slice(10);
			} else if (line.indexOf("%%HiResBoundingBox", 0) != -1) {
				var hrbbParams = line.split(" ");
			} else if (line.indexOf("%ImageData", 0) != -1) {
				var idParams = line.split(" ");
				break;
			}
		}
		f.close();
		return [creator, hrbbParams, idParams];
	},

	'getMode': function(imgObj) {
		var headerObj = this.parseHeader(imgObj);
		if (!headerObj[2]) return;
		var idParams = headerObj[2];
		switch(idParams[4]) {
			case "4":
				return "CMYK";
				break;
			case "3":
				return "RGB";
				break;
			case "2":
				return "Lab";
				break;
			case "1":
				return (idParams[3] == 1) ? "1bit" : "Gray";
				break;
			default:
				return;
		}
	},

	'getEncoding': function(imgObj) {
		var headerObj = this.parseHeader(imgObj);
		if (!headerObj[2]) return;
		var idParams = headerObj[2];
		switch(idParams[7]) {
			case "7":
				return "ASCII85";
				break;
			case "6":
				return "JPEG:Max";
				break;
			case "5":
				return "JPEG:High";
				break;
			case "4":
				return "JPEG:Mid";
				break;
			case "3":
				return "JPEG:Low";
				break;
			case "2":
				treturn "ASCII";
				break;
			case "1":
				return "Binary";
				break;
			default:
				return;
		}
	},

	'getPpi': function(imgObj) {
		var headerObj = this.parseHeader(imgObj);
		if (!headerObj[1] || !headerObj[2]) return;
		var hrbbParams = headerObj[1];
		var idParams = headerObj[2];
		var pt_x = hrbbParams[3];
		//var pt_y = hrbbParams[4];
		var px_x = idParams[1];
		//var px_y = idParams[2];
		return (px_x / pt_x * 72).toFixed(1);
	},

	'getCreator': function(imgObj) {
		var headerObj = this.parseHeader(imgObj);
		return headerObj[0] ? headerObj[0] : undefined;
	},

	'getAll': function(imgObj) {
		return {
			'creator': this.getCreator(imgObj),
			'mode': this.getMode(imgObj),
			'encoding': this.getEncoding(imgObj),
			'ppi': this.getPpi(imgObj)
		}
	}
}

配置されている画像を指定したサイズの矩形でマスクし、サイズと位置をフィットさせるIllustrator用JavaScript

Illustratorのドキュメントに配置されている画像を指定したサイズの矩形でマスクして、そのマスクに合うように画像をリサイズし、指定した間隔でファイル名順に並べて行くJavaScript。

例えば、こんな感じでドキュメントにフォルダからドラッグ&ドロップするなどして、無造作に画像を配置しておいて(分かりやすくする為にわざとバラバラに置いてますけど)、


このスクリプトを実行すると、マスクに使う矩形のサイズ、間隔、何列で並べるか等を入力するダイアログを表示するので、それらの数値を入力すると、


画像はドキュメントの左上を起点に、ファイル名順に並んでいきます。


画像は、マスクの矩形のセンターに来るように配置され、サイズはマスクよりほんのちょっとだけ大きくなる様リサイズされます。


■注意点
既にマスクされている画像、グループ化されている画像は処理されません。
ブラウザの環境(Safari等)でスクリプト中に『円マーク』が見えている場合は『バックスラッシュ』に置換する必要があります。
※表示されているコードの上の方にある『view plain』をクリックするとコードがプレーンテキストで表示される筈なんですが、Safari(3.2.1)だと動作しない様なので、対策考えておきます。対策済み。

■動作確認
MacOSX 10.5.6
Illustrator CS4
#target Illustrator

//マスクのサイズを入力するダイアログを表示
function askRectSettings() {
	var mes = 
		"dialog { alignChildren: 'center', \
			field1: Panel { orientation: 'column', alignChildren: 'right', \
				size: [180,72], text: 'マスクのサイズ', \
				size_w: Group { orientation: 'row', \
					s: StaticText { text: '幅:' }, \
					e: EditText { characters: 7, text: '50.0'}, \
					s2: StaticText { text: 'mm'} \
				}, \
				size_h: Group { orientation: 'row', \
					s: StaticText { text: '高さ:' }, \
					e: EditText { characters: 7, text: '50.0' } \
					s2: StaticText { text: 'mm' } \
				} \
			}, \
			field2: Panel { orientation: 'column', alignChildren: 'right', \
				size: [180,72], text: '画像間の余白', \
				margin_w: Group { orientation: 'row', \
					s: StaticText { text: '左右:' }, \
					e: EditText { characters: 7, text: '3.0'}, \
					s2: StaticText { text: 'mm'} \
				}, \
				margin_h: Group { orientation: 'row', \
					s: StaticText { text: '天地:' }, \
					e: EditText { characters: 7, text: '3.0' } \
					s2: StaticText { text: 'mm' } \
				} \
			}, \
			field3: Panel { orientation: 'column', \
				size: [180,40], text: '水平方向に並べる数', \
				column: Group { orientation: 'row', \
					e: EditText { characters: 3, text: '4' }, \
					s: StaticText { text: 'で折り返し' }, \
				} \
			}, \
			buttons: Group { orientation: 'row', \
				cancelBtn: Button { text:'Cancel', properties: { name: 'cancel'} }, \
				okBtn: Button { text: 'OK', properties: {name:'ok'} } \
			} \
		}";
	var dlg = new Window(mes);
	
	dlg.buttons.okBtn.onClick = function() {
		dlg.close(1);
	}

	dlg.center();
	var result = dlg.show();
	var w = dlg.field1.size_w.e.text;
	var h = dlg.field1.size_h.e.text;
	var mw = dlg.field2.margin_w.e.text;
	var mh = dlg.field2.margin_h.e.text;
	var co = dlg.field3.column.e.text;
	if (result == 1) {
		if (w != '' && h != '' && mw != '' && mh != '' && co !='') {
			try {
				return [eval(w), eval(h), eval(mw), eval(mh), eval(co)];
			} catch(e) {
				alert('数字を入力してください!');
				return false;
			}
		} else {
			alert('数値が入力されていません!');
			return false;
		}
	} else {
		return false;
	}
}

//PlacedItemsをファイル名でソートする
function sortPlacedItemsByName(plItems) {
	var retArr = [];
	var fNames = [];
	for (var i=0; i<plItems.length; i++) {
		var fn = plItems[i].file.name + plItems[i].file + i; //同名ファイルをユニークにするためパスと番号を追加
		plItems[i].name = fn
		fNames.push(fn);
	}
	fNames.sort();
	for (var i=0; i<fNames.length; i++) {
		retArr.push(plItems.getByName(fNames[i]));
	}
	return retArr;
}

//マスクされているかどうか
function isMasked(obj) {
	var p = obj.parent;
	while (p.constructor.name != 'Document') {
		if (p.clipped) {
			return true;
		} else {
			p = p.parent;
		}
	}
	return false;
}

//メイン
function clipAndFitImgs() {
	var doc = activeDocument;
	var P = sortPlacedItemsByName(doc.placedItems); //PlacedItemsをソートしておく
	
	var res = askRectSettings();
	if (!res) { return; }
	var ptm = 2.834645;
	var rect_w = res[0] * ptm; //mmに換算
	var rect_h = res[1] * ptm;
	var ofst_x = res[2] * ptm;
	var ofst_y = res[3] * ptm;
	var column = res[4];
	
	var sp = { //整列を開始する起点
		left: 0,
		top: doc.height
		}	
	var tgtImgs = [];		
	var rc = 0; //カウント用
	var cc = 0;
	
	var ro = doc.rulerOrigin;
	var ru = doc.rulerUnits;
	doc.rulerOrigin = [0, 0];
	doc.rulerUnits = 'Points';
	
	//マスク・グループ化されていないものを処理対象にする
	for (var i=0; i<P.length; i++) {
		if (!isMasked(P[i]) && P[i].parent.constructor.name != 'GroupItem') { tgtImgs.push(P[i]); } 
	}

	for (var i=0; i<tgtImgs.length; i++) {
		var ti = tgtImgs[i];
		var l = ti.parent;
		if ( l.constructor.name == 'Layer' ) { //不要?
			var g = l.groupItems.add();
			ti.moveToBeginning(g); //PathItemより先にPlacedItemをGroupItemに追加しないとマスクされない?
			var rect = g.pathItems.rectangle(sp.top - rect_h * rc - ofst_y * rc, sp.left + rect_w * cc + ofst_x * cc, rect_w, rect_h);
			cc++;
			if (cc == column) { 
				cc = 0;
				rc++;
			}
			ti.parent.clipped = true;
			var enl = Math.max((rect_w + 4) / ti.width, (rect_h + 4) / ti.height) * 100;
			ti.resize(enl, enl);
			//マスクに画像をフィットさせる
			//ti.move(rect, ElementPlacement.INSIDE);
			ti.top = (rect.top - rect.height / 2) + ti.height / 2;
			ti.left = (rect.left + rect.width / 2) - ti.width / 2;
		}
	}

	doc.rulerOrigin = ro;
	doc.rulerUnits = ru;
}


if (app.documents.length == 0) {
	alert('ドキュメントが開かれていません。');
} else {
	clipAndFitImgs();
}

選択したフォルダにある配置画像をマークで示すIllustrator用JavaScript

Illustratorドキュメントに配置されている画像が、『あるべきフォルダ』の中の物かどうかを一目でチェックするためのJavaScript。

ちょっと前のDTP駆け込み寺の掲示板の投稿
イラストレーターcs2での画像リンク
にもありましたが、Illustratorドキュメントを違う環境で開き直した時に、別の場所にある同名ファイルにリンクしてしまってないかチェックするのに使えるんじゃないでしょうか。

こんな感じのドキュメントで


スクリプトを実行すると、『配置された画像があるべきフォルダ』を選択するダイアログが表示されるので、対象のフォルダを選択します。


実行後、『選択したフォルダの中にある画像』が赤の■でマークされ、画像点数の情報を表示します。画像がマークより小さい場合は、画像のサイズに合わせてマークが小さくなります。『ユニークファイル数』は一つの画像を複数箇所に配置している場合に、実際のファイルの数のみをカウントした数値です。


これらの表示は『***画像マーク用』レイヤに作成されるので、チェックが終わったら削除してください。


■注意点
画像の一部をマスクしている場合にも、■マークはマスクではなく画像の中心に表示されます。
ネットワーク越しのフォルダを選択した場合、場所の表示は『/ボリューム名』から始まる形で表示されます。
ブラウザの環境等でスクリプト中に『円マーク』が見えている場合は『バックスラッシュ』に置換してから使用してください。

■動作確認
MacOSX 10.5.6
IllustratorCS4
#target Illustrator

function markImagesInSpecifiedFolder() {
	var doc = activeDocument;
	var images = doc.placedItems;
	var tgtPath = Folder.selectDialog ('選択したフォルダ内にある配置画像を■で表示します。');
	var L = doc.layers;
	var lName = '***画像マーク用';
	var rectSize = 50; //■マークのサイズ(pt)
	var rectMinSize = 25; //■マークの最小サイズ(pt)
	var sn1 = 'myResult1';
	var imgPathStrs = []; //配置された全ての画像ファイルのパスを格納
	var tgtImgPathStrs = []; //配置された画像の内、選択したフォルダにあるファイルのパスを格納
	var lostImgs = []; //リンク切れ画像を格納

	var ro = doc.rulerOrigin;
	doc.rulerOrigin = [0, 0];

	for (var i=0; i<L.length; i++) {
		if (L[i].name == lName) { L[i].remove(); }
	}

	var colors = {
		'magenta': setCmyk(0, 100, 0, 0),
		'white': setCmyk(0, 0, 0, 0),
		'nc': new NoColor()
		}

	var charStyles = doc.characterStyles;
	for (var i=0; i<charStyles.length; i++) {
		if (charStyles[i].name == sn1) { charStyles[i].remove(); }
	}

	//結果表示テキストのスタイルを設定
	var resultStyle = doc.characterStyles.add(sn1);
	var resultAttr = resultStyle.characterAttributes;
	resultAttr.size = 14;
	resultAttr.fillColor = colors.magenta;
	resultAttr.autoLeading = false; //行間を設定する場合はfalseにする
	resultAttr.leading = 22;

	var mkLayer = doc.layers.add();
	mkLayer.name = lName;

	//ドキュメント全体を半調にする為の矩形を作成
	var baseRect = mkLayer.pathItems.rectangle(doc.height + 10, -10, doc.width + 20, doc.height + 20);
	baseRect.fillColor = colors.white;
	baseRect.strokeColor = colors.magenta;
	baseRect.strokeWidth = 10;
	baseRect.opacity = 80;

	//全ての配置画像をチェックして行く
	var iLength = images.length;
	for (var i=0; i<iLength; i++) {
		var img = images[i];
		//リンク切れ対策
		try {
			var imgPath = img.file.parent.toString();
			imgPathStrs.push(img.file.toString());
		} catch(e) {
			var imgPath = '';
			lostImgs.push(img);
		}
		if (imgPath == tgtPath) {
			var rs = rectSize; //マークのサイズを初期値に
			tgtImgPathStrs.push(img.file.toString());
			//画像をマークする矩形を作成
			var w = img.width;
			var h = img.height;
			rs = Math.min(Math.min(rs, w), h);
			rs = Math.max(rs, rectMinSize);
			var ofst = rs / 2;
			var mkRect = mkLayer.pathItems.rectangle((img.top - h / 2) + ofst, (img.left + w / 2) - ofst, rs, rs);
			mkRect.fillColor = colors.magenta;
			mkRect.strokeColor = colors.nc;
			mkRect.strokeWidth = 0;
			mkRect.opacity = 80;
		}
	}

	//結果の文字を表示
	var lostMes = (lostImgs.length > 0) ? ' リンク切れ : ' + lostImgs.length + '点' : '';
	var mes = decodeURI(tgtPath) + '\r' + ' にある配置画像を■で表示しています' + '\r\r' +
			'配置画像の総数 : ' + images.length + '点 ' + lostMes + '\r' +
			decodeURI(tgtPath) + ' からの配置 : ' + tgtImgPathStrs.length + '点' + '(ユニークファイル数 : ' + uniqArr(tgtImgPathStrs).length + '点)';
	var result = mkLayer.textFrames.add();
	result.contents = mes;
	result.position = [0, doc.height + 140];
	result.characters.fillColor = colors.magenta;
	resultStyle.applyTo(result.textRange);

	doc.rulerOrigin = ro;
}

//CMYKカラー作成
function setCmyk(c, m, y, k) {
	col = new CMYKColor();
	col.cyan = c;
	col.magenta = m;
	col.yellow = y;
	col.black = k;
	return col;
};

//配列の値をユニークに(数値・文字列のみ可)
function uniqArr(arr) {
	var retArr = [];
	arr.sort();
	for (var i=0; i<arr.length; i++) {
		if (retArr[retArr.length-1] != arr[i]) { retArr.push(arr[i]); }
	}
	return retArr;
}

if (app.documents.length == 0) {
	alert('ドキュメントが開かれていません。');
} else {
	markImagesInSpecifiedFolder();
}

Illustratorでグラデーションの塗りを適用されたテキストを検索するJavaScript

ちょっと古いネタですけど、以前笹川%DTPオペさんのエントリ経由で見た、
イラレで、グラデーションの塗りを適用してしまったテキストを検索する方法?』from DTP駆け込み寺の掲示板
の投稿より。

Illustratorでテキストの塗りにグラデーションが適用されていても、一見するとただのスミ文字に見えていますが、


アウトライン化するとグラデーションがかかっています。


で、この一見スミ文字に見えているのに実はグラデーションが適用されている箇所を検索出来ないかと言う事なので、それ用のJavaScriptを書いてみました。
検索の処理自体はさほど難しくないんですが、テキストツールが入力状態(入力カーソルが出ている状態)だと、思った通りの動きをしてくれないのでその点でちょっと手間取りました。

このスクリプトを実行すると、テキストの塗りにグラデーションが適用されているテキストフレームを選択された状態にして、それが何カ所あったのかをダイアログで表示します。(バウンディングボックスの表示が有効になっているとちょっと見辛いかも知れません)


選択箇所の数を表示するダイアログ。


■注意点
使用の際はテキストツール以外のツールを選択しておく必要があります。
ブラウザの環境等でスクリプト中に『円マーク』が見えている場合は『バックスラッシュ』に置換してから使用してください。

■動作確認
MacOSX 10.5.6
Illustrator CS4
#target illustrator 

function selectGradientText() {
	var doc = activeDocument;
	var TF = doc.textFrames;
	var mes = 'テキストにグラデーションが適用されている箇所はありません。';
	doc.selection = null;
	for (var i=0; i<TF.length; i++) {
		L1: for (var j=0; j<TF[i].characters.length; j++) {
			if (TF[i].characters[j].fillColor == "[GradientColor]") {
				TF[i].selected = true;
				break L1;
			}
		}
	}
	try { 
		//テキストツールが入力状態の場合、選択されたオブジェクトがundefinedになる
		var cnt = doc.selection.length;
		if (cnt > 0) mes = 'グラデーションが適用された文字が含まれるテキストフレームを ' + cnt + '箇所 選択します。';
		alert(mes);
	} catch(e) {
		alert('テキストツールが選択されていると正しく動作しません。');
	}
}

if (app.documents.length == 0) {
	alert('ドキュメントが開かれていません。');
} else {
	selectGradientText();
}
Profile
choco
Author : choco

印刷・製版の現場を経て、広告制作会社でPhotoshopを使ったビジュアル制作を担当。

→現在は車載機器開発ベンダにて、組み込み3Dデータ作成やUIデザインなどを行っています。

Categories
Favorites


Search
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。