Initial Commit "Display Tools"

This commit is contained in:
Brendon Murphy 2017-03-20 12:32:20 +11:00
parent 8e3bfa5506
commit 5bc826c185
Notes: blender-bot 2023-02-14 20:19:43 +01:00
Referenced by issue #32253, Display Tools: Promote to Blender 2.79 release
9 changed files with 2870 additions and 0 deletions

View File

@ -0,0 +1,630 @@
# 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
bl_info = {
"name": "Display Tools",
"author": "Jordi Vall-llovera Medina, Jhon Wallace",
"version": (1, 6, 1),
"blender": (2, 7, 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",
"tracker_url": "",
"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 DisplayToolsPanel(Panel):
bl_label = "Display Tools"
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_category = "Display"
bl_options = {'DEFAULT_CLOSED'}
draw_type_icons = {'BOUNDS': 'BBOX',
'WIRE': 'WIRE',
'SOLID': 'SOLID',
'TEXTURED': 'POTATO'
}
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
gs = scene.game_settings
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="FACESEL_HLT")
row.prop(obj, "show_name", text="", icon="SORTALPHA")
row.prop(obj, "show_axis", text="", icon="AXIS_TOP")
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_x_ray", 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", "Simplify", toggle=True)
if render.use_simplify is True:
col = layout.column(align=True)
col.label("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="MATSPHERE", 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="Maximum:")
col.prop(obj, "draw_type", text="", icon=self.draw_type_icons[obj.draw_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='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("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(gs, "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 or gs.material_mode != 'GLSL':
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("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("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 SELECT2DROP:
col = layout.column(align=True)
if obj and obj.mode == 'OBJECT':
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 All", icon="RESTRICT_VIEW_ON")
col = layout.column(align=True)
col.operator("op.render_show_all_selected", icon="RESTRICT_VIEW_OFF")
col.operator("op.render_hide_all_selected", icon="RESTRICT_VIEW_ON")
if obj:
if obj.mode == 'OBJECT':
layout.operator_menu_enum("object.select_by_type", "type", text="Select All by Type...")
col = layout.column(align=True)
col.operator("opr.select_all", icon="MOD_MESHDEFORM")
col.operator("opr.inverse_selection", icon="MOD_REMESH")
if obj_type == 'MESH' and obj.mode == 'EDIT':
col = layout.column(align=True)
col.operator("opr.select_all", icon="MOD_MESHDEFORM")
col.operator("opr.inverse_selection", icon="MOD_REMESH")
col = layout.column(align=True)
col.operator("mesh.select_linked", icon="ROTATECOLLECTION")
col.operator("opr.loop_multi_select", icon="OUTLINER_DATA_MESH")
else:
col = layout.column(align=True)
col.operator("opr.select_all", icon="MOD_MESHDEFORM")
col.operator("opr.inverse_selection", icon="MOD_REMESH")
col = layout.column(align=True)
col.operator("view3d.select_border", icon="MESH_PLANE")
col.operator("view3d.select_circle", icon="MESH_CIRCLE")
# fast nav options
col.separator()
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 FASTNAVDROP:
col = layout.column(align=True)
col.operator("view3d.fast_navigate_operator")
col.operator("view3d.fast_navigate_stop")
layout.label("Settings:")
layout.prop(display_tools, "OriginalMode")
layout.prop(display_tools, "FastMode")
layout.prop(display_tools, "EditActive", "Edit mode")
layout.prop(display_tools, "Delay")
layout.prop(display_tools, "DelayTimeGlobal", "Delay time")
layout.prop(display_tools, "ShowParticles")
layout.prop(display_tools, "ParticlesPercentageDisplay")
layout.separator()
col = layout.column(align=True)
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="Display",
description="Display only a percentage of particles",
default=25,
min=0,
max=100,
soft_min=0,
soft_max=100,
subtype='FACTOR'
)
InitialParticles = IntProperty(
name="Count for initial particle setting before entering fast navigate",
description="Display a percentage value of particles",
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 = [
DisplayToolsPanel
]
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.user_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="")
# register the classes and props
def register():
bpy.utils.register_module(__name__)
# Register Scene Properties
bpy.types.Scene.display_tools = PointerProperty(
type=display_tools_scene_props
)
update_panel(None, bpy.context)
selection_restrictor.register()
def unregister():
del bpy.types.Scene.display_tools
selection_restrictor.unregister()
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()

View File

@ -0,0 +1,251 @@
# 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.draw_type = self.drawing
else:
for obj in selection:
obj.draw_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.draw_bounds_type = scene.BoundingMode
else:
for obj in selection:
obj.show_bounds = self.bounds
if self.bounds:
obj.draw_bounds_type = scene.BoundingMode
except:
self.report({'ERROR'}, "Display/Hide Bounding box overlay failed")
return {'CANCELLED'}
return {'FINISHED'}
# Double Sided switch
class DisplayDoubleSidedSwitch(Operator, BasePollCheck):
bl_idname = "view3d.display_double_sided_switch"
bl_label = "On/Off"
bl_description = "Turn on/off face double shaded mode"
double_side = BoolProperty(default=False)
def execute(self, context):
try:
selection = bpy.context.selected_objects
if not selection:
for mesh in bpy.data.meshes:
mesh.show_double_sided = self.double_side
else:
for sel in selection:
if sel.type == 'MESH':
mesh = sel.data
mesh.show_double_sided = self.double_side
except:
self.report({'ERROR'}, "Turn on/off face double shaded mode 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_x_ray = self.xrays
else:
for obj in selection:
obj.show_x_ray = 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

@ -0,0 +1,227 @@
# 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
# 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):
scene = bpy.context.scene.display_tools
if mode is True:
for particles in bpy.data.particles:
if particles.type == 'EMITTER':
particles.draw_method = 'DOT'
particles.draw_percentage = 100
else:
particles.draw_method = 'RENDER'
particles.draw_percentage = 100
else:
for particles in bpy.data.particles:
if particles.type == 'EMITTER':
particles.draw_method = 'DOT'
particles.draw_percentage = scene.ParticlesPercentageDisplay
else:
particles.draw_method = 'RENDER'
particles.draw_percentage = scene.ParticlesPercentageDisplay
# 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")
trigger = BoolProperty(default=False)
mode = BoolProperty(default=False)
screen_width = [0, 0]
def modal(self, context, event):
context.area.tag_redraw()
scene = context.scene.display_tools
if scene.FastNavigateStop is True:
self.cancel(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'}
def execute(self, context):
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)
return {'RUNNING_MODAL'}
@staticmethod
def calc_delay(scene):
if scene.Delay is True:
if scene.DelayTime < scene.DelayTimeGlobal:
scene.DelayTime += 1
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 context.area.type != 'VIEW_3D':
self.cancel(context)
return {'CANCELLED'}
if event.type in {'ESC', 'RET', 'SPACE'}:
self.cancel(context)
return {'CANCELLED'}
if scene.FastNavigateStop is True:
self.cancel(context)
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
if scene.ShowParticles is False:
for particles in bpy.data.particles:
if particles.type == 'EMITTER':
particles.draw_method = 'NONE'
else:
particles.draw_method = 'NONE'
else:
display_particles(self.mode)
def cancel(self, context):
scene = context.scene.display_tools
for particles in bpy.data.particles:
particles.draw_percentage = scene.InitialParticles
# 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

@ -0,0 +1,250 @@
# 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.scene.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

@ -0,0 +1,50 @@
# 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

@ -0,0 +1,224 @@
# ***** 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, 1),
"blender": (2, 7, 3),
"location": "3D View > Tools",
"description": "Selection Tools",
"warning": "",
"wiki_url": "",
"tracker_url": "",
"category": ""
}
import bpy
from bpy.types import Operator
class ShowHideObject(Operator):
bl_idname = "opr.show_hide_object"
bl_label = "Show/Hide Object"
bl_description = "Show/Hide all objects in the Data"
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 = False
if i.type not in ['CAMERA', 'LAMP']:
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 Objects"
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 = False
if i.type not in ['CAMERA', 'LAMP']:
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 = False
if i.type not in ['CAMERA', 'LAMP']:
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, verticies, 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 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 is True:
ob.hide_render = True
except:
continue
return {'FINISHED'}
# Register
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == '__main__':
register()

View File

@ -0,0 +1,851 @@
# ##### 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),
"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_LAMP'
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 of 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_LAMP'
else:
lamprestrictorenabled = False
lamp = 'LAMP_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'}
# hide or unhide 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'}
# hide or unhide object to restrictor
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 for 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 = 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 = 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 = False
return{'FINISHED'}
# restrictor for epties
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 = 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 = False
return{'FINISHED'}
# restrictor for lamps
class RestrictorLamp(Operator):
bl_idname = "restrictor.lamp"
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_LAMP'
for ob in bpy.context.scene.objects:
if ob.type == 'LAMP':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
else:
lamprestrictorenabled = False
bpy.context.scene['lamprestrictor'] = 1
lamp = 'LAMP_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'LAMP':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select = 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 = False
return{'FINISHED'}
# restrictor for text
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 = 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 = 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 = False
return{'FINISHED'}
# restrictor for speaks
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 = 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
# refresh meshes
if bpy.context.scene.get('meshrestrictor') is None:
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:
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 = False
# refresh curves
if bpy.context.scene.get('curverestrictor') is None:
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:
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 = False
# refresh armatures
if bpy.context.scene.get('armrestrictor') is None:
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:
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 = False
# refresh empties
if bpy.context.scene.get('emptyrestrictor') is None:
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:
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 = False
# refresh cameras
if bpy.context.scene.get('camrestrictor') is None:
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:
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 = False
# refresh lamps
if bpy.context.scene.get('lamprestrictor') is None:
lamp = 'OUTLINER_OB_LAMP'
for ob in bpy.context.scene.objects:
if ob.type == 'LAMP':
if ob.get('ignore_restrictors') is None:
ob.hide_select = False
lamp = 'LAMP_DATA'
for ob in bpy.context.scene.objects:
if ob.type == 'LAMP':
if ob.get('ignore_restrictors') is None:
ob.hide_select = True
ob.select = False
# refresh lattices
if bpy.context.scene.get('latrestrictor') is None:
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
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 = False
# refresh text
if bpy.context.scene.get('fontrestrictor') is None:
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:
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 = False
# refresh metaballs
if bpy.context.scene.get('metarestrictor') is None:
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:
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 = False
# refresh surfaces
if bpy.context.scene.get('surfrestrictor') is None:
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:
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 = False
# refresh speakers
if bpy.context.scene.get('speakrestrictor') is None:
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:
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 = False
return{'FINISHED'}
class 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.lamp", 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.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)
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.scene_update_post.append(check_restrictors)

View File

@ -0,0 +1,68 @@
# 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, 7, 0),
"location": "Toolshelf",
"description": "Display tools for fast navigate/interact with the viewport",
"warning": "",
"wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/"
"3D_interaction/Display_Tools",
"tracker_url": "",
"category": "Addon Factory"}
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

@ -0,0 +1,319 @@
# ##### 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, 1),
"blender": (2, 75, 0),
"location": "3D View > Tools",
"warning": "",
"wiki_url": "",
"tracker_url": "",
"category": "Tools"}
import bpy
from bpy.types import Operator
from bpy.props import BoolProperty
def print_errors(lists, operators="useless_tools.py"):
if lists:
print("\n[%s]\n\n%s\n" % (operators, "\n".join(lists)))
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:
print_errors(errors, "Operator: ut.set_selectable")
self.report({'INFO'},
"Set Selectable: some operations could not be performed (See console for more info)")
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:
print_errors(errors, "Operator: ut.set_renderable")
self.report({'INFO'},
"Set Renderable: some operations could not be performed (See console for more info)")
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:
print_errors(errors, "Operator: ut.all_selectable")
self.report({'INFO'},
"All Selectable: some operations could not be performed (See console for more info)")
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:
print_errors(errors, "Operator: ut.all_renderable")
self.report({'INFO'},
"All Renderable: some operations could not be performed (See console for more info)")
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:
print_errors(errors, "Operator: ut.select_ngons")
self.report({'INFO'},
"Select NGons: some operations could not be performed (See console for more info)")
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:
print_errors(errors, "Operator: ut.wire_show_hide")
self.report({'INFO'},
"Show/Hide Wire: some operations could not be performed (See console for more info)")
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 {"LAMP", "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:
print_errors(errors, "Operator: ut.subsurf_show_hide")
self.report({'INFO'},
"Subsurf Show/Hide: some operations could not be performed (See console for more info)")
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 {"LAMP", "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:
print_errors(errors, "Operator: ut.optimaldisplay")
self.report({'INFO'},
"Optimal Display: some operations could not be performed (See console for more info)")
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:
print_errors(errors, "Operator: ut.all_edges")
self.report({'INFO'},
"Enable All Edges: some operations could not be performed (See console for more info)")
return {'FINISHED'}
class UTDoubleSided(Operator):
bl_idname = "ut.double_sided"
bl_label = "Double Sided Normals"
bl_description = "Disables Double Sided Normals for all objects"
on = BoolProperty(
default=False
)
def execute(self, context):
errors = []
for e in bpy.data.meshes:
try:
e.show_double_sided = self.on
except Exception as k:
name = getattr(e, "name", "Nameless")
errors.append(
"Applying Double Sided Normals on {} \nError: {}".format(name, k))
if errors:
print_errors(errors, "Operator: ut.double_sided")
self.report({'INFO'},
"Double Sided Normals: some operations could not be performed (See console for more info)")
return {'FINISHED'}
# Register
def register():
bpy.utils.register_module(__name__)
def unregister():
bpy.utils.unregister_module(__name__)
if __name__ == "__main__":
register()