教程 21:CSV 导入

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

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

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

设置示例

  1. 打开 Assign_Floor_Usages_01.cej 场景。
  2. 使用 Lot 初始规则将 Assign_Floor_Usages_01.cga 规则文件分配给 2D 建筑物覆盖区。
  3. 使用 MassModel 初始规则将 Assign_Floor_Usages_01.cga 规则文件分配给 3D 质量模型。
  4. 同时选择两个形状。
  5. 检查器中,单击展开按钮 展开数组 以展开 floor_usages 数组属性,该属性最初为空。
  6. 单击添加按钮 添加数组行 以向数组添加元素。 单击此按钮 4 次以使用默认用途 Residential Single-Family 创建 4 个楼层。
    检查器中的数组

    如果需要删除行,请右键单击每个元素一侧的灰色数组索引,然后单击删除行

    删除行

    此规则将应用于 2D 建筑物覆盖区(左)和 3D 质量模型(右)。 在此初始状态下,该规则将具有分配给每个楼层的默认用途、颜色和楼层高度。

    已应用规则的形状

从 CSV 文件中导入数据

要从 CSV 文件中导入数据,请完成以下步骤:

  1. 打开 Assign_Floor_Usages_02.cej 场景。
  2. 打开 Assign_Floor_Usages_02.cga 规则文件。
  3. 查看 /assets/usages.csv 下的 CSV 文件中存储的空间用途数据。

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

    Excel 中的 CSV 文件
  4. 要从 CSV 文件中读取数据,请在常量和函数部分中的 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 属性并将其设置为数据数组的第一列。 方括号用于访问数组元素的子集。 在方括号内,将首先列出行,然后列出列。 0:numUsages-1 将返回从 0 到 14 的所有行。 逗号后的 0 表示第一列。 数组索引从 0 开始。

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

  6. 检查器中,单击 floor_usages 数组中的每个元素,然后从下拉菜单中选择用途以更改每个楼层的用途。 该列表中的值来自 CSV 文件中的 usages 数组。 将在属性定义上方的 @Enum 注记中定义此关系。

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

    在数组中更改用途。
  7. 定义常量以存储其他两列的数据。 可以在 usages 定义下方添加这些行。 floatArray 函数可将字符串数组转换为浮点数组。

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

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

    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]

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

    getFloorHeight(floor_usages[floorInd])

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

    getUsageColor(floor_usages[floorInd])

  11. Ctrl+S 以保存 CGA 规则文件。
  12. 选择形状。
  13. 单击生成
    来自 CSV 文件的模型
    来自 CSV 文件的数组

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

创建仪表盘

要创建仪表盘,请完成以下步骤:

  1. 修复报表,以便其使用相应的颜色来报告用途。 在 FloorMass 规则中,将 usages[0] 替换为以下代码:

    floor_usages[floorInd]

  2. 保存 CGA 规则文件并再次生成模型。
  3. 创建仪表盘卡片以可视化每个用途的总建筑面积 (GFA)。
    1. 单击窗口 > 仪表盘
    2. 单击添加图表
    3. 单击条形图
    4. 图标和标题下,键入 GFA By Usage
    5. 报表下,单击 GFA.*
    6. 单位下,键入 sqm
    7. 单击添加卡片以完成操作。

    添加条形图
    每种用途的条形图