在CityEngine中实现获取arcgis数据字段属性值

发布时间:2017-09-13    浏览:98

演示视频

http://v.youku.com/v_show/id_XNTE4NzI3MzU2.html

在实际建模工作中,可能会遇到一幢建筑由于具有不同的属性信息(如建筑的楼层数等)被拆分成多个部分的情况,同时希望这幢建筑最终是一个模型文件且包含所有被拆分的部分。推而广之,就是能够实现根据字段的属性值实现模型的批量导出。下面将通过一个示例展示CityEngine下是如何解决这个问题的。

1 数据准备

01.png

Layer字段具有共同属性值的多个features被选中

Layer字段具有共同属性值的多个features被选中

如上图,数据要有相应的属性字段(这里我们以”Layer”为例)并将按照此字段的值进行模型的导出。如果没有相应的字段,可以参考博文《CityEngine使用Python脚本按feature导出道路模型》的依据道路名称导出单条道路部分。其地址:http://blog.csdn.net/arcgis_all/article/details/8312531

2模型生成

把数据加载到建好的场景中,并赋以规则就可以得到相应的模型如下图:

02.png

3 模型按属性字段“Layer”批量导出

3.1 编写脚本

第一步,创建一个空的python脚本。

选择File菜单选择New选项(快捷键:Ctrl+N),在弹出的”New”对话框中选择Python Module,如下图:

03.png

点击下一步,在弹出的对话框中设置python的保存路径、名称以及脚本的类型如下:

04.png

这样就完成了脚本的初步创建,里面已经有了一些默认的内容如下:

05.png

第二步,脚本编写。

这里以批量导出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

注:CityEnginepython的学习可以参照教程10Tutorial 10 python Scripting 2011_2,此外CityEngine的帮助里提供的python的相关接口。


3.2使用脚本并按照属性值批量导出

第一步,选中要导出的模型。

第二步,在python脚本窗口活动的状态下,选择python菜单下的Run python(快捷键:F9)就执行相应的程序。

spacer.gif

 导出之后的3DS文件包含了具有相同属性值的feature生成的模型

导出之后的3DS文件包含了具有相同属性值的feature生成的模型

4小结

CityEngine中可以利用脚本完成繁琐的运算、数据的批量导入导出等,与规则的结合实用将会进一步的拓展CityEngine的应用范围。