CityEngine使用Python指令碼匯出模型

來源:互聯網
上載者:User

在前一篇《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
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.