154 lines
4.0 KiB
Python
154 lines
4.0 KiB
Python
import bpy
|
|
import mathutils
|
|
|
|
|
|
def get_type(cls):
|
|
return type(cls).__name__
|
|
|
|
|
|
def get_node_by_type(nodes, type_name: str):
|
|
return [node for node in nodes if get_type(node) == type_name]
|
|
|
|
def show_message(message="", title="Message Box", icon='INFO'):
|
|
|
|
def draw(self, context):
|
|
self.layout.label(text=message)
|
|
|
|
bpy.context.window_manager.popup_menu(draw, title=title, icon=icon)
|
|
|
|
|
|
def calc_bbox_verts(origin, size):
|
|
bbox_origin = mathutils.Vector(
|
|
(origin[0], origin[1], origin[2]))
|
|
bbox_size = mathutils.Vector(
|
|
(size[0], size[1], size[2]))
|
|
bbox_verts = [
|
|
(
|
|
bbox_origin[0] + 0,
|
|
bbox_origin[1] + 0,
|
|
bbox_origin[2] + 0
|
|
),
|
|
(
|
|
bbox_origin[0] + 0,
|
|
bbox_origin[1] + 0,
|
|
bbox_origin[2] + bbox_size[2]
|
|
),
|
|
(
|
|
bbox_origin[0] + 0,
|
|
bbox_origin[1] + bbox_size[1],
|
|
bbox_origin[2] + 0
|
|
),
|
|
(
|
|
bbox_origin[0] + 0,
|
|
bbox_origin[1] + bbox_size[1],
|
|
bbox_origin[2] + bbox_size[2]
|
|
),
|
|
(
|
|
bbox_origin[0] + bbox_size[0],
|
|
bbox_origin[1] + 0,
|
|
bbox_origin[2] + 0
|
|
),
|
|
(
|
|
bbox_origin[0] + bbox_size[0],
|
|
bbox_origin[1] + 0,
|
|
bbox_origin[2] + bbox_size[2],
|
|
),
|
|
(
|
|
bbox_origin[0] + bbox_size[0],
|
|
bbox_origin[1] + bbox_size[1],
|
|
bbox_origin[2] + 0,
|
|
),
|
|
(
|
|
bbox_origin[0] + bbox_size[0],
|
|
bbox_origin[1] + bbox_size[1],
|
|
bbox_origin[2] + bbox_size[2],
|
|
),
|
|
]
|
|
return bbox_verts
|
|
|
|
|
|
def get_bioxels_obj(current_obj):
|
|
bioxels_obj = None
|
|
if current_obj.get('bioxels_container'):
|
|
bioxels_values = []
|
|
for obj in bpy.data.objects:
|
|
if obj.parent == current_obj and obj.get('bioxels'):
|
|
bioxels_values.append(obj)
|
|
|
|
if len(bioxels_values) > 0:
|
|
bioxels_obj = bioxels_values[0]
|
|
|
|
elif current_obj.get('bioxels') and current_obj.parent:
|
|
if current_obj.parent.get('bioxels_container'):
|
|
bioxels_obj = current_obj
|
|
|
|
return bioxels_obj
|
|
|
|
|
|
def get_all_bioxels_objs():
|
|
bioxels_objs = []
|
|
|
|
for obj in bpy.data.objects:
|
|
if obj.parent:
|
|
if obj.parent.get('bioxels_container') and obj.get('bioxels'):
|
|
bioxels_objs.append(obj)
|
|
|
|
return list(set(bioxels_objs))
|
|
|
|
|
|
def get_text_index_str(text):
|
|
# Initialize an empty string to store the digits
|
|
digits = ""
|
|
|
|
# Iterate through the characters in reverse order
|
|
started = False
|
|
for char in text[::-1]:
|
|
if char.isdigit():
|
|
started = True
|
|
# If the character is a digit, add it to the digits string
|
|
digits += char
|
|
else:
|
|
if started:
|
|
# If a non-digit character is encountered, stop the loop
|
|
break
|
|
|
|
# Reverse the digits string to get the correct order
|
|
last_number = digits[::-1]
|
|
|
|
return last_number
|
|
|
|
|
|
def add_driver(target_prop, var_sources, expression):
|
|
|
|
driver = target_prop.driver_add("default_value")
|
|
is_vector = isinstance(driver, list)
|
|
drivers = driver if is_vector else [driver]
|
|
|
|
for i, driver in enumerate(drivers):
|
|
for j, var_source in enumerate(var_sources):
|
|
|
|
source = var_source['source']
|
|
prop = var_source['prop']
|
|
|
|
var = driver.driver.variables.new()
|
|
var.name = f"var{j}"
|
|
|
|
var.targets[0].id_type = source.id_type
|
|
var.targets[0].id = source
|
|
var.targets[0].data_path = f'["{prop}"][{i}]'\
|
|
if is_vector else f'["{prop}"]'
|
|
|
|
driver.driver.expression = expression
|
|
|
|
|
|
def add_direct_driver(target, target_prop, source, source_prop):
|
|
target_prop = target.inputs.get(target_prop)
|
|
drivers = [
|
|
{
|
|
"source": source,
|
|
"prop": source_prop
|
|
}
|
|
]
|
|
expression = "var0"
|
|
add_driver(target_prop, drivers, expression)
|