在实际建模工作中,可能会遇到一幢建筑由于具有不同的属性信息(如建筑的楼层数等)被拆分成多个部分的情况,同时希望这幢建筑最终是一个模型文件且包含所有被拆分的部分。推而广之,就是能够实现根据字段的属性值实现模型的批量导出。下面将通过一个示例展示CityEngine下是如何解决这个问题的。
1 数据准备
Layer字段具有共同属性值的多个features被选中
如上图,数据要有相应的属性字段(这里我们以”Layer”为例)并将按照此字段的值进行模型的导出。如果没有相应的字段,可以参考博文《CityEngine使用Python脚本按feature导出道路模型》的依据道路名称导出单条道路部分。其地址:http://blog.csdn.net/arcgis_all/article/details/8312531。
2模型生成
把数据加载到建好的场景中,并赋以规则就可以得到相应的模型如下图:
3 模型按属性字段“Layer”批量导出
3.1 编写脚本
第一步,创建一个空的python脚本。
选择File菜单选择New选项(快捷键:Ctrl+N),在弹出的”New”对话框中选择Python Module,如下图:
点击下一步,在弹出的对话框中设置python的保存路径、名称以及脚本的类型如下:
这样就完成了脚本的初步创建,里面已经有了一些默认的内容如下:
第二步,脚本编写。
这里以批量导出3DS格式模型为例,其主要代码如下:
#按照属性列objAttr_Name进行批量导出3DS格式的模型
def Export3DS_attr(objAttr_Name):
#获取场景中选中要导出的对象
Objects=ce.getObjectsFrom(ce.selection)
AttrList=[] #用以收集属性字段的值
#获取不同属性值的个数
for obj in Objects:
AttrList.append(ce.getAttribute(obj, objAttr_Name))
UniqueAttr=set(AttrList)#去除AttrList中重复的值
#根据不同的属性值选择相对应的对象并导出
for Attr in UniqueAttr:
objList=[]
for obj in Objects:
if ce.getAttribute(obj,objAttr_Name)==Attr:
objList.append(obj)
#3DS模型格式的导出设置
exportSettings=A3DSExportModelSettings()
exportSettings.setGeneralName(Attr)
exportSettings.getGeneralLocation()
exportSettings.setGeneralLocation(ce.toFSPath("models"))#模型的输出位置为工程文件下的”models”文件夹。
ce.export(objList, exportSettings)
if __name__ == '__main__':
Export3DS_attr("Layer")
Pass
注:CityEngine的python的学习可以参照教程10《Tutorial 10 python Scripting 2011_2》,此外CityEngine的帮助里提供的python的相关接口。
3.2使用脚本并按照属性值批量导出
第一步,选中要导出的模型。
第二步,在python脚本窗口活动的状态下,选择python菜单下的Run python(快捷键:F9)就执行相应的程序。
导出之后的3DS文件包含了具有相同属性值的feature生成的模型
4小结
CityEngine中可以利用脚本完成繁琐的运算、数据的批量导入导出等,与规则的结合实用将会进一步的拓展CityEngine的应用范围。
练习数据:下载
操作视频:http://v.youku.com/v_show/id_XNTE4NzI3MzU2.html