Поверните несколько элементов в Revit с помощью C# - PullRequest
0 голосов
/ 27 мая 2020

Я пишу макрос в Revit с C# для одновременного поворота нескольких выбранных элементов. Но я получаю эту ошибку каждый раз, когда пытаюсь запустить ее: «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();
            }
        }

1 Ответ

1 голос
/ 30 мая 2020

Вы получаете NullReferenceException, потому что тип возврата PickObjects равен IList<Reference>, а не List<Element>.

Попробуйте что-то вроде этого:

var elements = uidoc.Selection.PickObjects(ObjectType.Element, "Select Elements")
.Select(o => uidoc.Document.GetElement(o));

Учтите также, что угол измеряется в радианах, а не в градусах, как вы написали, или, по крайней мере, я думаю, что вы не хотите вращать элемент 45 рад;).

Наконец, не забывайте, что element.Location не всегда LocationPoint, в зависимости от выбранного элемента вы можете получить LocationPoint, LocationCurve или базовый класс «Местоположение».

...