CG・コンテンツ制作
  1. CG・コンテンツ制作トップ
  2. DAIKIN CG Channel
  3. UsersNotes
  4. スクリプト
  5. Script Notes ジェネラル/ユーザインタフェース編 
SUITE USERS NOTES

Script Notes
 >> ジェネラル/ユーザインタフェース編

Script Notesについて

Emi_banner4
ここでは、スクリプトに関するあらゆる機能やTipsなど思いつくまま紹介していきます。
こんなの使わねーだろーなーって感じのちょっとコアな内容も載せていく予定です。

主にVBSで作成していますが、気が向けばJsやPythonなどの掲載も予定しています。
izt_ml


ビューをスクリプトから開く方法

OpenViewコマンドでビューを開くことができます。

【例】

  • フローティングで、Explorerを開きます。
    OpenView "Explorer"
openview

  • フローティングで、アニメーションミキサを開きます。
    OpenView "Animation Mixer"
  • デフォルトではRecycleビュー内に開きますが、第二引数でFalseを指定することにより、新しいビューとして開くことができます。
    OpenView "Animation Mixer", False
  • "MyCustomTools"という名前のカスタムツールバーを開きます。
    OpenView "MyCustomTools"
  • "MyCustomShelf"という名前のカスタムシェルフを開きます。
    OpenView "MyCustomShelf"

キーマップを切り替える方法

SetDefaultKeyMapコマンドを使用します。バージョンによってキーマップ名が異なりますのでご注意ください。

<~v7.01>
SetDefaultKeyMap "Autodesk 3ds Max-Compatible"
SetDefaultKeyMap "QWERTY Key Map"
SetDefaultKeyMap "SI3D Key Map"
SetDefaultKeyMap "XSI Key Map"

<v7.5>
SetDefaultKeyMap "3ds MAX Compatible Key Map"
SetDefaultKeyMap "Maya Compatible Key Map"
SetDefaultKeyMap "SI|3D Key Map"
SetDefaultKeyMap "Softimage Key Map"

"MyKeyMap"という名前のカスタムキーマップに切り替えます。
SetDefaultKeyMap "MyKeyMap"


現在のキーマップを取得する方法

取得するときは
Logmessage GetValue( "Preferences.Interaction.defaultkeymap" )
または
Logmessage Preferences.GetPreferenceValue("Interaction.defaultkeymap")
で取得してログに出力できます。

ただし、キーマップの切り替えのために、
SetValue "Preferences.Interaction.defaultkeymap", "Maya Compatible Key Map"

Preferences.SetPreferenceValue "Interaction.defaultkeymap", "Maya Compatible Key Map"
などはできませんので、上記のSetDefaultKeyMapコマンドを使用してください。


インタラクションモードで設定される内容

ファイル > インタラクションモデルでショートカットやビュー操作などをMaya,SI3D等にあわせることができます。それぞれのインタラクションモデルで設定されるPreferencesの内容を以下に示します。

パラメータ名 Softimage Softimage + 拡張コンポーネント選択 Maya SI|3D
1 Keymap Softimage Key Map Softimage Key Map Maya Compatible Key Map SI|3D Key Map
2 Interaction.interactionmodel 0 1 3 2
3 Interaction.niltool false false false true
4 Interaction.stickykeys true true true false
5 Select.singleobject false false false true
6 Select.si3dselectmodel false false false true
7 Select.extcomponentsel false true false true
8 Select.clicktodeselect false false true false
9 Select.surroundpolygons true true false true
10 Camera.navaltmapping false false true false
11 Camera.navaltkey false false true false
12 TransformProperties.transformmanipulators true true true false
13 TransformProperties.transformfollowcursor true true true false
14 TransformProperties.transformmanipdefaultxfo 1 1 3 1
15 ransformProperties.transformshowselected false false true false
16 TransformProperties.transformhidden false false true false
17 TransformProperties.modifyobjectpivot false false true false
18 Display.headlight false false true false
19 Camera.zoomcursor false false false true
20 animation.save_key_command 0 0 1 0
21 fcurve_editor.display_options 3 3 4 3
22 animation_editor.prevent_movement_on_lmb false false true false
23 animation_editor.translate_on_mmb false false true false

keymap interact_tool tools_select
tools_camera tools_trans_tool tools_trans_trans
disp_gene anim edit_fcv
edit_ae    

現在使用中のツール名を取得する方法

ActiveToolName (XSIApplication)プロパティを使用します。
Logmessage "Current Tool is " & ActiveToolName
で取得してログに出力できます。

【実行例】
' INFO : Current Tool is RotationTool
' INFO : Current Tool is SelectionTool
' INFO : Current Tool is BrushTool


SRTツールをアクティブにする方法

上記のActiveToolName (XSIApplication)プロパティで取得できるツール名のうち、RotationTool、ScalingTool、およびTranslateTool だけが3Dビューでサポートされています。これらはそのまま実行するとSRTツールをアクティブにできます。
RotationTool
TranslateTool
ScalingTool

さらに、SetUserPrefコマンドの第一引数にて、"3D_TRANSFO_EDITED_AXIS_CHANGED"を指定し、第二引数でビットマスクを設定することにより、X/Y/Zのどれをアクティブにするか指定できます。(X=1, Y=2, Z=4)

【実行例】

ScalingTool
SetUserPref "3D_TRANSFO_EDITED_AXIS_CHANGED", 3

scale_xy


TranslateTool
SetUserPref "3D_TRANSFO_EDITED_AXIS_CHANGED", 6

trans_yz


イミディエイトモードの取得と設定

MCP(メインコマンドパネル)上の「イミディエイト」ボタンの状態の取得と設定の方法をご紹介します。

immed

取得するときは、
Logmessage GetUserPref("OperationMode")
で取得してログに出力できます。
ただし、起動して何もしない状態ではnullが返ってきますので、以下のようにすると便利です。

VBSの場合:
If GetUserPref( "OperationMode" ) Then bImmed = True Else bImmed = False
Logmessage bImmed

Jsの場合:
var bImmed = ( GetUserPref( "OperationMode" ) == true ) ? true : false;
LogMessage( bImmed );


設定するときは、
SetUserPref "OperationMode", True    ' ボタンON
SetUserPref "OperationMode", False   ' ボタンOFF
で可能です。

※これはSDKマニュアルにも記載されていないので、ノーサポートらしいです。
※SetUserPref で設定はでき、オペレーション上は反映されますが、MCP上のボタンには反映されません。
(完全な機能としての提供ではないのでノーサポートとなっているようです)

このTipsはSoftimage Wikiサイトのこちらにも掲載があります。


オブジェクト/プロパティ/パラメータの名前からオブジェクトモデルを取得する方法

オブジェクト/プロパティ/パラメータの名前の文字列からオブジェクトモデルを取得したい場合は、GetObject(Dictionary)を使います。Model階層単位でくくった名前で指定します。

【例】

  1. Scene_Root直下に"sphere"という名前のオブジェクトが存在する場合:
    Set ob = Dictionary.GetObject("sphere")
    Logmessage Typename( ob )

    <結果>
    ' INFO : X3DObject

  2. Model階層(名前"Model")以下に"torus"という名前のオブジェクトが存在する場合:

    model_torus

    Set ob = Dictionary.GetObject("Model.torus")
    Logmessage Typename( ob )

    <結果>
    ' INFO : X3DObject

  3. Model階層(名前"Model")以下に"torus"という名前のオブジェクトが存在し、さらにその下に"cylinder"という名前のオブジェクトが存在する場合:

    model_torus_cyl

    Set ob = Dictionary.GetObject("Model.cylinder")
    Logmessage Typename( ob )

    <結果>
    ' INFO : X3DObject

  4. 複数のModel階層以下に"cone"という名前のオブジェクトが存在する場合、複数のModel階層であっても、そのオブジェクトが属するModel階層名と組み合わせて指定します。"cone"が"Model1"に属する場合:

    model1_cone

    Set ob = Dictionary.GetObject("Model1.cone")
    Logmessage Typename( ob )

    <結果>
    ' INFO : X3DObject

  5. プロパティの文字列表現から取得します。Model階層(名前"PRIM")以下の"sphere"のVisibilityプロパティを取得する場合:

    PRIM_sp

    Set oProp = Dictionary.GetObject("PRIM.sphere.Visibility")
    Logmessage Typename( oProp )

    <結果>
    ' INFO : Property

  6. パラメータの文字列表現から取得します。Model階層(名前"PRIM")以下の"sphere"のsubdivuパラメータを取得する場合:

    Set oParam = Dictionary.GetObject("PRIM.sphere.polymsh.geom.subdivu")
    Logmessage Typename( oParam )
    Logmessage oParam.value

    <結果>
    ' INFO : Parameter
    ' INFO : 8

  7. デフォルトでは、オブジェクトが存在しない場合、スクリプトエラーとなり、処理が中断されますが、GetObjectの第二引数でfalseを指定することにより、中断せずにヌルを返すことができます。

    Set ob = Dictionary.GetObject("PRIM.Csphere",false)
    Logmessage Typename( ob )

    <結果>
    ' INFO : Nothing


プロパティページを表示する際、表示する位置や大きさをコントロールする方法

カスタムビューを作成し、その中にプロパティページを埋め込むことにより、ビューの属性として位置や大きさをコントロール可能です。

【例】
--------------------------------------------------------------------------

選択したプロパティを水平、垂直方向に100ドットずつずらして順次表示します。
サイズは水平、垂直に400ドットとしています。

for i = 0 to selection.count - 1
      InspectObj_inView selection(i), 100+i*100, 100+i*100, 400, 400 
next

sub InspectObj_inView( prop, xx, yy, xsize, ysize)
     if typename( prop ) = "Property" then
          set oPset = prop
     else
          set oPSet = Dictionary.GetObject( prop )
     end if

     set oLayout = oPSet.PPGLayout

     set oActiveLayout = Application.Desktop.ActiveLayout
     set oNewView = oActiveLayout.CreateView( "Property Panel", "MyPPGView" )
     oNewView.BeginEdit
     oNewView.Move xx, yy
     oNewView.Resize xsize, ysize
     oNewView.SetAttributeValue "targetcontent", oPSet.FullName
     oNewView.EndEdit
end sub

--------------------------------------------------------------------------

createview


Softimage付属のSDKサンプルにも同じ方法を用いたサンプルがあります。
\Softimage\XSI_<ver>\XSISDK\examples\workgroup\Addons\PPGDemos
をプラグインすると使用できる、PPGInViewが参考になります。


ビューのディスプレイオプションを一括で変更する方法

ビューのディスプレイオプションを一括で変更するには、オペレーションとしては「ディスプレイ > ディスプレイオプション(すべてのカメラ)」を実行して表示される、Display Options of All Camerasプロパティのパラメータを設定して行うことができます。例えば「シェーディングモード- X線モード」をON/OFFしてみましょう。
SetValueコマンドが、ものすごく長い引数を伴って実行されているのが分かります。これをこのまま自分のツールに取り込んで使うのはかなり不便です。

disp_all

xray_scr


これをもっと簡単に記述する方法として、ワイルドカードを使う方法があります。

' X線モードOFF
SetValue "Views.*.*.camdisp.xrayshaded,*.camdisp.xrayshaded",0

' X線モードON
SetValue "Views.*.*.camdisp.xrayshaded,*.camdisp.xrayshaded", 1

ただし、現在の値からトグルしたい場合は、このSetValueを使う方法では場合分けしなくてはならず不便です。
このような時は、ToggleValueコマンドを使うと便利です。

' X線モードON/OFFをトグル
ToggleValue "xrayshaded","Views.*.*.camdisp,*.camdisp"

xrayshaded

思いつけば追加、更新します。
また、モデリング編、アニメーション編等も追加していく予定です。

お気軽にお問い合わせください

Daikin CG News お申し込み

CGクリエイター向けのセミナー・イベントやキャンペーン、製品情報をメールマガジンでお届けします。(登録無料)

Twitter

ページの先頭へ