Revit二次开发小白学习笔记8——元素编辑
1.对元素编辑的几种方法
- ElementTransormUtils的移动(Move)、旋转(Rotate)和镜像
- 文档类Document的删除Delete()
- 阵列类型的创建
- 族编辑的一些基本类和方法
- 获取Parameter参数进行修改
2.移动元素
2.1.说明
2.1.1.ElementTransformUtils类的方法
- 使用给定的向量移动一个元素:MoveElement(Document,ElementId,XYZ)
- 使用给定的向量移动多个元素:MoveElements(Document,ICollection,XYZ)
2.1.2.Location类的方法
- 移动一个元素: bool Move(XYZ)
2.1.3.注意
- 基于标高的元素不能向上或向下移动,即不能改变Z轴坐标值,但可以移动元素到同一标高内的任意位置
- 当移动一个元素时,其他元素可能会跟着移动。如移动墙,墙上的窗户会跟着移动
- 如果元素被钉住,即Pinned属性是true时,则表示这个元素不能被移动
2.2.ElementTransformUtils.MoveElement()方法
//移动元素
//得到向量
XYZ translation = XYZ.BasisX * ToMM(1000);//向X轴正方向移动1000mm
//XYZ translation = XYZ.BasisX.Negate() * ToMM(1000);//向X轴负方向移动1000mm
//必须使用事务来进行移动
using (Transaction transaction = new Transaction(document, "移动"))
{
transaction.Start();
ElementTransformUtils.MoveElement(document, new ElementId(204351),translation);
transaction.Commit();
}
2.3.ElementTransformUtils.MoveElements()方法
//移动多个元素
//得到向量
XYZ translation = XYZ.BasisX.Negate() * ToMM(1000);
//必须使用事务来进行移动
using (Transaction transaction = new Transaction(document, "移动"))
{
transaction.Start();
IList<Reference> references = uIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element);
List<ElementId> elementIds = new List<ElementId>();
foreach (Reference item in references)
{
elementIds.Add(item.ElementId);
}
//移动多个要素
ElementTransformUtils.MoveElements(document,elementIds,translation);
transaction.Commit();
}
2.4.FamilyInstance.Location.Move()方法
//元素移动
//得到向量
XYZ translation = XYZ.BasisX.Negate() * ToMM(1000);
//必须使用事务来进行移动
using (Transaction transaction = new Transaction(document, "移动"))
{
transaction.Start();
IList<Reference> references = uIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element);
List<ElementId> elementIds = new List<ElementId>();
foreach (Reference item in references)
{
elementIds.Add(item.ElementId);
}
//移动多个要素
//ElementTransformUtils.MoveElements(document,elementIds,translation);
foreach (ElementId id in elementIds)
{
FamilyInstance familyInstance = document.GetElement(id) as FamilyInstance;
bool result = familyInstance.Location.Move(translation);//如果移动成功,返回True,否则False
}
transaction.Commit();
}
3.元素旋转
3.1.说明
3.1.1.ElementTransformUtils类的方法
- 旋转一个元素:RotateElements(Document, ElementId,Line,double)
- 旋转多个元素:RotateElements(Document,ICollection,Line,double)
3.1.2.Location类的方法
- 旋转一个元素:bool Rotate(Line,double)
3.1.3.注意事项
- 旋转轴是有限线,若是无限线会导致旋转失败。
- 旋转轴一般要求与元素LoactionCurve所在的平面垂直,否则很可能会旋转失败。
3.2.ElementTransformUtils.RotateElement()方法
基于旋转轴逆时针旋转
//元素旋转
//获取对象
ElementId elementId = new ElementId(204577);
Wall wall = document.GetElement(elementId) as Wall;
//获取旋转轴
Curve curve = (wall.Location as LocationCurve).Curve;
XYZ xyz = curve.GetEndPoint(0);
//XYZ xyz = (curve.GetEndPoint(0) + curve.GetEndPoint(1))/2;//中心点
Line line = Line.CreateBound(xyz,new XYZ(xyz.X,xyz.Y,xyz.Z + 1));
//创建事务旋转
using (Transaction transaction = new Transaction(document, "要素旋转"))
{
transaction.Start();
ElementTransformUtils.RotateElement(document, elementId, line, Math.PI / 2);
transaction.Commit();
}
3.3.ElementTransformUtils.RotateElements()方法
//元素旋转
//获取旋转轴
XYZ xyz = uIDocument.Selection.PickPoint();//选取点作为旋转轴起点
Line line = Line.CreateBound(xyz,new XYZ(xyz.X,xyz.Y,xyz.Z + 1));
//创建事务旋转
using (Transaction transaction = new Transaction(document, "要素旋转"))
{
transaction.Start();
List<ElementId> ids = new List<ElementId>();
//框选待旋转要素
IList<Reference> reference = uIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element);
foreach (Reference item in reference)
{
ids.Add(item.ElementId);
}
ElementTransformUtils.RotateElements(document, ids, line, -1 * Math.PI / 3);
transaction.Commit();
}
3.4.Element.Location.Rotate()方法
//元素旋转
//获取旋转轴
XYZ xyz = uIDocument.Selection.PickPoint();//选取点作为旋转轴起点
Line line = Line.CreateBound(xyz,new XYZ(xyz.X,xyz.Y,xyz.Z + 1));
//创建事务旋转
using (Transaction transaction = new Transaction(document, "要素旋转"))
{
transaction.Start();
List<ElementId> ids = new List<ElementId>();
//框选待旋转要素
IList<Reference> reference = uIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element);
foreach (Reference item in reference)
{
ids.Add(item.ElementId);
}
FilteredElementCollector elementCollector1 = new FilteredElementCollector(document, ids);
//过滤Wall要素对象
IList<Element> elements1 = elementCollector1.OfClass(typeof(Wall)).ToElements();
foreach (Element item in elements1)
{
item.Location.Rotate(line, Math.PI / 2);
}
transaction.Commit();
}