space_view3d_display_tools: move to contrib: T63750

This commit is contained in:
Brendon Murphy 2019-05-24 10:12:14 +10:00
parent d9ffde707f
commit c44a9cb5ba
9 changed files with 0 additions and 2891 deletions

View File

@ -1,667 +0,0 @@
# space_view_3d_display_tools.py Copyright (C) 2014, Jordi Vall-llovera
# Multiple display tools for fast navigate/interact with the viewport
# ##### 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 #####
# Contributed to by:
# Jasperge, Pixaal, Meta-androcto, Lapineige, lijenstina,
# Felix Schlitter, Ales Sidenko, Jakub Belcik
bl_info = {
"name": "Display Tools",
"author": "Jordi Vall-llovera Medina, Jhon Wallace",
"version": (1, 6, 6),
"blender": (2, 79, 0),
"location": "Toolshelf",
"description": "Display tools for fast navigation/interaction with the viewport",
"warning": "",
"wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/"
"Py/Scripts/3D_interaction/Display_Tools",
"category": "3D View"}
# Import From Files
if "bpy" in locals():
import importlib
importlib.reload(display)
importlib.reload(fast_navigate)
importlib.reload(modifier_tools)
importlib.reload(shading_menu)
importlib.reload(select_tools)
importlib.reload(useless_tools)
# importlib.reload(selection_restrictor)
else:
from . import display
from . import fast_navigate
from . import modifier_tools
from . import shading_menu
from . import select_tools
from . import useless_tools
# from . import selection_restrictor
import bpy
from bpy.types import (
Panel,
PropertyGroup,
AddonPreferences,
)
from bpy.props import (
IntProperty,
BoolProperty,
BoolVectorProperty,
EnumProperty,
StringProperty,
PointerProperty,
)
class DISPLAY_PT_ToolsPanel(Panel):
bl_label = "Display Tools"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
bl_category = "Display"
bl_options = {'DEFAULT_CLOSED'}
display_type_icons = {
'BOUNDS': 'SHADING_BBOX',
'WIRE': 'SHADING_WIRE',
'SOLID': 'SHADING_SOLID',
'TEXTURED': 'SHADING_RENDERED'
}
bounds_icons = {
'BOX': 'MESH_CUBE',
'SPHERE': 'MATSPHERE',
'CYLINDER': 'MESH_CYLINDER',
'CONE': 'MESH_CONE'
}
def draw(self, context):
scene = context.scene
display_tools = scene.display_tools
render = scene.render
view = context.space_data
obj = context.object
obj_type = obj.type if obj else None
fx_settings = view.fx_settings
DISPLAYDROP = display_tools.UiTabDrop[0]
SHADINGDROP = display_tools.UiTabDrop[1]
SCENEDROP = display_tools.UiTabDrop[2]
MODIFIERDROP = display_tools.UiTabDrop[3]
SELECT2DROP = display_tools.UiTabDrop[4]
FASTNAVDROP = display_tools.UiTabDrop[5]
icon_active_0 = "TRIA_RIGHT" if not DISPLAYDROP else "TRIA_DOWN"
icon_active_1 = "TRIA_RIGHT" if not SHADINGDROP else "TRIA_DOWN"
icon_active_2 = "TRIA_RIGHT" if not SCENEDROP else "TRIA_DOWN"
icon_active_3 = "TRIA_RIGHT" if not MODIFIERDROP else "TRIA_DOWN"
icon_active_4 = "TRIA_RIGHT" if not SELECT2DROP else "TRIA_DOWN"
icon_active_5 = "TRIA_RIGHT" if not FASTNAVDROP else "TRIA_DOWN"
icon_wt_handler = "X" if display_tools.WT_handler_enable else "MOD_WIREFRAME"
layout = self.layout
# Display Scene options
box1 = self.layout.box()
col = box1.column(align=True)
row = col.row(align=True)
row.prop(display_tools, "UiTabDrop", index=2, text="Display", icon=icon_active_2)
if not SCENEDROP:
if obj:
row.prop(obj, "show_texture_space", text="", icon="UV_DATA")
row.prop(obj, "show_name", text="", icon="OUTLINER_OB_FONT")
row.prop(obj, "show_axis", text="", icon="OBJECT_ORIGIN")
else:
col = layout.column()
col.prop(view, "show_manipulator")
col = layout.column(align=True)
col.alignment = 'EXPAND'
col.prop(view, "show_only_render", toggle=True)
col.prop(view, "show_world", toggle=True)
col.prop(view, "show_outline_selected", toggle=True)
col.prop(view, "show_all_objects_origin", toggle=True)
col.prop(view, "show_backface_culling", toggle=True)
if obj:
col.prop(obj, "show_in_front", text="X-Ray", toggle=True)
if obj and obj_type == 'MESH':
col.prop(obj, "show_transparent", text="Transparency", toggle=True)
col = layout.column()
col.prop(render, "use_simplify", text ="Simplify", toggle=True)
if render.use_simplify is True:
col = layout.column(align=True)
col.label(text="Settings :")
col.prop(render, "simplify_subdivision", "Subdivision")
col.prop(render, "simplify_shadow_samples", "Shadow Samples")
col.prop(render, "simplify_child_particles", "Child Particles")
col.prop(render, "simplify_ao_sss", "AO and SSS")
# Draw Type options
box1 = self.layout.box()
col = box1.column(align=True)
row = col.row(align=True)
row.prop(display_tools, "UiTabDrop", index=0, text="Draw Type", icon=icon_active_0)
if not DISPLAYDROP:
hide_wires = row.operator("ut.wire_show_hide", icon="MESH_CIRCLE", text="")
hide_wires.show = False
hide_wires.selected = False
show_wires = row.operator("ut.wire_show_hide", icon="MESH_UVSPHERE", text="")
show_wires.show = True
show_wires.selected = False
row.operator("ut.all_edges", icon="MESH_GRID", text="").on = True
else:
if obj:
col = layout.column(align=True)
col.alignment = 'EXPAND'
col.label(text="Display As:")
col.prop(obj, "display_type", text="", icon=self.display_type_icons[obj.display_type])
col = layout.column(align=True)
col.alignment = 'CENTER'
col.label(text="Selected Object(s):")
row = col.row(align=True)
row.operator("view3d.display_draw_change", text="Wire",
icon='SHADING_WIRE').drawing = 'WIRE'
row.operator("view3d.display_draw_change", text="Solid",
icon='SOLID').drawing = 'SOLID'
row = col.row()
row = col.row(align=True)
row.operator("view3d.display_draw_change", text="Textured",
icon="TEXTURE_SHADED").drawing = 'TEXTURED'
row.operator("view3d.display_draw_change", text="Bounds",
icon="BBOX").drawing = 'BOUNDS'
col = layout.column(align=True)
col.alignment = 'CENTER'
col.label(text="Wire Overlay:")
row = col.row()
row.operator("object.wt_selection_handler_toggle", icon=icon_wt_handler)
col = layout.column(align=True)
col.alignment = 'CENTER'
row = col.row(align=True)
row.operator("object.wt_hide_all_wire", icon="SOLID", text="Hide All")
row.operator("af_ops.wire_all", text="Toggle", icon="WIRE")
row = col.row()
row1 = col.row(align=True)
hide_wire = row1.operator("ut.wire_show_hide", icon="MATSPHERE", text="Hide")
hide_wire.show = False
hide_wire.selected = True
show_wire = row1.operator("ut.wire_show_hide", icon="MESH_UVSPHERE", text="Show")
show_wire.show = True
show_wire.selected = True
col = layout.column(align=True)
col.alignment = 'CENTER'
row = col.row()
row3 = col.row(align=True)
row3.alignment = 'CENTER'
row3.label(text="All Edges:")
row3.operator("ut.all_edges", icon="MESH_PLANE", text="Off").on = False
row3.operator("ut.all_edges", icon="MESH_GRID", text="On").on = True
col = layout.column(align=True)
col.alignment = 'EXPAND'
col.label(text="Bounding Box:")
row = col.row()
row.prop(display_tools, "BoundingMode", text="Type")
row = col.row()
col.separator()
col.operator("view3d.display_bounds_switch", "Bounds On",
icon='BBOX').bounds = True
col.operator("view3d.display_bounds_switch", "Bounds Off",
icon='BBOX').bounds = False
# Shading options
box1 = self.layout.box()
col = box1.column(align=True)
row = col.row(align=True)
row.prop(display_tools, "UiTabDrop", index=1, text="Shading", icon=icon_active_1)
if not SHADINGDROP:
row.operator("object.shade_smooth", icon="SMOOTH", text="")
row.operator("object.shade_flat", icon="MESH_ICOSPHERE", text="")
row.menu("VIEW3D_MT_Shade_menu", icon='SOLID', text="")
else:
col = layout.column(align=True)
col.alignment = 'EXPAND'
if not scene.render.use_shading_nodes:
col.prop("material_mode", text="", toggle=True)
if view.viewport_shade == 'SOLID':
col.prop(view, "show_textured_solid", toggle=True)
col.prop(view, "use_matcap", toggle=True)
if view.use_matcap:
col.template_icon_view(view, "matcap_icon")
if view.viewport_shade == 'TEXTURED' or context.mode == 'PAINT_TEXTURE':
if scene.render.use_shading_nodes:
col.prop(view, "show_textured_shadeless", toggle=True)
col.prop(view, "show_backface_culling", toggle=True)
if view.viewport_shade not in {'BOUNDBOX', 'WIREFRAME'}:
if obj and obj.mode == 'EDIT':
col.prop(view, "show_occlude_wire", toggle=True)
if obj and obj_type == 'MESH' and obj.mode in {'EDIT'}:
col = layout.column(align=True)
col.label(text="Faces:")
row = col.row(align=True)
row.operator("mesh.faces_shade_smooth", text="Smooth")
row.operator("mesh.faces_shade_flat", text="Flat")
col.label(text="Edges:")
row = col.row(align=True)
row.operator("mesh.mark_sharp", text="Smooth").clear = True
row.operator("mesh.mark_sharp", text="Sharp")
col.label(text="Vertices:")
row = col.row(align=True)
props = row.operator("mesh.mark_sharp", text="Smooth")
props.use_verts = True
props.clear = True
row.operator("mesh.mark_sharp", text="Sharp").use_verts = True
col = layout.column(align=True)
col.label(text="Normals:")
col.operator("mesh.normals_make_consistent", text="Recalculate")
col.operator("mesh.flip_normals", text="Flip Direction")
col.operator("mesh.set_normals_from_faces", text="Set From Faces")
col.separator()
if view.viewport_shade not in {'BOUNDBOX', 'WIREFRAME'}:
sub = col.column()
sub.active = view.region_3d.view_perspective == 'CAMERA'
sub.prop(fx_settings, "use_dof", toggle=True)
col.prop(fx_settings, "use_ssao", text="Ambient Occlusion", toggle=True)
if fx_settings.use_ssao:
ssao_settings = fx_settings.ssao
subcol = col.column(align=True)
subcol.prop(ssao_settings, "factor")
subcol.prop(ssao_settings, "distance_max")
subcol.prop(ssao_settings, "attenuation")
subcol.prop(ssao_settings, "samples")
subcol.prop(ssao_settings, "color")
# Modifier options
box1 = self.layout.box()
col = box1.column(align=True)
row = col.row(align=True)
row.prop(display_tools, "UiTabDrop", index=3, text="Modifiers", icon=icon_active_3)
if not MODIFIERDROP:
mod_all_hide = row.operator("ut.subsurf_show_hide", icon="MOD_SOLIDIFY", text="")
mod_all_hide.show = False
mod_all_hide.selected = False
mod_all_show = row.operator("ut.subsurf_show_hide", icon="MOD_SUBSURF", text="")
mod_all_show.show = True
mod_all_show.selected = False
mod_optimal = row.operator("ut.optimaldisplay", icon="MESH_PLANE", text="")
mod_optimal.on = True
mod_optimal.selected = False
else:
col = layout.column(align=True)
col.alignment = 'EXPAND'
row = col.row(align=True)
row.label(text="Viewport Visibility:", icon="RESTRICT_VIEW_OFF")
row = col.row(align=True)
row.operator("view3d.toggle_apply_modifiers_view", text="Viewport Vis")
col.separator()
row = col.row()
row.label(text="Render Visibility:", icon="RENDER_STILL")
row = col.row(align=True)
row.operator("view3d.display_modifiers_render_switch", text="On").mod_render = True
row.operator("view3d.display_modifiers_render_switch", text="Off").mod_render = False
col.separator()
row = col.row()
row.label(text="Subsurf Visibility:", icon="ALIASED")
col = layout.column(align=True)
row1 = col.row(align=True)
mod_all2_hide = row1.operator("ut.subsurf_show_hide", icon="MOD_SOLIDIFY", text="Hide")
mod_all2_hide.show = False
mod_all2_hide.selected = True
mod_all2_show = row1.operator("ut.subsurf_show_hide", icon="MOD_SUBSURF", text="Show")
mod_all2_show.show = True
mod_all2_show.selected = True
row2 = col.row(align=True)
mod_sel_hide = row2.operator("ut.subsurf_show_hide", icon="MOD_SOLIDIFY", text="Hide All")
mod_sel_hide.show = False
mod_sel_hide.selected = False
mod_sel_show = row2.operator("ut.subsurf_show_hide", icon="MOD_SUBSURF", text="Show All")
mod_sel_show.show = True
mod_sel_show.selected = False
col.separator()
col = layout.column()
row = col.row(align=True)
row.label(text="Edit Mode:", icon="EDITMODE_HLT")
row = col.row(align=True)
row.operator("view3d.display_modifiers_edit_switch", text="On").mod_edit = True
row.operator("view3d.display_modifiers_edit_switch", text="Off").mod_edit = False
col.separator()
row = col.row()
row.label(text="Modifier Cage:", icon="MOD_LATTICE")
row = col.row(align=True)
row.operator("view3d.display_modifiers_cage_set", text="On").set_cage = True
row.operator("view3d.display_modifiers_cage_set", text="Off").set_cage = False
col.separator()
row = col.row(align=True)
row.label(text="Subdivision Level:", icon="MOD_SUBSURF")
row = col.row(align=True)
row.operator("view3d.modifiers_subsurf_level_set", text="0").level = 0
row.operator("view3d.modifiers_subsurf_level_set", text="1").level = 1
row.operator("view3d.modifiers_subsurf_level_set", text="2").level = 2
row.operator("view3d.modifiers_subsurf_level_set", text="3").level = 3
row.operator("view3d.modifiers_subsurf_level_set", text="4").level = 4
row.operator("view3d.modifiers_subsurf_level_set", text="5").level = 5
row.operator("view3d.modifiers_subsurf_level_set", text="6").level = 6
# Selection options
box1 = self.layout.box()
col = box1.column(align=True)
row = col.row(align=True)
row.prop(display_tools, "UiTabDrop", index=4, text="Selection", icon=icon_active_4)
if not SELECT2DROP:
row.operator("view3d.select_box", text="", icon="MESH_PLANE")
row.operator("view3d.select_circle", text="", icon="MESH_CIRCLE")
row.label(text="", icon="BLANK1")
else:
if obj and obj.mode == 'OBJECT':
col = layout.column(align=True)
col.label(text="Render Visibility:")
col.operator("op.render_show_all_selected", icon="RESTRICT_VIEW_OFF")
col.operator("op.render_hide_all_selected", icon="RESTRICT_VIEW_ON")
col.label(text="Show/Hide:")
col.operator("opr.show_hide_object", text="Show/Hide", icon="GHOST_ENABLED")
col.operator("opr.show_all_objects", text="Show All", icon="RESTRICT_VIEW_OFF")
col.operator("opr.hide_all_objects", text="Hide Inactive", icon="RESTRICT_VIEW_ON")
if obj:
if obj.mode == 'OBJECT':
col = layout.column(align=True)
col.operator_menu_enum("object.show_by_type", "type", text="Show By Type")
col.operator_menu_enum("object.hide_by_type", "type", text="Hide By Type")
layout.label(text="Selection:")
col = layout.column(align=True)
col.operator_menu_enum("object.select_by_type", "type",
text="Select All by Type...")
if obj_type == 'MESH' and obj.mode == 'EDIT':
col = layout.column(align=True)
col.operator("mesh.select_linked", icon="ROTATECOLLECTION")
col.operator("opr.loop_multi_select", icon="OUTLINER_DATA_MESH")
col = layout.column(align=True)
col.operator("opr.select_all", icon="MOD_MESHDEFORM")
col.operator("opr.inverse_selection", icon="MOD_REMESH")
# fast nav options
box1 = layout.box()
col = box1.column(align=True)
row = col.row(align=True)
row.prop(display_tools, "UiTabDrop", index=5, text="Fast Nav", icon=icon_active_5)
if not FASTNAVDROP:
row.operator("view3d.fast_navigate_operator", text="", icon="NEXT_KEYFRAME")
row.operator("view3d.fast_navigate_stop", text="", icon="PANEL_CLOSE")
row.label(text="", icon="BLANK1")
else:
col = layout.column(align=True)
col.operator("view3d.fast_navigate_operator", icon="NEXT_KEYFRAME")
col.operator("view3d.fast_navigate_stop", icon="PANEL_CLOSE")
layout.label(text="Settings:")
layout.prop(display_tools, "OriginalMode")
layout.prop(display_tools, "FastMode")
layout.prop(display_tools, "EditActive", "Edit mode")
layout.prop(display_tools, "Delay")
col = layout.column(align=True)
col.active = display_tools.Delay
col.prop(display_tools, "DelayTimeGlobal", "Delay time")
layout.prop(display_tools, "ShowParticles")
col = layout.column(align=True)
col.active = display_tools.ShowParticles
col.prop(display_tools, "InitialParticles")
col.prop(display_tools, "ParticlesPercentageDisplay")
col = layout.column(align=True)
col.label(text="Screen Active Area:")
col.prop(display_tools, "ScreenStart")
col.prop(display_tools, "ScreenEnd")
# define scene props
class display_tools_scene_props(PropertyGroup):
# Init delay variables
Delay: BoolProperty(
default=False,
description="Activate delay return to normal viewport mode"
)
DelayTime: IntProperty(
default=30,
min=0,
max=500,
soft_min=10,
soft_max=250,
description="Delay time to return to normal viewport"
"mode after move your mouse cursor"
)
DelayTimeGlobal: IntProperty(
default=30,
min=1,
max=500,
soft_min=10,
soft_max=250,
description="Delay time to return to normal viewport"
"mode after move your mouse cursor"
)
# Init variable for fast navigate
EditActive: BoolProperty(
default=True,
description="Activate for fast navigate in edit mode too"
)
# Init properties for scene
FastNavigateStop: BoolProperty(
name="Fast Navigate Stop",
description="Stop fast navigate mode",
default=False
)
OriginalMode: EnumProperty(
items=[('TEXTURED', 'Texture', 'Texture display mode'),
('SOLID', 'Solid', 'Solid display mode')],
name="Normal",
default='SOLID'
)
BoundingMode: EnumProperty(
items=[('BOX', 'Box', 'Box shape'),
('SPHERE', 'Sphere', 'Sphere shape'),
('CYLINDER', 'Cylinder', 'Cylinder shape'),
('CONE', 'Cone', 'Cone shape')],
name="BB Mode"
)
FastMode: EnumProperty(
items=[('WIREFRAME', 'Wireframe', 'Wireframe display'),
('BOUNDBOX', 'Bounding Box', 'Bounding Box display')],
name="Fast"
)
ShowParticles: BoolProperty(
name="Show Particles",
description="Show or hide particles on fast navigate mode",
default=True
)
ParticlesPercentageDisplay: IntProperty(
name="Fast Display",
description="Display only a percentage of particles when active",
default=25,
min=0,
max=100,
soft_min=0,
soft_max=100,
subtype='FACTOR'
)
InitialParticles: IntProperty(
name="Normal Display",
description="When idle, how much particles are displayed\n"
"Overrides the Particles settings",
default=100,
min=0,
max=100,
soft_min=0,
soft_max=100
)
Symplify: IntProperty(
name="Integer",
description="Enter an integer"
)
ScreenStart: IntProperty(
name="Left Limit",
default=0,
min=0,
max=1024,
subtype='PIXEL',
description="Limit the screen active area width from the left side\n"
"Changed values will take effect on the next run",
)
ScreenEnd: IntProperty(
name="Right Limit",
default=0,
min=0,
max=1024,
subtype='PIXEL',
description="Limit the screen active area width from the right side\n"
"Changed values will take effect on the next run",
)
# Define the UI drop down prop
UiTabDrop: BoolVectorProperty(
name="Tab",
description="Expand/Collapse UI elements",
default=(False,) * 6,
size=6,
)
WT_handler_enable: BoolProperty(
default=False
)
WT_handler_previous_object: StringProperty(
default=""
)
# Addons Preferences Update Panel
# Define Panels for updating
panels = (
DISPLAY_PT_ToolsPanel,
)
def update_panel(self, context):
message = "Display Tools: Updating Panel locations has failed"
try:
for panel in panels:
if "bl_rna" in panel.__dict__:
bpy.utils.unregister_class(panel)
for panel in panels:
panel.bl_category = context.preferences.addons[__name__].preferences.category
bpy.utils.register_class(panel)
except Exception as e:
print("\n[{}]\n{}\n\nError:\n{}".format(__name__, message, e))
pass
class DisplayToolsPreferences(AddonPreferences):
# this must match the addon name, use '__package__'
# when defining this in a submodule of a python package.
bl_idname = __name__
category: StringProperty(
name="Tab Category",
description="Choose a name for the category of the panel",
default="Display",
update=update_panel
)
def draw(self, context):
layout = self.layout
row = layout.row()
col = row.column()
col.label(text="Tab Category:")
col.prop(self, "category", text="")
def DRAW_hide_by_type_MENU(self, context):
self.layout.operator_menu_enum(
"object.hide_by_type",
"type", text="Hide By Type"
)
self.layout.operator_menu_enum(
"object.show_by_type",
"type", text="Show By Type"
)
# Register
classes = [
DISPLAY_PT_ToolsPanel,
display_tools_scene_props,
DisplayToolsPreferences
]
# register the classes and props
def register():
from bpy.utils import register_class
for cls in classes:
register_class(cls)
bpy.types.VIEW3D_MT_object_showhide.append(DRAW_hide_by_type_MENU)
# Register Scene Properties
bpy.types.Scene.display_tools = PointerProperty(
type=display_tools_scene_props
)
update_panel(None, bpy.context)
# selection_restrictor.register()
def unregister():
# selection_restrictor.unregister()
bpy.types.VIEW3D_MT_object_showhide.remove(DRAW_hide_by_type_MENU)
from bpy.utils import unregister_class
for cls in reversed(classes):
unregister_class(cls)
del bpy.types.Scene.display_tools
if __name__ == "__main__":
register()

View File

@ -1,224 +0,0 @@
# space_view_3d_display_tools.py Copyright (C) 2014, Jordi Vall-llovera
# Multiple display tools for fast navigate/interact with the viewport
# wire tools by Lapineige
# ***** 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 *****
import bpy
from bpy.types import Operator
from bpy.props import (
BoolProperty,
EnumProperty,
)
# define base dummy class for inheritance
class BasePollCheck:
@classmethod
def poll(cls, context):
return True
class View3D_AF_Wire_All(Operator):
bl_idname = "af_ops.wire_all"
bl_label = "Wire on All Objects"
bl_description = "Toggle Wire on all objects in the scene"
@classmethod
def poll(cls, context):
return (context.active_object is not None and
not context.scene.display_tools.WT_handler_enable)
def execute(self, context):
for obj in bpy.data.objects:
if obj.show_wire:
obj.show_wire = False
else:
obj.show_wire = True
return {'FINISHED'}
# Change draw type
class DisplayDrawChange(Operator, BasePollCheck):
bl_idname = "view3d.display_draw_change"
bl_label = "Draw Type"
bl_description = "Change Display objects' mode"
drawing: EnumProperty(
items=[('TEXTURED', 'Texture', 'Texture display mode'),
('SOLID', 'Solid', 'Solid display mode'),
('WIRE', 'Wire', 'Wire display mode'),
('BOUNDS', 'Bounds', 'Bounds display mode'),
],
name="Draw Type",
default='SOLID'
)
def execute(self, context):
try:
view = context.space_data
view.viewport_shade = 'TEXTURED'
context.scene.game_settings.material_mode = 'GLSL'
selection = context.selected_objects
if not selection:
for obj in bpy.data.objects:
obj.display_type = self.drawing
else:
for obj in selection:
obj.display_type = self.drawing
except:
self.report({'ERROR'}, "Setting Draw Type could not be applied")
return {'CANCELLED'}
return {'FINISHED'}
# Bounds switch
class DisplayBoundsSwitch(Operator, BasePollCheck):
bl_idname = "view3d.display_bounds_switch"
bl_label = "On/Off"
bl_description = "Display/Hide Bounding box overlay"
bounds: BoolProperty(default=False)
def execute(self, context):
try:
scene = context.scene.display_tools
selection = context.selected_objects
if not selection:
for obj in bpy.data.objects:
obj.show_bounds = self.bounds
if self.bounds:
obj.display_bounds_type = scene.BoundingMode
else:
for obj in selection:
obj.show_bounds = self.bounds
if self.bounds:
obj.display_bounds_type = scene.BoundingMode
except:
self.report({'ERROR'}, "Display/Hide Bounding box overlay failed")
return {'CANCELLED'}
return {'FINISHED'}
# XRay switch
class DisplayXRayOn(Operator, BasePollCheck):
bl_idname = "view3d.display_x_ray_switch"
bl_label = "On"
bl_description = "X-Ray display on/off"
xrays: BoolProperty(default=False)
def execute(self, context):
try:
selection = context.selected_objects
if not selection:
for obj in bpy.data.objects:
obj.show_in_front = self.xrays
else:
for obj in selection:
obj.show_in_front = self.xrays
except:
self.report({'ERROR'}, "Turn on/off X-ray mode failed")
return {'CANCELLED'}
return {'FINISHED'}
# wire tools by Lapineige
class WT_HideAllWire(Operator):
bl_idname = "object.wt_hide_all_wire"
bl_label = "Hide Wire And Edges"
bl_description = "Hide All Objects' wire and edges"
@classmethod
def poll(cls, context):
return not context.scene.display_tools.WT_handler_enable
def execute(self, context):
for obj in bpy.data.objects:
if hasattr(obj, "show_wire"):
obj.show_wire, obj.show_all_edges = False, False
return {'FINISHED'}
class WT_SelectionHandlerToggle(Operator):
bl_idname = "object.wt_selection_handler_toggle"
bl_label = "Wire Selection (auto)"
bl_description = "Display the wire of the selection, auto update when selecting another object"
bl_options = {'INTERNAL'}
def execute(self, context):
display_tools = context.scene.display_tools
if display_tools.WT_handler_enable:
try:
bpy.app.handlers.scene_update_post.remove(wire_on_selection_handler)
except:
self.report({'INFO'},
"Wire Selection: auto mode exit seems to have failed. If True, reload the file")
display_tools.WT_handler_enable = False
if hasattr(context.object, "show_wire"):
context.object.show_wire, context.object.show_all_edges = False, False
else:
bpy.app.handlers.scene_update_post.append(wire_on_selection_handler)
display_tools.WT_handler_enable = True
if hasattr(context.object, "show_wire"):
context.object.show_wire, context.object.show_all_edges = True, True
return {'FINISHED'}
# handler
def wire_on_selection_handler(scene):
obj = bpy.context.object
if not scene.display_tools.WT_handler_previous_object:
if hasattr(obj, "show_wire"):
obj.show_wire, obj.show_all_edges = True, True
scene.display_tools.WT_handler_previous_object = obj.name
else:
if scene.display_tools.WT_handler_previous_object != obj.name:
previous_obj = bpy.data.objects[scene.display_tools.WT_handler_previous_object]
if hasattr(previous_obj, "show_wire"):
previous_obj.show_wire, previous_obj.show_all_edges = False, False
scene.display_tools.WT_handler_previous_object = obj.name
if hasattr(obj, "show_wire"):
obj.show_wire, obj.show_all_edges = True, True
# Register
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@ -1,278 +0,0 @@
# space_view_3d_display_tools.py Copyright (C) 2014, Jordi Vall-llovera
# Multiple display tools for fast navigate/interact with the viewport
# ##### 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 #####
"""
Additional links:
Author Site: http://www.jordiart.com
"""
import bpy
from bpy.types import Operator
from bpy.props import BoolProperty
from collections import defaultdict
# Fast Navigate toggle function
def trigger_fast_navigate(trigger):
scene = bpy.context.scene.display_tools
scene.FastNavigateStop = False
trigger = not trigger
# Control how to display particles during fast navigate
def display_particles(mode, dis_particles):
scene = bpy.context.scene.display_tools
for particles in bpy.data.particles:
if scene.ShowParticles is False:
particles.display_method = 'NONE'
else:
if particles.type == 'EMITTER':
particles.display_method = 'DOT'
particles.display_percentage = 100
else:
particles.display_method = 'RENDER'
particles.display_percentage = dis_particles
return dis_particles
# Fast Navigate operator
class FastNavigate(Operator):
bl_idname = "view3d.fast_navigate_operator"
bl_label = "Fast Navigate"
bl_description = ("Limit the objects drawing in the 3D view for faster navigation\n"
"Runs in modal mode until Stop is pressed or Esc, Return, Space")
trigger: BoolProperty(default=False)
mode: BoolProperty(default=False)
screen_width = [0, 0]
store_fail = False
store_init_particles = {}
store_viewport_shade = None
check_particles_draw = False
fast_particles_draw = 0
def modal(self, context, event):
context.area.tag_redraw()
scene = context.scene.display_tools
if scene.FastNavigateStop is True:
self.execute(context)
return {'FINISHED'}
if context.area.type != 'VIEW_3D':
self.execute(context)
return {'FINISHED'}
if scene.EditActive is True:
self.fast_navigate_stuff(context, event)
return {'PASS_THROUGH'}
else:
obj = context.active_object
if obj:
if obj.mode != 'EDIT':
self.fast_navigate_stuff(context, event)
return {'PASS_THROUGH'}
else:
return {'PASS_THROUGH'}
else:
self.fast_navigate_stuff(context, event)
return {'PASS_THROUGH'}
return {'RUNNING_MODAL'}
def invoke(self, context, event):
if context.area.type != 'VIEW_3D':
self.report({'WARNING'},
"Fast Navigate: View3D not found. Operation Cancelled")
return {'CANCELLED'}
self.store_init_particles = defaultdict(list)
self.store_fail = False
context.window_manager.modal_handler_add(self)
trigger_fast_navigate(self.trigger)
scene = context.scene.display_tools
scene.DelayTime = scene.DelayTimeGlobal
self.get_screen_size(context, scene)
self.start_settings_store(context, store=False)
self.check_particles_draw = True
return {'RUNNING_MODAL'}
def execute(self, context):
scene = context.scene.display_tools
scene.FastNavigateStop = True
self.start_settings_store(context, store=True)
mess, mess_txt = ('WARNING', "Fast Navigate: Some Settings could not be restored") if \
self.store_fail else ('INFO', "Exited the Fast Navigate mode")
self.report({mess}, mess_txt)
return {'FINISHED'}
@staticmethod
def calc_delay(scene):
if scene.Delay is True:
if scene.DelayTime < scene.DelayTimeGlobal:
scene.DelayTime += 1
def start_settings_store(self, context, store=False):
try:
view = context.space_data
shade = view.viewport_shade if view.type == 'VIEW_3D' else None
if store is False:
if not shade:
self.store_fail = True
else:
self.store_viewport_shade = shade
for particle in bpy.data.particles:
self.store_init_particles[particle.name] = \
[particle.display_method, particle.display_percentage]
else:
if not shade:
self.store_fail = True
else:
shade = self.store_viewport_shade or 'SOLID'
for particle in bpy.data.particles:
particle.display_method = self.store_init_particles[particle.name][0]
particle.display_percentage = self.store_init_particles[particle.name][1]
except:
self.store_fail = True
def get_screen_size(self, context, scene):
if context.area.type == 'VIEW_3D':
coord_x = context.area.x + scene.ScreenStart
coord_max_x = context.area.width - scene.ScreenEnd
self.screen_width = [coord_x, coord_max_x]
# Do repetitive fast navigate related stuff
def fast_navigate_stuff(self, context, event):
scene = context.scene.display_tools
view = context.space_data
if scene.FastNavigateStop is True:
return {'FINISHED'}
if context.area.type != 'VIEW_3D':
scene.FastNavigateStop = True
return {'FINISHED'}
if event.type in {'ESC', 'RET', 'SPACE'}:
scene.FastNavigateStop = True
return {'CANCELLED'}
# limit the active area
if event.mouse_x not in range(self.screen_width[0], self.screen_width[1]):
return {'PASS_THROUGH'}
# fast navigate while orbit/panning
if event.type == 'MIDDLEMOUSE':
self.calc_delay(scene)
view.viewport_shade = scene.FastMode
self.mode = False
# fast navigate while transform operations
if event.type in {'G', 'R', 'S'}:
self.calc_delay(scene)
view.viewport_shade = scene.FastMode
self.mode = False
# fast navigate while menu popups or duplicates
if event.type in {'W', 'D', 'L', 'U', 'I', 'M', 'A', 'B'}:
self.calc_delay(scene)
view.viewport_shade = scene.FastMode
self.mode = False
# fast navigate while numpad navigation
if event.type in {'NUMPAD_PERIOD', 'NUMPAD_1', 'NUMPAD_2', 'NUMPAD_3',
'NUMPAD_4', 'NUMPAD_5', 'NUMPAD_6', 'NUMPAD_7',
'NUMPAD_8', 'NUMPAD_9'}:
self.calc_delay(scene)
view.viewport_shade = scene.FastMode
self.mode = False
# fast navigate while zooming with mousewheel too
if event.type in {'WHEELUPMOUSE', 'WHEELDOWNMOUSE'}:
scene.DelayTime = scene.DelayTimeGlobal
view.viewport_shade = scene.FastMode
self.mode = False
if event.type == 'MOUSEMOVE':
if scene.Delay is True:
if scene.DelayTime == 0:
view.viewport_shade = scene.OriginalMode
scene.DelayTime = scene.DelayTimeGlobal
self.mode = True
else:
view.viewport_shade = scene.OriginalMode
self.mode = True
if scene.Delay is True:
scene.DelayTime -= 1
if scene.DelayTime == 0:
view.viewport_shade = scene.OriginalMode
scene.DelayTime = scene.DelayTimeGlobal
self.mode = True
# update particles draw (only update call when the fast draw or the percentage are changed)
self.check_particles_draw = not self.mode
dis_particles = scene.InitialParticles if self.mode else scene.ParticlesPercentageDisplay
if self.check_particles_draw is True:
self.fast_particles_draw = display_particles(self.mode, dis_particles)
else:
if self.fast_particles_draw != dis_particles:
self.fast_particles_draw = display_particles(self.mode, dis_particles)
# Fast Navigate Stop
def fast_navigate_stop(context):
scene = context.scene.display_tools
scene.FastNavigateStop = True
# Fast Navigate Stop Operator
class FastNavigateStop(Operator):
bl_idname = "view3d.fast_navigate_stop"
bl_label = "Stop"
bl_description = "Stop Fast Navigate"
def execute(self, context):
fast_navigate_stop(context)
return {'FINISHED'}
# Register
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@ -1,250 +0,0 @@
# space_view_3d_display_tools.py Copyright (C) 2014, Jordi Vall-llovera
# Multiple display tools for fast navigate/interact with the viewport
# ***** 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 *****
"""
Additional links:
Author Site: http://www.jordiart.com
"""
import bpy
from bpy.types import Operator
from bpy.props import (
IntProperty,
BoolProperty,
)
# function taken from space_view3d_modifier_tools.py
class DisplayApplyModifiersView(Operator):
bl_idname = "view3d.toggle_apply_modifiers_view"
bl_label = "Hide Viewport"
bl_description = "Shows/Hide modifiers of the active / selected object(s) in 3d View"
@classmethod
def poll(cls, context):
return context.active_object is not None
def execute(self, context):
is_apply = True
message_a = ""
for mod in context.active_object.modifiers:
if mod.show_viewport:
is_apply = False
break
# active object - no selection
for mod in context.active_object.modifiers:
mod.show_viewport = is_apply
for obj in context.selected_objects:
for mod in obj.modifiers:
mod.show_viewport = is_apply
if is_apply:
message_a = "Displaying modifiers in the 3d View"
else:
message_a = "Hiding modifiers in the 3d View"
self.report(type={"INFO"}, message=message_a)
return {'FINISHED'}
# define base dummy class for inheritance
class BasePollCheck:
@classmethod
def poll(cls, context):
return True
# Set Render Settings
def set_render_settings(context):
scene = context.scene
render = scene.render
render.simplify_subdivision = 0
render.simplify_shadow_samples = 0
render.simplify_child_particles = 0
render.simplify_ao_sss = 0
# Display Modifiers Render Switch
class DisplayModifiersRenderSwitch(Operator, BasePollCheck):
bl_idname = "view3d.display_modifiers_render_switch"
bl_label = "On/Off"
bl_description = "Display/Hide modifiers on render"
mod_render: BoolProperty(default=True)
def execute(self, context):
try:
if self.mod_render:
scene = context.scene.display_tools
scene.Simplify = 1
selection = context.selected_objects
if not selection:
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_render = self.mod_render
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_render = self.mod_render
except:
self.report({'ERROR'}, "Display/Hide all modifiers for render failed")
return {'CANCELLED'}
return {'FINISHED'}
# Display Modifiers Viewport switch
class DisplayModifiersViewportSwitch(Operator, BasePollCheck):
bl_idname = "view3d.display_modifiers_viewport_switch"
bl_label = "On/Off"
bl_description = "Display/Hide modifiers in the viewport"
mod_switch: BoolProperty(default=True)
def execute(self, context):
try:
selection = context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_viewport = self.mod_switch
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_viewport = self.mod_switch
except:
self.report({'ERROR'}, "Display/Hide modifiers in the viewport failed")
return {'CANCELLED'}
return {'FINISHED'}
# Display Modifiers Edit Switch
class DisplayModifiersEditSwitch(Operator, BasePollCheck):
bl_idname = "view3d.display_modifiers_edit_switch"
bl_label = "On/Off"
bl_description = "Display/Hide modifiers during edit mode"
mod_edit: BoolProperty(default=True)
def execute(self, context):
try:
selection = context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_in_editmode = self.mod_edit
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_in_editmode = self.mod_edit
except:
self.report({'ERROR'}, "Display/Hide all modifiers failed")
return {'CANCELLED'}
return {'FINISHED'}
class DisplayModifiersCageSet(Operator, BasePollCheck):
bl_idname = "view3d.display_modifiers_cage_set"
bl_label = "On/Off"
bl_description = "Display modifiers editing cage during edit mode"
set_cage: BoolProperty(default=True)
def execute(self, context):
selection = context.selected_objects
try:
if not selection:
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_on_cage = self.set_cage
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_on_cage = self.set_cage
except:
self.report({'ERROR'}, "Setting Editing Cage all modifiers failed")
return {'CANCELLED'}
return {'FINISHED'}
class ModifiersSubsurfLevel_Set(Operator, BasePollCheck):
bl_idname = "view3d.modifiers_subsurf_level_set"
bl_label = "Set Subsurf level"
bl_description = "Change subsurf modifier level"
level: IntProperty(
name="Subsurf Level",
description="Change subsurf modifier level",
default=1,
min=0,
max=10,
soft_min=0,
soft_max=6
)
def execute(self, context):
selection = context.selected_objects
try:
if not selection:
for obj in bpy.data.objects:
context.view_layer.objects.active = obj
bpy.ops.object.modifier_add(type='SUBSURF')
value = 0
for mod in obj.modifiers:
if mod.type == 'SUBSURF':
value = value + 1
mod.levels = self.level
if value > 1:
bpy.ops.object.modifier_remove(modifier="Subsurf")
else:
for obj in selection:
bpy.ops.object.subdivision_set(level=self.level, relative=False)
for mod in obj.modifiers:
if mod.type == 'SUBSURF':
mod.levels = self.level
except:
self.report({'ERROR'}, "Setting the Subsurf level could not be applied")
return {'CANCELLED'}
return {'FINISHED'}
# Register
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@ -1,50 +0,0 @@
# space_view_3d_display_tools.py Copyright (C) 2014, Jordi Vall-llovera
# Multiple display tools for fast navigate/interact with the viewport
# ***** 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 *****
"""
Additional links:
Author Site: http://www.jordiart.com
"""
import bpy
# Set Render Settings
def set_render_settings(context):
scene = context.scene
render = scene.render
render.simplify_subdivision = 0
render.simplify_shadow_samples = 0
render.simplify_child_particles = 0
render.simplify_ao_sss = 0
# Register
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@ -1,338 +0,0 @@
# ##### 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 #####
bl_info = {
"name": "Select Tools",
"author": "Jakub Belcik",
"version": (1, 0, 2),
"blender": (2, 73, 0),
"location": "3D View > Tools",
"description": "Selection Tools",
"warning": "",
"wiki_url": "",
"category": ""
}
import bpy
from bpy.types import Operator
from bpy.props import (
BoolProperty,
EnumProperty,
)
class ShowHideObject(Operator):
bl_idname = "opr.show_hide_object"
bl_label = "Show/Hide Object"
bl_description = ("Flip the viewport visibility for all objects in the Data\n"
"(Hidden to Visible and Visible to Hidden)")
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
if context.object is None:
self.report({'INFO'},
"Show/Hide: No Object found. Operation Cancelled")
return {'CANCELLED'}
if context.object.mode != 'OBJECT':
self.report({'INFO'},
"Show/Hide: This operation can be performed only in object mode")
return {'CANCELLED'}
for i in bpy.data.objects:
try:
if i.hide:
i.hide = False
i.hide_select = False
i.hide_render = False
else:
i.hide = True
i.select_set(False)
if i.type not in ['CAMERA', 'LIGHT']:
i.hide_render = True
except:
continue
return {'FINISHED'}
class ShowAllObjects(Operator):
bl_idname = "opr.show_all_objects"
bl_label = "Show All Objects"
bl_description = "Show all objects"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
for i in bpy.data.objects:
try:
i.hide = False
i.hide_select = False
i.hide_render = False
except:
continue
return {'FINISHED'}
class HideAllObjects(Operator):
bl_idname = "opr.hide_all_objects"
bl_label = "Hide All Inactive"
bl_description = "Hide all inactive objects"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
if context.object is None:
for i in bpy.data.objects:
i.hide = True
i.select_set(False)
if i.type not in ['CAMERA', 'LIGHT']:
i.hide_render = True
else:
obj_name = context.object.name
for i in bpy.data.objects:
if i.name != obj_name:
i.hide = True
i.select_set(False)
if i.type not in ['CAMERA', 'LIGHT']:
i.hide_render = True
return {'FINISHED'}
class SelectAll(Operator):
bl_idname = "opr.select_all"
bl_label = "(De)select All"
bl_description = "(De)select all objects, vertices, edges or faces"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
if context.object is None:
bpy.ops.object.select_all(action='TOGGLE')
elif context.object.mode == 'EDIT':
bpy.ops.mesh.select_all(action='TOGGLE')
elif context.object.mode == 'OBJECT':
bpy.ops.object.select_all(action='TOGGLE')
else:
self.report({'ERROR'},
"(De)select All: Cannot perform this operation in this mode")
return {'CANCELLED'}
return {'FINISHED'}
class InverseSelection(Operator):
bl_idname = "opr.inverse_selection"
bl_label = "Inverse Selection"
bl_description = "Inverse selection"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
if context.object is None:
bpy.ops.object.select_all(action='INVERT')
elif context.object.mode == 'EDIT':
bpy.ops.mesh.select_all(action='INVERT')
elif context.object.mode == 'OBJECT':
bpy.ops.object.select_all(action='INVERT')
else:
self.report({'ERROR'},
"Inverse Selection: Cannot perform this operation in this mode")
return {'CANCELLED'}
return {'FINISHED'}
class LoopMultiSelect(Operator):
bl_idname = "opr.loop_multi_select"
bl_label = "Edge Loop Select"
bl_description = "Select a loop of connected edges"
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def poll(cls, context):
return context.active_object is not None
def execute(self, context):
if context.object.mode != 'EDIT':
self.report({'ERROR'}, "This operation can be performed only in edit mode")
return {'CANCELLED'}
try:
bpy.ops.mesh.loop_multi_select(ring=False)
except:
self.report({'WARNING'},
"Edge loop select: Operation could not be performed (See Console for more info)")
return {'CANCELLED'}
return {'FINISHED'}
class ShowRenderAllSelected(Operator):
bl_idname = "op.render_show_all_selected"
bl_label = "Render On"
bl_description = "Render all objects"
def execute(self, context):
for ob in bpy.data.objects:
try:
if ob.select_get() is True:
ob.hide_render = False
except:
continue
return {'FINISHED'}
class HideRenderAllSelected(Operator):
bl_idname = "op.render_hide_all_selected"
bl_label = "Render Off"
bl_description = "Hide Selected Object(s) from Render"
def execute(self, context):
for ob in bpy.data.objects:
try:
if ob.select_get() is True:
ob.hide_render = True
except:
continue
return {'FINISHED'}
class OBJECT_OT_HideShowByTypeTemplate():
bl_options = {'UNDO', 'REGISTER'}
type: EnumProperty(
items=(
('MESH', 'Mesh', ''),
('CURVE', 'Curve', ''),
('SURFACE', 'Surface', ''),
('META', 'Meta', ''),
('FONT', 'Font', ''),
('ARMATURE', 'Armature', ''),
('LATTICE', 'Lattice', ''),
('EMPTY', 'Empty', ''),
('CAMERA', 'Camera', ''),
('LIGHT', 'Lamp', ''),
('ALL', 'All', '')),
name="Type",
description="Type",
default='LIGHT',
options={'ANIMATABLE'}
)
def execute(self, context):
scene = bpy.context.scene
objects = []
eligible_objects = []
# Only Selected?
if self.hide_selected:
objects = bpy.context.selected_objects
else:
objects = scene.objects
# Only Specific Types? + Filter layers
for obj in objects:
for i in range(0, 20):
if obj.layers[i] & scene.layers[i]:
if self.type == 'ALL' or obj.type == self.type:
if obj not in eligible_objects:
eligible_objects.append(obj)
objects = eligible_objects
eligible_objects = []
# Only Render Restricted?
if self.hide_render_restricted:
for obj in objects:
if obj.hide_render == self.hide_or_show:
eligible_objects.append(obj)
objects = eligible_objects
eligible_objects = []
# Perform Hiding / Showing
for obj in objects:
obj.hide = self.hide_or_show
return {'FINISHED'}
def invoke(self, context, event):
return self.execute(context)
# show hide by type # by Felix Schlitter
class OBJECT_OT_HideByType(OBJECT_OT_HideShowByTypeTemplate, Operator):
bl_idname = "object.hide_by_type"
bl_label = "Hide By Type"
hide_or_show: BoolProperty(
name="Hide",
description="Inverse effect",
options={'HIDDEN'},
default=1
)
hide_selected: BoolProperty(
name="Selected",
description="Hide only selected objects",
default=0
)
hide_render_restricted: BoolProperty(
name="Only Render-Restricted",
description="Hide only render restricted objects",
default=0
)
class OBJECT_OT_ShowByType(OBJECT_OT_HideShowByTypeTemplate, Operator):
bl_idname = "object.show_by_type"
bl_label = "Show By Type"
hide_or_show: BoolProperty(
name="Hide",
description="Inverse effect",
options={'HIDDEN'},
default=0
)
hide_selected: BoolProperty(
name="Selected",
options={'HIDDEN'},
default=0
)
hide_render_restricted: BoolProperty(
name="Only Renderable",
description="Show only non render restricted objects",
default=0
)
# Register
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == '__main__':
register()

View File

@ -1,737 +0,0 @@
# ##### 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 LICENSE BLOCK #####
bl_info = {
"name": "Selection Restrictor",
"author": "Ales Sidenko",
"version": (0, 1, 1),
"location": "3d viewer header",
"warning": "",
"description": "This addon helps to restrict the selection of objects by type. "
"Please email me if you find a bug (sidenkoai@gmail.com)",
"category": "3D View"
}
import bpy
from bpy.types import (
Menu,
Operator,
)
from bpy.props import (
BoolProperty,
StringProperty,
)
from bpy.app.handlers import persistent
mesh = 'OBJECT_DATA'
curve = 'OUTLINER_OB_CURVE'
arm = 'OUTLINER_OB_ARMATURE'
empty = 'OUTLINER_OB_EMPTY'
cam = 'OUTLINER_OB_CAMERA'
lamp = 'OUTLINER_OB_LIGHT'
lat = 'OUTLINER_OB_LATTICE'
font = 'OUTLINER_OB_FONT'
meta = 'OUTLINER_OB_META'
surf = 'OUTLINER_OB_SURFACE'
speak = 'OUTLINER_OB_SPEAKER'
show = 'TRIA_RIGHT'
show_restrictor = False
hide = True
# checking properties in scene to update icons when opening file
# or switching between scenes (executing in end of script)
@persistent
def check_restrictors(dummy):
global mesh
global curve
global arm
global empty
global cam
global lamp
global lat
global font
global meta
global surf
global speak
global show
global meshrestrictorenabled
global curverestrictorenabled
global armrestrictorenabled
global emptyrestrictorenabled
global camrestrictorenabled
global lamprestrictorenabled
global latrestrictorenabled
global fontrestrictorenabled
global metarestrictorenabled
global surfrestrictorenabled
global speakrestrictorenabled
# show restrictors?
if bpy.context.scene.get('show_restrictor') is not None:
show_restrictor = False
show = 'TRIA_RIGHT'
else:
show_restrictor = True
show = 'TRIA_DOWN'
# mesh
if bpy.context.scene.get('meshrestrictor') is None:
meshrestrictorenabled = True
mesh = 'OBJECT_DATA'
else:
meshrestrictorenabled = False
mesh = 'MESH_CUBE'
# curve
if bpy.context.scene.get('curverestrictor') is None:
curverestrictorenabled = True
curve = 'OUTLINER_OB_CURVE'
else:
curverestrictorenabled = False
curve = 'CURVE_DATA'
# armature
if bpy.context.scene.get('armrestrictor') is None:
armrestrictorenabled = True
arm = 'OUTLINER_OB_ARMATURE'
else:
armrestrictorenabled = False
arm = 'ARMATURE_DATA'
# empty
if bpy.context.scene.get('emptyrestrictor') is None:
emptyrestrictorenabled = True
empty = 'OUTLINER_OB_EMPTY'
else:
emptyrestrictorenabled = False
empty = 'EMPTY_DATA'
# camera
if bpy.context.scene.get('camrestrictor') is None:
camrestrictorenabled = True
cam = 'OUTLINER_OB_CAMERA'
else:
camrestrictorenabled = False
cam = 'CAMERA_DATA'
# lamp
if bpy.context.scene.get('lamprestrictor') is None:
lamprestrictorenabled = True
lamp = 'OUTLINER_OB_LIGHT'
else:
lamprestrictorenabled = False
lamp = 'LIGHT_DATA'
# lattice
if bpy.context.scene.get('latrestrictor') is None:
latrestrictorenabled = True
lat = 'OUTLINER_OB_LATTICE'
else:
latrestrictorenabled = False
lat = 'LATTICE_DATA'
# text
if bpy.context.scene.get('fontrestrictor') is None:
fontrestrictorenabled = True
font = 'OUTLINER_OB_FONT'
else:
fontrestrictorenabled = False
font = 'FONT_DATA'
# metaballs
if bpy.context.scene.get('metarestrictor') is None:
metarestrictorenabled = True
meta = 'OUTLINER_OB_META'
else:
metarestrictorenabled = False
meta = 'META_DATA'
# surfaces
if bpy.context.scene.get('surfrestrictor') is None:
surfrestrictorenabled = True
surf = 'OUTLINER_OB_SURFACE'
else:
surfrestrictorenabled = False
surf = 'SURFACE_DATA'
# sounds
if bpy.context.scene.get('speakrestrictor') is None:
speakrestrictorenabled = True
speak = 'OUTLINER_OB_SPEAKER'
else:
speakrestrictorenabled = False
speak = 'SPEAKER'
return{'FINISHED'}
# Show / Hide buttons
class RestrictorShow(Operator):
bl_idname = "restrictor.show"
bl_label = "Show/Hide Selection Restrictors"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Show/Hide Selection Restrictors"
hide: StringProperty()
def execute(self, context):
global show
if bpy.context.scene.get('show_restrictor') is None:
bpy.context.scene['show_restrictor'] = 1
show = 'TRIA_DOWN'
else:
if bpy.context.scene.get('show_restrictor') is not None:
del bpy.context.scene['show_restrictor']
show = 'TRIA_RIGHT'
return {'FINISHED'}
# Ignore the restrictor for selected objects
class IgnoreRestrictors(Operator):
bl_idname = "ignore.restrictors"
bl_label = "Ignore Restrictor by Selected Objects"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Ignore or do not ignore Restrictor by selected objects"
ignore: BoolProperty()
def execute(self, context):
if self.ignore is True:
for ob in bpy.context.selected_objects:
ob['ignore_restrictors'] = 1
else:
for ob in bpy.context.selected_objects:
if ob.get('ignore_restrictors') is not None:
del ob["ignore_restrictors"]
bpy.ops.refresh.restrictors()
return{'FINISHED'}
# Enable or Disable restrictors
# Restrictor Mesh
class RestrictorMesh(Operator):
bl_idname = "restrictor.mesh"
bl_label = "restrictor meshes"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Meshes selection restrictor"
mesh: StringProperty()
def execute(self, context):
global mesh
global meshrestrictorenabled
if bpy.context.scene.get('meshrestrictor') is not None:
meshrestrictorenabled = True
if bpy.context.scene.get('meshrestrictor') is not None:
del bpy.context.scene['meshrestrictor']
mesh = 'OBJECT_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'MESH':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
meshrestrictorenabled = False
bpy.context.scene['meshrestrictor'] = 1
mesh = 'MESH_CUBE'
for ob in bpy.context.scene.objects:
if ob.type == 'MESH':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select_set(False)
return{'FINISHED'}
# Restrictor for Curves
class RestrictorCurve(Operator):
bl_idname = "restrictor.curve"
bl_label = "restrictor curves"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Curves selection restrictor"
def execute(self, context):
global curve
global curverestrictorenabled
if bpy.context.scene.get('curverestrictor') is not None:
curverestrictorenabled = True
if bpy.context.scene.get('curverestrictor') is not None:
del bpy.context.scene['curverestrictor']
curve = 'OUTLINER_OB_CURVE'
for ob in bpy.context.scene.objects:
if ob.type == 'CURVE':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
curverestrictorenabled = False
bpy.context.scene['curverestrictor'] = 1
curve = 'CURVE_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'CURVE':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select_set(False)
return{'FINISHED'}
# Restrictor for Armatures
class RestrictorArm(Operator):
bl_idname = "restrictor.arm"
bl_label = "restrictor armatures"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Armatures selection restrictor"
def execute(self, context):
global arm
global armrestrictorenabled
if bpy.context.scene.get('armrestrictor') is not None:
armrestrictorenabled = True
if bpy.context.scene.get('armrestrictor') is not None:
del bpy.context.scene['armrestrictor']
arm = 'OUTLINER_OB_ARMATURE'
for ob in bpy.context.scene.objects:
if ob.type == 'ARMATURE':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
armrestrictorenabled = False
bpy.context.scene['armrestrictor'] = 1
arm = 'ARMATURE_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'ARMATURE':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select_set(False)
return{'FINISHED'}
# Restrictor for Empties
class RestrictorEmpty(Operator):
bl_idname = "restrictor.empty"
bl_label = "Restrictor Empties"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Empties selection restrictor"
def execute(self, context):
global empty
global emptyrestrictorenabled
if bpy.context.scene.get('emptyrestrictor') is not None:
emptyrestrictorenabled = True
if bpy.context.scene.get('emptyrestrictor') is not None:
del bpy.context.scene['emptyrestrictor']
empty = 'OUTLINER_OB_EMPTY'
for ob in bpy.context.scene.objects:
if ob.type == 'EMPTY':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
emptyrestrictorenabled = False
bpy.context.scene['emptyrestrictor'] = 1
empty = 'EMPTY_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'EMPTY':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select_set(False)
return{'FINISHED'}
# Restrictor for Cameras
class RestrictorCam(Operator):
bl_idname = "restrictor.cam"
bl_label = "restrictor cameras"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Cameras selection restrictor"
def execute(self, context):
global cam
global camrestrictorenabled
if bpy.context.scene.get('camrestrictor') is not None:
camrestrictorenabled = True
if bpy.context.scene.get('camrestrictor') is not None:
del bpy.context.scene['camrestrictor']
cam = 'OUTLINER_OB_CAMERA'
for ob in bpy.context.scene.objects:
if ob.type == 'CAMERA':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
camrestrictorenabled = False
bpy.context.scene['camrestrictor'] = 1
cam = 'CAMERA_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'CAMERA':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select_set(False)
return{'FINISHED'}
# Restrictor for Lamps
class RestrictorLamp(Operator):
bl_idname = "restrictor.light"
bl_label = "Restrictor Lamps"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Lamps selection restrictor"
def execute(self, context):
global lamp
global lamprestrictorenabled
if bpy.context.scene.get('lamprestrictor') is not None:
lamprestrictorenabled = True
if bpy.context.scene.get('lamprestrictor') is not None:
del bpy.context.scene['lamprestrictor']
lamp = 'OUTLINER_OB_LIGHT'
for ob in bpy.context.scene.objects:
if ob.type == 'LIGHT':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
lamprestrictorenabled = False
bpy.context.scene['lamprestrictor'] = 1
lamp = 'LIGHT_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'LIGHT':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select_set(False)
return{'FINISHED'}
# Restrictor for Lattice
class RestrictorLat(Operator):
bl_idname = "restrictor.lat"
bl_label = "Restrictor Lattices"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Lattices selection restrictor"
def execute(self, context):
global lat
global latrestrictorenabled
if bpy.context.scene.get('latrestrictor') is not None:
latrestrictorenabled = True
if bpy.context.scene.get('latrestrictor') is not None:
del bpy.context.scene['latrestrictor']
lat = 'OUTLINER_OB_LATTICE'
for ob in bpy.context.scene.objects:
if ob.type == 'LATTICE':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
latrestrictorenabled = False
bpy.context.scene['latrestrictor'] = 1
lat = 'LATTICE_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'LATTICE':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select_set(False)
return{'FINISHED'}
# Restrictor Font
class RestrictorFont(Operator):
bl_idname = "restrictor.font"
bl_label = "Restrictor Font"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Text selection restrictor"
def execute(self, context):
global font
global fontrestrictorenabled
if bpy.context.scene.get('fontrestrictor') is not None:
fontrestrictorenabled = True
if bpy.context.scene.get('fontrestrictor') is not None:
del bpy.context.scene['fontrestrictor']
font = 'OUTLINER_OB_FONT'
for ob in bpy.context.scene.objects:
if ob.type == 'FONT':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
fontrestrictorenabled = False
bpy.context.scene['fontrestrictor'] = 1
font = 'FONT_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'FONT':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select_set(False)
return{'FINISHED'}
# Restrictor for Metaballs
class RestrictorMeta(Operator):
bl_idname = "restrictor.meta"
bl_label = "restrictor metaballs"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Metaballs selection restrictor"
def execute(self, context):
global meta
global metarestrictorenabled
if bpy.context.scene.get('metarestrictor') is not None:
metarestrictorenabled = True
if bpy.context.scene.get('metarestrictor') is not None:
del bpy.context.scene['metarestrictor']
meta = 'OUTLINER_OB_META'
for ob in bpy.context.scene.objects:
if ob.type == 'META':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
metarestrictorenabled = False
bpy.context.scene['metarestrictor'] = 1
meta = 'META_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'META':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select_set(False)
return{'FINISHED'}
# Restrictor for Surfaces
class RestrictorSurf(Operator):
bl_idname = "restrictor.surf"
bl_label = "Restrictor Surfaces"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Surfaces selection restrictor"
def execute(self, context):
global surf
global surfrestrictorenabled
if bpy.context.scene.get('surfrestrictor') is not None:
surfrestrictorenabled = True
if bpy.context.scene.get('surfrestrictor') is not None:
del bpy.context.scene['surfrestrictor']
surf = 'OUTLINER_OB_SURFACE'
for ob in bpy.context.scene.objects:
if ob.type == 'SURFACE':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
surfrestrictorenabled = False
bpy.context.scene['surfrestrictor'] = 1
surf = 'SURFACE_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'SURFACE':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select_set(False)
return{'FINISHED'}
# Restrictor for Speakers
class RestrictorSound(Operator):
bl_idname = "restrictor.speak"
bl_label = "Restrictor Speakers"
bl_description = "Sounds selection restrictor"
bl_option = {'REGISTER', 'UNDO'}
def execute(self, context):
global speak
global speakrestrictorenabled
if bpy.context.scene.get('speakrestrictor') is not None:
speakrestrictorenabled = True
if bpy.context.scene.get('speakrestrictor') is not None:
del bpy.context.scene['speakrestrictor']
speak = 'OUTLINER_OB_SPEAKER'
for ob in bpy.context.scene.objects:
if ob.type == 'SPEAKER':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
speakrestrictorenabled = False
bpy.context.scene['speakrestrictor'] = 1
speak = 'SPEAKER'
for ob in bpy.context.scene.objects:
if ob.type == 'SPEAKER':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select_set(False)
return{'FINISHED'}
# refresh restrictors for newly created objects
class RefreshRestrictors(Operator):
bl_idname = "refresh.restrictors"
bl_label = "Refresh Selection Restrictors"
bl_option = {'REGISTER', 'UNDO'}
bl_description = "Refresh restrictors"
def execute(self, context):
global mesh
global curve
global arm
global empty
global cam
global lamp
global lat
global font
global meta
global surf
global speak
datas = {
'meshrestrictor': ("OBJECT_DATA", "MESH_CUBE", "MESH"),
'curverestrictor': ("OUTLINER_OB_CURVE", "CURVE_DATA", "CURVE"),
'armrestrictor': ("OUTLINER_OB_ARMATURE", "ARMATURE_DATA", "ARMATURE"),
'emptyrestrictor': ("OUTLINER_OB_EMPTY", "EMPTY_DATA", "EMPTY"),
'camrestrictor': ("OUTLINER_OB_CAMERA", "CAMERA_DATA", "CAMERA"),
'lamprestrictor': ("OUTLINER_OB_LIGHT", "LIGHT_DATA", "LIGHT"),
'latrestrictor': ("OUTLINER_OB_LATTICE", "LATTICE", "LATTICE"),
'fontrestrictor': ("OUTLINER_OB_FONT", "FONT", "FONT"),
'metarestrictor': ("OUTLINER_OB_META", "META_DATA", "META"),
'surfrestrictor': ("SURFACE", "SURFACE_DATA", "SURFACE"),
'speakrestrictor': ("OUTLINER_OB_SPEAKER", "SPEAKER", "SPEAKER"),
}
for prop, values in datas.items():
icon_i, icon_a, types = values
get_props = bpy.context.scene.get(prop)
gl_icon = icon_a if get_props else icon_i
for ob in bpy.context.scene.objects:
if ob.type == types:
if ob.get('ignore_restrictors') is None:
ob.hide_select = False if get_props is None else True
if get_props is None:
ob.select_set(False)
mesh = gl_icon if types == "MESH" else mesh
curve = gl_icon if types == "CURVE" else curve
arm = gl_icon if types == "ARMATURE" else arm
empty = gl_icon if types == "EMPTY" else empty
cam = gl_icon if types == "CAMERA" else cam
lamp = gl_icon if types == "LIGHT" else lamp
lat = gl_icon if types == "LATTICE" else lat
font = gl_icon if types == "FONT" else font
meta = gl_icon if types == "META" else meta
surf = gl_icon if types == "SURFACE" else surf
speak = gl_icon if types == "SPEAKER" else speak
return{'FINISHED'}
class RS_MT_RestrictorSelection(Menu):
"""Restrict Selection"""
bl_label = "Selection"
bl_idname = "RestrictorSelection"
def draw(self, context):
global mesh
global curve
global arm
global empty
global cam
global lamp
global lat
global font
global meta
global surf
global speak
global show_buttons
global show
layout = self.layout
layout.operator("restrictor.mesh", icon=mesh, text="Mesh")
layout.operator("restrictor.curve", icon=curve, text="Curve")
layout.operator("restrictor.arm", icon=arm, text="Armature")
layout.operator("restrictor.empty", icon=empty, text="Empty")
layout.operator("restrictor.cam", icon=cam, text="Camera")
layout.operator("restrictor.light", icon=lamp, text="Lamp")
layout.operator("restrictor.lat", icon=lat, text="Lattice")
layout.operator("restrictor.font", icon=font, text="Font")
layout.operator("restrictor.meta", icon=meta, text="MetaBall")
layout.operator("restrictor.surf", icon=surf, text="Surface")
layout.operator("restrictor.speak", icon=speak, text="Speaker")
layout.separator()
layout.operator("ignore.restrictors", icon='GHOST_ENABLED', text="Enable").ignore = True
layout.operator("ignore.restrictors", icon='GHOST_DISABLED', text="Disable").ignore = False
layout.operator("refresh.restrictors", icon='FILE_REFRESH', text="Refresh")
def view3d_select_menu(self, context):
self.layout.menu(RestrictorSelection.bl_idname)
def register():
bpy.types.VIEW3D_HT_header.append(view3d_select_menu)
bpy.utils.register_class(RefreshRestrictors)
def unregister():
bpy.types.VIEW3D_HT_header.remove(view3d_select_menu)
bpy.utils.unregister_class(RefreshRestrictors)
if __name__ == "__main__":
register()
# update icons when opening file and updating scene data
# I don't know what does "updating scene data" mean
# But I've added it here to refresh icons while switching scenes
bpy.app.handlers.load_post.append(check_restrictors)
bpy.app.handlers.depsgraph_update_post.append(check_restrictors)

View File

@ -1,65 +0,0 @@
# space_view_3d_display_tools.py Copyright (C) 2014, Jordi Vall-llovera
# Multiple display tools for fast navigate/interact with the viewport
# ##### 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 #####
bl_info = {
"name": "shade Tools",
"author": "Jordi Vall-llovera Medina, Jhon Wallace",
"version": (1, 6, 0),
"blender": (2, 70, 0),
"location": "Toolshelf",
"description": "Display tools for fast navigate/interact with the viewport",
"warning": "",
"wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/"
"Py/Scripts/3D_interaction/Display_Tools",
"category": "3D View"}
import bpy
from bpy.types import Menu
class VIEW3D_MT_Shade_menu(Menu):
bl_label = "Shade"
bl_description = "Global Shading settings"
def draw(self, context):
layout = self.layout
layout.prop(context.space_data, "viewport_shade", expand=True)
if context.space_data.use_matcap:
row = layout.column(1)
row.scale_y = 0.3
row.scale_x = 0.5
row.template_icon_view(context.space_data, "matcap_icon")
# Register
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@ -1,282 +0,0 @@
# ##### 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 LICENSE BLOCK #####
bl_info = {
"name": "Useless Tools",
"description": "Just a little collection of scripts and tools I use daily",
"author": "Greg Zaal",
"version": (1, 2, 2),
"blender": (2, 75, 0),
"location": "3D View > Tools",
"warning": "",
"wiki_url": "",
"category": "Tools"}
import bpy
from bpy.types import Operator
from bpy.props import BoolProperty
def error_handlers(self, op_name, errors, reports="ERROR"):
if self and reports:
self.report({'INFO'},
reports + ": some operations could not be performed "
"(See Console for more info)")
str_errors = "\n".join(errors)
print("\n[Display Tools]\nOperator: {}\nErrors: {}\n".format(op_name, str_errors))
class UTSetSelectable(Operator):
bl_idname = "ut.set_selectable"
bl_label = "Set Selectable"
bl_description = "Sets selectability for the selected objects"
selectable: BoolProperty()
def execute(self, context):
errors = []
for obj in bpy.context.selected_objects:
try:
if self.selectable is True:
obj.hide_select = False
else:
obj.hide_select = True
except Exception as k:
name = getattr(obj, "name", "Nameless")
errors.append("Error on {} - {}".format(name, k))
if errors:
error_handlers(self, "ut.set_selectable", errors, "Set Selectable")
return {'FINISHED'}
class UTSetRenderable(Operator):
bl_idname = "ut.set_renderable"
bl_label = "Set Renderable"
bl_description = "Sets renderability for the selected objects"
renderable: BoolProperty()
def execute(self, context):
errors = []
for obj in bpy.context.selected_objects:
try:
if self.renderable is True:
obj.hide_render = False
else:
obj.hide_render = True
except Exception as k:
name = getattr(obj, "name", "Nameless")
errors.append("Error on {} - {}".format(name, k))
if errors:
error_handlers(self, "ut.set_renderable", errors, "Set Renderable")
return {'FINISHED'}
class UTAllSelectable(Operator):
bl_idname = "ut.all_selectable"
bl_label = "All Selectable"
bl_description = "Allows all objects to be selected"
def execute(self, context):
errors = []
for obj in bpy.data.objects:
try:
obj.hide_select = False
except Exception as k:
name = getattr(obj, "name", "Nameless")
errors.append("Error on {} - {}".format(name, k))
if errors:
error_handlers(self, "ut.all_selectable", errors, "All Selectable")
return {'FINISHED'}
class UTAllRenderable(Operator):
bl_idname = "ut.all_renderable"
bl_label = "All Renderable"
bl_description = "Allow all objects to be rendered"
def execute(self, context):
errors = []
for obj in bpy.data.objects:
try:
obj.hide_render = False
except Exception as k:
name = getattr(obj, "name", "Nameless")
errors.append("Error on {} - {}".format(name, k))
if errors:
error_handlers(self, "ut.all_renderable", errors, "All Renderable")
return {'FINISHED'}
class UTSelNGon(Operator):
bl_idname = "ut.select_ngons"
bl_label = "Select NGons"
bl_description = "Select faces with more than 4 vertices"
@classmethod
def poll(cls, context):
if not context.active_object or context.mode != 'EDIT_MESH':
return False
return True
def execute(self, context):
errors = []
try:
context.tool_settings.mesh_select_mode = (False, False, True)
bpy.ops.mesh.select_face_by_sides(number=4, type='GREATER', extend=True)
except Exception as k:
errors.append("Error - {}".format(k))
if errors:
error_handlers(self, "ut.select_ngons", errors, "Select NGons")
return {'FINISHED'}
class UTWireShowHideSelAll(Operator):
bl_idname = "ut.wire_show_hide"
bl_label = "Show / Hide Wire Selected or All"
bl_description = "Change the status of the Wire display on Selected Objects"
show: BoolProperty(
default=False
)
selected: BoolProperty(
default=False
)
@classmethod
def poll(cls, context):
return not context.scene.display_tools.WT_handler_enable
def execute(self, context):
errors = []
objects = bpy.context.selected_objects if self.selected else bpy.data.objects
for e in objects:
try:
e.show_wire = self.show
except Exception as k:
name = getattr(e, "name", "Nameless")
errors.append("Error on {} - {}".format(name, k))
if errors:
error_handlers(self, "ut.wire_show_hide", errors,
"Show / Hide Wire Selected or All")
return {'FINISHED'}
class UTSubsurfHideSelAll(Operator):
bl_idname = "ut.subsurf_show_hide"
bl_label = "Subsurf Show/Hide"
bl_description = ("Sets the Subsurf modifier on objects:\n"
"Hide and Show operate on Selected Objects only\n"
"Hide All and Show All operate on All Objects in the data")
show: BoolProperty(
default=False
)
selected: BoolProperty(
default=False
)
def execute(self, context):
errors = []
objects = bpy.context.selected_objects if self.selected else bpy.data.objects
for e in objects:
try:
if e.type not in {"LIGHT", "CAMERA", "EMPTY"}:
e.modifiers['Subsurf'].show_viewport = self.show
except Exception as k:
name = getattr(e, "name", "Nameless")
errors.append(
"No subsurf on {} or it is not named Subsurf\nError: {}".format(name, k))
if errors:
error_handlers(self, "ut.subsurf_show_hide", errors, "Subsurf Show/Hide")
return {'FINISHED'}
class UTOptimalDisplaySelAll(Operator):
bl_idname = "ut.optimaldisplay"
bl_label = "Optimal Display"
bl_description = "Disables Optimal Display for all Subsurf modifiers on objects"
on: BoolProperty(
default=False
)
selected: BoolProperty(
default=False
)
def execute(self, context):
errors = []
objects = bpy.context.selected_objects if self.selected else bpy.data.objects
for e in objects:
try:
if e.type not in {"LIGHT", "CAMERA", "EMPTY"}:
e.modifiers['Subsurf'].show_only_control_edges = self.on
except Exception as k:
name = getattr(e, "name", "Nameless")
errors.append(
"No subsurf on {} or it is not named Subsurf\nError: {}".format(name, k))
if errors:
error_handlers(self, "ut.optimaldisplay", errors, "Optimal Display")
return {'FINISHED'}
class UTAllEdges(Operator):
bl_idname = "ut.all_edges"
bl_label = "All Edges"
bl_description = "Change the status of All Edges overlay on all objects"
on: BoolProperty(
default=False
)
def execute(self, context):
errors = []
for e in bpy.data.objects:
try:
e.show_all_edges = self.on
except Exception as k:
name = getattr(e, "name", "Nameless")
errors.append(
"Enabling All Edges on {} \nError: {}".format(name, k))
if errors:
error_handlers(self, "ut.all_edges", errors, "All Edges")
return {'FINISHED'}
# Register
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()