要访问 CityEngine 中的教程,请单击帮助 > 下载教程和示例。 在选择教程或示例后,系统会自动下载工程并将其添加到工作空间。
简介
本教程介绍了如何在 CityEngine 中进行局部编辑。 从教程 6 结束处开始,您将添加代码以开始启用局部编辑。 借助局部编辑,可以修改单个窗口大小、对底层进行更改并添加选择性阳台,而无需在 CGA 代码中指定这些局部变量。
修改单个窗口
要修改单个窗口,请完成以下步骤:
- 打开 Simple_Building_LE_01.cej 场景。
- 打开 Simple_Building_LE_01.cga 规则文件。
可以在具有控点的属性上进行局部编辑。 要启用窗口大小的局部编辑,需要创建窗口尺寸的属性,对 Tile 规则进行修改以使用这些属性,然后将控点添加到这些属性。
- 在 Simple_Building_LE_01.cga 规则文件中,添加窗口宽度和高度的属性。
attr window_width = 2 attr window_height = 1.5
- 找到 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
- 保存 CGA 文件,然后通过单击主工具栏上的生成或按 Ctrl+G 来重新生成建筑物。
- 拉动窗口控点。
由此将以相同方式更改所有窗口的窗口大小。
借助局部编辑,即使规则中仅存在一个窗口宽度属性,也可以单独更改每个窗口的宽度。
- 单击工具栏上的重置按钮 即可重置所有属性。
- 可通过单击工具栏上的局部编辑按钮 启用局部编辑模式。
- 选择窗口。
视窗中的橙色高亮显示将指示当前选择内容。 在检查器中同样以橙色高亮显示的属性是可以针对当前选择进行局部编辑的属性。 可以仅针对此窗口对 window_width 和 window_height 属性执行局部设置。
- 拉动窗口宽度和高度的控点以仅更改此窗口的大小。
在检查器中,window_width 和 window_height 属性旁边的 * 符号指示已针对当前选择内容对这些属性进行了局部编辑。
对于多个选择内容,可以将同一局部编辑同时应用于多个窗口。
- 在选择多个窗口的同时按 Shift 键以选择多个组件。
在选择的同时按下 Ctrl 键可以切换选择内容中的项目,已选择的项目将被移除。
- 通过拉动控点或者在检查器中输入一个值可以更改所选窗口的大小。
门上方的窗口通常较小,因为此处为楼梯所在位置。 可以撤消之前的所有更改,并使用局部编辑创建此更改。
- 要撤消所有局部编辑,请在视窗或检查器中右键单击,然后单击 > 重置所有局部编辑。
- 选择门上方的窗口。
- 按 End 键以选择门上方列中的所有窗口。
Home 和 End 键用于在可用模式中来回循环。 将根据形状树以及 CGA 代码创建形状树的方式来自动检测模式。 在这种情况下,可用选项是选择底层上方的窗户列。
- 通过拉动控点或者在“检查器”中输入值来缩小窗口。
更改底层
底层通常与建筑物的较高楼层有所不同。 例如,底层窗口通常比较高楼层窗口大。 这个简单的建筑物规则使用相同的窗口切片代码在所有楼层上创建相同的窗口切片。 借助局部编辑,可以增大建筑物前面的底层窗口,而无需为底层切片编写单独的规则。
- 打开 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 文件并重新生成建筑物。
- 在局部编辑模式下,选择底层的窗口,然后更改其切片宽度、窗口宽度和窗口高度。
由此将更改底层的一个切片。 但是,目标是更改底层上的所有切片。 通过在更高级别上选择形状,可以实现此目标。
- 按 PageUp 可以转到局部编辑层次结构中的上一级别。
现在,底层的所有窗口均已选中并以橙色高亮显示。 PageUp 和 PageDown 键可分别上移至更高级别和下移至更低级别。 局部编辑将链接至形状树,通过将编辑置于形状树的更高级别,可以将其应用于多个对象,例如楼层上的所有窗口。
- 增加窗口宽度,以使底层的窗口更大。
由此将更改底层上除了在步骤 5 中更改的第一个窗口以外的所有窗口。这是因为在步骤 5 中对第一个窗口所做的编辑处于较低级别。 当同一对象上存在多个编辑时,在最低级别进行的编辑将优先。
在检查器中,tile_width、window_width 和 window_height 属性旁边的向下箭头 ↓ 指示已对这些属性进行的编辑级别低于当前选择级别。 window_width 属性旁边的 * 符号意味着同时已在当前选择级别对该属性进行了编辑。 由于所有底层窗口均应相同,因此应撤消在较低级别对不一致的窗口所做的更改。
- 通过使用 PageDown 向下移动一个级别,可以在较低级别上选择不一致的窗口。
- 在视窗或检查器中单击鼠标右键,然后单击 > 重置高亮显示的局部编辑。
- 使用 PageUp 选择底层窗口。
- 增加切片宽度、窗口宽度和窗口高度,以使底层窗口更大。
现在,由于没有较低级别的局部编辑,因此所有窗口的大小都相同。 如果橙色高亮显示在更改切片宽度后丢失,则可能需要重新选择底层窗口。
添加阳台
可以采用局部方式将几何或细节添加到建筑物,但是当几何不存在时,用户需要通过某种方法来访问控点。 例如,可以使用局部编辑将阳台放置在所选窗口上。 为此,阳台必须具有同级几何。 即使在阳台不存在的情况下,此同级几何也允许访问阳台的控点。
- 打开 Simple_Building_LE_03.cej 场景。
- 打开 Simple_Building_LE_03.cga 规则文件。
- 在 Simple_Building_LE_03.cga 规则文件中,添加一个属性以确定是否存在阳台。
attr hasBalcony = false
- 4) 添加代码以创建阳台。
由于 Balcony 规则可能会生成阳台的几何,也可能不会生成任何内容 (NIL),因此应存在具有几何的同级形状,以便在没有阳台时也能够访问控点。 该同级形状为 Window。 BalconyMass 规则创建一个将阳台插入其中的体积,其余规则将创建阳台几何。
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. ]
- 将切换控点放置在属性 hasBalcony 上以启用局部编辑。
@Handle(shape=Balcony, type=toggle, occlusion=false) attr hasBalcony = false
将鼠标悬停在控点上方时,系统将在附加控点的位置显示阴影体积。 由于控点附加到 Balcony 规则,阴影体积将显示阳台的位置。
- 保存 CGA 文件并重新生成建筑物。
通常,阳台仅在建筑物的较高楼层上有意义,并且门上方楼梯间的窗口大多没有阳台。
- 选择较高楼层窗口,然后按 PageUp,直到选择所有较高楼层为止。
提示:
PageUp 和 PageDown 键可分别用于上移至更高级别和下移至更低级别。
- 通过使用切换控点将 hasBalcony 设置为 true 来添加阳台。
- 可以使用 PageDown 选择门上方的窗口。
在检查器中,属性 hasBalcony 旁边存在一个向上箭头 ↑。 这意味着已在更高级别对此属性进行了局部编辑。 由于在较低级别执行的编辑具有优先权,因此将覆盖此更改。
- 通过按 End 以选择门上方的所有窗口。
提示:
Home 和 End 键可用于选择模式。
- 通过将 hasBalcony 设置为 false,可以移除门上方窗口中的阳台。
添加草边框
局部编辑将链接至形状树。 局部编辑的限制之一是更改形状树结构可能会导致已应用的局部编辑丢失。 这意味着在应用局部编辑后更改代码可能会导致意外结果。 建议仅在代码完成后尝试进行局部编辑,在编写代码时创建占位符规则以说明将来对代码的更改,并且避免在更改代码时更改形状树结构。
- 打开 Simple_Building_LE_04.cej 场景。
- 打开 Simple_Building_LE_04.cga 规则文件并找到以下代码片段:
Lot --> extrude(height) Building
- 将代码片段修改为以下内容:
Lot --> offset(-1) comp(f) { inside: Footprint | border= Grass } Footprint --> extrude(height) Building Grass --> color("#4c7b1e")
由于偏移可用于将草与建筑物覆盖区分开,Footprint 规则将创建 Building。
- 保存 CGA 文件并重新生成建筑物。
这会导致局部编辑丢失,原因是局部编辑与形状树相关。 当形状树的结构发生变化时,局部编辑将会保留,但可能会导致意外结果。 要验证局部编辑,您可以将代码更改回原始状态。
步骤 3 之前和之后的形状树表明,Footprint 形状已插入到 Lot 和 Building 形状之间。
注:
要打开形状树,请转至窗口 > 模型等级并选择建筑物,然后单击模型等级选项卡中的检查模型。 有关详细信息,请参阅模型等级。
- 修改 Lot 规则,而无需在 Lot 和 Building 之间添加额外的规则。 可以移除 Footprint 规则。
Lot --> offset(-1) comp(f) { inside: extrude(height) Building | border= Grass }
- 保存 CGA 文件并重新生成建筑物。
现在,形状树将从 Lot 直接转至 Building。 下面是保留了局部编辑且周围存在草边框的建筑物。
最终结果位于使用 Simple_Building_LE_05.cga 规则文件的 Simple_Building_LE_05.cej 场景中。
提示:
避免丢失局部编辑的一种方法是在添加代码时尽量不要更改形状树结构。 另一种方法是尝试为您认为以后在创建初始规则文件时可能需要的规则创建占位符。 在更改代码时,某些局部编辑可能不再有意义,因此最高效的解决方案可能是仅在处理 CGA 文件后应用局部编辑。