2017-06-29 105 views
0

現在我一直在尋找一種方法來按照家人過濾元素。例如,我想要所有家庭接線盒的元件 - 負載。我對Revit API有點新鮮,我也知道類別過濾器和甚至是家族實例過濾器。但我不明白我如何獲得接線盒的家庭符號 - 例如,加載家庭。有沒有這樣做的好方法?或者我最好過濾家庭中的特定類型?如果是這樣,我將如何去做這件事?由Revit API中的家族過濾

謝謝!!!!

順便說一下,我在C編程#

回答

0

雅各布,

傑里米的答案是正確的。下面是一個可以用來獲得一定的家族名稱的所有家庭實例的代碼示例:

傑里米提到的是使用的參數過濾器的有效途徑:

var famType = new FilteredElementCollector(m_doc) 
    .OfClass(typeof(Family)) // This is called a class filter 
    .FirstOrDefault(x => x.Name == "YourFamilyName"); 

if (famType != null) 
{ 
    const BuiltInParameter testParam = BuiltInParameter.ELEM_FAMILY_PARAM; 
    var pvp = new ParameterValueProvider(new ElementId((int)testParam)); 
    var fnrv = new FilterNumericEquals(); 
    var ruleValId = famType.Id; 
    var paramFr = new FilterElementIdRule(pvp, fnrv, ruleValId); 
    var epf = new ElementParameterFilter(paramFr); 

    var results = new FilteredElementCollector(m_doc) 
     .OfClass(typeof(FamilyInstance)) 
     .WherePasses(epf) 
     .ToElements(); 
} 

效率較低的方法是要做到這一點:

var result = new FilteredElementCollector(m_doc) 
    .OfClass(typeof(FamilyInstance)) 
    .Cast<FamilyInstance>() 
    .Where(x => x.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM).AsValueString() == "YourFamilyName"); 

我知道傑里米提到第二種方法效率不高,但我個人不完全確定。​​是一個慢速過濾器,它擴展了內存中的所有元素。事件雖然它與兩個快速篩選器FamilyFamilyInstance選擇相結合,但這仍然是一個相當大的開銷,而不是使用LINQ可以採取的更直接的方法。

你還問能選擇FamilySymbol

var famType = new FilteredElementCollector(m_doc) 
     .OfClass(typeof(FamilySymbol)) 
     .FirstOrDefault(x => x.Name == "YourFamilyTypeName"); 
+0

謝謝你的徹底例子。你能解釋一下哪個更具體嗎?否則,我可以使用API​​數據庫來查找所有使用的方法。另外,where(...)方法與ToElements()的做法是一樣的,還是在將結果用作過濾器之前仍然需要這樣做? –

+0

下面是一個鏈接,更詳細地解釋了這一點:http://thebuildingcoder.typepad.com/blog/2010/06/parameter-filter.html – konrad

0

歡迎來到Revit編程!

使用Revit API開始學習和編程(包括安裝和使用SDK)的最有效方法是完成入門材料,特別是DevTV和My提供的分步說明首先的Revit插件視頻教程:

http://thebuildingcoder.typepad.com/blog/about-the-author.html#2

要回答你的問題:您使用過濾元件的收藏家來檢索的Revit數據庫元素:

http://www.revitapidocs.com/2017/263cf06b-98be-6f91-c4da-fb47d01688f3.htm

您可以將許多過濾器應用於它們。就你而言,你可以直接篩選FamilySymbol實例。

有兩種方法,以進一步限制搜索只檢索那些你感興趣的,命名爲"Junction Boxes - Load"

  • 高效:使用參數過濾
  • 簡單:使用.NET後處理或LINQ

有關Retrieving Elements Using FilteredElementCollector的主題組中的The Building Coder大量提供了更多詳細信息。

+0

非常感謝你對你的迴應。我目前正在瀏覽Revit API和Autodesk的教程。我確實有過編程經驗,但Revit API是一個全新的世界。我將在製作加載項時繼續閱讀您的教程。再次感謝你! –