Files
blender-portable-repo/scripts/addons/cc_blender_tools-main/lib.py
T
2026-03-17 14:30:01 -06:00

162 lines
5.9 KiB
Python

# Copyright (C) 2021 Victor Soupday
# This file is part of CC/iC Blender Tools <https://github.com/soupday/cc_blender_tools>
#
# CC/iC Blender Tools is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# CC/iC Blender Tools is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with CC/iC Blender Tools. If not, see <https://www.gnu.org/licenses/>.
import bpy, os
from . import utils, vars
def get_object(object_names, lib_tag="RL_Library_Object", allow_duplicates=True):
single = False
if type(object_names) is str:
object_names = [ object_names ]
single = True
appended_objects = [None]*len(object_names)
found = 0
if not allow_duplicates:
for obj in bpy.data.objects:
for i, object_name in enumerate(object_names):
if (obj.name.startswith(object_name) and
utils.prop(obj, lib_tag) and
is_version(obj)):
appended_objects[i] = obj
found += 1
files = [ {"name": object_name } for i, object_name in enumerate(object_names) if appended_objects[i] is None ]
if files:
path = os.path.dirname(os.path.realpath(__file__))
filename = "_LIB341.blend"
datablock = "Object"
file = os.path.join(path, filename)
if os.path.exists(file):
objects = utils.get_set(bpy.data.objects)
bpy.ops.wm.append(directory=os.path.join(path, filename, datablock),
files=files,
set_fake=True,
link=False)
new = utils.get_set_new(bpy.data.objects, objects)
for i, object_name in enumerate(object_names):
if appended_objects[i] is None:
for obj in new:
if utils.strip_name(obj.name) == object_name and lib_tag not in obj:
obj[lib_tag] = True
obj["RL_Addon_Version"] = vars.VERSION_STRING
utils.log_info(f"Appended Library Object: {path} / {object_name} > {obj.name}")
appended_objects[i] = obj
found += 1
if found < len(object_names):
raise ValueError(f"Unable to append all Library Objects: {object_names} from {path}")
if single:
return appended_objects[0]
else:
return appended_objects
def get_image(image_name, lib_tag="RL_Library_Image"):
for img in bpy.data.images:
if (img.name.startswith(image_name) and
utils.prop(img, lib_tag) and
is_version(img)):
if not img.packed_file:
img.pack()
return img
path = os.path.dirname(os.path.realpath(__file__))
filename = "_LIB341.blend"
datablock = "Image"
file = os.path.join(path, filename)
appended_image = None
if os.path.exists(file):
images = utils.get_set(bpy.data.images)
bpy.ops.wm.append(directory=os.path.join(path, filename, datablock),
filename=image_name,
set_fake=True,
link=False)
new = utils.get_set_new(bpy.data.images, images)
for img in new:
if utils.strip_name(img.name) == image_name and lib_tag not in img:
img[lib_tag] = True
img["RL_Addon_Version"] = vars.VERSION_STRING
utils.log_info(f"Appended Library Image: {path} / {image_name} > {img.name}")
appended_image = img
if not appended_image:
raise ValueError(f"Unable to append Library Image: {image_name} from {path}")
else:
if not appended_image.packed_file:
appended_image.pack()
return appended_image
def get_node_group(group_name, lib_tag="RL_Node_Group"):
for node_tree in bpy.data.node_groups:
if (node_tree.name.startswith(group_name) and
utils.prop(node_tree, lib_tag) and
is_version(node_tree)):
return node_tree
path = os.path.dirname(os.path.realpath(__file__))
filename = "_LIB341.blend"
datablock = "NodeTree"
file = os.path.join(path, filename)
appended_object = None
if os.path.exists(file):
node_groups = utils.get_set(bpy.data.node_groups)
bpy.ops.wm.append(directory=os.path.join(path, filename, datablock),
filename=group_name,
set_fake=True,
link=False)
new = utils.get_set_new(bpy.data.node_groups, node_groups)
for node_tree in new:
if utils.strip_name(node_tree.name) == group_name and lib_tag not in node_tree:
node_tree[lib_tag] = True
node_tree["RL_Addon_Version"] = vars.VERSION_STRING
utils.log_info(f"Appended Library Node Group: {path} / {group_name} > {node_tree.name}")
appended_object = node_tree
if not appended_object:
raise ValueError(f"Unable to append Library Image: {group_name} from {path}")
return appended_object
def check_node_groups():
for name in vars.NODE_GROUPS:
get_node_group(name)
def remove_all_groups():
for group in bpy.data.node_groups:
if vars.NODE_PREFIX in group.name or "RL_Node_Group" in group:
bpy.data.node_groups.remove(group)
def rebuild_node_groups():
remove_all_groups()
check_node_groups()
return
def is_version(obj):
return (vars.VERSION_STRING in obj.name or
utils.prop(obj, "RL_Addon_Version") == vars.VERSION_STRING)