PhotoShopScript JavaScript – 3Dcoatのファイル処理

うーん、微妙なスクリプトだ。
3Dcoatのファイルメニューから、
テクスチャ>エクスポート>深度、カラー、スペキュラと共にレイヤーをエクスポート
を実行すると、いくつかファイルが生成されます。
(ファイル名).color.psd
(ファイル名).depth.exr
(ファイル名).layers_xml
(ファイル名).specular.psd
の4種類です。

 

やりたかったことは、フォトショップに持っていった時に、レイヤーのグループ状態や表示状態を
3Dcoatと合わせたかったのです。
ただ、グループの仕様はフォトショップと3Dcoatで違いがあり、自由にターゲットが選べる3Dcoatとは違い、
フォトショップでは、グループ同士が上下に存在していなければなりません。
そこの部分はスクリプトではどうしようもなかったので、作りませんでした。
3Dcoatで「リンクするレイヤー」が設定されているレイヤーは下のレイヤーとグループになる。
という処理になっております。

 

使用方法ですが、
吐き出した、(ファイル名).color.psdをフォトショップで開き、スクリプトを実行します。
スクリプトは、
C:\Program Files (x86)\Adobe\Adobe Photoshop CS2\プリセット\スクリプト\
等に入れれば、フォトショップのファイルメニュー、ファイル>スクリプトに表示されます。
xmlファイルに記載されている情報を読み取り、レイヤーを操作しているだけです。

 

出来れば3Dcoatから直接送られてきたデータでも同じようにしたいのですが、中々難しい、、
xmlファイルを作らなくても3bファイルをテキストエディタで開くと、先頭部分に同じ記述があるので、
それを読み込みたいが、Pythonのように特定の文字列でファイルの読み込みを止める方法が分からない。
さすがに全部読み込むのは気がひけるなぁ、、

 

ということで中途半端なスクリプトです。

function coat_file()
{
	if (!app.documents)
	{
		return;
	}
	docRef = app.activeDocument;
	xmlFileName = docRef.name;
	xmlFileName = xmlFileName.split(".")[0]
	xmlFilePath = docRef.path+"/"+xmlFileName+".layers_xml";
	fileObj = new File(xmlFilePath);
	if (fileObj.exists)
	{
		read_xml_file(fileObj);
	}else{
		alert("xmlファイルが見つかりません");
		return;
	}
}
function read_xml_file(fileObj)
{
	try{
		fileObj.open("r");
	}catch(e){
		alert(fileObj.name + " ファイルが開けませんでした")
		return;
	}
	texts = fileObj.read();
	lines = texts.split("\n");
	fileObj.close();
	layName = [];
	layGroup = [];
	layVisible = [];
	for (i=0;i<lines.length;i++)
	{
		if (lines[i].indexOf("<Name>") != -1)
		{
			layName.push(lines[i].split("<Name>")[1].split("</Name>")[0]);
		}
		if (lines[i].indexOf("<LinkedLayer>") != -1)
		{
			layGroup.push(lines[i].split("<LinkedLayer>")[1].split("</LinkedLayer>")[0]);
		}
		if (lines[i].indexOf("<Visible>") != -1)
		{
			layVisible.push(lines[i].split("<Visible>")[1].split("</Visible>")[0]);
		}
	}
	for (i=0;i<layName.length;i++)
	{
		if (layGroup[i] != "NO_LINK" && !docRef.layers[layName[i]].grouped)
		{
			docRef.activeLayer = docRef.layers[layName[i]];
			group_layer();
		}
		if (layVisible[i] != "true")
		{
			docRef.layers[layName[i]].visible = false;
		}
	}
}
function group_layer()
{
	var idGrpL = charIDToTypeID( "GrpL" );
	var desc2 = new ActionDescriptor();
	var idnull = charIDToTypeID( "null" );
	var ref1 = new ActionReference();
	var idLyr = charIDToTypeID( "Lyr " );
	var idOrdn = charIDToTypeID( "Ordn" );
	var idTrgt = charIDToTypeID( "Trgt" );
	ref1.putEnumerated( idLyr, idOrdn, idTrgt );
	desc2.putReference( idnull, ref1 );
	executeAction( idGrpL, desc2, DialogModes.NO );
}
coat_file()

テキストエディタにコピペし、(適当なファイル名).jsと拡張子を付けて保存してください。

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です