
Скрипт створює UI-інструмент для швидкого генерування NURBS-контролерів (control shapes) у сцені Maya. Інструмент дозволяє обрати тип контролера (куб, коло, стрілки, кільце тощо), задати масштаб контролера через слайдер і, за потреби, автоматично прив’язати контролер до вибраного joint.
maya.cmdsicons/Функція get_script_dir() повертає абсолютний шлях до папки, де знаходиться файл скрипта. Передбачено кілька способів отримання шляху:
__file__ (якщо скрипт запущено як файл)inspect.getsourcefile(...) (fallback)cmds.internalVar(userScriptDir=True) як останній fallbackШлях нормалізується під Maya (заміна \ на /) для коректного використання у image=....
Функція get_selected():
cmds.ls(selection=True, type="joint")(True, <ім’я_першого_joint>)(False, <порожньо>)Скрипт орієнтується на перший виділений joint і використовує його як “ціль” для прив’язки.
Глобальна змінна scl задає множник масштабу контролера.
makeIdentity(..., apply=True, scale=True) для “замороження” масштабуГенерація контролерів (shape builders)
Кожна функція створення контролера виконує типову послідовність:
polyToCurve, або через curve, або через NURBS-примітиви)_ctrl з shape-нодами під нимscl_jnt та групи _grp_ctrl у <joint>_ctrl<joint>_jnt<joint>_jnt під <joint>_ctrl<joint>_grpmatchTransform(<joint>_ctrl, <joint>)parentConstraint(<joint>_jnt, <joint>)inViewMessage про завершення операціїСписок доступних типів контролерів у UI
Примітка: геометрія багатьох контролерів генерується через полігональні примітиви та вибір компонентів (edges/faces/verts), які конвертуються в криві. Це забезпечує контрольовану форму, але робить скрипт чутливим до імен за замовчуванням (див. “Обмеження”).
Якщо перед створенням контролера виділено joint:
parentConstraintbuild_ui() створює вікно window1_ui з назвою “Control Creator”.sizeable=False)columnLayoutgridLayout 4×4, розмір клітинки 64×64cmds.iconTextButton(...):get_script_dir() + '/icons/<name>.png'gridLayout додається rowLayout з:Control scale: <N>intSlider з діапазоном 1..10_on_slider_change(value):sclprint(get_script_dir()))build_ui() і відкривається UI<joint>_ctrl / <joint>_grp / <joint>_jnt (якщо joint був виділений)_ctrl / _grp / _jnt (якщо joint не виділений)Варіант A: joint був виділений
<rootJoint>_ctrl — трансформ з shape-нодами контролера<rootJoint>_jnt — дочірній joint під контролером<rootJoint>_grp — група, що тримає контролер (для нульового офсета)<rootJoint>_jnt → <rootJoint> (parentConstraint)Варіант B: joint не був виділений
_ctrl, _jnt, _grp створюються з дефолтними назвамиpCube1, pPlane1, pCylinder1polyToCurve1, polyToCurveShape1curve1, curveShape1select/rename/delete можуть працювати некоректно.select('pCube1.e[...]') залежить від точної топології та індексації компонентів. Будь-які зміни у генерації примітива (subdivisions, smooth, історія) можуть змінити індекси.icons/ поруч зі скриптом. Якщо папка відсутня або шлях обчислено неправильно — кнопки будуть без зображень або з помилкою завантаження.pCube1, polyToCurve1 тощо.cmds.undoInfo(openChunk=True/closeChunk=True), щоб одна кнопка = один undo-крок.