ビューポート内でのポイント選択

pickPoint() 関数によって、3ds Max ビューポート内で 3D ポイントを選択したり、リスナーに 3 次元座標を入力することができます。この関数を呼び出すと、3ds Max は特殊なポイント選択コマンド モードになり、カーソルは十字形に変わります。ユーザが 3ds Max のビューポートの 1 つをクリックするか、3 次元座標をリスナーに入力すると、この関数はそのポイントをワールド空間座標の MAXScript Point3 値として返します。

pickPoint [ prompt:<string> ] [ snap:#2D|#3D ] \
[ rubberBand:<start_point3> ] \
[ mouseMoveCallback:fn | #(fn,arg) ] \
[ relativeTo:<relativePt_point3> ] \
[ terminators:#(<string>,<string>,...) ]

この関数はオプションの prompt: 文字列引数を取り、これをプロンプト メッセージとしてリスナーに出力します。また、オプションの snap: キーワード引数もあり、これは 3ds Max インタフェース内で[スナップ](Snap)がオンになっている場合に、ビューポートのポイント選択をコントロールします。 #3D が指定された場合、カーソルは 3D 空間内の任意の位置にあるポイントにスナップします。 #2D が指定された場合(既定値)、カーソルは現在アクティブなグリッド作図平面上だけでスナップします。3ds Max インタフェース内で[スナップ](Snap)がオフになっている場合、クリックしたポイントは常に現在アクティブなグリッド作図平面上に配置されます。

ユーザは、[Esc]を押すか、右マウス ボタンをクリックして、いつでもポイント選択を中断できます。[Esc]を押した場合、関数はただちに特殊な MAXScript 値 #escape を返し、右マウス ボタンをクリックした場合は #rightClick を返します。

pickPoint() 関数を獲得して、ポイント入力時にラバーバンド破線を表示することができます。これを実行するには、オプションのキーワード引数 rubberBand:<start_point3> を指定します。 pickPoint() の呼び出し時にこれを指定すると、マウスの動きに従って、指定された開始点から破線をラバーバンド処理します。最後に選択したポイントを連続した各選択の rubberBand: 開始ポイントとして指定することにより、一連のポイント選択でこの機能を使用できます。 rubberBand: に指定された開始点はワールド座標になければなりません。

また、ポイント入力中にマウスの自由な動きを追跡するために、マウス移動コールバック関数を設定することができます。これに対するオプションのキーワード引数は mouseMoveCallback: であり、次の 2 つの形式があります。

mouseMoveCallback:fn
mouseMoveCallback:#(fn, arg)

2 番目の形式では、コールバック関数を呼び出すたびにその関数に送られる引数値を与えることができます。

fn は、上記の最初の形式では 1 つの引数を取り、2 番目の形式では 2 つの引数を取ります。コールバック関数を呼び出すと、その関数が取得する最初の引数は常にマウスの現在のワールド座標になり、2 番目の引数がある場合はユーザによって与えられた arg になります。コールバック関数を使って、たとえば、マウスの動きに従ってスプラインの頂点や四角形の高さをを調整して、より複雑な形式のラバーバンド処理を実行することができます。これを行う場合は、必要な update() メッシュ関数またはスプライン関数をすべて呼び出してください。

[リスナー](Listener)ウィンドウへのコマンド ラインの入力

pickPoint() 関数を使用すると、3ds Max ビューポート内でクリックするか、または、MAXScript リスナー ウィンドウに数字を入力して座標を入力することができます。ユーザは、次に示す形式の 1 つで(AutoCAD のコマンド行入力構文に基づきます)、座標を入力できます。

x, y, z or [x, y, z]

現在の作図平面座標内の明示的なポイント

x, y or [x, y]

作図平面(cp)上のポイント

d

最後のポイントからマウス方向に d 単位離れたポイント

@ x, y, z or @[x, y, z]

相対、最後の入力ポイントへのオフセット

@ x, y or @[x, y]

cp 上にあり、cp 上の最後のポイントの投影に相対

d < a

x 軸から角度 a で cp 原点から一定の距離にある cp 上の極座

@ d < a

最後のポイントを中心とした、cp 上の相対極座

d < a1 < a2

原点から d、x 面から al、xy 面から a2 の位置にある cp 上の球形

@ d < a1 < a2

相対球形

数字とメタ文字の間にはゼロ個、またはそれ以上の空白文字を入れることができます。

入力された座標は現在アクティブなグリッド作図平面に相対的であると解釈され、 pickPoint() によって返された座標は常にワールド空間にあります。

relativeTo : キーワード引数が与えられていると、 pickPoint() が、エントリとして相対座標構文が使われている場合に選択された最後のポイントではなく、relativePt Point3 の値を使用して結果を評価します。

ユーザによってキーボードから入力され、予想される座標入力形式ではないものは文字列値として返されるため、作成者は猶予を与えてエラーを処理するか、または別の種類の入力をスクリプトが解析できるようにします。

これらの戻り条件は classOf() 関数を使ってテストできます。以下に例を示します。

p = pickPoint()
case of
(
(p == undefined): ... -- user pressed escape
(p == #rightClick): ... -- user clicked RMB
(classOf p == Point3): ... -- user entered a point
(classOf p == String): ... -- user keyed a non-point
)

terminators: キーワード引数は、1 つ以上の文字のそれぞれに対して 1 つ以上の文字列の配列を予想します。これが指定された場合、この文字列リストはキーボード入力終端文字シーケンスのセットを指定します。このうちの 1 つが入力の終わりに入力されると、 pickPoint() 関数は[Enter]キーが押されるのを待つことなく、すぐに戻ります。いずれの場合も、 terminators: キーワード引数が与えられた場合は pickPoint() 関数は 2 つの要素の配列を返します。最初の要素は入力されたポイント、2 番目の要素は終端文字列になります。またはマウス クリックによってポイントが入力された場合や[Enter]キーを使って終端した場合には undefined を返します。

これにより、ユーザはターミネータ文字列によって終端したポイントを入力するか、またはターミネータ文字列だけを入力することができます。後者の場合、結果配列の最初の要素は値 undefined になります。ターミネータがある場合は、この配列の 2 番目の要素を調べて、ユーザが実際にどのターミネータを入力したかを判別できます。

例:

pp = pickPoint prompt:"foo: " terminators:#(" ","a","oo")
if pp[2] == "a" then ...

pickPoint() 関数は、線の中の連続頂点など、複数のポイントを要求するために、スクリプトの中で繰り返し使われることがよくあります。このように新規シーン オブジェクトを少しずつ作図する場合は、新しい関数 redrawViews() を使って強制的にビューポートの更新をする必要があります。通常、MAXScript は、スクリプトの実行が終了するまでビューポートの再描画を遅らせます。

pickOffsetDistance [ prompt:<string> ] [ pt2Prompt:<string> ] \ 
[ errPrompt:<string> ] [ snap:#2D|#3D ] \ 
[ keyword:<string> ]

この関数は、 prompt メッセージ(メッセージがある場合)をリスナーに発行し、ユーザがビューポート内をクリックするか( pickPoint() 関数とまったく同じポイントが決定される)、数値を入力して[Enter]を押すか(数値が決定される)、 keyword のすべてまたは先頭部分を入力して[Enter]を押すのを待機します。ユーザがキーワードを入力した場合、関数は true を返します。ユーザが数字を入力した場合、関数はその値を返します。ユーザがポイントをクリックした場合、関数は pt2Prompt メッセージがある場合にそれをリスナーに発行し、2 番目のポイントがクリックされるのを待って、2 点間のワールド空間距離を返します。ユーザが数字ではなく、キーワードに一致しないものを入力した場合、関数は errPrompt メッセージがある場合はそれを発行します。それ以外の場合、関数は prompt メッセージがある場合はそれを発行し、ユーザがもう一度実行するのを待機します。

関連事項