阅读笔记 | Autodesk Revit二次开发基础教程 | 第3章 元素

元素

一、Element类的解析

1.1 继承关系

所有的族、族类型、族实例都是继承Element

  • 族(Family)
  • 族类型(FamilySymbol)
  • 族实例(FamilyInstance)

1.2 属性

  • Category:类别
  • Location:位置
    • LocationPoint
    • LocationCurve
  • LevelId:标高
  • GroupId:组
  • Id:
  • UniqueId:唯一Id

1.3 方法

  • GetMaterials:获取元素的材质
  • GetAnalyticalModel:获取元素的分析模型,返回AnalyticalModel类型的对象
    • GetCurve、GetCurves、GetPoint:获取分析模型几何信息
    • IsSingleCurve、IsSinglePoint:判断调用上述三个方法的哪一个
Document document = commandData.Application.ActiveUIDocument.Document;
Element element = document.GetElement(new ElementId(183554));

AnalyticalModel analyticalModel = element.GetAnalyticalModel();
if (analyticalModel.IsSingleCurve())
{
    Curve curve = analyticalModel.GetCurve();
}
else if (analyticalModel.IsSinglePoint())
{
    XYZ p = analyticalModel.GetPoint();
}
else
{
    IList curves = analyticalModel.GetCurves(AnalyticalCurveType.ActiveCurves);
}

return Result.Succeeded;

二、获取元素

2.1 通过ID获取元素

UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Document doc = uiDoc.Document;
Element element = doc.GetElement(new ElementId(30));
Level level = element as Level;

通过Document类的GetElement方法获取ElementId对象得到元素的实例,再通过as关键字转型为所需元素类型,该方法缺点是,用户必须知道元素ID及类型才行

2.2 通过过滤器获取元素

2.2.1 过滤器步骤
  1. 创建收集器
  2. 创建过滤器
  3. 调用收集器的WherePasses函数对元素进行过滤,可连续调用
  4. 遍历收集器,获取想要的元素
2.2.2 收集器

FilteredElementCollector类

  • 构造函数
    • FilteredElementCollector(Document document)
    • FilteredElementCollector(Document document, ICollection elementIds)
    • FilteredElementCollector(Document document, ElementId viewId)
  • 方法
    • WherePasses
    • OfClass、OfCategoryId、OwnedByView
    • UnionWith、InstersectWith
2.2.3 元素过滤器

元素过滤器层次:

  • 快速过滤器
    • ElementCategoryFilter:使用类别过滤元素
    • ElementClassFilter:按照类型过滤元素
    • ElementIsElementTypeFilter
    • FamilySymbolFilter:使用族类型过滤元素
    • ExclusionFilter
    • ...
  • 慢速过滤器
    • ElementLevelFilter
    • ElementParameterFilter
    • FamilyInstanceFilter
    • CurveElementFilter
    • ...
  • 逻辑过滤器
    • LogicalOrFilter
    • LogicalAndFilter

2.3 通过选择获取元素

UIDocument uiDoc = commandData.Application.ActiveUIDocument;
ICollection collection = uiDoc.Selection.GetElementIds();
foreach (ElementId id in collection)
{
    TaskDialog.Show("Infomation", id.IntegerValue.ToString());
}

通过UIDocument中Selection.GetElementIds方法获取选中元素的id集合,并且可以通过ElementId下的IntegerValue属性获取id编号

三、编辑元素参数

3.1 参数分类

  • 内建参数(BuiltInParameter)
  • 共享参数
  • 项目参数

3.2 参数编辑

  • 获取参数
    • 获取元素所有参数:Element.Parameters
    • 获取元素指定参数:Element.get_Parameter(参数),返回Parameter类型
      • string参数名字:效率最低
      • BuiltInParameter参数枚举:效率最高,推荐使用
      • Definition参数定义
      • Guid参数的guid
  • 修改参数
    • Parameter.Set(参数)
    • Parameter.IsShared属性:判断参数是共享参数还是项目参数

四、编辑元素

4.1 移动

移动的三种方法

  • 通过ElementTransformUtils类下的MoveElement()/MoveElements()方法
    • 不能竖向移动,只能在平面内移动
    • 依附在元素上的元素也会移动
    • 无法移动被钉住的元素
    • 该方法是移动到目标坐标值
  • 通过Location类的Move()方法
    • 该方法是移动一个偏移向量
  • 通过直接修改Location.LocationCurve.Curve属性或Location.LocationPoint.Point属性

4.2 旋转

旋转的两种方法

  • 通过ElementTransformUtils类下的RotateElement()/RotateElements()方法
    • 旋转角度用弧度计量,正值逆时针旋转,负值顺时针旋转
    • 旋转轴是有限线段
  • 通过Location类的Rotate()方法

4.3 镜像

通过ElementTransformUtils类下的MirrorElement()/MirrorElements()方法

  • MirrorElement(Document, ElementId, Plane)
  • MirrorElements(Document, ICollection, Plane)
  • CanMirrorElement(Document, ElementId):判断元素是否可以镜像
  • CanMirrorElements(Document, ICollection):判断元素集是否可以镜像

4.4 删除

方法

  • Delete(ElementId)
  • Delete(ICollection)
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Document doc = uiDoc.Document;

//删除一面墙
Wall wall = doc.GetElement(new ElementId(184163)) as Wall;
using (Transaction tran = new Transaction(doc, "Delete the Wall"))
{
    tran.Start();
    ICollection deletedElements = doc.Delete(wall.Id); 
    tran.Commit();
}

//删除多面墙
List elementsToDelete = new List();
using (Transaction tran = new Transaction(doc, "Delete the Wall"))
{
    tran.Start();
    foreach (var elementId in uiDoc.Selection.GetElementIds())
    {
        elementsToDelete.Add(elementId);
    }
    ICollection deletedElements = doc.Delete(elementsToDelete);
    tran.Commit();
}

return Result.Succeeded;

4.5 组合

通过doc.Create.NewGroup()方法生成一个组合,方法返回Group类型
通过Group对象的GroupType.Name属性修改组合的名称

UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Document doc = uiDoc.Document;

//组合
List elementsToGroup = new List();
using (Transaction tran = new Transaction(doc, "Group"))
{
    tran.Start();
    foreach (var elementId in uiDoc.Selection.GetElementIds())
    {
        elementsToGroup.Add(elementId);
    }
    Group group = doc.Create.NewGroup(elementsToGroup);
    group.GroupType.Name = "MyGroup";
    tran.Commit();
}

return Result.Succeeded;

4.6 阵列

  • 线型阵列
    • LinearArray.Create(Document, View, ElementId, int, XYZ, ArrayAnchorMember)
    • LinearArray.Create(Document, View, ICollection, int, XYZ, ArrayAnchorMember)
  • 圆弧型阵列
    • RadialArray.Create(Document, View, ElementId, int, Line, double, ArrayAnchorMember)
    • RadialArray.Create(Document, View, ICollection, int, Line, double, ArrayAnchorMember)

你可能感兴趣的:(阅读笔记 | Autodesk Revit二次开发基础教程 | 第3章 元素)