Skip to content
Snippets Groups Projects
pdt_library.py 6.89 KiB
Newer Older
  • Learn to ignore specific revisions
  • # ***** BEGIN GPL LICENSE BLOCK *****
    #
    #
    # This program 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 2
    # of the License, or (at your option) any later version.
    #
    # This program 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 this program; if not, write to the Free Software Foundation,
    # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    #
    # ***** END GPL LICENCE BLOCK *****
    #
    # -----------------------------------------------------------------------
    # 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 = context.preferences.addons[__package__].preferences.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 = context.preferences.addons[__package__].preferences.pdt_library_path
            path = Path(file_path)
    
            if path.is_file() and ".blend" in str(path):
                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,
                                )
    
                if pg.lib_mode == "COLLECTIONS":
    
                        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,
                                )
    
                if pg.lib_mode == "MATERIALS":
    
                        filepath=str(path),
                        directory=str(path) + "/Material",
                        filename=pg.lib_materials,
    
            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
    
                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 = context.preferences.addons[__package__].preferences.pdt_library_path
            path = Path(file_path)
            if path.is_file() and ".blend" in str(path):
                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":
    
                        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":
    
                        filepath=str(path),
                        directory=str(path) + "/Material",
                        filename=pg.lib_materials,
    
            error_message = PDT_ERR_NO_LIBRARY
            self.report({"ERROR"}, error_message)
    
            return {"FINISHED"}