Local Edits

What are local edits?

Changing rule attributes using handles or the Inspector has a global effect by default. For example, below is a simple building generated from the code at the bottom. When the selection tool is active, dragging the windowHeight handle will change all the windows, as shown in the middle:

Left: Initial Building, Middle: Global Edit, Right: Local Edit.

Using the Local Edit tool it is now possible to change just a specific window locally. This enables fine-grained artistic control. To do this, first activate the Local Edit tool , and then click on a window in the 3D Viewport. Changing an attribute in the Inspector or using handles will now only affect this window. To exit the Local Edit tool, simply activate the selection tool again.

Local Edit Selections

The area of effect of a local edit depends on the selection. You can select single or multiple parts of a building, as explained in Local Edit Selections.

You can also apply local edits to predecessor shapes on a higher level of the shape tree, for example by changing all windows on a specific floor or facade. Also, changes can be applied to patterns on the building, for example by changing all windows in one column. See Local Edits on Higher Levels and Patterns for details.

When many local edits are applied to a building, it can get confusing to see which edit causes a change. You can manage local edits to get an overview.

Example Rule File

Local Edits work on attributes. Only attributes with handles can be locally edited. The handles are specific to the local attribute they modify.

In the following example, there are handles for windowHeight, windowWidth, and floorHeight that allow for local edits. The attribute bldgHeight is only used once in the first rule to create one shape in the shape tree and thus can not be edited locally.

version "2017.0"

@handle(shape=Init, axis=y)
attr bldgHeight = 10

@handle(shape=Floor, axis=y)
attr floorHeight = 2
@handle(shape=Window, axis=y)
attr windowHeight = 1
@handle(shape=Window, axis=x)
attr windowWidth = 1

Init --> extrude(bldgHeight) comp(f){side:Facade}
Facade --> split(y){~floorHeight: Floor}*
Floor --> split(x){~0.5:Wall | windowWidth: Tile | ~0.5: Wall}*

Wall --> X.
Tile --> split(y){~0.5:Wall | windowHeight: Window | ~0.5: Wall}

Window --> color(0.4,0.4,0.75) X.


Copyright ©2008-2018 Esri R&D Center Zurich. All rights reserved.