1. 程式人生 > >CityEngine使用Python指令碼匯出模型

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