mirror of
https://github.com/blender/blender-addons.git
synced 2025-07-25 16:05:20 +00:00
189 lines
6.0 KiB
Python
189 lines
6.0 KiB
Python
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Author: Alan Odom (Clockmender), Rune Morling (ermo) Copyright (c) 2019
|
|
# -----------------------------------------------------------------------
|
|
#
|
|
import bpy
|
|
from bpy.types import Operator
|
|
from mathutils import Vector
|
|
from pathlib import Path
|
|
from .pdt_functions import debug, oops
|
|
from .pdt_msg_strings import PDT_ERR_NO_LIBRARY, PDT_ERR_OBJECTMODE
|
|
|
|
|
|
class PDT_OT_LibShow(Operator):
|
|
"""Show Library File Details"""
|
|
|
|
bl_idname = "pdt.lib_show"
|
|
bl_label = "Show Library Details"
|
|
bl_options = {"REGISTER", "UNDO"}
|
|
|
|
def execute(self, context):
|
|
"""Shows Location Of PDT Library File.
|
|
|
|
Args:
|
|
context: Blender bpy.context instance.
|
|
|
|
Returns:
|
|
Status Set.
|
|
"""
|
|
|
|
scene = context.scene
|
|
pg = scene.pdt_pg
|
|
file_path = pg.pdt_library_path
|
|
pg.error = str(Path(file_path))
|
|
debug("PDT Parts Library:")
|
|
debug(f"{pg.error}")
|
|
bpy.context.window_manager.popup_menu(
|
|
oops, title="Information - Parts Library File", icon="INFO"
|
|
)
|
|
return {"FINISHED"}
|
|
|
|
|
|
class PDT_OT_Append(Operator):
|
|
"""Append from Library at cursor Location"""
|
|
|
|
bl_idname = "pdt.append"
|
|
bl_label = "Append"
|
|
bl_options = {"REGISTER", "UNDO"}
|
|
|
|
def execute(self, context):
|
|
"""Appends Objects from PDT Library file.
|
|
|
|
Note:
|
|
Appended Objects are placed at Cursor Location.
|
|
Uses pg.lib_objects, pg.lib_collections & pg.lib_materials
|
|
|
|
Args:
|
|
context: Blender bpy.context instance.
|
|
|
|
Returns:
|
|
Status Set.
|
|
"""
|
|
|
|
scene = context.scene
|
|
pg = scene.pdt_pg
|
|
obj = context.view_layer.objects.active
|
|
if obj is not None:
|
|
if obj.mode != "OBJECT":
|
|
error_message = PDT_ERR_OBJECTMODE
|
|
self.report({"ERROR"}, error_message)
|
|
return {"FINISHED"}
|
|
|
|
obj_names = [o.name for o in context.view_layer.objects].copy()
|
|
file_path = pg.pdt_library_path
|
|
path = Path(file_path)
|
|
|
|
if path.is_file() and str(path).endswith(".blend"):
|
|
if pg.lib_mode == "OBJECTS":
|
|
bpy.ops.wm.append(
|
|
filepath=str(path),
|
|
directory=str(path) + "/Object",
|
|
filename=pg.lib_objects,
|
|
)
|
|
for obj in context.view_layer.objects:
|
|
if obj.name not in obj_names:
|
|
obj.select_set(False)
|
|
obj.location = Vector(
|
|
(
|
|
scene.cursor.location.x,
|
|
scene.cursor.location.y,
|
|
scene.cursor.location.z,
|
|
)
|
|
)
|
|
return {"FINISHED"}
|
|
if pg.lib_mode == "COLLECTIONS":
|
|
bpy.ops.wm.append(
|
|
filepath=str(path),
|
|
directory=str(path) + "/Collection",
|
|
filename=pg.lib_collections,
|
|
)
|
|
for obj in context.view_layer.objects:
|
|
if obj.name not in obj_names:
|
|
obj.select_set(False)
|
|
obj.location = Vector(
|
|
(
|
|
scene.cursor.location.x,
|
|
scene.cursor.location.y,
|
|
scene.cursor.location.z,
|
|
)
|
|
)
|
|
return {"FINISHED"}
|
|
if pg.lib_mode == "MATERIALS":
|
|
bpy.ops.wm.append(
|
|
filepath=str(path),
|
|
directory=str(path) + "/Material",
|
|
filename=pg.lib_materials,
|
|
)
|
|
return {"FINISHED"}
|
|
|
|
error_message = PDT_ERR_NO_LIBRARY
|
|
self.report({"ERROR"}, error_message)
|
|
return {"FINISHED"}
|
|
|
|
|
|
class PDT_OT_Link(Operator):
|
|
"""Link from Library at Object's Origin"""
|
|
|
|
bl_idname = "pdt.link"
|
|
bl_label = "Link"
|
|
bl_options = {"REGISTER", "UNDO"}
|
|
|
|
def execute(self, context):
|
|
"""Links Objects from PDT Library file.
|
|
|
|
Note:
|
|
Linked Objects are placed at Cursor Location
|
|
Uses pg.lib_objects, pg.lib_collections & pg.lib_materials
|
|
|
|
Args:
|
|
context: Blender bpy.context instance.
|
|
|
|
Returns:
|
|
Status Set.
|
|
"""
|
|
|
|
scene = context.scene
|
|
pg = scene.pdt_pg
|
|
obj = context.view_layer.objects.active
|
|
if obj is not None:
|
|
if obj.mode != "OBJECT":
|
|
error_message = PDT_ERR_OBJECTMODE
|
|
self.report({"ERROR"}, error_message)
|
|
return {"FINISHED"}
|
|
|
|
file_path = pg.pdt_library_path
|
|
path = Path(file_path)
|
|
|
|
if path.is_file() and str(path).endswith(".blend"):
|
|
if pg.lib_mode == "OBJECTS":
|
|
bpy.ops.wm.link(
|
|
filepath=str(path),
|
|
directory=str(path) + "/Object",
|
|
filename=pg.lib_objects,
|
|
)
|
|
for obj in context.view_layer.objects:
|
|
obj.select_set(False)
|
|
return {"FINISHED"}
|
|
if pg.lib_mode == "COLLECTIONS":
|
|
bpy.ops.wm.link(
|
|
filepath=str(path),
|
|
directory=str(path) + "/Collection",
|
|
filename=pg.lib_collections,
|
|
)
|
|
for obj in context.view_layer.objects:
|
|
obj.select_set(False)
|
|
return {"FINISHED"}
|
|
if pg.lib_mode == "MATERIALS":
|
|
bpy.ops.wm.link(
|
|
filepath=str(path),
|
|
directory=str(path) + "/Material",
|
|
filename=pg.lib_materials,
|
|
)
|
|
return {"FINISHED"}
|
|
|
|
error_message = PDT_ERR_NO_LIBRARY
|
|
self.report({"ERROR"}, error_message)
|
|
return {"FINISHED"}
|