チュートリアル 20 : ローカル編集
チュートリアル データ
チュートリアル データは、[Help] メニュー → [Download Tutorials and Examples…] を選択し、[CityEngine Tutorial] からダウンロードできます。チュートリアルまたはサンプルを選択すると、プロジェクトが自動的にダウンロードされ、ワークスペースに追加されます。

このチュートリアルでは、ArcGIS CityEngine におけるローカル編集の方法を紹介します。ローカル編集を使用すると、個々の窓のサイズを変更したり、1 階部分を調整したり、バルコニーを個別に追加したりすることができます。これらのローカルな変更を CGA コード内で指定する必要はありません。
生成されたモデルがどのように構成されているかを理解することは有益です。これをより深く理解するために、[Model Hierarchy] ツールに慣れておくことをおすすめします。このツールを使えば、生成されたモデルのシェープ ツリーを確認することができます。
Part1: 個々の窓の編集
個々の窓を編集するには、以下の手順を完了してください。
- [Navigator] ウィンドウで Tutorial_20_Local_Edits チュートリアル フォルダーを展開します。
- scenes フォルダー内の Simple_Building_LE_01.cej ファイルをダブルクリックして、シーンを [Viewport] ウィンドウで開きます。
- rules フォルダー内の Simple_Building_LE_01.cga ファイルをダブルクリックして、ルールを [CGA Editor] ウィンドウで開きます。
ローカル編集は、ハンドルを持つ属性に対して利用可能です。窓のサイズのローカル編集を有効にするために、ルールの冒頭で窓の寸法に関する属性を作成します。その後、Tile ルールをこれらの属性を使用するように変更し、ユニークな属性にハンドルを追加することで、[Viewport] ウィンドウでインタラクティブに変更できるようにします。 - Simple_Building_LE_01.cga ルール ファイル内で、窓の幅と高さの属性を追加します。
attr window_width = 2
attr window_height = 1.5- [CGA Editor] ウィンドウでこのルール ファイルを確認し、Tile ルールを見つけてください。窓のサイズに関する数値を、先ほど追加した属性に置き換えます。
タイル (Tile) とは、四方を壁に囲まれた窓を含む構成要素です。Tile ルールは、指定された幅と高さで窓を作成し、それをタイルの中央に配置します。
Tile -->
split(x){ ~1 : Wall
| window_width: split(y){ ~1: Wall | window_height: Window | ~1: Wall }
| ~1 : Wall }- 属性にハンドルを追加します。
@Handle(shape=Window, axis=x)
attr window_width = 2
@Handle(shape=Window)
attr window_height = 1.5- Ctrl+S を押して CGA ファイルを保存し、ツールバーの [Generate Models] ツール (Ctrl+G) をクリックして建物を再生成します。

- 青い窓のハンドルの 1 つをドラッグします。

この操作により、すべての窓のサイズが同じように変更されます。

ローカル編集を使用すると、ルール内に窓の幅の属性が 1 つしか存在しない場合でも、各窓の幅を個別に変更することが可能です。
- [Inspector] ウィンドウで Default style を選択して、属性をリセットします。
- ツールバーで [Make local edits] ツールをクリックします。
- 1 つの窓を選択します。

[Viewport] ウィンドウでオレンジ色にハイライトされている部分は、現在選択されているオブジェクトを示しています。[Inspector] ウィンドウで同じくオレンジ色にハイライトされている属性は、現在の選択に対してローカル編集が可能です。window_width と window_height の属性は、この窓だけに対して個別に設定することができます。
- 青いハンドルをドラッグして、この窓だけのサイズを変更します。
[Inspector] ウィンドウでは、window_width と window_height 属性の横に表示される記号が、現在の選択に対してこれらの属性がローカル編集されたことを示しています。

複数選択を使用すると、同じローカル編集を複数の窓に同時に適用することができます。
- Shift を押しながら複数の窓を選択します。
Ctrl を押すと逆選択ができ、Ctrl+Shift を押すと選択解除ができます。 - 選択した窓のサイズは、ハンドルをドラッグするか、[Inspector] ウィンドウで値を入力することで変更できます。

ドアの上にある窓は、階段があるために小さくなることがよくあります。以前のすべての変更を取り消し、ローカル編集を使ってこの構成を作成することができます。
- すべてのローカル編集を元に戻すには、[Viewport] ウィンドウまたは [Inspector] ウィンドウで右クリックし、Reset all local edits をクリックします。

- ドアの上にある窓を選択します。
- End を押して、ドアの上にある列のすべての窓を選択します。

Home と End を押すことで、利用可能なパターンを前方または後方に繰り返すことができます。パターンは、シェープ ツリーと CGA コードによって作成された階層構造に基づいて自動的に検出されます。この場合、利用可能なオプションは、地上階の上にある窓の列の選択です。
- ハンドルをドラッグするか、[Inspector] ウィンドウで値を入力して、窓のサイズを小さくします。

Part2: 地上階の変更
地上階は建物の上層階とは異なることがよくあります。例えば、地上階の窓は通常、上層階の窓よりも大きくなっています。このシンプルな建物ルールでは、すべての階に同じ窓のタイルを作成するために、同じ窓のタイル コードを使用しています。しかし、ローカル編集を行うことで、地上階のためのタイル ルールを新たに作成する必要なく、地上階の建物正面の窓をより大きくすることができます。
- Simple_Building_LE_02.cej シーンを開きます。
- Simple_Building_LE_02.cga ルール ファイルを開きます。
- Simple_Building_LE_02.cga ルール ファイルの tile_width 属性にハンドルを追加し、属性のローカル編集をできるようにします。
@Handle(shape=Tile, axis=x)
@Range(min=1, max=10, restricted=false)
attr tile_width = rand(2.5,6)- CGA ファイルを保存して建物を再生成します。
- ツールバーで [Local edits] ツールをクリックします。
- 地上階の窓を選択し、タイルの幅、窓の幅、および窓の高さを変更します。

これは地上階の 1 つのタイルを変更するだけです。しかし、目標は地上階のすべてのタイルを変更することです。これは、より高いレベルでシェープを選択することで可能になります。
- PageUp を押して、ローカル編集レベルの1つ上のレベルに移動します。

現在、地上階のすべての窓が選択され、オレンジ色でハイライトされています。PageUp と PageDown は、それぞれ階層を上のレベル、または下のレベルへ移動します。ローカル編集はシェープ ツリーにリンクされており、編集をシェープ ツリーのより上位のレベルで適用することで、階すべての窓など複数のオブジェクトに対して編集を行うことができます。
- 地上階の窓を大きくするために、窓の高さを増やします。

これは、地上階のすべての窓を変更しますが、先ほど変更した最初の窓は除かれます。これは、最初の窓に対する編集がより低いレベルで行われたためです。同じオブジェクトに複数の編集が存在する場合、最も低いレベルで行われた編集が優先されます。
[Inspector] ウィンドウでは、tile_width、window_width、window_height 属性の横にある下向き矢印 (↓) は、これらの属性が現在の選択レベルよりも低いレベルで編集されていることを示しています。また、window_width 属性の横にあるアスタリスク (*) は、現在の選択レベルでも編集されていることを示しています。
地上階のすべての窓を同じにする必要があるため、不一致となっている窓に対して、低いレベルで行われた変更を元に戻す必要があります。
- PageDown を押してレベルを下げ、不一致のある窓を低いレベルで選択します。
- [Viewport] ウィンドウまたは [Inspector] ウィンドウで右クリックし、Reset highlighted local edits をクリックします。

- PageUp を押すか、Local Edits Menu の Select higher level をクリックして、地上階の窓を選択します。
- 地上階の窓を大きくするために、タイルの幅、窓の幅、窓の高さを増やします。

現在、すべての窓が同じサイズになっています。これは、下位レベルでのローカル編集が存在しないためです。
Part3: バルコニーの追加
建物にジオメトリーやディテールをローカルに追加するオプションを提供することは可能ですが、ジオメトリーが存在しない場合でもユーザーがハンドルにアクセスする方法が必要です。たとえば、選択した窓にバルコニーを追加するためにローカル編集を使用することができます。そのためには、バルコニーに並列ジオメトリーが必要です。この並列ジオメトリーがあることで、バルコニーが存在しない場合でもバルコニーのハンドルにアクセスすることが可能になります。
- Simple_Building_LE_03.cej シーンを開きます。
- Simple_Building_LE_03.cej ルール ファイルを開きます。
- Simple_Building_LE_03.cej ルール ファイルにバルコニーがあるかどうかを判断する属性を追加します。
attr hasBalcony = false- バルコニーを作成するためのコードを追加します。
Tile -->
split(x){ ~1 : Wall
| window_width: split(y){ ~1: Wall | window_height: Window BalconyMass | ~1: Wall }
| ~1 : Wall }
BalconyMass -->
s('1,0.9,0.9)
t(0,0,'-0.5)
Balcony
Balcony -->
case hasBalcony:
primitiveCylinder(32)
color(0.8,0.8,0.8)
split(z) { ~1: NIL
| ~1: comp(f) { top: NIL
| back: NIL
| bottom: extrude(0.05) Bottom.
| all= BalconyRailing } }
else:
NIL
BalconyRailing -->
comp(f) { side: s(0.05,'1,'1) center(x) extrude(0.05) Bar. }
s('1,0.05,'1)
[ t(0,-0.05,0) extrude(vertex.normal, 0.05) Bottom. ]
[ t(0,0.9,0) extrude(vertex.normal, 0.05) Railing. ]Balcony ルールは、バルコニーのジオメトリーを生成する場合もあれば、何も生成しない(NIL) 場合もあるため、バルコニーが存在しないときでもハンドルにアクセスできるように、ジオメトリーを持つ並列シェープが必要です。その並列シェープが「窓」です。BalconyMass ルールは、バルコニーが挿入されるボリューム空間を作成し、残りのルールがバルコニーのジオメトリーを生成します。
- ローカル編集を有効にするために、hasBalcony 属性にトグル ハンドルを追加します。
@Handle(shape=Balcony, type=toggle, occlusion=false)
attr hasBalcony = false- CGA ファイルを保存します。
- ツールバーで [Local edits] ツールをクリックし、1 つの窓を選択します。
- 窓の上にカーソルを合わせると、影付きのボリュームと新しいタイプのハンドル (四角いスイッチアイコンとして表示) が表示されます。 これは、Balcony ルールに付属しているトグル ハンドルであり、クリックすることで hasBalcony 属性を true と false に切り替えて、バルコニーの有無を制御することができます。
- スイッチ アイコンをクリックして true に切り替えると、選択した窓にバルコニーが表示されます。

- CGA ファイルを保存して建物を再生成します。
通常、バルコニーは建物の上層階にのみあり、玄関の上にある階段の窓には設置されないことが多いです。
上層階の窓を選択し、PageUp を押して、地上階を除いたすべての上層階が選択されるまでレベルを上げます。
トグル ハンドルを使って hasBalcony 属性を true に切り替えることで、すべての上層階の窓にバルコニーを追加してください。

- PageDown を押して、玄関の上にある窓を選択してください。

[Inspector] ウィンドウで、hasBalcony 属性の横に上向き矢印 (↑)が表示されています。これは、この属性がより高いレベルでローカル編集されていることを示しています。この変更は上書き可能です。なぜなら、同じオブジェクトに対して複数の編集がある場合、より低いレベルで行われた編集が優先されるためです。
- End を押して、玄関の上にあるすべての窓を選択します。
- 玄関の上にある窓からバルコニーを削除するには、hasBalcony 属性を false に設定してください。

このチュートリアルでは、ローカル編集を使用して以下のことを行う方法を学びました。
- 個別の窓サイズの変更
- 地上階の変更
- CGA ルールファイルを変更せずにバルコニーを個別に追加
CityEngine の学習をさらに進めるには、その他のクラシック チュートリアルをご覧ください。