CityEngine2023新增案例 Tutorial 22: Dynamic imports

 

 

要访问 ArcGIS CityEngine 中的教程工程, 打开 CityEngine,然后单击帮助>下载教程和 主菜单中的示例。选择教程或示例后, 项目将自动下载并添加到 CityEngine 工作区。

 

下载地址:https://www.cityengine.cn/product/view556.html

 

GUID-5B2E5329-B36A-45DB-8100-72B91F4A3D86-web

本教程通过涉及 ESRI.lib Plant_Loader的示例介绍如何使用动态导入。您将学习如何使用两种方法沿道路两侧插入棕榈树:一种更耗时的方法,需要在 CGA 中进行更多编码,另一种方法是使用动态导入的更有效方法。

用户常犯的错误

使用Plant_Loader时,用户经常设置植物的名称,而不知道如果不设置高度和半径,它们可能会不正确。换句话说,当设置所需属性而不知道还需要设置依赖属性时,这通常会导致错误。

接下来,您将更详细地了解这一点。

  1. 展开“导航”窗口中的Tutorial_22_Dynamic_Imports教程文件夹。
  2. 打开 /scenes/ 文件夹中的 dynamic_imports_01.cej 文件,以在没有任何植物的街道视中打开场景:

    GUID-C47E19C6-E948-4088-A6D4-273DCEFB61BD-web

  3. 在 /rules/ 文件夹中打开 dynamic_imports_01.cga 规则文件,以在 CGA 编辑器窗口中将其打开。
  4. 要从 ESRI.lib 导入Plant_Loader,请将 /ESRI.lib/rules/Plants/Plant_Loader.cga 文件从“导航”窗口拖放到规则文件中的导入Street_Modern_Simple:“/ESRI.lib/rules/Streets/Street_Modern_Simple.cga” 语句下方:

    GUID-BB3F6738-41DD-4798-80B8-F9A2AA98A6CF-web

    这将添加第二个导入语句:

    import Plant_Loader:"/ESRI.lib/rules/Plants/Plant_Loader.cga"

     

  5. 使用Plant_Loader修改规则以将树木添加到街道两侧:
    Tree -->
    	Plant_Loader.Generate

     

  6. 保存 dynamic_imports_01.cga 文件。
  7. 选择人行道形状,然后单击生成 GUID-2FD1C89B-9F1C-4C8F-8586-7ED8AAC28421-web (Ctrl+G):

    GUID-E7BBA1B9-8202-4ED5-A350-8A09BBFF1FC4-web

    由于您没有指定植物名称,因此街道两旁是默认的“橙树”。在本教程中,您希望树木是“椰子树”。

    若要查看此时场景和规则的外观,请打开 dynamic_imports_02.cej 场景和 dynamic_imports_02.cga 规则文件。

  8. 在树规则中将植物属性名称设置为“椰子”:
    Tree -->
    	set(Plant_Loader.Name, "Coconut Palm")
    	Plant_Loader.Generate

     

  9. 保存规则并生成:

    GUID-1F9C8D4C-D93B-4288-ABD3-7F52355FFC59-web

    街道两旁种满了棕榈树,但它们的高度和半径不正确,因为这些值来自默认的“橙树”名称。

    这是因为,导入Plant_Loader时,“名称”属性设置为“橙色树”,并且“高度”和“半径”属性是根据“橙色树”的标准大小计算的。在Plant_Loader中,属性相互依赖。“高度”值基于“名称”属性计算,“半径”值基于“名称”和“高度”属性计算。

    因此,当您使用 set() 操作将 Plant_Loader.Name 设置为“椰子树”时,它只设置 Name 属性。它不会更改或重新计算高度和半径的值,并且这些属性仍然具有来自“橙色树”的原始值。

通过重新计算值来修复树大小

通过仅设置植物的 Name 属性,您已经创建了具有橘子树高度的棕榈树。要固定棕榈树的高度,可以在设置植物名称后重新计算并设置高度半径的值。

接下来,您将探索此解决方案,但请记住,这是一种繁琐的方法,因为它需要您了解Plant_Loader的属性依赖关系以及如何重新计算必要的属性。这种方法很复杂,容易出错。

  1. 打开 dynamic_imports_03.cej 场景和dynamic_imports_03.cga 规则文件。
  2. 在 dynamic_imports_03.cga 中,修改规则以在设置植物名称后设置高度半径
    Tree -->
    	set(Plant_Loader.Name, "Coconut Palm")
    	set(Plant_Loader.Height, Plant_Loader.getStandardHeight)
    	set(Plant_Loader.Radius, Plant_Loader.getRadius)
    	Plant_Loader.Generate

     

  3. 保存并生成。

    GUID-2CC15C0F-0111-4FAB-BD50-F3531FFE7EF8-web

    现在棕榈树具有正确的高度和半径,但这种方法不是更新大小的有效方法。此方法很复杂,因为首先,您必须知道哪些属性需要重新计算以及按什么顺序重新计算,其次,您必须知道如何重新计算它们。

使用动态导入修复树大小

修复此错误的建议方法是使用动态导入。您可以使用动态导入设置所需的一个或多个属性,而不是使用 set() 操作设置属性,并且将自动重新计算任何依赖属性和常量。

若要了解其工作原理,请参阅下面的Plant_Loader示例:

  1. 打开 dynamic_imports_04.cej 场景和 dynamic_imports_04.cga 规则文件。
  2. 修改规则以使用将 Name 属性设置为“椰子树”的动态导入:
    Tree -->
    	Plant_Loader(Name="Coconut Palm").Generate

     

    高度”和“半径”属性会自动更新,无需考虑。

  3. 保存并生成。

    GUID-2CC15C0F-0111-4FAB-BD50-F3531FFE7EF8-web

    场景和以前一模一样。椰子树排列在街道两侧,具有正确的高度和半径。区别在于代码。使用动态导入时,只需设置所需的属性,属性依赖关系将自动重新计算。

  4. 修改布什规则以使用动态导入Plant_Loader沿人行道插入杜鹃花:
    Bush -->
    	Plant_Loader(Name="Rhododendron Azaleas").Generate

     

  5. 保存并生成。

    GUID-5B2E5329-B36A-45DB-8100-72B91F4A3D86-web

    同一导入Plant_Loader用于插入棕榈树和杜鹃花灌木,方法是将 Name 属性设置为形状树中不同点的动态导入中的不同值。

    您可以打开 dynamic_imports_05.cej 场景和 dynamic_imports_05.cga 文件以查看最终场景和规则文件。

在本教程中,您学习了如何执行以下操作:

  • 使用效率较低的方法在场景中插入植物,该方法需要了解属性依赖关系并且容易出错。
  • 使用推荐的动态导入方法在场景中插入植物,其中仅设置所需的一个或多个属性,然后自动重新计算依赖属性。