複数のオブジェクトのプロパティを一度に変更する方法はありますか。
 
 
 

MAXScript FAQに関する質問と回答 > オブジェクトのプロパティへのアクセス > 複数のオブジェクトのプロパティを一度に変更する方法はありますか。

日常業務で最も頻繁に使用されている MAXScript のアプリケーションの 1 つに、オブジェクト プロパティの大量変更があります。これによって、クリック回数や作業時間を大幅に削減できます。

複数のオブジェクトのプロパティを変更するには、まず次のことが必要です。

  1. 変更対象となる正しいオブジェクトを取得する。

  2. 正しいプロパティに値を割り当てる。

想像できる最もシンプルな状況は、同じような複数のオブジェクト (たとえば、多数の球プリミティブなど) を選択することです。MAXScript を使用すれば、シーン内の現在の選択範囲に簡単にアクセスできます。さらに、オブジェクト プロパティの割り当てが「マップ可能」になります。つまり、 MAXScript によって、代入演算子「=」の右側にある値が選択範囲内のすべての単一オブジェクトに自動的に適用され、MAXScript で明示的にループ指定する必要がないということです(マップされた演算の詳細は、「MAXScript におけるマップされた演算とは何ですか。」を参照してください)。

-- マウスでシーン内の球を多数選択します。
-- 次に、すべての選択したオブジェクトの半径を 10.0 単位に変更するため
-- 次のようにリスナーに入力します。
selection.radius = 10
OK

半径と呼ばれるプロパティのない何らかのオブジェクト (ボックス プリミティブや編集可能オブジェクトなど) を選択した場合、上記のコードを入力するとエラーが発生します。

エラーの例:

selection.radius = 10
-- Unknown property: "radius" in $Box:Box01 @ [0. 000000, 0. 000000,0.000000]

このような場合、割り当てを行う前に、選択範囲のオブジェクトをスクリプトによってフィルタ処理する必要があります。詳細は、「For ループ」を参照してください。次の方法が考えられます。

例:

-- マウスでシーン内のオブジェクトをいくつか選択します。
-- 次に、.radius プロパティを持つすべてのオブジェクトの半径を変更するために
-- 次のようにリスナーに入力します。
for i inselection where hasProperty i "radius" do i.radius = 10
OK

オブジェクトを手動で選択するのではなく、このようなプロパティを持つシーン内のオブジェクトの半径をすべて変更する場合は、MAXScript によってシーンをフィルタ処理することができます。この処理は、球、天球、円柱などに影響し、ボックスなど、「半径 (radius)」プロパティを持たないものはすべて無視します。

例:

-- すべてのジオメトリ オブジェクトを巡回し、.radius プロパティを持つものをフィルタ処理します。
-- さらに半径を 10 単位に変更するために、次のようにリスナーに入力します。
for i inGeometry where hasProperty i "radius" do i.radius = 10
OK

シーン内の天球体のみに影響させ、他のすべてのクラスを除外する場合は、オブジェクトのクラスを確認することになります。この場合、天球には「半径 (radius)」という名前のプロパティが存在するので、このプロパティについてチェックする必要はありません。classOf 関数によってオブジェクトのクラスが返されるので、これを影響を与えたいクラスと比較することができます。

例:

-- すべてのジオメトリ オブジェクトを巡回し、天球をフィルタ処理します。
-- さらに半径を 10 単位に変更するために、次のようにリスナーに入力します。
for i in Geometry where classOf i == GeoSphere do i.radius = 10
OK

MAXScript での正しいプロパティ名がわからない場合は、ヘルプ ファイルを参照するか、リスナーにある showProperties 調査関数を使用して公開されたすべてのオブジェクト プロパティのリストを印刷します。

例:

-- シーン内で単一の球をマウスで選択し、
-- 次のようにリスナーに入力します。
showProperties $
.smooth : boolean
.radius : float
.mapCoords : boolean
.segs : integer
.slice : boolean
.hemisphere : float
.sliceFrom : angle
.sliceTo : angle
.chop : integer
.recenter : boolean
false
関連事項