元素
一、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<Curve> 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 过滤器步骤
- 创建收集器
- 创建过滤器
- 调用收集器的WherePasses函数对元素进行过滤,可连续调用
- 遍历收集器,获取想要的元素
2.2.2 收集器
FilteredElementCollector类
- 构造函数
- FilteredElementCollector(Document document)
- FilteredElementCollector(Document document, ICollection<ElementId> 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<ElementId> 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<ElementId>, Plane)
- CanMirrorElement(Document, ElementId):判断元素是否可以镜像
- CanMirrorElements(Document, ICollection<ElementId>):判断元素集是否可以镜像
4.4 删除
方法
- Delete(ElementId)
- Delete(ICollection<ElementId>)
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<ElementId> deletedElements = doc.Delete(wall.Id);
tran.Commit();
}
//删除多面墙
List<ElementId> elementsToDelete = new List<ElementId>();
using (Transaction tran = new Transaction(doc, "Delete the Wall"))
{
tran.Start();
foreach (var elementId in uiDoc.Selection.GetElementIds())
{
elementsToDelete.Add(elementId);
}
ICollection<ElementId> 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<ElementId> elementsToGroup = new List<ElementId>();
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<ElementId>, int, XYZ, ArrayAnchorMember)
- 圆弧型阵列
- RadialArray.Create(Document, View, ElementId, int, Line, double, ArrayAnchorMember)
- RadialArray.Create(Document, View, ICollection<ElementId>, int, Line, double, ArrayAnchorMember)