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();
}
  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ping_Kingzero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值