Вращение элементов вокруг их оси с реализацией на Python
Вопрос: Я пытаюсь повернуть элементы Revit вокруг их центров. Для этого мне нужно выбрать элементы, найти из центры, затем построить линию с координатами этой точки.
Моя идея заключается в том, чтобы взять bounding box-ы элементов, найти их центры. Моя проблема в том, что я не уверен, как мне это сделать
Я использую pyRevit (отличная вещь!) и я застрял - обернуть ли элемент в bounding box или получить существующие bounding box-ы.
Мой текущий прогресс:
- def pickobject():
- from Autodesk.Revit.UI.Selection import ObjectType
- app = __revit__.Application
- doc = __revit__.ActiveUIDocument.Document
- uidoc = __revit__.ActiveUIDocument
- t = Transaction(doc, 'This is my new transaction')
- t.Start()
- picked = uidoc.Selection.PickObject(ObjectType.Element, "Select something.")
- ### ?????????? ###
- # Получить bounding box.
- picked_bb = BoundingBoxXYZ(picked)
- # Получить точки max и min bounding box-а.
- picked_bb_max = picked_bb.Max
- picked_bb_min = picked_bb.Min
- # Получить центр bounding box-а.
- picked_bb_center = (picked_bb_max + picked_bb_min) / 2
- ### ?????????? ###
- t.Commit()
- return picked, picked_bb_center
Получить элемент и его Bounding Box из Reference-а
Ответ: Центр bounding box-а получить очень просто. Picked - это Reference. Получите Element используя метод doc.GetElement, а затем его bounding box:
- Element e = Util.SelectSingleElement(uidoc, "Выбор элемента" );
- BoundingBoxXYZ bb = e.get_BoundingBox( null );
Для некоторых элементов и неправильных форм, возможно лучшим решением будет получить центр тяжести (centroid) вместо bounding box-а:
- centroid твердотельной геометрии и расчет объемов
Использовать Location Point вместо центра Bounding Box?
Ответ: Быть может, в Вашем случае лучше использовать LocationPoint? В моём случае, это почти всегда лучше. Вот здесь Вы можете глянуть 2-минутное видео с демонстрацией работы моей утилиты, исходный код скрипта для pyRevit. Я описал работу скрипта, показанного в этом видео, в блоге есть статья о вращении элементов в любом направлении.
Ответ: Спасибо!
Я думаю, Вы правы насчет использования LocationPoint.
Я посмотрел Ваш скрипт (Спасибо ещё раз!) и попробовал реализовать в своем коде:
- transform = doc.GetElement(picked.ElementId).GetTransform()
Я передаю Id элемента, но получаю ошибку, что объект Wall не имеет аттрибута GetTransform...
Ответ: Это потому что, как сказано в сообщении об ошибке Wall не имеет метода GetTransform. Вы пробовали использовать вместо этого ElementTransformUtils?
Готовое решение
Это мой финальный скрипт на pyRevit, позволяющий поворачивать элемент вокруг оси Z из центра его bounding box-а:
- def pickobject():
- from Autodesk.Revit.UI.Selection import ObjectType
- app = __revit__.Application
- doc = __revit__.ActiveUIDocument.Document
- uidoc = __revit__.ActiveUIDocument
- t = Transaction(doc, 'This is my new transaction')
- t.Start()
- el = uidoc.Selection.PickObject(ObjectType.Element, "Select something.")
- el_ID = doc.GetElement(el)
- el_bb = el_ID.get_BoundingBox(doc.ActiveView)
- el_bb_max = el_bb.Max
- el_bb_min = el_bb.Min
- el_bb_center = (el_bb_max + el_bb_min) / 2
- p1 = XYZ(el_bb_center[0], el_bb_center[1], 0)
- p2 = XYZ(el_bb_center[0], el_bb_center[1], 1)
- myLine = Line.CreateBound(p1, p2)
- ElementTransformUtils.RotateElement(doc, el, myLine, converted_value)
- t.Commit()
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 28.12.2018