myara CG blog

CG Design Blog. Thoughts, experiments and experiences.

ビューポートにカスタムプローパティセット(DisplayInfo)

カスタムパラメーターセットの名前を「DisplayInfo」にするとビューポートに表示されるとどこかで読んだことがあります。多分xsibaseだった気がする。最近それを思い出して、マニュアルに確認してみてどこが便利なのかも分からずにやってみました。

やり方はシンプルです。

カスタムパラメーターセットの名前をDisplayInfoから始まるような名前にします。
DisplayInfo_Exampleにしたら、「Example」というタイトルで表示されます。

Visibility Options (Shift + S) の Stats の中にある
「Show Custom "DisplayInfo" Parameters」にチェックすると、ビューポートに表示されます。

Preferences の Display - General - Display Options の
「Enable On-Screen Editing of Custom "DisplayInfo" Parameters」にチェック入れると、ビューポートでパラメーターをいじることも可能になります。デフォルトでこのオプションにチェックが入っていると思います。

DisplayInfo.gif

最近サブディビジョンをかけるモデリングが多いですね。でも

ペンタブでモデリングして、
サブディビジョンを確認したい時にペンを置いて、
キーボードまで手を移動して、
「+」キー を 2回打ってサブディビジョンをかけて、
ペンをとって、モデルいじってまたキーボードに戻り
「-」キーを2回打ってサブヂビジョン解除するのは

面倒くさい!!

サブディビジョンをこのカスタムパラメーターに繋げれば便利かも!ビューポートでクリックするだけで切り替えることが出来るかも!

と思い、カスタムパラメーターセット作成して、カスタムパラメータの・Integerタイプ、 0~2 を作ってみた。

これでビューポートのパラメーターにクリックして長押し、左右にドラッグするスライドみたいにパラメーターをいじることが出来ます。

しかし、これはカスタムパラメーターセットを選択している時にしか出来ない!

数字にクリックして、キーボードで数字入力が出来るけど、キーボードを使わなきゃいけないから意味ない。

それで、ブーレアン(ON/OFFのチェックタイプ)も試してみました。想像した通りにダブルクリックで切り替えることが可能です。しかも、カスタムパラメーターセットを選択せずに出来ます。

これで、サブディビジョンに繋げて、エスプレッションに*2をかけて、完了。これでビューポートにダブルクリックでサブディビジョンの切り替えが可能になります。

DisplayInfo_subdiv.gif

一応、スクリプトにまとめました。


jscript

if (selection.count ==1 && selection(0).type=="polymsh")
{
FindCustomSet();
var oObj=selection(0)
var oRoot=ActiveProject.ActiveScene.Root
AddProp("Custom_parameter_list", oRoot, "", "DisplayInfo_Menu", null);
SIAddCustomParameter("DisplayInfo_Menu", "Subdivision", siBool, 0, 0, 1, null, 2053, 0, 1, null, null);
SIAddCustomParameter("DisplayInfo_Menu", "GeomApprox", siBool, 0, 0, 1, null, 2053, 0, 1, null, null);

// 選択されているオブジェクトのGeomApproxに繋げる。
CopyPaste("DisplayInfo_Menu.Subdivision", null, oObj.fullname + ".geomapprox.gapproxmosl", 1);
SetExpr("Scene_Root.geomapprox.gapproxmosl", "DisplayInfo_Menu.Subdivision*2", null);
CopyPaste("DisplayInfo_Menu.Subdivision", null, oObj.fullname + ".geomapprox.gapproxmordrsl", 1);
SetExpr("Scene_Root.geomapprox.gapproxmordrsl", "DisplayInfo_Menu.Subdivision*2", null);

// Geometry Approximation の角度 も一応入れておく
CopyPaste("DisplayInfo_Menu.GeomApprox", null, oObj.fullname + ".geomapprox.gapproxmoan", 1);
SetExpr("Scene_Root.geomapprox.gapproxmoan", "DisplayInfo_Menu.GeomApprox*180", null);
SetValue("DisplayInfo_Menu.GeomApprox", true, null);

//現ビューポートのDisplayInfoオプションをONにする。念のためにプリファレンスも
SetValue(GetView()+".camvis.custominfo", true, null);
SetValue("preferences.Display.displayinfoedit", true, null);
}
else
{
LogMessage("select 1 object", siWarning)
}
function GetView()
// 現ビューポート取得
{
var vw = GetFocusedViewport();
var mCamera = GetViewCamera(-1)
if (vw == "A")
{mCamera = GetViewCamera(0)}
else if (vw == "B")
{mCamera = GetViewCamera(1)}
else if (vw == "C")
{mCamera = GetViewCamera(2)}
else if (vw == "D")
{mCamera = GetViewCamera(3)}
return mCamera
}
function FindCustomSet()
{
// 既にこのカスタムパラメーターセットが存在するか確認
a=FindObjects( null, "{76332571-D242-11d0-B69C-00AA003B3EA6}" ) ;
for (var i=0;i<a.count;i++)
{
if (a(i).name=="DisplayInfo_Menu" && a(i).parent=="Scene_Root")
{deleteobj(a(i))}
}
}