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 获取其基本信息。

 

posted @ 2021-01-27 17:04  Min.Xiaoshuang  阅读(729)  评论(2编辑  收藏  举报