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

  • 相关阅读:
    绘制程序流程图笔记
    强软弱虚引用
    安全点和安全区域
    垃圾回收算法
    垃圾回收相关算法
    内存访问全过程
    多级页表与快表
    分页
    虚拟内存
    内存分段机制
  • 原文地址:https://www.cnblogs.com/minhost/p/14335863.html
Copyright © 2020-2023  润新知