Revit 二次開發之 零件


1.  什么是零件?

  指將一個或者多個大的完整的圖元按照需要分割成許多小的零件,對整體圖元沒有實質的影響。

  • l零件的特點

  所創建的零件對圖元沒有任何影響,只是顯示一個效果;

  零件可以單獨列入明細表、進行標記、過濾和導出。

  • l零件的使用條件

  需要展示某種效果或者樣式的圖元可以使用零件。

  • 可創建零件的元素

  牆(不包括疊層牆和幕牆);

  基礎牆;

  樓板(不包括多層的形狀編輯樓板);

  屋頂;

  天花板;

  結構樓板基礎;

  樓板邊緣;

  封檐帶;

  檐溝;

  結構框架;

  柱;

  結構柱。

  可以進行零件創建的圖元有

  • 分割零件

  參照相交:將其他層的參照設置為選定好的那層;

  分割零件中的添加:添加的是已經創建成零件的圖元;

  編輯草圖的時候要先選擇工作平面。

  有間隙地分割零件(可以通過楔形槽 : 楔形槽、槽口 : 槽口、斜踏板 : 斜踏板對零件進行分隔)

  排除零件

  合並零件(材質、類型、階段完全相同的零件才能合並;)

  分割零件和編輯分區

2.零件的創建

  零件的創建,主要通過零件的專用API:PartUtils類來實現。通常的步驟就是,創建一個零件對象,然后對零件對象進行分隔等操作。其主要函數如下表:

編號

函數名稱

說明

1

AreElementsValidForCreateParts

標識給定元素們是否可用於創建零件。主要判斷當前元素可不可以被創建為零件,非常簡單粗暴。

2

ArePartsValidForDivide

判斷提供的成員是否都可以被分割,就是看看零件們能不能被分隔

3

ArePartsValidForMerge

判斷傳入的零件們是否可以合並

4

CreateMergedPart

對零件進行合並

5

CreateParts(Document, ICollection<(Of <<'(ElementId>)>>))

使用原始元素創建一組新零件。案例看3.1

6

CreateParts(Document, ICollection<(Of <<'(LinkElementId>)>>))

使用原始元素創建一組新零件。案例看3.1

7

DivideParts

用零件創建分割的零件。案例看3.2

8

FindMergeableClusters

將一組元素分隔為對合並有效的子集。

9

GetAssociatedPartMaker(Document, ElementId)

獲取元素的關聯零件生成器PartMaker。

10

GetAssociatedPartMaker(Document, LinkElementId)

獲取元素的關聯零件生成器PartMaker。

11

GetAssociatedParts(Document, ElementId, Boolean, Boolean)

返回與給定元素關聯的所有零件。

12

GetAssociatedParts(Document, LinkElementId, Boolean, Boolean)

返回與給定元素關聯的所有零件

13

GetChainLengthToOriginal

計算最長的分割/合並鏈的長度,以到達作為測試零件源的原始非零件元素。

14

GetMergedParts

獲取指定合並零件所有的源元素集合

15

GetPartMakerMethodToDivideVolumeFW

獲取允許訪問PartMaker的分割體積屬性的對象。

16

GetSplittingCurves(Document, ElementId)

標識用於創建零件的曲線。

17

GetSplittingCurves(Document, ElementId, Plane%)

標識用於創建零件及其所在平面的曲線。

18

GetSplittingElements

獲取創建當前零件所有的參照對象(參照平面、標高、軸網)。

19

HasAssociatedParts(Document, ElementId)

檢查元素是否有關聯的零件。

20

HasAssociatedParts(Document, LinkElementId)

檢查元素是否有關聯的零件。

21

IsMergedPart

是合並的零件

22

IsPartDerivedFromLink

判斷當前零件是否從鏈接模型中生成

23

IsValidForCreateParts

標識給定元素是否可用於創建零件。

 3  案例說明

  3.1  零件的創建CreateParts

  傳入需要創建零件的對象,直接可以創建零件

Floor floor = elem as Floor;
if (floor != null)
{
  List<ElementId> list = new List<ElementId>();
  list.Add(floor.Id);
  //將當前樓板轉換為零件
  PartUtils.CreateParts(floor.Document, list);
}

  3.2   零件的分割DivideParts函數

     通過以上函數,可以對已經存在的零件對象進行分隔,其代碼如下:

List<ElementId> list = (from element in partsToDivide select element.Id).ToList<ElementId>();
//對當前元素進行拆分                    
if (!refPlanes.none<ElementId>())
{
  PartUtils.DivideParts(document, list, refPlanes, new List<Curve>(), sketchPlane.Id);
}
else
{
PartUtils.DivideParts(document, list, new List<ElementId>(), arrayDividerCurves, sketchPlane.Id);
}

通過分隔零件,會獲取一個PartMaker 對象,這個對象我們可以簡單的認為是零件的修理器,可以對分隔的零件進行相應的處理.

PartMaker解釋如下:PartMaker是一個元素,它獲取一些源元素(例如,一堵牆及其所有層)並從中創建一個或多個零件。創建這些部件所依據的邏輯非常重要,PartMaker使用各種PartMakerMethods(當前只有PartMakerMethodToDivideVolumes )來表示這些邏輯。此元素管理為一個或多個原始元素生成部分元素的策略。

通俗的講PartMaker是一個Element元素,他是用於記錄當前零件的分隔策略的,其具有各種PartMakerMethods的方法,來實現對構件進行分隔,我們可以通過這個類的一些屬性,查找零件分隔的基本策略:

其包含一個核心成員PartMakerMethodToDivideVolumes 對象,其包含着當前體積拆分的基本策略

1、獲取一個零件分隔區域體積處理方法,如通過楔形槽 : 楔形槽、槽口 : 槽口、斜踏板 : 斜踏板對零件進行分隔的關鍵細節

    //獲取當前的PartMaker
            PartMaker associatedPartMaker = PartUtils.GetAssociatedPartMaker(part.Document, part.Id);
    
            //獲取當前創建類
            if (associatedPartMaker != null)
            {
                PartMakerMethodToDivideVolumes partMakerMethodToDivideVolumeFW = PartUtils.GetPartMakerMethodToDivideVolumeFW(associatedPartMaker);

                if (partMakerMethodToDivideVolumeFW != null)
                {
    
                    //設置當前的間隙
                    if (!partMakerMethodToDivideVolumeFW.DivisionGap.Eq(dGap, -1.0))
                    {
                        partMakerMethodToDivideVolumeFW.DivisionGap = dGap;
                    }

                    //假如族不為空
                    if (!string.IsNullOrEmpty(sFamilyName) && !string.IsNullOrEmpty(sSymbolName))
                    {
                        string familiesPath = FamiliesProvider.GetFamiliesPath(FamilyGroup.Profils);

                        Category category = (BuiltInCategory.OST_DivisionProfile).getCategory(part.Document);

                        FamilySymbol symbol = this.elementToDivide.Document.getSymbol(sFamilyName, sSymbolName, familiesPath, LoadBehaviour.OverwriteWithParam, category, CategoryBehaviour.Ignore);
                        
                        //指定當前的族元素
                        partMakerMethodToDivideVolumeFW.ProfileType = symbol.Id;

                        partMakerMethodToDivideVolumeFW.ProfileMatch = condOrient;
                    }
                }
            }

上表指定的API中具有GetSplittingElements、GetSplittingCurves兩個函數,其實最終也是從PartMakerMethodToDivideVolumes 獲取其基本信息。

 


免責聲明!

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



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