インタフェース

3ds Max バージョン 4 で導入された関数公開システムでは、プラグインの外部のコードがプラグインの主要な関数の検出および照会を行い、共通の呼び出しメカニズムを使って呼び出せるようにして、これらの関数および演算をパブリッシュすることができます。システム全体は Window の COM および OLE オートメーション システムに非常に似ており、アーキテクチャでは同様の概念を数多く共有しています。ただし、関数公開システムは COM および OLE に基づいていませんが、3ds Max 用に最適化されたカスタム アーキテクチャです。関数公開 API はさまざまな目的で使用できます。サード パーティの開発者は関数公開 API を使って、外部ソースで使用されるプラグインの重要な部分を開発し、ユーザがそれらを直接拡張およびコントロールできるようにすることができます。

関数公開システムの用途には、以下のようなものがあります。

注:関数公開システムについての詳細は、3ds Max SDK ヘルプ ファイルの「Function Publishing」を参照してください。

インタフェース

コア インタフェース

ノード インタフェース

その他のインタフェース

関数は、1 つまたは複数のインタフェースでプラグインによってパブリッシュされます。アクション関数は、インタフェースの独自のセットでパブリッシュする必要があります。各インタフェースは、基本クラス FPInterface から派生するクラスのインスタンスによって表現されます。外部システムは、インタフェース定義オブジェクトにアクセスする ClassDesc に対してさまざまなクエリー メソッドを呼び出すことで、公開されたインタフェースを認識することができます。これらの問い合わせまたは「反映」メソッドの他に、FPInterface には、インタフェース内の特定の関数を実際に呼び出すための呼び出しメソッドもあります。このため、いずれかのインタフェースを認識した場合は、任意の公開関数を呼び出すことができます。

アクション インタフェース

アクション マネージャ

アクション インタフェースは、特殊なインタフェースです。これらのインタフェースには、UI のボタンおよびキーを「押す」ためのプログラム方法をプラグインに提供する、UI アクション関数が含まれています。

直接ドット表記プロパティ

MAXScript は、このように定義されたプロパティを直接ドット表記プロパティとしてインタフェースに公開します。たとえば、次の円柱 mixin の例に示すように、Get/SetRadius に関数としてアクセスする場合があります。

r = $cyl01.cylMixin.getRadius()
$cyl01.cylMixin.setRadius 23

新しいバージョンでは次の表記を使用できます。

r = $cyl01.cylMixin.radius
$cyl01.cylMixin.radius = 23

これは、MAXScript に存在するすべての関数公開インタフェース(static、Mixin、Core)に当てはまります。一層の最適化として、MAXScript はすべてのインタフェース メソッドおよびプロパティをインタフェースのレベルまで効果的に格上げします。このため、オブジェクトまたはクラスのすべてのインタフェースで、個々のメソッドおよびプロパティが固有の名前を持つ場合は、インタフェース名を省略することができます。

上記の例は次のように記述することもできます。

r = $cyl01.getRadius()
$cyl01.setRadius 23

および

r = $cyl01.radius
$cyl01.radius = 23

名前の競合が発生する場合は、常にインタフェース名レベルを含めることでこの競合を解決できます。

公開関数と MAXScript

MAXScript では、関数公開システムを通じて、プラグインによってパブリッシュされたすべての関数に自動的にアクセスすることができます。各プラグイン クラスは、MAX クラス オブジェクトとして MAXScript に表示されます。このため、プラグインのインスタンスの生成やクラスのテストなどに使用することができます。プラグインがインタフェースをパブリッシュする場合、それらのインタフェースは、このクラス オブジェクトのプロパティとして MAXScript に表示されます。インタフェースの内部名は、プロパティ名として使用されます。インタフェース内のすべての関数には、インタフェースの名前付きプロパティとしてアクセスできます。上記の例で示したインタフェースが EditMesh によってパブリッシュされた場合、次のスクリプト フラグメントを使用できます。

EditMesh.faceOps.extrude $foo.mesh #{1,2,3} 10

上記のスクリプトは、 $foo のメッシュ、面 1、2、3、量 10 単位について FaceOps インタフェースの押し出し関数を呼び出します。

EditMesh.actions

アクション関数を取得して、表示します。各インタフェースは、構造体定義としてクラス オブジェクトに格納されます。

EditMesh.actions.create()

作成モードを開始(または停止)します。これには、EditMesh ロールアップの[作成](Create)ボタンをハイライト/ハイライト解除する副作用があります。MAXScript のアクション関数が FPS_OK を返す場合、アクション関数の呼び出しは true を返し、それ以外の場合は false を返します。

if EditMesh.actions.create.isChecked() then ...

このように、アクション関数用の述語関数を、アクション関数オブジェクト自体のプロパティとして使用できます。次のように問い合わせを行うことで、述語が指定されているかどうかを確認することができます。

if EditMesh.actions.create.isChecked != undefined

   

インタフェースにアクセスする 2 つ の方法

インタフェースへのアクセスには、スタンドアロン インタフェースとしてアクセスする方法と特定のオブジェクトのインタフェースとしてアクセスする方法があります。インタフェースに直接アクセスする場合は、操作するオブジェクトをインタフェースに渡す必要があります。

m = Bitmaptexture fileName:"L:\\mypath\\scenes\\2500hicon.JPG" 
bitmapTex.viewImage m -- direct interface access, need to pass object
m.viewImage() -- accessing interface on object, object internally passed as arg 1.

関連するメソッド :

getCoreInterfaces()

コア インタフェース値の配列を返します。

以下の実行により、すべてのコア インタフェースのリストが作成されます。

core_interfaces = getcoreinterfaces()
for i in core_interfaces do (showinterface i; format"\n")

関連事項