Photoshop とつながりました

Adobe 社が Photoshop と Websocket 通信できる UXP のサンプルを公開していたので、意外とあっさり Photoshop との接続に成功しました。

ただの Hello world で恐縮ですが :sweat_smile: 今後様々なアプリと Cubism が連携すると思うと、すごくワクワクしてきますね!

【外部アプリ連携を使ってみて】

▼要望①:cmo3 ファイルへの書き込み

今のところ “GetParameterValues” などの提供されているメソッド群は cmo3 ファイルからのリードオンリーなものばかりですが、今後 cmo3 に対し「書き込み可能」なメソッド群が提供されると便利になるかなと感じました。

例えば “MakeParameter” “DeletePalameter” のようなメソッド群が搭載されますと、以下のような軽い実装要望はプラグイン開発者が巻き取れると思います。

▼要望②:PSD ファイルへのアクセスと操作

今回の検証で Photoshop と連携できたので、Cubism 側から PSD やモデル用画像を直接操作できる書き込み可能メソッドが提供されますと、便利になるかなと思いました。

“ReloadPSD” → 指定された PSD ファイルが現在のドキュメントに存在していたらリロードする
“ReloadPSDLayers” → 指定されたレイヤーだけをリロードしてモデル用画像に適用する

などなど。再インポート時のPSD の全リロードは、モデラー側としては意外と長い待ち時間だったりします :sweat_smile:

* * *

今後の開発のご参考になりますと、幸いです。

「いいね!」 3

【Photoshop連携・第二章】

動画の通り、Photoshop で引いた作業用パスのアンカーポイント座標が UXP 側で取れました。

https://developer.adobe.com/photoshop/uxp/2022/ps_reference/classes/pathitem/

試しに Cubism でアートメッシュを手打ちし、その座標を目視で照会したところ、わずかな誤差はあるものの概ね一致。

つまり作業用パスの座標が Cubism でのモデリングに利用できる可能性を秘めてきます。

* * *

▼要望①:MakeArtMeshVertexFromCoordinate( var ancors )

編集モードが “ModelingMeshEdit” の場合、JSON送信された座標に頂点を打ち、アートメッシュを自動形成するメソッドがあるといいなと思います!

こちらの要望が巻き取れて、幾何学的形状や円のように美しいアートメッシュが PhotoShop 先輩のパワーで作れるようになるかな~と感じます。

▼要望②:MakeStroke( int MeshWidht, int interval, int ControlPointNum, var ancors )

編集モードが “ModelingMeshEdit” の場合、JSON送信された座標を「ストロークによるメッシュ割り(β)」の制御点へプロット。引数でメッシュ幅や折り返しの間隔、幅の頂点数を指定できるとなお良いかと思います!

特に「輪郭」のモデリングが効率化できそう。絵師様と Vtuber の数だけ輪郭のバリエーションが存在し、最も丁寧なアートメッシュ形成が求められる部位であるためです。

スカートの稜線にもパスから自動生成できると、時短になりそうですね!

▼要望③:MakeWarpDeformerFromRectangle( int 分割数etc… )

編集モードが “Modeling” の場合、JSON送信された矩形座標を「ワープデフォーマ」に変換します。

* * *

Photoshop を深く知り使いこなすことが、さらなる効率化につながりそうな気がいたしました。今後の開発の参考になりますと、幸いです。

【追記・JavaScript】

関数を core に詰め込んで executeAsModal で実行しないといけないようでした。

function GetPathAncorpoints()
{
	const PScore = require( "photoshop" ).core;
	const app = require( "photoshop" ).app;
	
	PScore.executeAsModal( async() =>
	{
	    try
	    {
			const currentPathItem = app.activeDocument.pathItems[0];
			var ancors = currentPathItem.subPathItems[0].pathPoints;
			console.warn( "★ " + currentPathItem.name + " のアンカーポイント数 = " + ancors.length );
			
			for( var p of ancors )
			{
				console.warn( "★座標 = " + p.anchor );
			}
			
			//@ToDo JSONにして WebSocket 送信
	    }
	    catch( e )
	    {
			console.log( e );
	    }
	});
}
「いいね!」 1