基于脚本的导出

基于脚本的导出是脚本界面的另一个强大功能。 可以在模型生成期间通过回调方法执行任意 python 命令。

基于脚本的导出模板

  • 根据模板文件 > 新建... > Python > Python 模块创建一个新的 python 导出脚本
  • 选择模块:导出(报告)为模板
根据导出模板创建新的 Python 模块
根据导出模板创建新的 Python 模块

导出回调函数

在根据导出模板创建新模块后,系统将显示以下回调方法:

initExport

在导出开始之前调用

initModel

在生成之前针对每种形状调用。

finishModel

在生成之后针对每种形状调用。

finishExport

在生成所有形状后调用。

可将此类脚本用于

  • 基于脚本的导出 (Python)

    此“导出器”可生成模型以及并行执行附加的 python 脚本。 将不会创建任何几何文件。

  • 任意几何导出器

    系统将像往常一样生成和导出模型,同时并行执行附加的 python 脚本。

在“其他”选项中设置了脚本的 OBJ 导出对话框
在“其他”选项中设置了脚本的 OBJ 导出对话框

示例:处理 CGA 报告数据

以下代码片段是在生成过程中报告数据的 CGA 规则的典型示例。

FloorArea --> report("area", geometry.area)

可以使用导出回调函数访问所报告数据。

以下代码给出了有关如何访问报告数据并将其写入文件的示例。

'''
Created on Nov 6, 2013

@author: andi
'''
from scripting import *

# Get a CityEngine instance
ce = CE()

REPORT = ""

def initExport(exportContextOID):
    global REPORT
    REPORT = "Name,#Floors,totalFloorArea,averageFloorArea\n"

def finishModel(exportContextOID, shapeOID, modelOID):
    shape = Shape(shapeOID)
    model = Model(modelOID)

    global REPORT
    i = 0
    totalArea = 0.0
    reports = model.getReports()
    if 'area' in reports.keys():
        for area in reports['floorArea']:
            totalArea +=area
            i+=1
        REPORT += "%s,%d,%f,%f\n" % (ce.getName(shape), i, area, area/i)
    else :
        REPORT += "%s,%d,%f,%f\n" % (model, 0, 0, 0)

def finishExport(exportContextOID):
    filename = ce.toFSPath("models/"+"/reportdata.txt")
    FILE = open(filename, "w")
    FILE.write(REPORT)
    FILE.close()

在这种情况下,生成的逗号分隔文件将包含以下数据:

名称#FloorstotalFloorAreaavgFloorArea

LotSouth_35

5

357.3825

71.47651

LotSouth_37

4

335.8072

83.95179

LotSouth_38

3

379.4594

126.4865

...

...

...

...

回调函数中的特定方法

这些 Python 方法仅在回调函数中有效

方法description

model.getReports()

返回 CGA 报告()数据的字典

model.getOffsets()

返回本地/全局导出偏移的元组

检查模块名称

为了防止在导出器调用脚本时执行回调方法之外的代码,可以使用模块属性 __name__ 来区分调用程序。

if __name__ == '__main__':
    #only do stuff is script is started directly

这使得一个脚本既可用于正常 Python 执行又可用于基于脚本的导出,例如

def finishModel(exportContextOID, shapeOID, modelOID):
    # export callback code

if __name__ == '__main__':
    exportSettings = OBJExportModelSettings()
    exportSettings.setScript("/general/scripts/scriptbasedexport.py")
    ce.export(ce.selection(), exportSettings)

在上面的示例中,当基于脚本的导出器调用脚本时,系统不会执行主要子句

不同上下文中的模块名称

不同上下文中生成的模块名称 __name__

快捷菜单模块名称

上下文正自身运行

__main__

上下文从导出器开始

__export__

上下文将在启动过程中启动

__startup__

 

另请参阅