教程 20:局部编辑

CityEngine 2025.0    |    |  

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

添加 Footprint 规则而未丢失局部编辑的建筑物

本教程介绍了如何在 ArcGIS CityEngine 中进行局部编辑。 借助局部编辑,可以修改单个窗口大小、对底层进行更改并独立添加阳台,而无需在 CGA 代码中指定这些局部变更。

了解生成的模型的结构是很有用的。 为了更好地理解这一点,建议您熟悉模型等级工具,该工具可用于检查生成的模型的形状树。

修改单个窗口

要修改单个窗口,请完成以下步骤:

  1. Navigator 窗口中展开 Tutorial_20_Local_Edits 教程文件夹。
  2. 双击 scenes 文件夹中的 Simple_Building_LE_01.cej 文件以在视口窗口中打开场景。
  3. 双击 rules 文件夹中的 Simple_Building_LE_01.cga 文件,在 CGA 编辑器窗口中打开规则。

    可以对具有控点的属性进行局部编辑。 要启用窗口大小的局部编辑,需要在规则开始时创建窗口尺寸的属性。 然后修改 Tile 规则以使用这些属性,并将控点添加到唯一属性以在视口窗口中启用交互式更改。

  4. Simple_Building_LE_01.cga 规则文件中,添加窗口宽度和高度的属性。
    attr window_width = 2
    attr window_height = 1.5
  5. CGA 编辑器窗口中探索此规则文件以找到 Tile 规则。 使用这些属性替换窗口大小的确切值。

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

    Tile -->
    	split(x){ ~1 : Wall 
    			| window_width: split(y){ ~1: Wall | window_height: Window | ~1: Wall }
    			| ~1 : Wall }

  6. 向属性添加控点。
    @Handle(shape=Window, axis=x)
    attr window_width = 2
    
    @Handle(shape=Window)
    attr window_height = 1.5
  7. Ctrl+S 以保存 CGA 文件,然后通过单击主工具栏上的生成模型工具 生成Ctrl+G)来重新生成建筑物。
    带有控点的建筑物
  8. 拖动其中一个蓝色窗口控点。

    针对窗口的局部编辑

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

    使用局部编辑更改所有窗口

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

  9. Inspector 窗口中选择默认样式以重置属性。
  10. 单击工具栏上的局部编辑工具 局部编辑工具
  11. 选择单个窗口。

    Inspector 窗口中高亮显示的局部编辑选择内容。

    视口窗口中的橙色高亮显示将指示当前选择内容。 在 Inspector 窗口中同样以橙色高亮显示的属性可以针对当前选择进行局部编辑。 可以仅针对此窗口对 window_widthwindow_height 属性执行局部设置。

  12. 拖动蓝色控点仅更改此窗口的大小。

    Inspector 窗口中,window_widthwindow_height 属性旁边的 * 符号指示已针对当前选择内容对这些属性进行了局部编辑。

    Inspector 窗口指示已应用局部编辑。

  13. 对于多个选择内容,可以将同一局部编辑同时应用于多个窗口。
  14. 按住 Shift 键选择多个窗口。

    Ctrl 键执行反向选择,按 Ctrl+Shift 执行取消选择。

  15. 通过拖动控点或者在 Inspector 窗口中输入一个值可以更改所选窗口的大小。

    具有多个选择内容的局部编辑

  16. 门上方的窗口通常较小,因为此处为楼梯所在位置。 可以撤消之前的所有更改,并使用局部编辑创建此更改。
  17. 要撤消所有局部编辑,请在视口窗口或 Inspector 窗口中右键单击,然后单击重置所有局部编辑

    重置所有本地编辑

  18. 选择门上方的窗口。
  19. End 键以选择门上方列中的所有窗口。

    具有模式的局部编辑选择内容

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

  20. 通过拖动控点或者在 Inspector 窗口中输入值来缩小窗口。

    应用模式局部编辑后

更改底层

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

  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. 选择底层的窗口,然后更改其切片宽度、窗口宽度和窗口高度。

    局部编辑底层选择内容

  7. 由此将更改底层的一个切片。 但是,目标是更改底层上的所有切片。 通过在更高级别上选择形状,可以实现此目标。
  8. PageUp 可以转到局部编辑层次结构中的上一级别。

    更高级别上的局部编辑选择内容

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

  9. 增加窗口高度,以使底层的窗口更大。

    应用于更高级别上的局部编辑。

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

    Inspector 窗口中,tile_widthwindow_widthwindow_height 属性旁边的向下箭头 ↓ 指示已对这些属性进行的编辑级别低于当前选择级别。 window_width 属性旁边的 * 符号意味着同时已在当前选择级别对该属性进行了编辑。

  10. 由于所有底层窗口均应相同,因此应撤消在较低级别对不一致的窗口所做的更改。
  11. 通过按 PageDown 向下移动一个级别,可以在较低级别上选择不一致的窗口。
  12. 视口窗口或 Inspector 窗口中单击鼠标右键,然后单击重置高亮显示的局部编辑
    高亮显示重置后的局部编辑选择内容
  13. PageUp 或单击局部编辑菜单中的选择更高级别以选择底层窗口。
  14. 增加切片宽度、窗口宽度和窗口高度,以使底层窗口更大。

    具有相同大小的底层窗口

    现在,由于没有较低级别的局部编辑,因此所有窗口的大小都相同。

注:
如果橙色高亮显示在更改切片宽度后丢失,则可能需要重新选择底层窗口。

添加阳台

可以采用局部方式将几何或细节添加到建筑物,但是当几何不存在时,可以访问控点则非常重要。 例如,可以使用局部编辑将阳台放置在所选窗口上。 为此,阳台必须具有同级几何。 即使在阳台不存在的情况下,此同级几何也允许访问阳台的控点。

  1. 打开 Simple_Building_LE_03.cej 场景。
  2. 打开 Simple_Building_LE_03.cga 规则文件。
  3. Simple_Building_LE_03.cga 规则文件中,添加一个属性以确定是否存在阳台。
    attr hasBalcony = false
  4. 添加代码以创建阳台。

    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),因此应存在具有几何的同级形状,以便在没有阳台时也能够访问控点。 该同级形状为 Window。 BalconyMass 规则创建一个将阳台插入其中的体积,其余规则将创建阳台几何。

  5. 将切换控点添加到属性 hasBalcony 上以启用局部编辑。
    @Handle(shape=Balcony, type=toggle, occlusion=false)
    attr hasBalcony = false
  6. 保存 CGA 文件。
  7. 单击局部编辑工具 局部编辑工具,然后选择单个窗口。
  8. 将鼠标悬停在窗口上即可看到阴影体积和新型控点(显示为方形开关图标)。

    这是附加到 Balcony 规则的切换控点,单击时,在 true 和 false 之间切换以启用或禁用 hasBalcony 属性。

  9. 单击开关图标以切换到 true,显示所选窗口上的阳台。

    用于局部编辑的阳台控点。

  10. 保存 CGA 文件并重新生成建筑物。

  11. 通常,阳台仅在建筑物的较高楼层上有意义,并且门上方楼梯间的窗口大多没有阳台。
  12. 选择较高楼层窗口,然后按 PageUp,直到选择所有较高楼层为止(无底层)。
  13. 使用切换控点将 hasBalcony 属性切换为 true,为所有上层的窗户添加阳台。
    最高级别上的局部编辑选择内容
  14. 可以按 PageDown 选择门上方的窗口。
    门上方的阳台

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

  15. 通过按 End 以选择门上方的所有窗口。

    提示:

    HomeEnd 键可用于选择模式。

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

注:

局部编辑的限制之一是更改形状树结构可能会导致已应用的局部编辑丢失。 这意味着在应用局部编辑后更改代码可能会导致意外结果。 建议仅在代码完成后尝试进行局部编辑。

在本教程中,您学习了如何使用局部编辑执行以下操作:

  • 修改单个窗口大小。
  • 更改底层。
  • 独立添加阳台,无需更改 CGA 规则文件。

要继续学习 CityEngine,请参阅完整的 CityEngine 教程目录