CityEngine使用Python脚本导出模型

在前一篇《CityEngine使用Python脚本按feature整体导出道路》中介绍了如何按照GIS道路数据的ObjectID将道路导出,用户在使用过程中提出几个问题,如:

1、 脚本的使用范围是CityEngine的整个场景,在数据量非常大的时候会卡死

2、 在对道路数据进行处理的时候,Name字段必须赋值为ObjectID,不够直观

3、 在道路数据表中记录道路的条数以便修改Python脚本的range()参数,不够智能

4、 导出道路的选择只能通过Range()的参数来控制,不方便而且很傻

为了解决以上问题,达到摆脱ObjectID的限制(Name字段可以赋值为道路名称,当然要是英文字符),并可以通过直接拉框选择进行模型分批导出的目的,现修改脚本如下:

'''
Created on 2012-8-14

@author: YYX
'''
from scripting import *

# 获取CE实例
ce = CE()

SelectedObj = ce.getObjectsFrom(ce.selection(),ce.isGraphSegment)#在ce.selection集合中获取路网Segments集合
ce.setSelection(SelectedObj)#重新设置ce.selection为Segments集合
NumOfSelected = SelectedObj.__len__()#获取Segments集合objects个数
NameOfSelectedObj = []#创建空列表
'''循环获取Segment集合中objects的名称,并通过set函数合并重复值  '''
for i in range(0,NumOfSelected):
    NameOfSelectedObj.append(ce.getName(ce.selection()[i]))
    UniqueSelectedObj = set(NameOfSelectedObj)#合并重复值后的Segments集合objects名称,即唯一的道路名称
'''依据道路名称列表,循环获取某一道路对应的所有Segments,最后导出为一个obj模型文件'''
for Ojb in UniqueSelectedObj:
    name= "'"+ str(Ojb)+"'"#道路名称
    #获取所有与道路名称相同的Segments对象,这些Segments对象组成了一条道路
    TargetOjb = ce.getObjectsFrom(ce.selection(), ce.withName(name))
    ce.setSelection(TargetOjb)#设置ce.selection为所选同名Segments
    #设置导出参数
    settings = OBJExportModelSettings()
    settings.setGeneralLocation("d:/temp")
    settings.setGeneralName(name)

    ce.export(ce.selection(), settings)#依据导出参数将所选Segments导出为一个Obj模型文件,该obj模型文件即为一条道路的模型
    ce.setSelection(SelectedObj)#重新设置ce.selection为所有Segments集合,以便导出下一条道路

注:该脚本只对道路的导出有效,脚本最终会将选择的每条道路生成一个单独的Obj文件。

道路数据预处理方式与前文一样,需要新建Name字段,并对Name字段赋值,只是Name字段可以是英文名称,而不必一定是ObjectID

生成模型后,进行导出模型的选择时可以通过以下几种方式:

1、拉框选择

2、在Scene窗口中选择道路的Segments,通过Shift或Ctrl进行多选


同名的Segments为同一条道路的不同线段,如上图中的两个Major Edge 40062,这两个Segments组成一条名叫Major Edge 40062的道路。

运行脚本,脚本会将同名的Segments挑选出来并分别导出到一个Obj文件中,这样就得到了所选道路的模型,道路模型的名字与其对应的Name字段相同。

下面对脚本的一些方法进行说明:

1、ce.selection():当前CE实例所选择的Objects集合

2、ce.setSelection():通过该方法设置ce.selection()

3、ce.isGraphSegment:判断所选Objects是否为Segment,因本脚本要进行道路的导出,所以筛选的类型为Segment,若想要进行建筑物的导出则可以选择ce.isBlock或者ce.isShape,这取决于所选Objects的类型,见下图:

以Block为单位导出模型


以Shape为单位导出模型


所选Object的类型可以在Inspector中查看,如:


4、ce.getName():获取所选Objects的名字即Name

5、ce.withName():根据Name获取Objects

6、OBJExportModelSettings():设置OBJ模型导出参数

7、ce.export():依据OBJ模型导出参数导出ce.selection所选的Objects的模型

总结:

  • 脱离了Name必须是ObjectID的限制,Name字段可以是非中文的字符
  • 可以导出任意选择的道路模型
  • 稍加修改即可用于建筑物的导出(修改ce.isGraphSegment为ce.isBlock或者ce.isShape等)
  • 在进行Objects选择后只需指定其Rules,不需要在Scene中生成Models,也可以将模型导出
  • 执行脚本可以在脚本窗口直接按F9执行

问题:

  • 若框选的时候选中了某一条道路的部分Segments,则导出的该道路的模型不完整,只包含选中的Segments
<think>好的,用户想了解如何在CityEngine导出带有属性的模型,并且需要教程。首先,我需要回忆CityEngine的相关功能和导出流程。记得CityEngine允许用户将生成的3D模型导出到多种格式,比如FBX、OBJ、Collada等,同时可能需要保留属性信息。 首先,用户可能已经创建了带有属性的模型,例如建筑物高度、类型等,这些属性通常通过CGA规则定义。导出时,这些属性需要正确映射到导出格式支持的元数据中。例如,FBX和Collada(DAE)支持自定义属性,而OBJ可能不支持,所以需要选择合适的格式。 接下来,导出步骤。通常步骤是:完成模型生成后,选择要导出模型,然后通过菜单中的导出选项,选择格式,并在导出设置中勾选导出属性的选项。可能需要检查导出设置中的属性导出选项是否启用,并确保属性名称正确。 另外,用户可能需要将属性导出为单独的CSV文件,或者嵌入到模型文件中。这取决于后续使用的需求,比如在游戏引擎或GIS软件中使用时的兼容性。 还需要考虑不同版本的CityEngine是否有不同的导出方式,可能需要查阅最新版本的文档或教程。如果用户遇到问题,比如导出的属性不显示,可能需要检查属性名称是否符合目标软件的命名规则,或者是否有保留字符被使用。 此外,用户可能需要具体的教程链接或步骤,比如官方网站的教程、社区论坛的指南,或者视频教程。需要确保提供的资源是可靠和最新的。 最后,生成相关问题,可能涉及导出格式的选择、属性映射的具体方法、常见问题解决,以及与其他软件的集成等。</think>### CityEngine导出带属性模型教程 在CityEngine导出带有属性的模型需完成以下步骤: 1. **属性定义阶段** - 在CGA规则文件中使用`attr`关键字定义模型属性 ```cga attr buildingHeight = 30 //定义建筑高度属性 attr roofType = "gable" //定义屋顶类型属性 ``` - 通过`set`操作符将属性绑定到几何体特征[^1] 2. **模型导出操作流程** - 选择需要导出的形状(单个或多个地块) - 菜单栏选择File > Export > Models... - 选择支持属性导出的格式(推荐FBX或Collada DAE) - 在导出设置中启用属性选项: ``` √ Export Shape Attributes //导出形状属性 √ Export Rule Attributes //导出规则属性 ``` 3. **格式兼容性说明** - **FBX格式**:自动将属性存储在模型元数据中,支持Unity/Unreal引擎读取 - **Collada DAE**:属性以XML格式存储,兼容GIS软件和3ds Max - **OBJ+CSV组合**:通过"Export Attributes to CSV"生成配套数据表 ```python # 示例:通过Python脚本批量导出 import ce for shape in ce.getObjects(): ce.export(shape, format='FBX2018', options={'exportAttributes':True}) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值