在前一篇《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