Как получить ограничивающий прямоугольник из Revit Element с Revit API, а затем вызвать центр этого ограничивающего прямоугольника - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь вращать элементы Revit вокруг их центральных точек.Для этого мне нужно выбрать элемент Revit и найти его центральную точку, а затем создать линию с координатами в центральной точке этого элемента.

Моя лучшая идея для этого - обернуть элемент Revit.в ограничительной рамке, а затем найдите центр этой рамки.Моя проблема в том, что я не уверен, как это сделать.

Я использую pyRevit (удивительный инструмент), и я застрял на том, как обернуть выделенный элемент ограничивающим прямоугольником или получить его существующий ограничивающий прямоугольник.

Любая помощь будет принята с благодарностью!Я действительно пытаюсь изучить Revit API и понять, как все работает.Я делаю успехи, но есть много, чтобы распаковать.

        def pickobject():
            from Autodesk.Revit.UI.Selection import ObjectType

            #define the active Revit application and document
            app = __revit__.Application
            doc = __revit__.ActiveUIDocument.Document
            uidoc = __revit__.ActiveUIDocument

            #define a transaction variable and describe the transaction
            t = Transaction(doc, 'This is my new transaction')

            # Begin new transaction
            t.Start()

            # Select an element in Revit
            picked = uidoc.Selection.PickObject(ObjectType.Element, "Select something.")


            ### ?????????? ###

            # Get bounding box of selected element.
            picked_bb = BoundingBoxXYZ(picked)  

            # Get max and min points of bounding box.
            picked_bb_max = picked_bb.Max
            picked_bb_min = picked_bb.Min

            # Get center point between max and min points of bounding box.
            picked_bb_center = (picked_bb_max + picked_bb_min) / 2

            ### ?????????? ###    

            # Close the transaction
            t.Commit()

            return picked, picked_bb_center  

Заранее спасибо, что взглянули на то, что у меня есть.Пожалуйста, дайте мне знать, если что-то требует дальнейших разъяснений!

edit:

@ CyrilWaechter

Я думаю, что вы правы.Использование LocationPoint, вероятно, будет иметь больше смысла.Я просмотрел скрипт, который вы связали (спасибо, кстати!), И попытался реализовать этот раздел в своем коде.

transform = doc.GetElement(picked.ElementId).GetTransform()

Я передаю ElementId через это утверждение, но я получаю сообщение об ошибке, объект "Стена"не имеет атрибута «GetTransform».Не могли бы вы помочь мне понять это?

edit 2: Спасибо @JeremyTammik и @CyrilWaechter, ваши идеи помогли мне понять, где я ошибался.Хотя я все еще чувствую, что некоторые свойства в Revit API неоднозначны, я смог заставить свой код работать должным образом.Ниже я опубликую код, который мне удалось получить.

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Вот как мне удалось решить мою проблему с помощью pyRevit.Этот код позволяет вращать элемент вокруг его оси Z от центра его ограничительной рамки.

Чтобы использовать этот код, выберите один элемент Revit, а затем откройте оболочку Revit Python.Скопируйте приведенный ниже код в блокнот Revit Python Shell и нажмите кнопку «Выполнить».Это приведет к повороту элемента на 45 градусов, поскольку текущий аргумент rotateSelectedElement () равен 45. Вы можете изменить это число на любое значение перед запуском.

# Import the math module to convert user input degrees to radians.
import math

# Get a list of all user selected objects in the Revit Document.
selection = [doc.GetElement(x) for x in uidoc.Selection.GetElementIds()]

# Definitions
def rotateSelectedElement(degrees_to_rotate):
    from Autodesk.Revit.UI.Selection import ObjectType

    #define the active Revit application and document
    app = __revit__.Application
    doc = __revit__.ActiveUIDocument.Document
    uidoc = __revit__.ActiveUIDocument

    #define a transaction variable and describe the transaction
    t = Transaction(doc, 'This is my new transaction')

    # Convert the user input from degrees to radians.
    converted_value = float(degrees_to_rotate) * (math.pi / 180.0)

    # Begin new transaction
    t.Start()

    # Get the first selected element from the current Revit doc.
    el = selection[0].Id

    # Get the element from the selected element reference
    el_ID = doc.GetElement(el)      

    # Get the Bounding Box of the selected element.
    el_bb = el_ID.get_BoundingBox(doc.ActiveView)

    # Get the min and max values of the elements bounding box.
    el_bb_max = el_bb.Max
    el_bb_min = el_bb.Min

    # Get the center of the selected elements bounding box.
    el_bb_center = (el_bb_max + el_bb_min) / 2

    #Create a line to use as a vector using the center location of the bounding box.
    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)

    # Rotate the selected element.
    ElementTransformUtils.RotateElement(doc, el, myLine, converted_value)

    # Close the transaction
    t.Commit()


# Execute    
# Add the desired degrees to rotate by as an argument for rotateSelectedElement()
rotateSelectedElement(45)

edit: код стал более понятным.Код теперь выполняется в Revit Python Shell без каких-либо дальнейших изменений.Если у вас возникли проблемы, см. Инструкции выше!

0 голосов
/ 18 декабря 2018

Отредактировано и сохранено для потомков The Building Coder:

Большое спасибо Кристиану заИнтересная дискуссия и Кирилл за богатство дополнительной информации, которую он предоставляет!

0 голосов
/ 13 декабря 2018

Очень легко получить центр ограничительной рамки.picked является Reference.Получите ElementId из этого, откройте его, используя doc.GetElement, и восстановите ограничивающий прямоугольник, используя get_BoundingBox, ср. Кабелепроводы, пересекающие распределительную коробку :

Element e = Util.SelectSingleElement(
  uidoc, "a junction box" );

BoundingBoxXYZ bb = e.get_BoundingBox( null );

Для некоторых элементов и определенных неправильных форм вы можете использовать центроид вместо ограничительной рамки:

...