Revit二次開發十一 族


   在Revit中,提供了一個供用戶自定義的元素"族",在Revit所有的操作都圍繞族這個元素進行。

  1. 族的分類

    Revit將族分為系統族、內建族、標准構件族。

    1. 系統族:系統族是在 Autodesk Revit 中預定義的族,包含基本建築構件,例如牆、窗和門。例如:基本牆系統族包含定義內牆、外牆、基礎牆、常規牆和隔斷牆樣式的牆類型;可以復制和修改現有系統族,但不能創建新系統族;可以通過指定新參數定義新的族類型。
    2. 標准構件族:在默認情況下,在項目樣板中載入標准構件族,但更多標准構件族存儲在構件庫中。使用族編輯器創建和修改構件。可以復制和修改現有構件族, 也可以根據各種族樣板創建新的構件族。族樣板可以是基於主體的樣板, 也可以是獨立的樣板。基於主體的族包括需要主體的構件。例如:以牆族為主體的門族,獨立族包括柱、樹和家具;族樣板有助於創建和操作構件族。標准構件族可以位於項目環境外,且具有 .rfa 擴展名,可以將它們載入項目,從一個項目傳遞到另一個項目,而且如果需要還可以從項目文件保存到您的庫中。
    3. 內建族:內建族可以是特定項目中的模型構件,也可以是注釋構件。只能在當前項目中創建內建族,因此它們僅可用於該項目特定的對象,例如:自定義牆的處理。創建內建族時,可以選擇類別,且您使用的類別將決定構件在項目中的外觀和顯示控制。

    而我們在Revit二次開發中,與Family相關的主要是標准構建族和內建族,系統族雖然也被統稱為族,並沒有Family的相關屬性和特性。本章主要講解Family的相關關系。如圖1-1所示:

    一個族(Famliy)在Revit系統中,是不允許獨立存在,必須附屬在一個族類別之上,族類別比族更加具體,族就像一個抽象類、族類型就是一個類,而族實例是一個實例化的對象元素。

  2. 族的訪問

    從族實例獲取族類型FamilySymbol:

  3. FamilySymbol symbol = familylnstance. Symbol  
    FamilySymbol symbol = RevitDoc. GetElement(familyInstance.GetTypeId()) as FamilySymbol 

     

     

  4. 從族類型獲取族:

    Family family = symbol. Family;

     

    從族獲取族類型:

    FamilySymbolSet setOfSymbols = family. Symbols;

     

    從族類型獲取族實例

    FamilylnstanceFilter familylnstanceFilter = new FamilyInstanceFilter(RevitDoc,symbol, Id); 
    FilteredElementCollector filteredElements = new FilteredElementCollector(RevitDoc); 
    filteredElements = filteredElements. WherePasses(familylnstanceFilter); 
    foreach (Familylnstance element in filteredElements) 
    { 
    //各族實例 
    } 

    族實例的構建

  5. 分別通過doc.LoadFamily(file, out family);加載族,通過doc.Create.NewFamilyInstance創建一個族實例。

     

    /// <summary>
    /// 創建一個門族的案例
    /// </summary>
    /// <param name="RevitDoc"></param>
    /// <param name="doorTypeName"></param>
    public void CreatDoorInstance(Document doc, string doorTypeName = "0762 x 2032 mm") 
    { 
    FamilySymbol doorType = null; 
     
    string file = @"C:\ProgramData\Autodesk\RVT 2017\Libraries\Chinese_INTL\門\M_單-嵌板.rfa"; 
    //獲取族
    Family family = null; 
    //加載指定的族
    bool loadSuccess = doc.LoadFamily(file, out family); 
    if (loadSuccess) 
    { 
    //獲取當前族所有的驗證類型
    foreach (ElementId doorTypeId in family.GetValidTypes()) 
    { 
    //獲取當前的族類型
    doorType = doc.GetElement(doorTypeId) as FamilySymbol; 
    //指定當前的族類型
    if (doorType != null) 
    { 
    if (doorType.Name == doorTypeName) 
    { 
    break; 
    } 
    } 
    } 
    } 
    else
    { 
    Autodesk.Revit.UI.TaskDialog.Show("失敗", "加載族失敗"); 
    } 
    // 使用族類型創建門 
    if (doorType != null) 
    { 
    // 首先找到線形的牆 
    ElementFilter wallFilter = new ElementClassFilter(typeof(Wall)); 
    FilteredElementCollector filteredElements = new FilteredElementCollector(doc); 
    filteredElements = filteredElements.WherePasses(wallFilter); 
    Wall wall = null; 
    Line line = null; 
    foreach (Wall element in filteredElements) 
    { 
    LocationCurve locationCurve = element.Location as LocationCurve; 
    if (locationCurve != null) 
    { 
    line = locationCurve.Curve as Line; 
    if (line != null) 
    { 
    wall = element; 
    break; 
    } 
    } 
    } 
    // 在牆的中心位置創建一個門 
    if (wall != null) 
    { 
    XYZ midPoint = (line.GetEndPoint(0) + line.GetEndPoint(1)) / 2; 
    Level wallLevel = doc.GetElement(wall.LevelId) as Level; 
    //創建一個族實例 
    FamilyInstance door = doc.Create.NewFamilyInstance(midPoint, doorType, wall, wallLevel, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); 
    Autodesk.Revit.UI.TaskDialog.Show("成功", door.Id.ToString()); 
    System.Diagnostics.Trace.WriteLine("門創建完成: " + door.Id.ToString()); 
    } 
    else
    { 
    Autodesk.Revit.UI.TaskDialog.Show("元素不存在", "沒有找到符合條件的牆"); 
    } 
    } 
    else
    { 
    Autodesk.Revit.UI.TaskDialog.Show("族類型不存在", "沒有找到族類型'" + doorTypeName + "'"); 
    } 
    }
    

     

     

  6. 元素的編輯

    元素的移動、旋轉和鏡像,當前對對象進行操作時需要注意以下幾點,不管是移動和旋轉鏡像,需要當前族具有此類特性,如一些族限制了標高,則Z方向不管賦值是否,都無法產生移動,其代碼如下:

    public void ElementUtil(Document doc, FamilyInstance familyInstance) { 
     
    //元素的移動
    ElementTransformUtils.MoveElement(doc, familyInstance.Id, new XYZ(0, 0, 0)); 
    ElementTransformUtils.RotateElement(doc, familyInstance.Id, Line.CreateBound(new XYZ(0, 0, 0), new XYZ(1, 1, 1)), 30); 
    Plane plane = Plane.CreateByNormalAndOrigin(XYZ.BasisX, XYZ.Zero); 
    ElementTransformUtils.MirrorElement(doc, familyInstance.Id, plane); 
    }

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM