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)