教程 20:本地编辑

要访问 CityEngine 中的教程,请单击帮助 > 下载教程和示例...。 在选择教程或示例后,系统会自动下载工程并将其添加到工作空间。

添加了 Footprint 规则,而不会丢失本地编辑的建筑物

简介

本教程介绍了如何在 CityEngine 中进行本地编辑。 从教程 6 结束处开始,您将添加代码以开始启用本地编辑。 借助本地编辑,可以修改单个窗口大小、对底层进行更改并添加选择性阳台,而无需在 CGA 代码中指定这些本地变量。

修改单个窗口

  1. 打开 Simple_Building_LE_01.cej 场景。
  2. 打开 Simple_Building_LE_01.cga 规则文件。

    可以在具有控点的属性上进行本地编辑。 要启用窗口大小的本地编辑,需要创建窗口尺寸的属性,对 Tile 规则进行修改以使用这些属性,然后将控点添加到这些属性。

  3. Simple_Building_LE_01.cga 规则文件中,添加窗口宽度和高度的属性。
    attr window_width = 2
    attr window_height = 1.5
  4. 找到 Tile 规则,然后使用这些属性替换窗口大小的确切值。

    切片包含在所有四个侧面都带有一些围墙的窗户。 Tile 规则将在切片的中心创建具有所需宽度和高度的窗口。

    Tile -->
    	split(x){ ~1 : Wall 
    			| window_width: split(y){ ~1: Wall | window_height: Window | ~1: Wall }
    			| ~1 : Wall }
  5. 向属性添加控点。
    @Handle(shape=Window, axis=x)
    attr window_width = 2
    
    @Handle(shape=Window)
    attr window_height = 1.5
  6. 保存 CGA 文件,然后通过单击主工具栏上的“生成”或按 Ctrl + G 来重新生成建筑物。
    带有控点的建筑物
  7. 拉动窗口控点。

    由此将以相同方式更改所有窗口的窗口大小。

    窗口上的本地编辑

    借助本地编辑,即使规则中仅存在一个窗口宽度属性,也可以单独更改每个窗口的宽度。

  8. 单击工具栏上的“重置” 重置 工具即可重置所有属性。
  9. 可以通过单击工具栏上的“本地编辑” 本地编辑 工具来启用本地编辑模式。
  10. 选择窗口。

    视口中的橙色高亮显示将指示当前选择。 在检查器中同样以橙色高亮显示的属性是可以针对当前选择进行本地编辑的属性。 可以仅针对此窗口在本地设置属性 window_widthwindow_height

    在检查器中高亮显示的本地编辑选择
  11. 拉动窗口宽度和高度的控点以仅更改此窗口的大小。

    在检查器中,window_widthwindow_height 属性旁边的 * 符号指示已针对当前选择对这些属性进行了本地编辑。

    检查器指示已应用本地编辑

    对于多个选择,可以将同一本地编辑同时应用于多个窗口。

  12. 在选择多个窗口的同时按 Shift 键可以选择多个组件。

    在选择的同时按下 Ctrl 键可以切换选择中的项目 - 已选择的项目将被移除。

  13. 通过拉动控点或者在检查器中输入一个值可以更改所选窗口的大小。

    具有多个选择的本地编辑

    门上方的窗口通常较小,因为此处为楼梯所在位置。 可以撤消之前的所有更改,并使用本地编辑创建此更改。

  14. 要撤消所有本地编辑,请在“视口”或“检查器”中单击鼠标右键 > 重置所有本地编辑
  15. 选择门上方的窗口。
  16. 按 End 键以选择门上方列中的所有窗口。

    HomeEnd 键用于在可用模式中来回循环。 将根据形状树以及 CGA 代码创建形状树的方式来自动检测模式。 在这种情况下,可用选项是选择底层上方的窗户列。

    带有模式的本地编辑选择
  17. 通过拉动控点或者在“检查器”中输入值来缩小窗口。
    应用模式本地编辑后

使底层有所不同

底层通常与建筑物的较高楼层有所不同。 例如,底层窗口通常比较高楼层窗口大。 这个简单的建筑物规则使用相同的窗口切片代码在所有楼层上创建相同的窗口切片。 借助本地编辑,可以增大建筑物前部的底层窗口,而无需为底层切片编写单独的规则。

  1. 打开 Simple_Building_LE_02.cej 场景。
  2. 打开 Simple_Building_LE_02.cga 规则文件。
  3. 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)
  4. 保存 CGA 文件并重新生成建筑物。
  5. 在本地编辑模式下,选择底层的窗口,然后更改其切片宽度、窗口宽度和窗口高度。
    本地编辑底层选择

    由此将更改底层的一个切片。 但是,目标是更改底层上的所有切片。 通过在更高级别上选择形状,可以实现此目标。

  6. PageUp 可以转到本地编辑层次结构中的上一级别。

    现在,底层上的所有窗口均已选中并以橙色高亮显示。 PageUpPageDown 键可分别上移至更高级别和下移至更低级别。 本地编辑将链接至形状树,通过将编辑置于形状树的更高级别,可以将其应用于多个对象,例如楼层上的所有窗口。

    更高级别上的本地编辑选择
  7. 增加窗口宽度,以使底层上的窗口更大。
    应用于更高级别上的本地编辑

    由此将更改底层上除了在步骤 5 中更改的第一个窗口以外的所有窗口。这是因为在步骤 5 中对第一个窗口所做的编辑处于较低级别。 当同一对象上存在多个编辑时,在最低级别进行的编辑将优先。

    在检查器中,tile_widthwindow_width window_height 属性旁边的向下箭头 ↓ 指示已对这些属性进行的编辑级别低于当前选择级别。 window_width 属性旁边的 * 符号意味着同时已在当前选择级别对该属性进行了编辑。 由于所有底层窗口均应相同,因此应撤消在较低级别对不一致的窗口所做的更改。

  8. 通过使用 PageDown 向下移动一个级别,可以在较低级别上选择不一致的窗口。
  9. 在“视口”或“检查器”中单击鼠标右键 > 重置高亮显示的本地编辑
  10. 使用 PageUp 选择底层窗口。
    高亮显示重置后的本地编辑选择
  11. 增加切片宽度、窗口宽度和窗口高度,以使底层窗口更大。

    现在,由于没有较低级别的本地编辑,因此所有窗口的大小都相同。 如果橙色高亮显示在更改切片宽度后丢失,则可能需要重新选择底层窗口。

    具有相同大小的底层窗口

添加阳台

可以提供在本地将几何或细节添加到建筑物的选项,但是当几何不存在时,用户需要通过相应方法来访问控点。 例如,可以使用本地编辑将阳台放置在所选窗口上。 为此,阳台需要具有同级几何。 即使在阳台不存在的情况下,此同级几何也允许访问阳台的控点。

  1. 打开 Simple_Building_LE_03.cej 场景。
  2. 打开 Simple_Building_LE_03.cga 规则文件。
  3. Simple_Building_LE_03.cga 规则文件中,添加一个属性以确定是否存在阳台。
    attr hasBalcony = false
  4. 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. ]
  5. 将切换控点放置在属性 hasBalcony 上以启用本地编辑。
    @Handle(shape=Balcony, type=toggle, occlusion=false)
    attr hasBalcony = false

    将鼠标悬停在控点上方时,系统将在附加控点的位置显示阴影体积。 由于控点附加到 Balcony 规则,阴影体积将显示阳台的位置。

    用于本地编辑的阳台控点
  6. 保存 CGA 文件并重新生成建筑物。

    通常,阳台仅在建筑物的较高楼层上有意义,并且通常不包含在门上方的楼梯窗口中。

  7. 选择较高楼层窗口,然后按 PageUp,直到选择所有较高楼层为止。
    提示:

    PageUpPageDown 键可分别用于上移至更高级别和下移至更低级别。

  8. 通过使用切换控点将 hasBalcony 设置为 true 来添加阳台。
    最高级别上的本地编辑选择
  9. 可以使用 PageDown 选择门上方的窗口。
    门上方的阳台

    在检查器中,属性 hasBalcony 旁边存在一个向上箭头 ↑。 这意味着已在更高级别对此属性进行了本地编辑。 由于在较低级别执行的编辑具有优先权,因此将覆盖此更改。

  10. 通过按 End 以选择门上方的所有窗口。
    提示:

    Home 和 End 键可用于选择模式。

    所选门上方的阳台
  11. 通过将 hasBalcony 设置为 false,可以移除门上方窗口中的阳台。
    已移除门上方的阳台

添加草边框

本地编辑将链接至形状树。 本地编辑的限制之一是更改形状树结构可能会导致已应用的本地编辑丢失。 这意味着在应用本地编辑后更改代码可能会导致意外结果。 建议仅在代码完成后尝试进行本地编辑,在编写代码时创建占位符规则以说明将来对代码的更改,和/或避免在更改代码时更改形状树结构。

  1. 打开 Simple_Building_LE_04.cej 场景。
  2. 打开 Simple_Building_LE_04.cga 规则文件并找到以下代码片段:

    Lot --> 
    	extrude(height) Building

  3. 将代码片段修改为以下内容:
    Lot --> 
    	offset(-1)
    	comp(f) { inside: Footprint | border= Grass }
    	
    Footprint -->
    	extrude(height) Building
    
    Grass -->
    	color("#4c7b1e")

    由于偏移可用于将草与建筑物覆盖区分开,Footprint 规则将创建 Building

  4. 保存 CGA 文件并重新生成建筑物。
    添加 Footprint 规则并丢失本地编辑后的建筑物

    这会导致本地编辑丢失,原因是本地编辑相对于形状树。 当形状树的结构发生变化时,本地编辑将会保留,但可能会导致意外结果。 要验证本地编辑,您可以将代码更改回原始状态。

    步骤 3 之前和之后的形状树表明,Footprint 形状已插入到 LotBuilding 形状之间。

    之前
    之前
    之后
    之后

    注:

    要打开形状树,请转至窗口 > 模型等级并选择建筑物,然后单击模型等级选项卡中的检查模型。 有关详细信息,请参阅模型等级

  5. 修改 Lot 规则,而无需在 LotBuilding 之间添加额外的规则。 可以移除 Footprint 规则。

    Lot --> 
    	offset(-1)
    	comp(f) { inside: extrude(height) 
               Building | border= Grass }
    添加了 Lot 规则,而无需在 Lot 和 Building 之间添加额外的规则
  6. 保存 CGA 文件并重新生成建筑物。

    现在,形状树将从 Lot 直接转至 Building。 下面是保留了本地编辑并在其周围存在草边框的建筑物。

    添加了 Footprint 规则,而不会丢失本地编辑的建筑物

最终结果位于使用 Simple_Building_LE_05.cga 规则文件的 Simple_Building_LE_05.cej 场景中。

提示:

避免丢失本地编辑的一种方法是在添加代码时尽量不要更改形状树结构。 另一种方法是尝试为您认为以后在创建初始规则文件时可能需要的规则创建占位符。 在更改代码时,某些本地编辑可能不再有意义,因此最简单的解决方案可能是仅在处理 CGA 文件后再应用本地编辑。