CityEngine2023新增案例 Tutorial 22: Dynamic imports
要访问 ArcGIS CityEngine 中的教程工程, 打开 CityEngine,然后单击帮助>下载教程和 主菜单中的示例。选择教程或示例后, 项目将自动下载并添加到 CityEngine 工作区。
下载地址:https://www.cityengine.cn/product/view556.html
本教程通过涉及 ESRI.lib Plant_Loader的示例介绍如何使用动态导入。您将学习如何使用两种方法沿道路两侧插入棕榈树:一种更耗时的方法,需要在 CGA 中进行更多编码,另一种方法是使用动态导入的更有效方法。
用户常犯的错误
使用Plant_Loader时,用户经常设置植物的名称,而不知道如果不设置高度和半径,它们可能会不正确。换句话说,当设置所需属性而不知道还需要设置依赖属性时,这通常会导致错误。
接下来,您将更详细地了解这一点。
- 展开“导航”窗口中的Tutorial_22_Dynamic_Imports教程文件夹。
- 打开 /scenes/ 文件夹中的 dynamic_imports_01.cej 文件,以在没有任何植物的街道视口中打开场景:
- 在 /rules/ 文件夹中打开 dynamic_imports_01.cga 规则文件,以在 CGA 编辑器窗口中将其打开。
- 要从 ESRI.lib 导入Plant_Loader,请将 /ESRI.lib/rules/Plants/Plant_Loader.cga 文件从“导航”窗口拖放到规则文件中的导入Street_Modern_Simple:“/ESRI.lib/rules/Streets/Street_Modern_Simple.cga” 语句下方:
这将添加第二个导入语句:
import Plant_Loader:"/ESRI.lib/rules/Plants/Plant_Loader.cga"
- 使用Plant_Loader修改树规则以将树木添加到街道两侧:
Tree --> Plant_Loader.Generate
- 保存 dynamic_imports_01.cga 文件。
- 选择人行道形状,然后单击生成 (Ctrl+G):
由于您没有指定植物名称,因此街道两旁是默认的“橙树”。在本教程中,您希望树木是“椰子树”。
若要查看此时场景和规则的外观,请打开 dynamic_imports_02.cej 场景和 dynamic_imports_02.cga 规则文件。
- 在树规则中将植物属性名称设置为“椰子树”:
Tree --> set(Plant_Loader.Name, "Coconut Palm") Plant_Loader.Generate
- 保存规则并生成:
街道两旁种满了棕榈树,但它们的高度和半径不正确,因为这些值来自默认的“橙树”名称。
这是因为,导入Plant_Loader时,“名称”属性设置为“橙色树”,并且“高度”和“半径”属性是根据“橙色树”的标准大小计算的。在Plant_Loader中,属性相互依赖。“高度”值基于“名称”属性计算,“半径”值基于“名称”和“高度”属性计算。
因此,当您使用 set() 操作将 Plant_Loader.Name 设置为“椰子树”时,它只设置 Name 属性。它不会更改或重新计算高度和半径的值,并且这些属性仍然具有来自“橙色树”的原始值。
通过重新计算值来修复树大小
通过仅设置植物的 Name 属性,您已经创建了具有橘子树高度的棕榈树。要固定棕榈树的高度,可以在设置植物名称后重新计算并设置高度和半径的值。
接下来,您将探索此解决方案,但请记住,这是一种繁琐的方法,因为它需要您了解Plant_Loader的属性依赖关系以及如何重新计算必要的属性。这种方法很复杂,容易出错。
- 打开 dynamic_imports_03.cej 场景和dynamic_imports_03.cga 规则文件。
- 在 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
- 保存并生成。
现在棕榈树具有正确的高度和半径,但这种方法不是更新大小的有效方法。此方法很复杂,因为首先,您必须知道哪些属性需要重新计算以及按什么顺序重新计算,其次,您必须知道如何重新计算它们。
使用动态导入修复树大小
修复此错误的建议方法是使用动态导入。您可以使用动态导入设置所需的一个或多个属性,而不是使用 set() 操作设置属性,并且将自动重新计算任何依赖属性和常量。
若要了解其工作原理,请参阅下面的Plant_Loader示例:
- 打开 dynamic_imports_04.cej 场景和 dynamic_imports_04.cga 规则文件。
- 修改树规则以使用将 Name 属性设置为“椰子树”的动态导入:
Tree --> Plant_Loader(Name="Coconut Palm").Generate
“高度”和“半径”属性会自动更新,无需考虑。
- 保存并生成。
场景和以前一模一样。椰子树排列在街道两侧,具有正确的高度和半径。区别在于代码。使用动态导入时,只需设置所需的属性,属性依赖关系将自动重新计算。
- 修改布什规则以使用动态导入Plant_Loader沿人行道插入杜鹃花:
Bush --> Plant_Loader(Name="Rhododendron Azaleas").Generate
- 保存并生成。
同一导入Plant_Loader用于插入棕榈树和杜鹃花灌木,方法是将 Name 属性设置为形状树中不同点的动态导入中的不同值。
您可以打开 dynamic_imports_05.cej 场景和 dynamic_imports_05.cga 文件以查看最终场景和规则文件。
在本教程中,您学习了如何执行以下操作:
- 使用效率较低的方法在场景中插入植物,该方法需要了解属性依赖关系并且容易出错。
- 使用推荐的动态导入方法在场景中插入植物,其中仅设置所需的一个或多个属性,然后自动重新计算依赖属性。