Hatena::ブログ(Diary)

MOCHI-MOCHI RSSフィード

QLOOKアクセス解析

2013-09-02

【Softimage】JSON読み書きプラグイン

SoftimageからJSONの読み書きが行いたかったのでネットで配布されているJSONライブラリjson2.jsをSoftimageプラグイン化してみました。
これを使えばSoftimageコマンドとしてJSON形式のファイルが読み書きできるはず。
※json2.jsについては他のページをご覧くださいませ。
 http://codezine.jp/article/detail/6533とかが良いかも...


http://bit.ly/SI_JSON2からファイルをダウンロードしてください。

◆使い方◆

//書き込み
var JSON_base = {}
JSON_base.AAA = "bafbababa";
JSON_base.BBB = "uuu";
MakeJSON ( "c:\\Test.json", 2, JSON_base );
//読み込み
var JSON = ReadJSON("c:\\Test.json")
logmessage(JSON.AAA)

以上です。簡単ですね〜。(説明も簡潔すぎる)
これで情報のやり取りが簡単になるはず^^

内容としては本当にjson2.jsをコマンド内にぶち込んだだけ。
ちなみに、

var JSON = JSON2();

とすることで自分でJSONオブジェクトを作成することもできます。

2013-04-28

Softimage的疑似クラスコマンド化について[Softimage Script][JScript]


先日会社でJScriptで疑似クラスを記述したJSファイルを見かけました。
その内容はエクセルを操作するための汎用的なクラスだったんですが
、他のスクリプトからはeval関数を利用してファイル内の文字列を読み込む形式だったんです。

特にそれ自体には問題ないんですけどね。
会社ではSIのワークグループをTortoiseSVNを使用して管理していたため、
eval関数を利用するとファイルがロックされていると認識されSVNからの更新に失敗してしまうなど、
食い合わせが悪かったのですよ。(=△=;

ということで、疑似クラスを自己インストールプラグイン化できないかなーと試してみました。
今回使用するクラスは以下。犬クラスです。
※クラスについて詳しくはググってください〜

var oDog = new clDog("ポチ");//クラスをインスタンス化する
logmessage(oDog.name);
oDog.SetType("雑種");

//犬クラス
var clDog = function(in_name) {
	this.name = in_name;//犬の名前
	this.type = "";
 
	//犬種を設定しログを表示
	this.SetType = function( in_type ){
		this.type = in_type;
		logmessage(this.name + "の種類は" + this.type + "だよ!");
	}
}

今まではこのクラスが記述されているjsファイルを別のjsファイルから文字列として読み込むことで
汎用的なコマンドとして使用してたんですね〜。
ではでは、これを自己インストール型のプラグイン化してみます。

function XSILoadPlugin( in_reg )
{
	in_reg.Author = "";
	in_reg.Name = "clDog";
	in_reg.Email = "";
	in_reg.Help = 	"";
	in_reg.Major = 1;
	in_reg.Minor = 0;
	
	in_reg.RegisterCommand("clDog","clDog");//コマンド

	return true;
}

function clDog_Init( in_ctxt )
{
	//コールバックコンテキストからCommandオブジェクトを取得
	var oCmd = in_ctxt.Source;
	//ArgumentCollectionを取得
	var oArgs = oCmd.Arguments;
	
	//引数の設定(追加)
	oArgs.Add("in_name", siArgumentInput,"");

	return true;
}

function clDog_Execute( in_name )
{
	return new clDog(in_name); //クラスをインスタンス化したものを戻してやる

	//犬クラス本体
	var clDog = function(in_name) {
		this.name = in_name;//犬の名前
		this.type = "";
	 
		//犬種を設定しログを表示
		this.SetType = function( in_type ){
			this.type = in_type;
			logmessage(this.name + "の種類は" + this.type + "だよ!");
		}
	}
}

これで疑似クラスをプラグイン化したものが完成っす!
単純にコマンド内に疑似クラス本体を記述して、そのインスタンスを戻しているだけです。
これで、クラス内のメソッドに対して引数を渡す事もできます。
ただし、インスタンス化するための引数だけは自己インストール型の引数の記述をしています。

具体的な使い方は以下のような感じです。

var oDog = clDog("ポチ");//コマンドを実行した戻り値がクラスをインスタンス化されたもの
logmessage(oDog.name);
oDog.SetType("雑種");

以上です〜。

2013-01-15

選択中のアニメーションクリップとシーン範囲を一致させるプラグイン


アニメーションの作業をしてて、アニメーションクリップのフレーム幅と、シーンのフレーム範囲を一致させることがよくあります。
前々から思ってたけど、毎回メンドクセ―よ!!(゚Д゚)ゴルァ!!ということでプラグイン作りました。

◆使い方◆
1.http://bit.ly/FrameMatch_from_AnimetionClipからファイルをダウンロード

2.解凍して C:\users\ユーザー名\Autodesk\Softimageのバージョン\Application\Plugins とかにファイルをぶち込む
  (パスは個人によって違いますので注意)

3.メインコマンドパネルの[Animation]メニュー内に『アニメーションクリップとシーンのフレーム範囲を一致』が追加される。
f:id:mochio326:20130116020953j:image

4.アニメーションミキサーのクリップを選択(複数可)

5.コマンド実行してフレーム範囲を一致させる。
f:id:mochio326:20130116021003j:image

アニメーションクリップとシーンのフレーム範囲を一致』メニューは切り離しておくと使いやすいはず。
良く使う場合はキーボードショートカットに追加しておくのも良いかと。


コマンド名動作
FrameMatch_from_AnimetionClip_S開始Frを一致
FrameMatch_from_AnimetionClip_E終了Frを一致
FrameMatch_from_AnimetionClip_SE開始・終了Frを一致

本当はクリップを選択した状態で右クリックからコマンドを実行したかったんですが、SI2011では登録出来ないように見えました。
無念orz

ちなみに、デフォ機能にはないですよね??
あったら泣く。。。


※当プラグインを使用してなにか起っても責任とれませんが、そでも良い方だけどうぞー。

2013-01-11

Softimageからテクスチャを直接外部ツールで起動するプラグイン『ImageOpener』


Softimageからテクスチャを直接開くツールを作りたいと思ってたら丁度良い具合に
XSI道場さんでTR OpenImageの記事(http://www.cveld.net/modules/xigg/index.php/node/990)を見かけたので、
同じような機能を持たせたプラグインを作りました。

ダウンロードは以下からどうぞ。
『ImageOpener( http://bit.ly/ImageOpener )』
zipになってるので解凍C:\users\ユーザー名\SIのフォルダ\Application\Pluginsとかにぶち込むと使えます。

f:id:mochio326:20130112023932j:image

大まかな使い方はTR OpenImageとおなじなので、そっちの動画を見てもらえれば大丈夫かと。
D
以下TR OpenImageからの変更点です。

 1.複数個選択→実行で複数起動可

 2.モデル選択時にAlt+右クリックでモデルに属しているテクスチャ全て起動(複数可)

 3.同名別拡張子のファイル、相対パス指定で開くオプションを実装

 4.JScriptで記述してるのでSI2010以前でも使える

 5.設定オプションが右クリックメニューから呼び出し可能

分かっている不具合等は

 1.モデルのテクスチャを全て開く場合は、RenderTree内のイメージノードが全て対象になります。
   その際、そのノードが使用されているかどうかという確認は行ってないので、
   宙ぶらりん(未接続)のテクスチャも開かれます。

 2.また、RenderTreeではマテリアルノードを選択状態でもメニューが出て、
   コマンドが実行出来ますが思いっきりバグります。

 3.画像ビューアなど開けないソフトもあります。

という感じです。

プラグインを使用してなにか問題が起きても責任はとれませんのでオッケーな人だけどうぞです。
しかし、ようやく普通に使えるツールを公開できたな…。

2012-11-11

スクリプトエディタ拡張プラグイン

きっかけはjunkiさんのツイッタ―での『XSIのJScriptでファイルパスを書くときにフォルダ区切りは \ ではなく \\ にするわけですが、どっかからコピペしたパス文字列の \ を \\ に書き換えていく過程が実に苦痛なのですが、楽にする良いアイデアはないでしょうか?』という呟き。
良いお題だったのもあり、ツイッタ―では大いに盛り上がったようです。
最終的に示されたのは

というもの。バッチファイルを作ってクリップボードにコピーする際に、変換しちゃおうというものですねー。
うむ。合理的。

自分は盛り上がってる時間帯を逃してしまい、やっちまった感満点だったのですが、自分なりのアプローチでなにか出来ないか探ってみました。
で、辿り着いたのがSoftimageのスクリプトエディタ用のコマンドを作るというもの。
よくよく考えてみたらDCCツール作業者を対象にしたプラグインは数多くあれど、ツール作成者を対象としたスクリプトエディタを拡張するコマンドって見たことないんですよね。
スクリプトエディタが操作できるのかどうかも最初は良く分からなかったので、どうやったらいいのか小一時間悩みましたがなんとか出来ました。

プラグインファイルをどこかにアップすればいいと思うんですが、いい場所が良く分からなかったのでコードそのまま貼り付けます。
(何処か共同でまとめられたら使う側としても便利じゃないかなー??とか思ったり…。)

function XSILoadPlugin( in_reg )
{
	in_reg.Author = "mochio" ;
	in_reg.Name = "ScriptEditor_ExpansionMenu Plug-in";
	in_reg.Major = 1;
	in_reg.Minor = 0 ;

	//***メニュー登録
	in_reg.RegisterMenu( siMenuScriptEditContextID , "ScriptEditor_ExpansionMenu" );
	//***コマンド登録
	in_reg.RegisterCommand("ScriptEditor_ChengePathString_Clipboard","ScriptEditor_ChengePathString_Clipboard");
	in_reg.RegisterCommand("ScriptEditor_ChengePathString_SelectedText","ScriptEditor_ChengePathString_SelectedText");

	return true;
}

function XSIUnloadPlugin( in_reg )
{
	Logmessage( in_reg.name + " has been unloaded." );
	return true;
}

//--------------------------------------------------------------------------
// 右クリックメニュー登録部分
//--------------------------------------------------------------------------
//ポップアップメニューの登録
function ScriptEditor_ExpansionMenu_Init( in_ctxt )
{
	var menu = in_ctxt.source;

	menu.name = "ExpansionMenu(JScript)";
	
	//共通メニュー
	menu.AddCommandItem("クリップボードの文字列の「\\」を「\\\\」として貼り付け","ScriptEditor_ChengePathString_Clipboard");
	menu.AddCommandItem("選択範囲を「\\」を「\\\\」に変換","ScriptEditor_ChengePathString_SelectedText");
}

//--------------------------------------------------------------------------
// コマンド
//--------------------------------------------------------------------------
function ScriptEditor_ChengePathString_SelectedText_Init( in_ctxt )
{
	var oCmd;
	oCmd = in_ctxt.Source;
	oCmd.Description = "";
	oCmd.ReturnValue = true;
	return true;
}

//選択範囲を変換
function ScriptEditor_ChengePathString_SelectedText_Execute(){
	var oSEditor = LF_GetScriptEditor();
	var sSelText = oSEditor.GetAttributeValue("selectedtext");
	LF_StringPaste(sSelText);
}

function ScriptEditor_ChengePathString_Clipboard_Init( in_ctxt )
{
	var oCmd;
	oCmd = in_ctxt.Source;
	oCmd.Description = "";
	oCmd.ReturnValue = true;
	return true;
}

//クリップボードから貼り付け
function ScriptEditor_ChengePathString_Clipboard_Execute(){

	// クリップボードに文字列を設定
	var jp;
	if (!jp) jp = {};
	if (!jp.raindrop) jp.raindrop = {};
	if (!jp.raindrop.frog) jp.raindrop.frog = {};
	jp.raindrop.frog.clipboard || (function ()
	    {
	        // コマンドのID
	        var OLECMDID_COPY = 12;
	        var OLECMDID_PASTE = 13;
	        var OLECMDID_SELECTALL = 17;

	        // IE の初期化
	        var _internetExplorer = new ActiveXObject ('InternetExplorer.Application');
	        _internetExplorer.navigate ("about:blank");
	        while (_internetExplorer.Busy)
	            WScript.Sleep (10);

	        // textarea 要素を作成する
	        var _textarea = _internetExplorer.document.createElement ("textarea");
	        _internetExplorer.document.body.appendChild (_textarea);
	        _textarea.focus ();

	        jp.raindrop.frog.clipboard = {
	            // クリップボードに文字列をコピー
	            setText: function (text)
	            {
	                _textarea.innerText = text;
	                _internetExplorer.execWB (OLECMDID_SELECTALL, 0);
	                _internetExplorer.execWB (OLECMDID_COPY, 0);
	            },

	            // クリップボードより文字列を取得
	            getText: function ()
	            {
	                _textarea.innerText = "";
	                _internetExplorer.execWB (OLECMDID_PASTE, 0);
	                return _textarea.innerText;
	            },

	            // IE を解放
	            release: function ()
	            {
	                _internetExplorer.Quit ();
	            }
	        };
	    }());

	//クリップボード内の文字列を取得
	var GetStg = jp.raindrop.frog.clipboard.getText();

	jp.Quit;//開放…できてんのか???
	jp = null;
	
	LF_StringPaste(GetStg);
}

//文字列を変換してスクリプトエディタに貼り付ける
function LF_StringPaste(in_Stg){
	in_Stg = in_Stg.replace(/\\(?!\\)/g , "\\\\");
	in_Stg = in_Stg.replace(/\\\\\\/g , "\\\\");//後読み対応してないので、\\\となってしった場合に\\に戻す
	var oSEditor =  LF_GetScriptEditor();
	oSEditor.SetAttributeValue("inserttext" , in_Stg);
}

//スクリプトエディタを取得する
function LF_GetScriptEditor(){
	var l = Desktop.ActiveLayout;
	for(var i = 0; i < l.Views.count; i++){
		if(l.Views(i).type == "Script Editor"){
			var oSEditor = l.Views(i);
			return l.Views(i);
		}
	}
}

適当にファイルにコピーしてプラグインとして読まれるところに放り込んで下さい。
スクリプトエディタ上で右クリックをすると、専用のメニューExpansionMenu(JScript)が追加されています。
f:id:mochio326:20121110170642j:image

今回用意したのは
クリップボード上にある文字列(ctrl+cとかでコピーしておいたパス)の\を\\に変換した状態で貼りつける、というコマンド
f:id:mochio326:20121111050953j:image

既にスクリプトエディタ上にある文字列の中の\を\\に変換する、というコマンド
f:id:mochio326:20121111050822j:image

の2つです。
2つ目の選択範囲の文字列を変更するものに関しては、複数行も問題なくいけます。
右クリックからコマンドを実行するのは多少手間なので、コマンドをショートカットに登録しておくとよいかもしれません。

さらに拡張すれば、標準のスクリプトエディタにはない「選択範囲の置換」「正規表現を使った置換」といった機能も追加できそうな予感です。
しかし、何でこういう標準的にあってもよさそうな物が搭載されてないかな…。
是非オートデスク様にはこう言ったところも改善していただきたいところですね。