基于脚本的导出是脚本界面的另一个强大功能。 可以在模型生成期间通过回调方法执行任意 python 命令。
基于脚本的导出模板
- 根据模板文件 > 新建... > Python > Python 模块创建一个新的 python 导出脚本
- 选择模块:导出(报告)为模板
导出回调函数
在根据导出模板创建新模块后,系统将显示以下回调方法:
initExport | 在导出开始之前调用 |
initModel | 在生成之前针对每种形状调用。 |
finishModel | 在生成之后针对每种形状调用。 |
finishExport | 在生成所有形状后调用。 |
可将此类脚本用于
- 基于脚本的导出 (Python)
此“导出器”可生成模型以及并行执行附加的 python 脚本。 将不会创建任何几何文件。
- 任意几何导出器
系统将像往常一样生成和导出模型,同时并行执行附加的 python 脚本。
示例:处理 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()
在这种情况下,生成的逗号分隔文件将包含以下数据:
名称 | #Floors | totalFloorArea | avgFloorArea |
---|---|---|---|
LotSouth_35 | 5 | 357.3825 | 71.47651 |
LotSouth_37 | 4 | 335.8072 | 83.95179 |
LotSouth_38 | 3 | 379.4594 | 126.4865 |
... | ... | ... | ... |
回调函数中的特定方法
这些 Python 方法仅在回调函数中有效
方法 | description |
---|---|
返回 CGA 报告()数据的字典 | |
返回本地/全局导出偏移的元组 |
检查模块名称
为了防止在导出器调用脚本时执行回调方法之外的代码,可以使用模块属性 __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__ |
另请参阅