2016-08-17 26 views
1

我試圖訪問ToRoom/FromRoom屬性的門。 IronPython中簡化的代碼片段:revitapi ironpython ToRoom在revit api返回「索引器#對象」

fc = FilteredElementCollector(doc) 
doors = fc.OfCategory(BuiltInCategory.OST_Doors).WhereElementIsNotElementType().ToElements() 

for door in doors: 
    froom = door.FromRoom 

我的結果是一個「在0x0000000000035索引#對象」 如何從這裏進入客房對象?

+0

恐怕我不知道你的問題的答案。它看起來對我來說很好。但是,您對ToElements的呼叫是不必要的且效率低下。過濾元素收集器本身已經可迭代。 ToElements創建整個集合的一個副本。以下是對ToElementIds的類似低效性的詳細討論:http://thebuildingcoder.typepad.com/blog/2012/12/toelementids-performance.html –

+0

請注意,同樣的問題也在revit api討論論壇線程中討論過http://reums.autodesk.com/t5/revit-api/toroom-fromroom-python-issue/mp/6507328 –

+0

傑里米謝謝你關於過濾元素收集器的提示。 – user3460882

回答

1

這是一個IronPython /時髦的Revit API問題。基本上,定義FromRoom的方式,它可以是屬性或索引屬性。請參閱API documentation for FromRoom

您得到的「索引器」是FromRoom的第二個版本 - 它需要Phase作爲它的參數。所以,你基本上可以做到這一點:

phase = list(doc.Phases)[0] 
room = door.FromRoom[phase] 

由於爲FromRoom的文件說,它返回

的「從房間」在項目的最後階段的門或窗設置。

你可能實際上要做到這一點:

phase = list(doc.Phases)[-1] # retrieve the last phase of the project 
room = door.FromRoom[phase] 

我無法弄清楚如何獲得的FromRoom其他版本保持...

+0

謝謝,托馬斯!開發人員發現了同樣的事情,並使用您在Revit API論壇中推薦的相同方法分享了他的工作解決方案http://forums.autodesk.com/t5/revit-api/toroom-fromroom-python-issue/m-p/6507328 –

0

達人,謝謝你你的貢獻!在jeremy的回答後,我檢查了同樣的方法。 這裏是代碼片段

fc = FilteredElementCollector(doc) 
doors = fc.OfCategory(BuiltInCategory.OST_Doors).WhereElementIsNotElementType() 

phases = doc.Phases 

phase = phases[phases.Size - 1] 

for door in doors: 
    try: 
     froom = door.FromRoom[phase].Id 
    except: 
     froom = -1 
    try: 
     troom = door.ToRoom[phase].Id 
    except: 
     troom = -1 

    TaskDialog.Show("Revit","%s, %s" %(froom, troom))`