Продолжаю изучать states

Продолжая изучать состояния я доделал инструмент multy-boolean, я делаю его в качестве практики, я разобрался как выделять дроябл(drawable), это направляющая геометрия, теперь выделяя я хендел и управляю выделенным объектом, выделяю я по полигону, он и подсвечивается, думаю можно было бы чтобы подсвечивался весь объект возвращая все примитивы с выбранным атрибутом, но я не стал заморачиваться.

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

Второй инструмент уже более практичный, я загружаю объекты, в данном случае окно и дверь и использую инструмент для их расположения, в нем же создается бокс по границам объекта и его его можно использовать для вырезания, думаю для окно или с более чем двумя створками нужно создавать инструмент под них:


Опять же это простой способ показывает как можно удобно использовать hda с состояниями, делается простые хендлы довольно легко, достаточно при создание State указать Static Handle

2026-07-27_10-02-33.png

2026-07-27_09-52-29.png

и добавить bindHandleStatic() с указанием типа и привязать параметры:

import hou import viewerstate.utils as su
HANDLE_TYPENAME = "unknown" HANDLE_NAME = HANDLE_TYPENAME
class State(object):
def __init__(self, **kwargs): self.__dict__.update(kwargs) self.handle = hou.Handle(self.scene_viewer, 'Bounding')
def onEnter(self, kwargs):
self.handle.show(True)

def createViewerStateTemplate(): """ Mandatory entry point to create and return the viewer state template to register. """

state_typename = kwargs["type"].definition().sections()["DefaultState"].contents()
state_label = "AG::size and place::1.0"
state_cat = hou.sopNodeTypeCategory()
template = hou.ViewerStateTemplate(state_typename, state_label, state_cat)
template.bindFactory(State)
template.bindIcon(kwargs["type"].icon())
# bind handle
template.bindHandleStatic( 'boundingbox', 'Bounding', [
('sizex', 'sizex'),
('sizey', 'sizey'),
('sizez', 'sizez'),
('tx', 'centerx'),
('ty', 'centery'),
('tz', 'centerz'),
('rx', 'rx'),
('ry', 'ry'),
('rz', 'rz')
]) return template

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

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

497 0 850 1
0
RENDER.RU