教程 21:CSV 导入

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

通过数组导入 CSV

本教程将展示如何从 .csv 文件中导入数据,然后将其用于包含数组的 CGA 代码。

要演示 .csv 文件导入,您将使用相应规则,该规则用于将建筑物分割为多个楼层,并允许为每个楼层分配空间用途。 .csv 文件包含可用空间用途及其颜色和楼层高度的列表。 在 CGA 代码中,可将 .csv 文件中的数据读取到数组中,然后在检查器窗口中使用该数据来驱动规则和相应的 UI。

设置数据

要设置数据,请完成以下步骤:

  1. 导航器窗口中展开 Tutorial_21_CSV_Import 教程文件夹。
  2. 打开 scenes 文件夹中的 Assign_Floor_Usages_01.cej 场景,视窗窗口中将显示 2D 建筑物覆盖区与 3D 建筑物质量:
    显示 3D 建筑物质量
  3. 使用 Lot 初始规则将 rules 文件夹中的 Assign_Floor_Usages_01.cga 规则文件分配给 2D 建筑物覆盖区。
  4. 使用 MassModel 初始规则将 Assign_Floor_Usages_01.cga 规则文件分配给 3D 质量模型。
  5. 同时选中 2D 建筑物覆盖区与 3D 建筑物质量。
  6. 检查器窗口中,单击展开按钮 展开数组 以查看 floor_usages 数组属性,该属性最初为空。
  7. 单击添加按钮 添加数组行 以向数组添加元素。
  8. 单击此按钮 5 次以使用默认用途 Residential Single-Family 创建 5 个楼层。

    已应用规则的形状

    此时可观察到 3D 建筑物质量模型不会突破原定高度,而基于 2D 覆盖区生成的模型则使用默认用途 Residential Single-Family 成功创建了 5 个楼层。

  9. 检查器窗口中右键单击最后一个数组索引元素(行),然后单击删除行以删除多余楼层。

    删除行

  10. 视窗窗口的可见性设置 可见性设置 中取消选中形状,以便更清晰地观察各楼层。

    隐藏形状

当前场景显示的规则采用默认用途 Residential Single-Family,建筑呈现灰色,默认层高为 2.85 米。

默认采用“单户型住宅”用途的模型

打开 Assign_Floor_Usages_02.cej 场景以参考相同的结果。

从 CSV 文件导入数据

为精确定义这些属性,请通过 CSV 表格填充数组并完成以下步骤:

  1. 打开 assets 文件夹中的 usages.csv 文件以查看空间用途数据:

    Excel 中的 .csv 文件

    第一列将列出空间用途,下一列包含每种用途的颜色和楼层高度。 此文件使用逗号和新的行分隔符格式化。 许多其他常用分隔符(包括逗号、分号、制表符和空格)也同样有效。

  2. 接下来将使用此表格中的信息填充数组。
  3. CGA 编辑器窗口中打开 Assign_Floor_Usages_01.cga 规则文件。
  4. 要从 usages.csv 文件中读取数据,请在 ConstantsFunctions 部分中的 default_floor_height 定义之后添加以下代码:

    // read usages data from csv file
    const usages_filename = "usages.csv"
    const usages_data = readStringTable(usages_filename)
    const numUsages = nRows(usages_data)

    readStringTable 函数将读取 .csv 文件数据并返回一个字符串数组,然后将其存储在 usages_data 中。 数组的维度为 15 x 3,对应于数据文件中的行数和列数。 nRows 函数将返回数组中的行数。

  5. 重新定义 usages 属性并将其设置为数据数组的第一列:

    @Hidden
    attr usages = usages_data[0:numUsages-1,0]

    方括号用于访问数组元素的子集。 在方括号内,将首先列出行,然后列出列。 0:numUsages-1 将返回从 0 到 14 的所有行。 逗号后的 0 表示第一列。 数组索引从 0 开始。

  6. 按 Ctrl+S 以保存 CGA 文件。
  7. 单击生成 生成 或按 Ctrl+G,以在视窗窗口中生成模型。
  8. 接下来,在检查器窗口中逐栋选择建筑物并更新每个楼层的用途。
  9. 检查器窗口中,单击 floor_usages 数组中的每个元素,然后从下拉菜单中选择用途以更改每个楼层的用途。
  10. 与以下配置相匹配:

    • 0 = 零售
    • 1 = 办公室
    • 2 = 多户型住宅
    • 3 = 多户型住宅

    该列表中的值来自 .csv 文件中的 usages 数组。 将在 CGA 规则文件中的属性定义上方的 @Enum 注记中定义此关系。

    @Enum(valuesAttr=usages)
    attr floor_usages = stringArray()

    请参考 Assign_Floor_Usages_02.cga

  11. 定义常量以存储其他两列的数据:

    const colors = usages_data[0:numUsages-1,1]
    const floor_heights = floatArray(usages_data[0:numUsages-1,2])

    @Hidden 部分下的 usages 定义之后添加这几行代码。 floatArray 函数可将字符串数组转换为浮点数组。

  12. 编写函数以获取给定用途的颜色或楼层高度:

    getUsageColor(usage) = _getUsageColorFromIndex(findFirst(usages, usage))
    _getUsageColorFromIndex(usageInd) =
    	case usageInd==-1:           default_color
    	else:                        colors[usageInd]
    
    getFloorHeight(usage) = _getFloorHeightFromIndex(findFirst(usages, usage))
    _getFloorHeightFromIndex(usageInd) =
    	case usageInd==-1:           default_floor_height
    	else:                        floor_heights[usageInd]

  13. 可以使用该数据以获取每种用途的正确楼层高度。 在 CreateFloorFloorMassSplitMassModel 规则中,将 default_floor_height 替换为以下代码:

    getFloorHeight(floor_usages[floorInd])

  14. 可以使用该数据,根据每个楼层的用途对其进行着色。 在 FloorMass 规则中,将两次出现的 default_color 替换为以下代码:

    getUsageColor(floor_usages[floorInd])

  15. Ctrl+Shift+S 以保存所有文件。
  16. 选择形状。
  17. 生成模型。

    来自 .csv 文件的模型

    现在,该规则将使用已导入的 .csv 文件中的数据,根据每个楼层的指定用途来确定每个楼层的楼层高度和颜色。

创建仪表盘

要创建仪表盘以可视化每个用途的总建筑面积 (GFA),请完成以下步骤:

  1. 确保已打开 Assign_Floor_Usages_01.cej 场景。
  2. 再次打开 Assign_Floor_Usages_01.cga 规则文件。
  3. 修复报表,以便其使用相应的颜色来报告用途。 在 FloorMass 规则中,将 usages[0] 替换为以下代码:

    floor_usages[floorInd]

  4. 单击窗口 > 仪表盘
  5. 单击添加图表 添加卡片
  6. 图标和标题下,输入 GFA By Usage
  7. 报表下,单击 GFA
  8. 单位下,输入 sqm
  9. 保留剩余输入的默认值,然后单击添加卡片以完成。

    每种用途的条形图

打开 Assign_Floor_Usages_03.cej  场景和 Assign_Floor_Usages_03.cga 规则文件以查看最终结果。

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

  • 向属性添加数组数据。
  • .csv 文件导入数据以与 CGA 文件一起用于定义模型中的楼层数据,例如用途和颜色。
  • 创建一个仪表盘以显示每种用途的 GFA。

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