Skip to content
Snippets Groups Projects
ui.py 90.5 KiB
Newer Older
  • Learn to ignore specific revisions
  •         col.prop(obj.pov, "replacement_text", text="")
    
    ###############################################################################
    # Add Povray Objects
    ###############################################################################
    
    class POVRAY_MT_primitives_add_menu(bpy.types.Menu):
    
        """Define the menu with presets"""
    
        bl_idname = "POVRAY_MT_primitives_add_menu"
    
        bl_label = "Povray"
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        @classmethod
        def poll(cls, context):
            engine = context.scene.render.engine
    
            return (engine == 'POVRAY_RENDER')
    
    
        def draw(self,context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
            layout.menu(BasicShapesMenu.bl_idname, text = "Primitives",icon="GROUP")
            layout.menu(ImportMenu.bl_idname, text = "Import",icon="IMPORT")
    
    class BasicShapesMenu(bpy.types.Menu):
    
        bl_idname = "POVRAY_MT_basic_shape_tools"
    
        bl_label = "Basic_shapes"
    
        def draw(self,context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
            layout.operator("pov.addplane", text="Infinite Plane",icon = 'MESH_PLANE')
            layout.operator("pov.addbox", text="Box",icon = 'MESH_CUBE')
            layout.operator("pov.addsphere", text="Sphere",icon = 'SOLID')
            layout.operator("pov.addcylinder", text="Cylinder",icon="MESH_CYLINDER")
            layout.operator("pov.cone_add", text="Cone",icon="MESH_CONE")
            layout.operator("pov.addtorus", text="Torus",icon = 'MESH_TORUS')
            layout.separator()
            layout.operator("pov.addrainbow", text="Rainbow",icon="COLOR")
            layout.operator("pov.addlathe", text="Lathe",icon = 'MOD_SCREW')
            layout.operator("pov.addprism", text="Prism",icon = 'MOD_SOLIDIFY')
            layout.operator("pov.addsuperellipsoid", text="Superquadric Ellipsoid",icon = 'MOD_SUBSURF')
            layout.operator("pov.addheightfield", text="Height Field",icon="RNDCURVE")
            layout.operator("pov.addspheresweep", text="Sphere Sweep",icon = 'FORCE_CURVE')
            layout.separator()
            layout.operator("pov.addblobsphere", text="Blob Sphere",icon = 'META_DATA')
            layout.separator()
            layout.label("Isosurfaces")
            layout.operator("pov.addisosurfacebox", text="Isosurface Box",icon="META_CUBE")
            layout.operator("pov.addisosurfacesphere", text="Isosurface Sphere",icon="META_BALL")
            layout.operator("pov.addsupertorus", text="Supertorus",icon="SURFACE_NTORUS")
            layout.separator()
            layout.label(text = "Macro based")
            layout.operator("pov.addpolygontocircle", text="Polygon To Circle Blending",icon="RETOPO")
            layout.operator("pov.addloft", text="Loft",icon="SURFACE_NSURFACE")
    
            layout.separator()
            # Warning if the Add Advanced Objects addon containing
            # Add mesh extra objects is not enabled
            if not check_add_mesh_extra_objects():
                #col = box.column()
                layout.label(text="Please enable Add Mesh: Extra Objects addon", icon="INFO")
                #layout.separator()
    
                layout.operator("preferences.addon_show",
    
                             text="Go to Add Mesh: Extra Objects addon",
                             icon="PREFERENCES").module = "add_mesh_extra_objects"
    
                #layout.separator()
                return
            else:
                layout.operator("pov.addparametric", text="Parametric",icon = 'SCRIPTPLUGINS')
    
    class ImportMenu(bpy.types.Menu):
    
        bl_idname = "POVRAY_MT_import_tools"
    
        bl_label = "Import"
    
        def draw(self,context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
    
            layout.operator("import_scene.pov",icon="FORCE_LENNARDJONES")
    
    
    def menu_func_add(self, context):
        engine = context.scene.render.engine
        if engine == 'POVRAY_RENDER':
    
            self.layout.menu("POVRAY_MT_primitives_add_menu", icon="PLUGIN")
    
    
    def menu_func_import(self, context):
        engine = context.scene.render.engine
        if engine == 'POVRAY_RENDER':
    
            self.layout.operator("import_scene.pov",icon="FORCE_LENNARDJONES")
    
    ##############Nodes
    
    # def find_node_input(node, name):
        # for input in node.inputs:
            # if input.name == name:
                # return input
    
    # def panel_node_draw(layout, id_data, output_type, input_name):
        # if not id_data.use_nodes:
            # #layout.operator("pov.material_use_nodes", icon='SOUND')#'NODETREE')
            # #layout.operator("pov.use_shading_nodes", icon='NODETREE')
            # layout.operator("WM_OT_context_toggle", icon='NODETREE').data_path = \
    
                            # "material.pov.material_use_nodes"
    
            # return False
    
        # ntree = id_data.node_tree
    
        # node = find_node(id_data, output_type)
        # if not node:
            # layout.label(text="No output node")
        # else:
            # input = find_node_input(node, input_name)
            # layout.template_node_view(ntree, node, input)
    
        # return True
    
    
    class NodeMapCreateMenu(bpy.types.Menu):
    
        """Create maps"""
    
        bl_idname = "POVRAY_MT_node_map_create"
    
        bl_label = "Create map"
    
        def draw(self,context):
            layout = self.layout
            layout.operator("node.map_create")
    
    def menu_func_nodes(self, context):
        ob = context.object
        if hasattr(ob,'active_material'):
            mat=context.object.active_material
            if mat and context.space_data.tree_type == 'ObjectNodeTree':
                self.layout.prop(mat.pov,"material_use_nodes")
    
                self.layout.menu(NodeMapCreateMenu.bl_idname)
    
                self.layout.operator("wm.updatepreviewkey")
            if hasattr(mat,'active_texture') and context.scene.render.engine == 'POVRAY_RENDER':
                tex=mat.active_texture
                if tex and context.space_data.tree_type == 'TextureNodeTree':
                    self.layout.prop(tex.pov,"texture_use_nodes")
    
    
    
    ###############################################################################
    # Camera Povray Settings
    
    ###############################################################################
    
    class CAMERA_PT_povray_cam_dof(CameraDataButtonsPanel, bpy.types.Panel):
    
        bl_label = "POV-Ray Depth Of Field"
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        def draw_header(self, context):
            cam = context.camera
    
    
            self.layout.prop(cam.pov, "dof_enable", text="")
    
        def draw(self, context):
            layout = self.layout
    
            cam = context.camera
    
    
            split = layout.split()
    
            col = split.column()
    
            col.prop(cam.pov, "dof_samples_min")
            col.prop(cam.pov, "dof_variance")
    
            col = split.column()
    
            col.prop(cam.pov, "dof_samples_max")
            col.prop(cam.pov, "dof_confidence")
    
    class CAMERA_PT_povray_cam_nor(CameraDataButtonsPanel, bpy.types.Panel):
        bl_label = "POV-Ray Perturbation"
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        def draw_header(self, context):
            cam = context.camera
    
            self.layout.prop(cam.pov, "normal_enable", text="")
    
        def draw(self, context):
            layout = self.layout
    
            cam = context.camera
    
            layout.active = cam.pov.normal_enable
    
            layout.prop(cam.pov,"normal_patterns")
            layout.prop(cam.pov,"cam_normal")
            layout.prop(cam.pov,"turbulence")
            layout.prop(cam.pov,"scale")
    
    
    
    class CAMERA_PT_povray_replacement_text(CameraDataButtonsPanel, bpy.types.Panel):
        bl_label = "Custom POV Code"
    
    Thomas Dinges's avatar
    Thomas Dinges committed
            col = layout.column()
    
            col.prop(cam.pov, "replacement_text", text="")
    
    ###############################################################################
    # Text Povray Settings
    ###############################################################################
    
    class TEXT_OT_povray_insert(bpy.types.Operator):
        """Tooltip"""
        bl_idname = "text.povray_insert"
        bl_label = "Insert"
    
    
        filepath : bpy.props.StringProperty(name="Filepath", subtype='FILE_PATH')
    
    
        @classmethod
        def poll(cls, context):
            # context.area.type == 'TEXT_EDITOR'
            return bpy.ops.text.insert.poll()
    
        def execute(self, context):
            if self.filepath and isfile(self.filepath):
                file = open(self.filepath, "r")
                bpy.ops.text.insert(text=file.read())
    
                # places the cursor at the end without scrolling -.-
                # context.space_data.text.write(file.read())
                file.close()
            return {'FINISHED'}
    
    def validinsert(ext):
    
    	return ext in {".txt",".inc",".pov"}
    
    
    class TEXT_MT_insert(bpy.types.Menu):
        bl_label = "Insert"
        bl_idname = "TEXT_MT_insert"
    
        def draw(self, context):
            pov_documents = locate_docpath()
            prop = self.layout.operator("wm.path_open", text="Open folder", icon='FILE_FOLDER')
            prop.filepath = pov_documents
            self.layout.separator()
    
            list=[]
            for root,dirs,files in os.walk(pov_documents):
                list.append(root)
            print(list)
            self.path_menu(list,
                           "text.povray_insert",
                           #{"internal": True},
    					   filter_ext= validinsert
                           )
    
    
    class TEXT_PT_povray_custom_code(TextButtonsPanel, bpy.types.Panel):
    
        bl_label = "POV-Ray"
    
    Thomas Dinges's avatar
    Thomas Dinges committed
            text = context.space_data.text
    
            if not pov_documents :
    
                layout.label(text="Please configure ", icon="INFO")
                layout.label(text="default pov include path ")
                layout.label(text="in addon preferences")
                #layout.separator()
    
                layout.operator("preferences.addon_show",
    
                             text="Go to Render: POV-Ray addon",
                             icon="PREFERENCES").module = "render_povray"
    
                #layout.separator()
            else:
                #print(pov_documents)
                layout.menu(TEXT_MT_insert.bl_idname)
    
            if text:
                box = layout.box()
                box.label('Source to render:', icon='RENDER_STILL')
                row = box.row()
                row.prop(text.pov, "custom_code",expand = True)
                if text.pov.custom_code in {'3dview'}:
    
                    box.operator("render.render", icon='OUTLINER_DATA_POSE')
    
                if text.pov.custom_code in {'text'}:
                    rtext = bpy.context.space_data.text
                    box.operator("text.run", icon='POSE_DATA')
                #layout.prop(text.pov, "custom_code")
                elif text.pov.custom_code in {'both'}:
                    box.operator("render.render", icon='POSE_HLT')
                    layout.label(text="Please specify declared", icon="INFO")
                    layout.label(text="items in properties ")
    
                    #layout.label(text="")
    
    ###############################################
    # Text editor templates from header menu
    
    
    class TEXT_MT_templates_pov(bpy.types.Menu):
        bl_label = "POV-Ray"
    
        # We list templates on file evaluation, we can assume they are static data,
        # and better avoid running this on every draw call.
        import os
        template_paths = [os.path.join(os.path.dirname(__file__), "templates_pov")]
    
        def draw(self, context):
            self.path_menu(
                self.template_paths,
                "text.open",
                props_default={"internal": True},
            )
    
    def menu_func_templates(self, context):
        # Do not depend on POV-Ray being active renderer here...
        self.layout.menu("TEXT_MT_templates_pov")
    
        WORLD_PT_POV_world,
        POV_WORLD_MT_presets,
        AddPresetWorld,
    
        #RenderButtonsPanel,
        #ModifierButtonsPanel,
        #MaterialButtonsPanel,
        #TextureButtonsPanel,
        #ObjectButtonsPanel,
        #CameraDataButtonsPanel,
        #WorldButtonsPanel,
        #TextButtonsPanel,
        #PovDataButtonsPanel,
        DATA_PT_POV_normals,
        DATA_PT_POV_texture_space,
        DATA_PT_POV_vertex_groups,
        DATA_PT_POV_shape_keys,
        DATA_PT_POV_uv_texture,
        DATA_PT_POV_vertex_colors,
        DATA_PT_POV_customdata,
        #PovLampButtonsPanel,
        LIGHT_PT_POV_preview,
        LIGHT_PT_POV_light,
        POV_LIGHT_MT_presets,
        AddPresetLamp,
        OBJECT_PT_povray_obj_rainbow,
        RENDER_PT_povray_export_settings,
        RENDER_PT_povray_render_settings,
        RENDER_PT_povray_photons,
        RENDER_PT_povray_antialias,
        RENDER_PT_povray_radiosity,
        POV_RADIOSITY_MT_presets,
        AddPresetRadiosity,
        RENDER_PT_povray_media,
        MODIFIERS_PT_povray_modifiers,
    
        MATERIAL_PT_povray_activate_node,
        MATERIAL_PT_povray_active_node,
    
        MATERIAL_PT_povray_reflection,
        MATERIAL_PT_povray_fade_color,
        MATERIAL_PT_povray_caustics,
        MATERIAL_PT_povray_replacement_text,
        TEXTURE_PT_povray_type,
        TEXTURE_PT_povray_preview,
        TEXTURE_PT_povray_parameters,
        TEXTURE_PT_povray_tex_gamma,
        OBJECT_PT_povray_obj_parameters,
        OBJECT_PT_povray_obj_sphere,
        OBJECT_PT_povray_obj_cylinder,
        OBJECT_PT_povray_obj_cone,
        OBJECT_PT_povray_obj_superellipsoid,
        OBJECT_PT_povray_obj_torus,
        OBJECT_PT_povray_obj_supertorus,
        OBJECT_PT_povray_obj_parametric,
        OBJECT_PT_povray_replacement_text,
        POVRAY_MT_primitives_add_menu,
        BasicShapesMenu,
        ImportMenu,
        NodeMapCreateMenu,
        CAMERA_PT_povray_cam_dof,
        CAMERA_PT_povray_cam_nor,
        CAMERA_PT_povray_replacement_text,
        TEXT_OT_povray_insert,
        TEXT_MT_insert,
        TEXT_PT_povray_custom_code,
        TEXT_MT_templates_pov,
    )
    
    
    def register():
        #from bpy.utils import register_class
    
        for cls in classes:
            register_class(cls)
            
        bpy.types.VIEW3D_MT_add.prepend(menu_func_add)
        bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
        bpy.types.TEXT_MT_templates.append(menu_func_templates)
        bpy.types.RENDER_PT_povray_radiosity.prepend(rad_panel_func)
        bpy.types.LIGHT_PT_POV_light.prepend(light_panel_func)
        #bpy.types.WORLD_PT_POV_world.prepend(world_panel_func)
        # was used for parametric objects but made the other addon unreachable on
        # unregister for other tools to use created a user action call instead
        #addon_utils.enable("add_mesh_extra_objects", default_set=False, persistent=True)
    
        #bpy.types.TEXTURE_PT_context_texture.prepend(TEXTURE_PT_povray_type)
    
    def unregister():
        #from bpy.utils import unregister_class
    
        for cls in classes:
            unregister_class(cls)
            
        #bpy.types.TEXTURE_PT_context_texture.remove(TEXTURE_PT_povray_type)
        #addon_utils.disable("add_mesh_extra_objects", default_set=False)
        #bpy.types.WORLD_PT_POV_world.remove(world_panel_func)
        bpy.types.LIGHT_PT_POV_light.remove(light_panel_func)
        bpy.types.RENDER_PT_povray_radiosity.remove(rad_panel_func)
        bpy.types.TEXT_MT_templates.remove(menu_func_templates)
        bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)
        bpy.types.VIEW3D_MT_add.remove(menu_func_add)