设为首页 收藏本站
查看: 594|回复: 0

[经验分享] CityEngine使用Python脚本导出模型

[复制链接]

尚未签到

发表于 2017-5-3 09:55:07 | 显示全部楼层 |阅读模式
  在前一篇《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()))
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、拉框选择
DSC0000.png
  2、在Scene窗口中选择道路的Segments,通过Shift或Ctrl进行多选
DSC0001.png

  同名的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为单位导出模型
DSC0002.png

  以Shape为单位导出模型

DSC0003.png

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

DSC0004.png

  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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372404-1-1.html 上篇帖子: python基础学习笔记分享版(1) 下篇帖子: Python 学习入门(9)—— set操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表