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

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

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

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

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

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

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

-- select a large number of spheres in the scene with the mouse,
-- then change the radius of all selected objects to 10.0 units
-- by typing in the Listener:
selection.radius = 10
OK

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

エラーの例:

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

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

例:

-- select any number of objects in the scene with the mouse,
-- then change the radius of all objects that have a .radius property
-- by typing in the Listener:
for i inselection where hasProperty i "radius" do i.radius = 10
OK

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

例:

-- Go through all geometry objects, filter those that have a .radius property
-- and change the radius to 10 units by typing in the Listener:
for i inGeometry where hasProperty i "radius" do i.radius = 10
OK

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

例:

-- Go through all geometry objects, filter the GeoSpheres
-- and change their radius to 10 units by typing in the Listener:
for i in Geometry where classOf i == GeoSphere do i.radius = 10
OK

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

例:

-- Select a single sphere in the scene using the mouse and
-- type in the Listener:
showProperties $
.smooth : boolean
.radius : float
.mapCoords : boolean
.segs : integer
.slice : boolean
.hemisphere : float
.sliceFrom : angle
.sliceTo : angle
.chop : integer
.recenter : boolean
false

関連事項