C# 使用C在Revit中旋转多个图元

C# 使用C在Revit中旋转多个图元,c#,revit-api,revit,C#,Revit Api,Revit,我正在用C在Revit中编写一个宏,用于一次旋转多个选定图元。但每次尝试运行时都会出现以下错误: System.NullReferenceException:对象引用未设置为对象的实例。 我不知道为什么会出现这个错误,因为我的选择中没有空引用。有人知道发生了什么吗? 这是代码片段: //Get document UIDocument uidoc = this.Application.ActiveUIDocument; Document doc =

我正在用C在Revit中编写一个宏,用于一次旋转多个选定图元。但每次尝试运行时都会出现以下错误: System.NullReferenceException:对象引用未设置为对象的实例。 我不知道为什么会出现这个错误,因为我的选择中没有空引用。有人知道发生了什么吗? 这是代码片段:

        //Get document
        UIDocument uidoc = this.Application.ActiveUIDocument;
        Document doc = uidoc.Document;

        //Elements selection
        double angle = 45.0;
        var elements = uidoc.Selection.PickObjects(ObjectType.Element,"Select Elements") as List<Element>;
        foreach (Element element in elements)
        {
            LocationPoint lp = element.Location as LocationPoint;
            XYZ ppt = new XYZ(lp.Point.X,lp.Point.Y,0);
            Line axis = Line.CreateBound(ppt, new XYZ(ppt.X,ppt.Y,ppt.Z+10.0));

            using(Transaction rotate = new Transaction(doc,"rotate elements"))
            {
                rotate.Start();
                ElementTransformUtils.RotateElement(doc,element.Id,axis,angle);
                rotate.Commit();
            }
        }
您将获得一个AllReferenceException,因为PickObjects的返回类型是IList而不是List

试着这样做:

var elements = uidoc.Selection.PickObjects(ObjectType.Element, "Select Elements")
.Select(o => uidoc.Document.GetElement(o));
还要考虑角度是以弧度度量的,而不是如您所写的以度度量的,或者至少我认为您不希望将元素旋转45 rad


最后,不要忘记该元素。位置并不总是一个位置点,根据所选的元素,您可以得到一个位置点、位置曲线或基类的“位置”。

在哪一行抛出错误?另外,我相信您在line axis=line.CreateBoundppt,new XYZppt.X,ppt.Y,ppt.Z+10.0之后缺少一行;线您需要告诉文档绘制一条线元素。你只是告诉它你想要一条线,而不是真正画出来。类似于这个DetailLine myline=doc.Create.NewDetailCurvemyview,轴作为DetailLine;您可以在文档[此处]中查看更多内容,谢谢,但它没有起作用,因为RotateElement方法要求的是一行,而不是详细行:/Thank!正如你所说,这实际上是因为它要求元素,而不是引用。