Порассуждаем о "динамическом" взаимодействии питона с ревитом

Главная Форумы Python Помогите с питон кодом Порассуждаем о "динамическом" взаимодействии питона с ревитом

Просмотр 15 сообщений - с 1 по 15 (из 27 всего)
  • Автор
    Сообщения
  • #3097 Score: 0
    tuuletin
    Участник
    3 pts

    Привет, друзья,
    хочется порассуждать о возможности реализации “динамического” взаимодействия питона с ревитом, назовём это, в “рамках одной транзакции” (?).

    То есть, я хотел бы:
    1. Запустить скрипт dynamo/python.
    2. Скрипт ожидает-предполагает построение линии (например).
    3. Ставлю первую точку на виде, потом вторую. Координаты точек (будь то координаты в системе координат относительно вида, или координаты из модели = нод Select Point on Face) забираются в скрипт.
    4. Происходит построение линии из питона.

    Пока что это реализуемо, например, двумя нодами Select Point on Face, но это совершенно не то уже… Есть какие-нибудь идеи?

    #3098 Score: 1
    Khasan Mamaev
    Модератор
    187 pts

    может это поможет?

    #3099 Score: 2
    Legantmar
    Хранитель
    475 pts

    накидал тут

    #3120 Score: 0
    tuuletin
    Участник
    3 pts

    Привет всем, нет, немного то, что я хотел бы!
    На видео Legantmar уже поближе тому, что я хотел бы. Только, чтобы точки передавались ручным запусканием скрипта, а скрипт бы был запущен и ожидал получения этих точек (чтобы исключить каждый раз ручной пуск скрипта). Допустим, получив бы 5 этих адаптивных точек, он бы выключался.
    Сейчас накопал, что есть Selection Class, вроде бы там можно покрутить так, как я хотел бы…
    Но не получается получить ActiveUIDocument из RevitAPIUI.

    Делаю вот так вот:

    import clr
    clr.AddReference("RevitAPI")
    import Autodesk
    from Autodesk.Revit.DB import *
    
    clr.AddReference("RevitAPIUI")
    import Autodesk
    from Autodesk.Revit.UI import *
    from Autodesk.Revit.UI.Selection import *
    
    doc = DocumentManager.Instance.CurrentDBDocument
    uiapp = Autodesk.Revit.UI.UIApplication.ActiveUIDocument
    OUT = [uiapp, doc]

    И получается вот это:

    Как получить этот UIApplication.ActiveUIDocument?

    #3122 Score: 0
    tuuletin
    Участник
    3 pts

    Да и из любого элемента из RevitAPIUI получается IronPython.Runtime.Types.ReflectedProperty.
    Почему не возвращается объекты как автокадовские?

    #3126 Score: 1
    Legantmar
    Хранитель
    475 pts

    >Только, чтобы точки передавались ручным запусканием скрипта, а скрипт бы был запущен и ожидал получения
    к сожалению, это невозможно (есть хитрый способ, но я не скажу) (ибо ревит сильно тупит и зависает)
    конкретно в твоем случае, после последней точки нужно нажимать Esc – чтобы “отпустить” ревит

    p.s. по поводу второй части вопроса, этот UI.UIApplication.ActiveUIDocument сильно разнится в 2015 и 2016 версии )))
    посмотри вот это видео (концовку)

    #3143 Score: 0
    tuuletin
    Участник
    3 pts

    (есть хитрый способ, но я не скажу) (ибо ревит сильно тупит и зависает)

    А что за способ? Может, я бы глянул? Он ведь не запатентован? :)

    #3146 Score: 0
    tuuletin
    Участник
    3 pts

    Если пустить два PickPoint() подряд, то получается именно то, что мне пока что нужно! Идеально!

    pt1 = uidoc.Selection.PickPoint()
    pt2 = uidoc.Selection.PickPoint()

    Спасибо, ребятушки.

    #3147 Score: 0
    tuuletin
    Участник
    3 pts

    А почему не работает

    uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
    ids = uidoc.Selection.GetElementIds
    OUT = ids

    ?

    Возвращает IronPython.Runtime.Types.BuiltinFunction.

    #3148 Score: 1
    Legantmar
    Хранитель
    475 pts

    какая версия ревит?
    вот эту тему уже видел?
    для Revit 2016:
    ids=uidoc.Selection.GetElementIds() — получает Id номера всех выделенных элементов

    далее через doc.GetElements(ids) — можно получить сами элементы

    uidoc.Selection.SetElementIds(ids) — выделяет элементы по их Id

    #3149 Score: 1
    Khasan Mamaev
    Модератор
    187 pts

    import clr
    clr.AddReference(“RevitAPI”)
    import Autodesk
    from Autodesk.Revit.DB import *

    clr.AddReference(“RevitAPIUI”)
    import Autodesk
    from Autodesk.Revit.UI import *
    from Autodesk.Revit.UI.Selection import *

    clr.AddReference(“RevitServices”)
    import RevitServices
    from RevitServices.Persistence import DocumentManager
    #from RevitServices.Transactions import TransactionManager
    #from System.Collections.Generic import *

    reset = IN[0]

    doc = DocumentManager.Instance.CurrentDBDocument
    uiapp = Autodesk.Revit.UI.UIApplication.ActiveUIDocument
    uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
    ids = uidoc.Selection.GetElementIds()
    OUT = ids

    #3150 Score: 1
    Khasan Mamaev
    Модератор
    187 pts

    doc тоже можно отключить

    #3154 Score: 1
    tuuletin
    Участник
    3 pts

    какая версия ревит?

    2015, спасибо за тему, прочитал!

    Хасан, спасибо, сейчас поковырялся в выделении, разобрался во всём… Мощная штука.

    #3163 Score: 0
    Khasan Mamaev
    Модератор
    187 pts

    понаписал кучу лишнего и никто меня не поправил) вот так получаем выбранные в Ревит элементы

    import clr
    clr.AddReference(“RevitServices”)
    import RevitServices
    from RevitServices.Persistence import DocumentManager
    reset = IN[0]

    uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
    ids = uidoc.Selection.GetElementIds()

    OUT = ids

    #3164 Score: 0
    Khasan Mamaev
    Модератор
    187 pts

    а это код, который получает сами элементы, выделенные в Ревит, как одиночные, так и кучкой

    import clr
    clr.AddReference(“RevitServices”)
    clr.AddReference(“RevitAPI”)
    from Autodesk.Revit.DB import *
    import RevitServices
    from RevitServices.Persistence import DocumentManager
    from Autodesk.Revit.ApplicationServices import Application

    reset = IN[0]

    doc = DocumentManager.Instance.CurrentDBDocument
    uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
    ids = uidoc.Selection.GetElementIds()

    idd = [str(i) for i in ids]

    if isinstance(idd, list) == True:
    elems = [doc.GetElement(ElementId(int(i))) for i in idd]
    else:
    elems = doc.GetElement(ElementId(int(idd)))

    OUT = elems

Просмотр 15 сообщений - с 1 по 15 (из 27 всего)
  • Для ответа в этой теме необходимо авторизоваться.