- Создана пользователем Неизвестный пользователь (a.trubilin). Последнее обновление: июл. 03, 2024 ( Дмитрий Гаврилов) Время чтения: 5 мин.
resources/gui_and_objects/trassir_objects
Модуль используется для создания кастомных/использования готовых классов для создания объектов и событий в трассире.
Доступные классы и объекты
BaseObject- Базовый класс для создания объектов.Event- Класс для описания событий объекта.State- Класс для описания состояний объектаState.Value- Класс для описания возможных значений состояний объекта.icons- Содержит возможные иконки, который можно использовать для создания состояний объектов.
Все доступные иконки можно скачать в архиве. Для удобства в архиве находится файл icons.html которы отображает все иконки. При клике по иконке в буфер обмена скопируется соотвестующий путь, который необходимо указать в описании.

После регистрации класса изменить его можно будет только после перезапуска Trassir
Аргументы класса BaseObject
name (str, optional): Имя созданного объекта.guid (str, optional): Guid созданного объекта.parent (str, optional): Guid родительского объекта.folder (str, optional): Папка, куда будет помещен созданный объект в дереве объектов.associated_channel (str, optional): Ассоциированный канал, связанный с объектом.
Атрибуты класса
Данные атрибуты необходимо задавать при создании собственного класса для объектов.
classname (str): Имя класса для созданного объекта. Если не задано - используется имя класса.events (Tuple[Event]): Список событий для объекта.states (Tuple[State]): Список состояний объекта.
Для каждого объекта можно задать список событий и состояний, которые в последствии можно будет генерировать и изменять. Каждое событие описывается с помощью объекта Event. А каждое состояний с помощью объекта State.
Примеры кода
ExampleObject
Создаем новый класс объектов Example.
Добавим классу события:
- Winter is coming
- Vacations is coming
- Birthday %1 is coming
И состояния:
- health - Здоровье объекта
Список возможных значений:- OK
- ERROR
- Unknown
- fire - Состояние "Пожар"
Возможные значения:- Fire
- No Fire
После чего создадим объект созданного класса.
Для каждого состояния класса можно задать соответствующую иконку.
Первое, заданное состояние будет отображаться как главная иконка объекта.
import host
from base_object import BaseObject, Event, State, icons
class ExampleObject(BaseObject):
classname = "Example" # Задаем название класса
# Задаем события которые сможет генерировать объект
events = (
Event("Winter is coming"),
Event("Vacations is coming"),
Event("Birthday %1 is coming"),
)
# Задаем возможные состояния объекта
states = (
State(
"health",
(
State.Value("OK", icon=icons.Facer.face_recognizer),
State.Value("ERROR", icon=icons.Settings.dead),
State.Value("Unknown", icon=icons.Merge.edit_channel)
)
),
State(
"fire",
(
State.Value("Fire", icon=icons.Archer.firedetector),
State.Value("No Fire", icon=icons.Paradox.area_ready),
)
)
)
obj = ExampleObject(name="Example 1", guid=host.random_guid())
После чего в дереве объектов у Вас появится созданной объект

Изменяем состояние объекта
Для всех состояний, которые заданы были при описании объекта создаются соответствующие параметры, с помощью которых их можно изменять или считывать текущее.
# Описание класса # ... obj = ExampleObject(name="Example 1", guid=host.random_guid()) # Смена состояния health на значение 'ERROR' obj.health = "ERROR" # Смена состояния fire на значение 'No Fire' obj.fire = "No Fire"

Генерируем события
Для генерации событий можно воспользоваться методом fire_event(event_type, p1, p2, p3)
# Описание класса
# ...
obj = ExampleObject(name="Example 1", guid=host.random_guid())
# Создадим событие 'Winter is coming'
obj.fire_event("Winter is coming", "", "", "")
# Создадим событие 'Birthday %1 is coming'
obj.fire_event("Birthday %1 is coming", "Ivan", "", "")

В событии можно пользоваться параметрами %1, %2, %3 за место которых в интерфейсе трассира будет подставляться соответствующие аргументы p1, p2, p3
Также данные события можно "отловить" с помощью метода host.activate_on_events в т.ч. в других скриптах.
import host
def handler(ev):
host.message(
"<b>%s</b><br>"
"p1 = %r<br>"
"p2 = %r<br>"
"p3 = %r" % (ev.type, ev.p1, ev.p2, ev.p3)
)
host.activate_on_events("Birthday %1 is coming", "", handler)

Вместо метода fire_event можно воспользоваться методом fire_event_ который позволяет передать стандартные параметры p1, p2, p3 в виде пустой строки. Пример кода ниже:
# Описание класса
# ...
obj = ExampleObject(name="Example 1", guid=host.random_guid())
# Создадим событие 'Winter is coming'
obj.fire_event_("Winter is coming")
# Создадим событие 'Birthday %1 is coming'
obj.fire_event_("Birthday %1 is coming", "Ivan")
Получить список всех созданных объектов можно с помощью метода host.objects_list(filter) где filter - название класса, например 'Example'
import host
host.message(host.objects_list("Example"))

Метод host.objects_list возвращает List[Tuple[str, str, str, str]] где каждый объект описывается с помощью кортежа, состоящего из:
- Название
- Guid
- Classname
- Parent
Для удобства одновременного изменения состояния объекта вместе с установкой соответствующих состояний создадим необходимые методы в класс ExampleObject. Изменять состояние будем с помощью нажатия клавиш F10, F11
import host
from base_object import BaseObject, Event, State, icons
class ExampleObject(BaseObject):
classname = "Example" # Задаем название класса
# Задаем события которые сможет генирировать объект
events = (
Event("Winter is coming"),
Event("Vacations is coming"),
Event("Birthday %1 is coming"),
)
# Задаем возможные состояния объекта
states = (
State(
"health",
(
State.Value("OK", icon=icons.Facer.face_recognizer),
State.Value("ERROR", icon=icons.Settings.dead),
State.Value("Unknown", icon=icons.Merge.edit_channel)
)
),
State(
"fire",
(
State.Value("Fire", icon=icons.Archer.firedetector),
State.Value("No Fire", icon=icons.Paradox.area_ready),
)
)
)
def vacations_is_coming(self):
self.health = "OK"
self.fire = "No Fire"
self.fire_event_("Vacations is coming")
def winter_is_coming(self):
self.health = "Unknown"
self.fire = "No Fire"
self.fire_event_("Winter is coming")
def birthday_is_coming(self, name):
self.health = "ERROR"
self.fire = "Fire"
self.fire_event_("Birthday %1 is coming", name)
obj = ExampleObject(name="Example 1", guid=host.random_guid())
host.activate_on_shortcut("F10", obj.vacations_is_coming)
host.activate_on_shortcut("F11", obj.winter_is_coming)
ScriptObject
Пример описания существующего класса объекта скрипта.
from base_object import BaseObject, State
class ScriptObject(BaseObject):
classname = "Script"
states = (
State("health", (State.Value("OK"), State.Value("Error"))),
State("check_me", (State.Value("1"), State.Value("0"))),
)
def fire_event_v2(self, message, channel="", data=""):
"""Generate trassir script event
Args:
message (str): Event message (p1)
channel (str, optional): Event associated channel (p2)
data (str, optional): Event data (p3)
"""
self.fire_event_("Script: %1", message, channel, data)
Пример использования данного класса предоставлен в статье Создание событий