Revit Event Handler

Час для продвинутих речей. Ревіт має багато  "подій" які ми можемо відстежити, такі як  закриття / відкриття документу, активація виду тощо. Усі можливі "події" можна знайти на revitapidocks:

UIApplication: посилання
ControlledApplication: посилання

Отже ми можемо сказати Ревіту зробити щось, коли якась подія відбувається, також цей скрипт повинен працювати у фоновому режимі. Розпочнемо з найпростішого.

# -*- coding: UTF-8 -*-
#import Autodesk
#from Autodesk.Revit import DB   
#from Autodesk.Revit import UI
from pyrevit import DB
from pyrevit import UI
from pyrevit import HOST_APP, framework
from pyrevit import forms

__doc__='PostableCommand Enumeration'
__author__ = 'Dmytro Serebriian'

# define event handler
def docopen_eventhandler(sender, args):
    forms.alert('Document Opened: {}'.format(args.PathName))

# add the event handler function
HOST_APP.app.DocumentOpening += \
    framework.EventHandler[DB.Events.DocumentOpeningEventArgs](
        docopen_eventhandler
        )
print('ok') #just for checking

Є декілька варіантів, щоб це скрипт запрацюв. Створіть startup.py файл у папці із розширенням і вставте туди вище зазначений код:

Перезавантажте PyRevit, і ви зможете побачити нову консоль де написано "ок". Це означає, що все має працювати. Тепер, коли відкриваєте будь-який документ, з'явиться інформаційне віконце:

Як можна використати ці події вже залежить від вашої уяви!

Другий метод є продвинутішим. Завантажте повний код з моєї сторінки githube GitHub.

Наприклад, я візьму скрипт Sync Views з панелі pyrevit'у.

Коли ми натискаємо кнопку скрипта, міняється іконка, а також, при активації видів, видовий екран пересунеться в місце попереднього виду. Це означає, що кожного разу як ви активуєте якийсь вид, спрацьовує скрипт. А також ми можемо його увімкнути/вимкнути.

Спробуємо розібратися поступово.

Необхідно використовувати для файлу script.py теку .smartbutton, не .pushbutton. Smartbutton запускає скрипт одразу після запуску pyrevit'у, це дозволяє нам "зареєструвати" подію.

def __selfinit__(script_cmp, ui_button_cmp, __rvt__):
    try:
        __rvt__.ViewActivating += \
            framework.EventHandler[
                UI.Events.ViewActivatingEventArgs](copyzoomstate)
        __rvt__.ViewActivated += \
            framework.EventHandler[
                UI.Events.ViewActivatedEventArgs](applyzoomstate)
        return True
    except Exception:
        return False

Необхідно створити функцію __selfinit__  щоб pyrevit smartbutton розуміла, що саме ви хочете виконати. В нашому випадку ми реєструємо 2 події. Для ViewActivating(скрипт копіює поточне місцезнаходження екрану) та ViewActivated(скрипт застосовує скопійоване розташування вже для активованого виду).

copyzoomstate та applyzoomstate це функції в яких ми пишемо інструкції, що саме виконувати.

Тепер необхідно зробити можливість включати/відключати виконання скрипту. Для цого спершу треба розуміти, що таке pyrevit environment variables посилання   п.4.5.

Якщо запустити скрипт нижче, то побачите в консолі списох всіх існуючих перемінних середовища:

# -*- coding: UTF-8 -*-
from pyrevit.coreutils import envvars
print(envvars.get_pyrevit_env_vars())

Тому ми можемо, наприклад, створити перемінну та сказати, якщо вона дорівнює True, тоді запускаємо скрипт, якщо ні - нічого не робимо.

Коли ми натискаємо кнопку скрипту, виконується тільки функція togglestate. 

SYNC_VIEW_ENV_VAR = 'TESTVIEW'

def togglestate():
    new_state = not script.get_envvar(SYNC_VIEW_ENV_VAR)
    if new_state:
        data_filename = get_data_filename(revit.doc)
        if os.path.exists(data_filename):
            os.remove(data_filename)
    script.set_envvar(SYNC_VIEW_ENV_VAR, new_state)
    script.toggle_icon(new_state)
    #print(script.get_envvar())

if __name__ == '__main__':
    togglestate()

Тут нічого особливого, якщо перемінна дорівнює False, коли ми запускаємо скрит, то вона міняється на True. Та навпаки.

script.toggle_icon(new_state) вбудована функція pyrevit'у, вона міняє іконки кнопки. Створіть додатково 2 іконки в папці із вашим скриптом для кожного "стану":

Наостанок, функція:

def copyzoomstate(sender, args):
    if script.get_envvar(SYNC_VIEW_ENV_VAR):
        forms.alert('view activating')

def applyzoomstate(sender, args):
    if script.get_envvar(SYNC_VIEW_ENV_VAR):
        forms.alert('view activated')

Подія у будь-якому випадку запустить функцію, проте ми можемо зазначити, щоб подальші дії відбувалися лише в тому випадку, якщо наша створена перемінна дорівнює True. 

Це все. Наступного разу поговоримо про IUpdaters. 

 

 

Коментарії(0)