Update utils_behaviour.py
This commit is contained in:
@@ -50,84 +50,70 @@ TEXT = localization.TEXT
|
|||||||
|
|
||||||
# 左侧面板功能
|
# 左侧面板功能
|
||||||
# 搜索相关功能
|
# 搜索相关功能
|
||||||
def filter_controls(text):
|
# def filter_controls(text):
|
||||||
"""
|
# """
|
||||||
过滤控制列表
|
# 过滤控制列表
|
||||||
"""
|
# """
|
||||||
print(f"过滤控制列表: {text}")
|
# print(f"过滤控制列表: {text}")
|
||||||
# 这里实现过滤控制列表的功能
|
# # 这里实现过滤控制列表的功能
|
||||||
return True
|
# return True
|
||||||
|
|
||||||
# 控制列表相关功能
|
# 控制列表相关功能
|
||||||
def control_selected(item):
|
# def control_selected(item):
|
||||||
"""
|
# """
|
||||||
控制项目被选中
|
# 控制项目被选中
|
||||||
"""
|
# """
|
||||||
print(f"控制项目被选中: {item.text()}")
|
# print(f"控制项目被选中: {item.text()}")
|
||||||
# 这里实现控制项目选中的功能
|
# # 这里实现控制项目选中的功能
|
||||||
return True
|
# return True
|
||||||
|
|
||||||
def update_control_selection():
|
# def update_control_selection():
|
||||||
"""更新控制器选择"""
|
# """更新控制器选择"""
|
||||||
try:
|
# try:
|
||||||
print("更新控制器选择")
|
# print("更新控制器选择")
|
||||||
except Exception as e:
|
# except Exception as e:
|
||||||
print(f"更新控制器选择时出错: {str(e)}")
|
# print(f"更新控制器选择时出错: {str(e)}")
|
||||||
|
|
||||||
def update_control_value(value):
|
# def update_control_value(value):
|
||||||
"""更新控制器值"""
|
# """更新控制器值"""
|
||||||
try:
|
# try:
|
||||||
print(f"更新控制器值: {value}")
|
# print(f"更新控制器值: {value}")
|
||||||
except Exception as e:
|
# except Exception as e:
|
||||||
print(f"更新控制器值时出错: {str(e)}")
|
# print(f"更新控制器值时出错: {str(e)}")
|
||||||
|
|
||||||
def switch_page(page):
|
# def switch_page(page):
|
||||||
"""切换页面"""
|
# """切换页面"""
|
||||||
try:
|
# try:
|
||||||
print(f"切换到页面: {page}")
|
# print(f"切换到页面: {page}")
|
||||||
except Exception as e:
|
# except Exception as e:
|
||||||
print(f"切换页面时出错: {str(e)}")
|
# print(f"切换页面时出错: {str(e)}")
|
||||||
|
|
||||||
# 页码相关功能
|
# 页码相关功能
|
||||||
def decrease_range():
|
# def decrease_range():
|
||||||
"""
|
# """
|
||||||
减小范围
|
# 减小范围
|
||||||
"""
|
# """
|
||||||
print("减小范围")
|
# print("减小范围")
|
||||||
# 这里实现减小范围的功能
|
# # 这里实现减小范围的功能
|
||||||
return True
|
# return True
|
||||||
|
|
||||||
def increase_range():
|
# def increase_range():
|
||||||
"""
|
# """
|
||||||
增加范围
|
# 增加范围
|
||||||
"""
|
# """
|
||||||
print("增加范围")
|
# print("增加范围")
|
||||||
# 这里实现增加范围的功能
|
# # 这里实现增加范围的功能
|
||||||
return True
|
# return True
|
||||||
|
|
||||||
# 右侧面板功能
|
# 右侧面板功能
|
||||||
# BlendShapes相关功能
|
# BlendShapes相关功能
|
||||||
def blendshape_selected(item):
|
# def blendshape_selected(item):
|
||||||
"""
|
# """
|
||||||
混合形状项目被选中
|
# 混合形状项目被选中
|
||||||
"""
|
# """
|
||||||
print(f"混合形状项目被选中: {item.text()}")
|
# print(f"混合形状项目被选中: {item.text()}")
|
||||||
# 这里实现混合形状项目选中的功能
|
# # 这里实现混合形状项目选中的功能
|
||||||
return True
|
# return True
|
||||||
|
|
||||||
def update_blendshape_selection():
|
|
||||||
"""更新BlendShape选择"""
|
|
||||||
try:
|
|
||||||
print("更新BlendShape选择")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"更新BlendShape选择时出错: {str(e)}")
|
|
||||||
|
|
||||||
def update_blendshape_value(value):
|
|
||||||
"""更新BlendShape值"""
|
|
||||||
try:
|
|
||||||
print(f"更新BlendShape值: {value}")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"更新BlendShape值时出错: {str(e)}")
|
|
||||||
|
|
||||||
def flip_target():
|
def flip_target():
|
||||||
"""翻转目标"""
|
"""翻转目标"""
|
||||||
@@ -192,79 +178,6 @@ def blend_select():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"混合选择时出错: {str(e)}")
|
print(f"混合选择时出错: {str(e)}")
|
||||||
|
|
||||||
# BlendShape操作相关功能
|
|
||||||
def reset_blendshape():
|
|
||||||
"""
|
|
||||||
重置混合形状
|
|
||||||
"""
|
|
||||||
print("重置混合形状")
|
|
||||||
# 这里实现重置混合形状的功能
|
|
||||||
return True
|
|
||||||
|
|
||||||
def mirror_blendshape():
|
|
||||||
"""
|
|
||||||
镜像混合形状
|
|
||||||
"""
|
|
||||||
print("镜像混合形状")
|
|
||||||
# 这里实现镜像混合形状的功能
|
|
||||||
return True
|
|
||||||
|
|
||||||
def remove_blendshape():
|
|
||||||
"""
|
|
||||||
移除混合形状
|
|
||||||
"""
|
|
||||||
print("移除混合形状")
|
|
||||||
# 这里实现移除混合形状的功能
|
|
||||||
return True
|
|
||||||
|
|
||||||
def update_blendshape():
|
|
||||||
"""
|
|
||||||
更新混合形状
|
|
||||||
"""
|
|
||||||
print("更新混合形状")
|
|
||||||
# 这里实现更新混合形状的功能
|
|
||||||
return True
|
|
||||||
|
|
||||||
def isolate_blendshape():
|
|
||||||
"""
|
|
||||||
隔离混合形状
|
|
||||||
"""
|
|
||||||
print("隔离混合形状")
|
|
||||||
# 这里实现隔离混合形状的功能
|
|
||||||
return True
|
|
||||||
|
|
||||||
def new_blendshape():
|
|
||||||
"""
|
|
||||||
新建混合形状
|
|
||||||
"""
|
|
||||||
print("新建混合形状")
|
|
||||||
# 这里实现新建混合形状的功能
|
|
||||||
return True
|
|
||||||
|
|
||||||
def combine_blendshape():
|
|
||||||
"""
|
|
||||||
组合混合形状
|
|
||||||
"""
|
|
||||||
print("组合混合形状")
|
|
||||||
# 这里实现组合混合形状的功能
|
|
||||||
return True
|
|
||||||
|
|
||||||
# 标签页相关功能
|
|
||||||
def switch_tab(tab):
|
|
||||||
"""切换标签页"""
|
|
||||||
try:
|
|
||||||
print(f"切换到标签页: {tab}")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"切换标签页时出错: {str(e)}")
|
|
||||||
|
|
||||||
# 底部相关功能
|
|
||||||
def update_main_value(value):
|
|
||||||
"""更新主滑块值"""
|
|
||||||
try:
|
|
||||||
print(f"更新主滑块值: {value}")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"更新主滑块值时出错: {str(e)}")
|
|
||||||
|
|
||||||
def reset_default_expression():
|
def reset_default_expression():
|
||||||
"""重置默认表情"""
|
"""重置默认表情"""
|
||||||
try:
|
try:
|
||||||
@@ -307,204 +220,8 @@ def write_find_mirror():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"写入查找镜像时出错: {str(e)}")
|
print(f"写入查找镜像时出错: {str(e)}")
|
||||||
|
|
||||||
def exchange_from_expression():
|
|
||||||
"""
|
|
||||||
交换从表情
|
|
||||||
"""
|
|
||||||
print("交换从表情")
|
|
||||||
# 这里实现交换从表情的功能
|
|
||||||
return True
|
|
||||||
|
|
||||||
def reset_selected_expression():
|
|
||||||
"""
|
|
||||||
重置选定表情
|
|
||||||
"""
|
|
||||||
print("重置选定表情")
|
|
||||||
# 这里实现重置选定表情的功能
|
|
||||||
return True
|
|
||||||
|
|
||||||
def import_expression():
|
|
||||||
"""
|
|
||||||
导入表情
|
|
||||||
"""
|
|
||||||
print("导入表情")
|
|
||||||
try:
|
|
||||||
file_path = cmds.fileDialog2(
|
|
||||||
fileFilter="Expression Files (*.exp);;JSON Files (*.json);;All Files (*.*)",
|
|
||||||
dialogStyle=2,
|
|
||||||
fileMode=1
|
|
||||||
)
|
|
||||||
if file_path:
|
|
||||||
# 这里实现导入表情的功能
|
|
||||||
print(f"将从{file_path[0]}导入表情")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"导入表情时出错: {e}")
|
|
||||||
return True
|
|
||||||
|
|
||||||
def control_panel_search():
|
|
||||||
"""
|
|
||||||
控制面板搜索
|
|
||||||
"""
|
|
||||||
print("控制面板搜索")
|
|
||||||
# 这里实现控制面板搜索的功能
|
|
||||||
return True
|
|
||||||
|
|
||||||
def select_related_keys():
|
|
||||||
"""
|
|
||||||
选择相关键值
|
|
||||||
"""
|
|
||||||
print("选择相关键值")
|
|
||||||
# 这里实现选择相关键值的功能
|
|
||||||
return True
|
|
||||||
|
|
||||||
def import_map_expression():
|
|
||||||
"""
|
|
||||||
导入表情映射
|
|
||||||
"""
|
|
||||||
print("导入表情映射")
|
|
||||||
try:
|
|
||||||
file_path = cmds.fileDialog2(
|
|
||||||
fileFilter="Map Files (*.map);;JSON Files (*.json);;All Files (*.*)",
|
|
||||||
dialogStyle=2,
|
|
||||||
fileMode=1
|
|
||||||
)
|
|
||||||
if file_path:
|
|
||||||
# 这里实现导入表情映射的功能
|
|
||||||
print(f"将从{file_path[0]}导入表情映射")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"导入表情映射时出错: {e}")
|
|
||||||
return True
|
|
||||||
|
|
||||||
# 勾选框处理函数
|
|
||||||
def toggle_raw_slider_all(state):
|
|
||||||
"""
|
|
||||||
切换左侧滑块的All选项
|
|
||||||
|
|
||||||
Args:
|
|
||||||
state (int): 勾选框状态
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
print(f"切换左侧滑块All选项: {state}")
|
|
||||||
# 根据勾选状态执行相应操作
|
|
||||||
if state == 2: # 选中状态
|
|
||||||
print("应用到所有控制器")
|
|
||||||
# TODO: 实现应用到所有控制器的逻辑
|
|
||||||
else: # 未选中状态
|
|
||||||
print("仅应用到选中的控制器")
|
|
||||||
# TODO: 实现仅应用到选中控制器的逻辑
|
|
||||||
except Exception as e:
|
|
||||||
print(f"切换左侧滑块All选项时出错: {str(e)}")
|
|
||||||
|
|
||||||
def toggle_bs_slider_all(state):
|
|
||||||
"""
|
|
||||||
切换右侧BS滑块的All选项
|
|
||||||
|
|
||||||
Args:
|
|
||||||
state (int): 勾选框状态
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
print(f"切换右侧BS滑块All选项: {state}")
|
|
||||||
# 根据勾选状态执行相应操作
|
|
||||||
if state == 2: # 选中状态
|
|
||||||
print("应用到所有BlendShape")
|
|
||||||
# TODO: 实现应用到所有BlendShape的逻辑
|
|
||||||
else: # 未选中状态
|
|
||||||
print("仅应用到选中的BlendShape")
|
|
||||||
# TODO: 实现仅应用到选中BlendShape的逻辑
|
|
||||||
except Exception as e:
|
|
||||||
print(f"切换右侧BS滑块All选项时出错: {str(e)}")
|
|
||||||
|
|
||||||
def toggle_bottom_slider_all(state):
|
|
||||||
"""
|
|
||||||
切换底部主滑块的All选项
|
|
||||||
|
|
||||||
Args:
|
|
||||||
state (int): 勾选框状态
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
print(f"切换底部主滑块All选项: {state}")
|
|
||||||
# 根据勾选状态执行相应操作
|
|
||||||
if state == 2: # 选中状态
|
|
||||||
print("应用到所有表情")
|
|
||||||
# TODO: 实现应用到所有表情的逻辑
|
|
||||||
else: # 未选中状态
|
|
||||||
print("仅应用到当前表情")
|
|
||||||
# TODO: 实现仅应用到当前表情的逻辑
|
|
||||||
except Exception as e:
|
|
||||||
print(f"切换底部主滑块All选项时出错: {str(e)}")
|
|
||||||
|
|
||||||
# 滑块更新函数
|
|
||||||
def update_raw_slider_value(value):
|
|
||||||
"""
|
|
||||||
更新左侧滑块数值显示
|
|
||||||
|
|
||||||
Args:
|
|
||||||
value (int): 滑块值
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
float: 标准化后的值(0-1范围)
|
|
||||||
"""
|
|
||||||
# 将滑块值转换为0-1范围的浮点数,并显示3位小数
|
|
||||||
normalized_value = value / 100.0
|
|
||||||
|
|
||||||
# 获取UI实例并更新显示
|
|
||||||
from scripts.ui import behaviour
|
|
||||||
behaviour_ui = behaviour.BehaviourUI.get_instance()
|
|
||||||
if behaviour_ui and hasattr(behaviour_ui, 'controls'):
|
|
||||||
behaviour_ui.controls["raw_slider_value"].setText(f"{normalized_value:.3f}")
|
|
||||||
|
|
||||||
# 更新控制值
|
|
||||||
update_control_value(value)
|
|
||||||
|
|
||||||
return normalized_value
|
|
||||||
|
|
||||||
def update_bs_slider_value(value):
|
|
||||||
"""
|
|
||||||
更新右侧BS滑块数值显示
|
|
||||||
|
|
||||||
Args:
|
|
||||||
value (int): 滑块值
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
float: 标准化后的值(0-1范围)
|
|
||||||
"""
|
|
||||||
# 将滑块值转换为0-1范围的浮点数,并显示3位小数
|
|
||||||
normalized_value = value / 100.0
|
|
||||||
|
|
||||||
# 获取UI实例并更新显示
|
|
||||||
from scripts.ui import behaviour
|
|
||||||
behaviour_ui = behaviour.BehaviourUI.get_instance()
|
|
||||||
if behaviour_ui and hasattr(behaviour_ui, 'controls'):
|
|
||||||
behaviour_ui.controls["bs_slider_value"].setText(f"{normalized_value:.3f}")
|
|
||||||
|
|
||||||
# 更新BlendShape值
|
|
||||||
update_blendshape_value(value)
|
|
||||||
|
|
||||||
return normalized_value
|
|
||||||
|
|
||||||
def update_bottom_slider_value(value):
|
|
||||||
"""
|
|
||||||
更新底部主滑块数值显示
|
|
||||||
|
|
||||||
Args:
|
|
||||||
value (int): 滑块值
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
float: 标准化后的值(0-1范围)
|
|
||||||
"""
|
|
||||||
# 将滑块值转换为0-1范围的浮点数,并显示3位小数
|
|
||||||
normalized_value = value / 100.0
|
|
||||||
|
|
||||||
# 获取UI实例并更新显示
|
|
||||||
from scripts.ui import behaviour
|
|
||||||
behaviour_ui = behaviour.BehaviourUI.get_instance()
|
|
||||||
if behaviour_ui and hasattr(behaviour_ui, 'controls'):
|
|
||||||
behaviour_ui.controls["bottom_slider_value"].setText(f"{normalized_value:.3f}")
|
|
||||||
|
|
||||||
# 更新主值
|
|
||||||
update_main_value(value)
|
|
||||||
|
|
||||||
return normalized_value
|
|
||||||
|
|
||||||
# UI事件处理相关的功能函数
|
# UI事件处理相关的功能函数
|
||||||
def on_selection_changed(ui_instance):
|
def on_selection_changed(ui_instance):
|
||||||
@@ -538,55 +255,116 @@ def adjust_range(delta):
|
|||||||
delta (float): 范围调整值
|
delta (float): 范围调整值
|
||||||
"""
|
"""
|
||||||
if delta > 0:
|
if delta > 0:
|
||||||
increase_range()
|
"""
|
||||||
|
增加范围
|
||||||
|
"""
|
||||||
|
print("增加范围")
|
||||||
|
# 这里实现增加范围的功能
|
||||||
|
return True
|
||||||
else:
|
else:
|
||||||
decrease_range()
|
"""
|
||||||
|
减小范围
|
||||||
|
"""
|
||||||
|
print("减小范围")
|
||||||
|
# 这里实现减小范围的功能
|
||||||
|
return True
|
||||||
|
|
||||||
def on_raw_slider_changed(value):
|
def on_raw_slider_changed(value):
|
||||||
"""
|
"""
|
||||||
处理Raw滑块值变化
|
更新左侧滑块数值显示
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
value (int): 滑块值
|
value (int): 滑块值
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
float: 标准化后的值(0-1范围)
|
||||||
"""
|
"""
|
||||||
# 更新显示值
|
# 将滑块值转换为0-1范围的浮点数,并显示3位小数
|
||||||
print(f"Raw滑块值变化: {value}")
|
normalized_value = value / 100.0
|
||||||
# 调用实际的更新函数
|
|
||||||
update_raw_slider_value(value)
|
# 获取UI实例并更新显示
|
||||||
|
from scripts.ui import behaviour
|
||||||
|
behaviour_ui = behaviour.BehaviourUI.get_instance()
|
||||||
|
if behaviour_ui and hasattr(behaviour_ui, 'controls'):
|
||||||
|
behaviour_ui.controls["raw_slider_value"].setText(f"{normalized_value:.3f}")
|
||||||
|
|
||||||
|
# 更新控制值
|
||||||
|
try:
|
||||||
|
print(f"更新控制器值: {value}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"更新控制器值时出错: {str(e)}")
|
||||||
|
|
||||||
|
return normalized_value
|
||||||
|
|
||||||
def on_bs_slider_changed(value):
|
def on_bs_slider_changed(value):
|
||||||
"""
|
"""
|
||||||
处理BlendShape滑块值变化
|
更新右侧BS滑块数值显示
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
value (int): 滑块值
|
value (int): 滑块值
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
float: 标准化后的值(0-1范围)
|
||||||
"""
|
"""
|
||||||
# 更新显示值
|
# 将滑块值转换为0-1范围的浮点数,并显示3位小数
|
||||||
print(f"BlendShape滑块值变化: {value}")
|
normalized_value = value / 100.0
|
||||||
# 调用实际的更新函数
|
|
||||||
update_bs_slider_value(value)
|
# 获取UI实例并更新显示
|
||||||
|
from scripts.ui import behaviour
|
||||||
|
behaviour_ui = behaviour.BehaviourUI.get_instance()
|
||||||
|
if behaviour_ui and hasattr(behaviour_ui, 'controls'):
|
||||||
|
behaviour_ui.controls["bs_slider_value"].setText(f"{normalized_value:.3f}")
|
||||||
|
|
||||||
|
# 更新BlendShape值
|
||||||
|
try:
|
||||||
|
print(f"更新BlendShape值: {value}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"更新BlendShape值时出错: {str(e)}")
|
||||||
|
|
||||||
|
return normalized_value
|
||||||
|
|
||||||
def on_bottom_slider_changed(value):
|
def on_bottom_slider_changed(value):
|
||||||
"""
|
"""
|
||||||
处理底部主滑块值变化
|
更新底部主滑块数值显示
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
value (int): 滑块值
|
value (int): 滑块值
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
float: 标准化后的值(0-1范围)
|
||||||
"""
|
"""
|
||||||
# 更新显示值
|
# 将滑块值转换为0-1范围的浮点数,并显示3位小数
|
||||||
print(f"底部主滑块值变化: {value}")
|
normalized_value = value / 100.0
|
||||||
# 调用实际的更新函数
|
|
||||||
update_bottom_slider_value(value)
|
# 获取UI实例并更新显示
|
||||||
|
from scripts.ui import behaviour
|
||||||
|
behaviour_ui = behaviour.BehaviourUI.get_instance()
|
||||||
|
if behaviour_ui and hasattr(behaviour_ui, 'controls'):
|
||||||
|
behaviour_ui.controls["bottom_slider_value"].setText(f"{normalized_value:.3f}")
|
||||||
|
|
||||||
|
# 更新主值
|
||||||
|
update_main_value(value)
|
||||||
|
try:
|
||||||
|
print(f"更新BlendShape值: {value}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"更新BlendShape值时出错: {str(e)}")
|
||||||
|
|
||||||
|
return normalized_value
|
||||||
|
|
||||||
def on_control_selection_changed():
|
def on_control_selection_changed():
|
||||||
"""处理控制列表选择变化"""
|
"""更新控制器选择"""
|
||||||
print("控制列表选择变化")
|
try:
|
||||||
update_control_selection()
|
print("更新控制器选择")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"更新控制器选择时出错: {str(e)}")
|
||||||
|
|
||||||
def on_blendshape_selection_changed():
|
def on_blendshape_selection_changed():
|
||||||
"""处理BlendShape列表选择变化"""
|
"""处理BlendShape列表选择变化"""
|
||||||
print("BlendShape列表选择变化")
|
print("BlendShape列表选择变化")
|
||||||
update_blendshape_selection()
|
try:
|
||||||
|
print("更新BlendShape选择")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"更新BlendShape选择时出错: {str(e)}")
|
||||||
|
|
||||||
def adjust_bs_range(delta):
|
def adjust_bs_range(delta):
|
||||||
"""
|
"""
|
||||||
@@ -596,16 +374,20 @@ def adjust_bs_range(delta):
|
|||||||
delta (float): 范围调整值
|
delta (float): 范围调整值
|
||||||
"""
|
"""
|
||||||
print(f"调整BlendShape滑块范围: {delta}")
|
print(f"调整BlendShape滑块范围: {delta}")
|
||||||
adjust_range(delta)
|
if delta > 0:
|
||||||
|
"""
|
||||||
# 保留原来的函数作为兼容性考虑
|
增加范围
|
||||||
def behaviour_temp_utils_function():
|
"""
|
||||||
"""
|
print("增加范围")
|
||||||
Placeholder function for behaviour module
|
# 这里实现增加范围的功能
|
||||||
This function will be replaced with actual functionality in future updates
|
return True
|
||||||
"""
|
else:
|
||||||
print("Behaviour module temporary function called")
|
"""
|
||||||
return True
|
减小范围
|
||||||
|
"""
|
||||||
|
print("减小范围")
|
||||||
|
# 这里实现减小范围的功能
|
||||||
|
return True
|
||||||
|
|
||||||
def reposition_joints():
|
def reposition_joints():
|
||||||
"""
|
"""
|
||||||
|
Reference in New Issue
Block a user