OO/◯ᴥᗱᗴᗝИNᗱᗴᙁ⚭ⵙ⚭ᙁᗱᗴИNᗝᗱᗴᴥ◯/2.90/SCRIPTS/ADDONS/SPACE_VIEW_3D_DISPLAY_TOOLS.PY

1360 lines
43 KiB
Python

# space_view_3d_display_tools.py Copyright (C) 2012, 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": "Display Tools",
"author": "Jordi Vall-llovera Medina",
"version": (1, 2, 6),
"blender": (2, 6, 4),
"location": "Toolshelf",
"description": "Display tools for fast navigate/interact with the viewport",
"warning": "",
"wiki_url": "http://jordiart3d.blogspot.com.es/",
"tracker_url": "",
"category": "3D View"}
"""
Additional links:
Author Site: http://jordiart3d.blogspot.com.es/
"""
import bpy
from bpy.props import IntProperty, BoolProperty, FloatProperty, EnumProperty
# init delay variables
bpy.types.Scene.Delay = bpy.props.BoolProperty(
default = False,
description = "Activate delay return to normal viewport mode")
bpy.types.Scene.DelayTime = bpy.props.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")
bpy.types.Scene.DelayTimeGlobal = bpy.props.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
bpy.types.Scene.EditActive = bpy.props.BoolProperty(
default = True,
description = "Activate for fast navigate in edit mode too")
#Fast Navigate toggle function
def trigger_fast_navigate(trigger):
scene = bpy.context.scene
scene.FastNavigateStop = False
if trigger == True:
trigger = False
else:
trigger = True
#Control how to display particles during fast navigate
def display_particles(mode):
scene = bpy.context.scene
if mode == 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
#Do repetitive fast navigate related stuff
def fast_navigate_stuff(self, context, event):
scene = bpy.context.scene
view = context.space_data
if bpy.context.area.type != 'VIEW_3D':
return self.cancel(context)
if event.type == 'ESC' or event.type == 'RET' or event.type == 'SPACE':
return self.cancel(context)
if scene.FastNavigateStop == True:
return self.cancel(context)
#fast navigate while orbit/panning
if event.type == 'MIDDLEMOUSE':
if scene.Delay == True:
if scene.DelayTime < scene.DelayTimeGlobal:
scene.DelayTime += 1
view.viewport_shade = scene.FastMode
self.mode = False
#fast navigate while transform operations
if event.type == 'G' or event.type == 'R' or event.type == 'S':
if scene.Delay == True:
if scene.DelayTime < scene.DelayTimeGlobal:
scene.DelayTime += 1
view.viewport_shade = scene.FastMode
self.mode = False
#fast navigate while menu popups or duplicates
if event.type == 'W' or event.type == 'D' or event.type == 'L'\
or event.type == 'U' or event.type == 'I' or event.type == 'M'\
or event.type == 'A' or event.type == 'B':
if scene.Delay == True:
if scene.DelayTime < scene.DelayTimeGlobal:
scene.DelayTime += 1
view.viewport_shade = scene.FastMode
self.mode = False
#fast navigate while numpad navigation
if event.type == 'NUMPAD_PERIOD' or event.type == 'NUMPAD_1'\
or event.type == 'NUMPAD_2' or event.type == 'NUMPAD_3'\
or event.type == 'NUMPAD_4' or event.type == 'NUMPAD_5'\
or event.type == 'NUMPAD_6' or event.type == 'NUMPAD_7'\
or event.type == 'NUMPAD_8' or event.type == 'NUMPAD_9':
if scene.Delay == True:
if scene.DelayTime < scene.DelayTimeGlobal:
scene.DelayTime += 1
view.viewport_shade = scene.FastMode
self.mode = False
#fast navigate while zooming with mousewheel too
if event.type == 'WHEELUPMOUSE' or event.type == 'WHEELDOWNMOUSE':
scene.DelayTime = scene.DelayTimeGlobal
view.viewport_shade = scene.FastMode
self.mode = False
if event.type == 'MOUSEMOVE':
if scene.Delay == True:
if scene.DelayTime == 0:
scene.DelayTime = scene.DelayTimeGlobal
view.viewport_shade = scene.OriginalMode
self.mode = True
else:
view.viewport_shade = scene.OriginalMode
self.mode = True
if scene.Delay == True:
scene.DelayTime -= 1
if scene.DelayTime == 0:
scene.DelayTime = scene.DelayTimeGlobal
view.viewport_shade = scene.OriginalMode
self.mode = True
if scene.ShowParticles == 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)
#Fast Navigate operator
class FastNavigate(bpy.types.Operator):
"""Operator that runs Fast navigate in modal mode"""
bl_idname = "view3d.fast_navigate_operator"
bl_label = "Fast Navigate"
trigger = BoolProperty(default = False)
mode = BoolProperty(default = False)
scene = bpy.context.scene
scene.DelayTime = scene.DelayTimeGlobal
def modal(self, context, event):
scene = bpy.context.scene
view = context.space_data
if scene.EditActive == True:
fast_navigate_stuff(self, context ,event)
return {'PASS_THROUGH'}
else:
obj = context.active_object
if obj:
if obj.mode != 'EDIT':
fast_navigate_stuff(self, context ,event)
return {'PASS_THROUGH'}
else:
return {'PASS_THROUGH'}
else:
fast_navigate_stuff(self, context ,event)
return {'PASS_THROUGH'}
def execute(self, context):
context.window_manager.modal_handler_add(self)
trigger_fast_navigate(self.trigger)
return {'RUNNING_MODAL'}
def cancel(self, context):
scene = context.scene
for particles in bpy.data.particles:
particles.draw_percentage = scene.InitialParticles
return {'CANCELLED'}
#Fast Navigate Stop
def fast_navigate_stop(context):
scene = bpy.context.scene
scene.FastNavigateStop = True
#Fast Navigate Stop Operator
class FastNavigateStop(bpy.types.Operator):
'''Stop Fast Navigate Operator'''
bl_idname = "view3d.fast_navigate_stop"
bl_label = "Stop"
FastNavigateStop = IntProperty(name = "FastNavigateStop",
description = "Stop fast navigate mode",
default = 0)
def execute(self,context):
fast_navigate_stop(context)
return {'FINISHED'}
#Drawtype textured
def draw_textured(context):
view = context.space_data
view.viewport_shade = 'TEXTURED'
bpy.context.scene.game_settings.material_mode = 'GLSL'
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
obj.draw_type = 'TEXTURED'
else:
for obj in selection:
obj.draw_type = 'TEXTURED'
class DisplayTextured(bpy.types.Operator):
'''Display objects in textured mode'''
bl_idname = "view3d.display_textured"
bl_label = "Textured"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
draw_textured(context)
return {'FINISHED'}
#Drawtype solid
def draw_solid(context):
view = context.space_data
view.viewport_shade = 'TEXTURED'
bpy.context.scene.game_settings.material_mode = 'GLSL'
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
obj.draw_type = 'SOLID'
else:
for obj in selection:
obj.draw_type = 'SOLID'
class DisplaySolid(bpy.types.Operator):
'''Display objects in solid mode'''
bl_idname = "view3d.display_solid"
bl_label = "Solid"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
draw_solid(context)
return {'FINISHED'}
#Drawtype wire
def draw_wire(context):
view = context.space_data
view.viewport_shade = 'TEXTURED'
bpy.context.scene.game_settings.material_mode = 'GLSL'
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
obj.draw_type = 'WIRE'
else:
for obj in selection:
obj.draw_type = 'WIRE'
class DisplayWire(bpy.types.Operator):
'''Display objects in wireframe mode'''
bl_idname = "view3d.display_wire"
bl_label = "Wire"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
draw_wire(context)
return {'FINISHED'}
#Drawtype bounds
def draw_bounds(context):
view = context.space_data
view.viewport_shade = 'TEXTURED'
bpy.context.scene.game_settings.material_mode = 'GLSL'
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
obj.draw_type = 'BOUNDS'
else:
for obj in selection:
obj.draw_type = 'BOUNDS'
class DisplayBounds(bpy.types.Operator):
'''Display objects in bounds mode'''
bl_idname = "view3d.display_bounds"
bl_label = "Bounds"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
draw_bounds(context)
return {'FINISHED'}
#Shade smooth
def shade_smooth(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
bpy.ops.object.select_all(action = 'TOGGLE')
bpy.ops.object.shade_smooth()
bpy.ops.object.select_all(action = 'TOGGLE')
else:
obj = context.active_object
if obj.mode == 'OBJECT':
for obj in selection:
bpy.ops.object.shade_smooth()
else:
bpy.ops.mesh.faces_shade_smooth()
class DisplayShadeSmooth(bpy.types.Operator):
'''Display shade smooth meshes'''
bl_idname = "view3d.display_shade_smooth"
bl_label = "Smooth"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
shade_smooth(context)
return {'FINISHED'}
#Shade flat
def shade_flat(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
bpy.ops.object.select_all(action = 'TOGGLE')
bpy.ops.object.shade_flat()
bpy.ops.object.select_all(action = 'TOGGLE')
else:
obj = context.active_object
if obj.mode == 'OBJECT':
for obj in selection:
bpy.ops.object.shade_flat()
else:
bpy.ops.mesh.faces_shade_flat()
class DisplayShadeFlat(bpy.types.Operator):
'''Display shade flat meshes'''
bl_idname = "view3d.display_shade_flat"
bl_label = "Flat"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
shade_flat(context)
return {'FINISHED'}
#Shadeless on
def shadeless_on(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.materials:
obj.use_shadeless = True
else:
for sel in selection:
if sel.type == 'MESH':
materials = sel.data.materials
for mat in materials:
mat.use_shadeless = True
class DisplayShadelessOn(bpy.types.Operator):
'''Display shadeless material'''
bl_idname = "view3d.display_shadeless_on"
bl_label = "On"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
shadeless_on(context)
return {'FINISHED'}
#Shadeless off
def shadeless_off(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.materials:
obj.use_shadeless = False
else:
for sel in selection:
if sel.type == 'MESH':
materials = sel.data.materials
for mat in materials:
mat.use_shadeless = False
class DisplayShadelessOff(bpy.types.Operator):
'''Display shaded material'''
bl_idname = "view3d.display_shadeless_off"
bl_label = "Off"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
shadeless_off(context)
return {'FINISHED'}
#Wireframe on
def wire_on(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
obj.show_wire = True
for mesh in bpy.data.meshes:
mesh.show_all_edges = True
else:
for obj in selection:
obj.show_wire = True
for sel in selection:
if sel.type == 'MESH':
mesh = sel.data
mesh.show_all_edges = True
class DisplayWireframeOn(bpy.types.Operator):
'''Display wireframe overlay on'''
bl_idname = "view3d.display_wire_on"
bl_label = "On"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
wire_on(context)
return {'FINISHED'}
#Wireframe off
def wire_off(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
obj.show_wire = False
for mesh in bpy.data.meshes:
mesh.show_all_edges = False
else:
for obj in selection:
obj.show_wire = False
for sel in selection:
if sel.type == 'MESH':
mesh = sel.data
mesh.show_all_edges = False
class DisplayWireframeOff(bpy.types.Operator):
'''Display wireframe overlay off'''
bl_idname = "view3d.display_wire_off"
bl_label = "Off"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
wire_off(context)
return {'FINISHED'}
#Bounds on
def bounds_on(context):
scene = context.scene
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
obj.show_bounds = True
obj.draw_bounds_type = scene.BoundingMode
else:
for obj in selection:
obj.show_bounds = True
obj.draw_bounds_type = scene.BoundingMode
class DisplayBoundsOn(bpy.types.Operator):
'''Display Bounding box overlay on'''
bl_idname = "view3d.display_bounds_on"
bl_label = "On"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
bounds_on(context)
return {'FINISHED'}
#Wireframe off
def bounds_off(context):
scene = context.scene
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
obj.show_bounds = False
else:
for obj in selection:
obj.show_bounds = False
class DisplayBoundsOff(bpy.types.Operator):
'''Display Bounding box overlay off'''
bl_idname = "view3d.display_bounds_off"
bl_label = "Off"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
bounds_off(context)
return {'FINISHED'}
#Double Sided on
def double_sided_on(context):
selection = bpy.context.selected_objects
if not(selection):
for mesh in bpy.data.meshes:
mesh.show_double_sided = True
else:
for sel in selection:
if sel.type == 'MESH':
mesh = sel.data
mesh.show_double_sided = True
class DisplayDoubleSidedOn(bpy.types.Operator):
'''Turn on face double shaded mode'''
bl_idname = "view3d.display_double_sided_on"
bl_label = "On"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
double_sided_on(context)
return {'FINISHED'}
#Double Sided off
def double_sided_off(context):
selection = bpy.context.selected_objects
if not(selection):
for mesh in bpy.data.meshes:
mesh.show_double_sided = False
else:
for sel in selection:
if sel.type == 'MESH':
mesh = sel.data
mesh.show_double_sided = False
class DisplayDoubleSidedOff(bpy.types.Operator):
'''Turn off face double sided shade mode'''
bl_idname = "view3d.display_double_sided_off"
bl_label = "Off"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
double_sided_off(context)
return {'FINISHED'}
#XRay on
def x_ray_on(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
obj.show_x_ray = True
else:
for obj in selection:
obj.show_x_ray = True
class DisplayXRayOn(bpy.types.Operator):
'''X-Ray display on'''
bl_idname = "view3d.display_x_ray_on"
bl_label = "On"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
x_ray_on(context)
return {'FINISHED'}
#XRay off
def x_ray_off(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
obj.show_x_ray = False
else:
for obj in selection:
obj.show_x_ray = False
class DisplayXRayOff(bpy.types.Operator):
'''X-Ray display off'''
bl_idname = "view3d.display_x_ray_off"
bl_label = "Off"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
x_ray_off(context)
return {'FINISHED'}
#Init properties for scene
bpy.types.Scene.FastNavigateStop = bpy.props.BoolProperty(
name = "Fast Navigate Stop",
description = "Stop fast navigate mode",
default = False)
bpy.types.Scene.OriginalMode = bpy.props.EnumProperty(
items = [('TEXTURED', 'Texture', 'Texture display mode'),
('SOLID', 'Solid', 'Solid display mode')],
name = "Normal",
default = 'SOLID')
bpy.types.Scene.BoundingMode = bpy.props.EnumProperty(
items = [('BOX', 'Box', 'Box shape'),
('SPHERE', 'Sphere', 'Sphere shape'),
('CYLINDER', 'Cylinder', 'Cylinder shape'),
('CONE', 'Cone', 'Cone shape')],
name = "BB Mode")
bpy.types.Scene.FastMode = bpy.props.EnumProperty(
items = [('WIREFRAME', 'Wireframe', 'Wireframe display'),
('BOUNDBOX', 'Bounding Box', 'Bounding Box display')],
name = "Fast")
bpy.types.Scene.ShowParticles = bpy.props.BoolProperty(
name = "Show Particles",
description = "Show or hide particles on fast navigate mode",
default = True)
bpy.types.Scene.ParticlesPercentageDisplay = bpy.props.IntProperty(
name = "Display",
description = "Display only a percentage of particles",
default = 25,
min = 0,
max = 100,
soft_min = 0,
soft_max = 100,
subtype = 'FACTOR')
bpy.types.Scene.InitialParticles = bpy.props.IntProperty(
name = "Count for initial particle setting before enter fast navigate",
description = "Display a percentage value of particles",
default = 100,
min = 0,
max = 100,
soft_min = 0,
soft_max = 100)
#Set Render Settings
def set_render_settings(conext):
scene = bpy.context.scene
render = bpy.context.scene.render
view = bpy.context.space_data
render.simplify_subdivision = 0
render.simplify_shadow_samples = 0
render.simplify_child_particles = 0
render.simplify_ao_sss = 0
class DisplaySimplify(bpy.types.Operator):
'''Display scene simplified'''
bl_idname = "view3d.display_simplify"
bl_label = "Reset"
Mode = EnumProperty(
items = [('WIREFRAME', 'Wireframe', ''),
('BOUNDBOX', 'Bounding Box', '')],
name = "Mode")
ShowParticles = BoolProperty(
name = "ShowParticles",
description = "Show or hide particles on fast navigate mode",
default = True)
ParticlesPercentageDisplay = IntProperty(
name = "Display",
description = "Display a percentage value of particles",
default = 25,
min = 0,
max = 100,
soft_min = 0,
soft_max = 100,
subtype = 'FACTOR')
@classmethod
def poll(cls, context):
return True
def execute(self, context):
set_render_settings(context)
return {'FINISHED'}
#Display Modifiers Render on
def modifiers_render_on(context):
scene = bpy.context.scene
bpy.types.Scene.Symplify = IntProperty(
name = "Integer",description = "Enter an integer")
scene['Simplify'] = 1
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_render = True
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_render = True
class DisplayModifiersRenderOn(bpy.types.Operator):
'''Display modifiers in render'''
bl_idname = "view3d.display_modifiers_render_on"
bl_label = "On"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_render_on(context)
return {'FINISHED'}
#Display Modifiers Render off
def modifiers_render_off(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_render = False
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_render = False
class DisplayModifiersRenderOff(bpy.types.Operator):
'''Hide modifiers in render'''
bl_idname = "view3d.display_modifiers_render_off"
bl_label = "Off"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_render_off(context)
return {'FINISHED'}
#Display Modifiers Viewport on
def modifiers_viewport_on(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_viewport = True
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_viewport = True
class DisplayModifiersViewportOn(bpy.types.Operator):
'''Display modifiers in viewport'''
bl_idname = "view3d.display_modifiers_viewport_on"
bl_label = "On"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_viewport_on(context)
return {'FINISHED'}
#Display Modifiers Viewport off
def modifiers_viewport_off(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_viewport = False
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_viewport = False
class DisplayModifiersViewportOff(bpy.types.Operator):
'''Hide modifiers in viewport'''
bl_idname = "view3d.display_modifiers_viewport_off"
bl_label = "Off"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_viewport_off(context)
return {'FINISHED'}
#Display Modifiers Edit on
def modifiers_edit_on(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_in_editmode = True
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_in_editmode = True
class DisplayModifiersEditOn(bpy.types.Operator):
'''Display modifiers during edit mode'''
bl_idname = "view3d.display_modifiers_edit_on"
bl_label = "On"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_edit_on(context)
return {'FINISHED'}
#Display Modifiers Edit off
def modifiers_edit_off(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_in_editmode = False
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_in_editmode = False
class DisplayModifiersEditOff(bpy.types.Operator):
'''Hide modifiers during edit mode'''
bl_idname = "view3d.display_modifiers_edit_off"
bl_label = "Off"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_edit_off(context)
return {'FINISHED'}
#Display Modifiers Cage on
def modifiers_cage_on(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_on_cage = True
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_on_cage = True
class DisplayModifiersCageOn(bpy.types.Operator):
'''Display modifiers editing cage during edit mode'''
bl_idname = "view3d.display_modifiers_cage_on"
bl_label = "On"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_cage_on(context)
return {'FINISHED'}
#Display Modifiers Cage off
def modifiers_cage_off(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_on_cage = False
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_on_cage = False
class DisplayModifiersCageOff(bpy.types.Operator):
'''Hide modifiers editing cage during edit mode'''
bl_idname = "view3d.display_modifiers_cage_off"
bl_label = "Off"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_cage_off(context)
return {'FINISHED'}
#Display Modifiers Expand
def modifiers_expand(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_expanded = True
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_expanded = True
class DisplayModifiersExpand(bpy.types.Operator):
'''Expand all modifiers on modifier stack'''
bl_idname = "view3d.display_modifiers_expand"
bl_label = "Expand"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_expand(context)
return {'FINISHED'}
#Display Modifiers Collapse
def modifiers_collapse(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
mod.show_expanded = False
else:
for obj in selection:
for mod in obj.modifiers:
mod.show_expanded = False
class DisplayModifiersCollapse(bpy.types.Operator):
'''Collapse all modifiers on modifier stack'''
bl_idname = "view3d.display_modifiers_collapse"
bl_label = "Collapse"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_collapse(context)
return {'FINISHED'}
#Apply modifiers
def modifiers_apply(context):
selection = bpy.context.selected_objects
if not(selection):
bpy.ops.object.select_all(action = 'TOGGLE')
bpy.ops.object.convert(target = 'MESH', keep_original = False)
bpy.ops.object.select_all(action = 'TOGGLE')
else:
for mesh in selection:
if mesh.type == "MESH":
bpy.ops.object.convert(target='MESH', keep_original = False)
class DisplayModifiersApply(bpy.types.Operator):
'''Apply modifiers'''
bl_idname = "view3d.display_modifiers_apply"
bl_label = "Apply All"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_apply(context)
return {'FINISHED'}
#Delete modifiers
def modifiers_delete(context):
selection = bpy.context.selected_objects
if not(selection):
for obj in bpy.data.objects:
for mod in obj.modifiers:
bpy.context.scene.objects.active = obj
bpy.ops.object.modifier_remove(modifier = mod.name)
else:
for obj in selection:
for mod in obj.modifiers:
bpy.context.scene.objects.active = obj
bpy.ops.object.modifier_remove(modifier = mod.name)
class DisplayModifiersDelete(bpy.types.Operator):
'''Delete modifiers'''
bl_idname = "view3d.display_modifiers_delete"
bl_label = "Delete All"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_delete(context)
return {'FINISHED'}
#Put dummy modifier for boost subsurf
def modifiers_set_dummy(context):
selection = bpy.context.selected_objects
if not(selection):
print("funciona")
for object in bpy.data.objects:
if object.type == "MESH":
mod = object.modifiers.new(type = 'SIMPLE_DEFORM',\
name = "Dummy")
mod.factor = 0
else:
for object in selection:
if object.type == "MESH":
mod = object.modifiers.new(type = 'SIMPLE_DEFORM',\
name = "Dummy")
mod.factor = 0
class DisplayAddDummy(bpy.types.Operator):
'''Add a dummy simple deform modifier to boost\
subsurf modifier viewport performance'''
bl_idname = "view3d.display_modifiers_set_dummy"
bl_label = "Put Dummy"
@classmethod
def poll(cls, context):
return True
def execute(self, context):
modifiers_set_dummy(context)
return {'FINISHED'}
# main class for Fast Navigate
class VIEW3D_PT_FastNavigate(bpy.types.Panel):
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_label = "Fast Navigate"
bl_options = {"DEFAULT_CLOSED"}
def draw(self, context):
layout = self.layout
# Tools
scene = context.scene
row = layout.row(align=True)
row.alignment = 'LEFT'
row.operator("view3d.fast_navigate_operator")
row.operator("view3d.fast_navigate_stop")
layout.label("Settings :")
row = layout.row()
box = row.box()
box.prop(scene,"OriginalMode")
box.prop(scene,"FastMode")
box.prop(scene, "EditActive", "Edit mode")
box.prop(scene, "Delay")
box.prop(scene, "DelayTimeGlobal", "Delay time")
box.alignment = 'LEFT'
box.prop(scene,"ShowParticles")
box.prop(scene,"ParticlesPercentageDisplay")
# main class for Display Mode
class VIEW3D_PT_DisplayMode(bpy.types.Panel):
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_label = "Display Mode"
bl_options = {"DEFAULT_CLOSED"}
def draw(self, context):
layout = self.layout
# Tools
col = layout.column()
col.alignment = 'EXPAND'
row = col.row()
row.operator("view3d.display_textured" , icon ='TEXTURE_SHADED')
row.operator("view3d.display_solid" , icon ='SOLID')
col = layout.column()
col.alignment = 'EXPAND'
row = col.row()
row.operator("view3d.display_wire" , icon = 'WIRE')
row.operator("view3d.display_bounds" , icon = 'BBOX')
# main class for Shading Setup
class VIEW3D_PT_ShadingSetup(bpy.types.Panel):
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_label = "Shading Setup"
bl_options = {"DEFAULT_CLOSED"}
def draw(self, context):
layout = self.layout
# Tools
col = layout.column(align=True)
row = col.row()
row.operator("view3d.display_shade_smooth")
row.operator("view3d.display_shade_flat")
row = col.row()
row.operator("view3d.display_shadeless_on", "Shadeless On",\
icon = 'SOLID')
row.operator("view3d.display_shadeless_off",\
"Shadeless Off", icon = 'SOLID')
row = col.row()
row.operator("view3d.display_wire_on", "Wire On", icon = 'WIRE')
row.operator("view3d.display_wire_off", "Wire Off", icon = 'WIRE')
row = col.row()
row.operator("view3d.display_bounds_on", "Bounds On", icon = 'BBOX')
row.operator("view3d.display_bounds_off", "Bounds Off", icon = 'BBOX')
row = col.row()
row.operator("view3d.display_double_sided_on",\
"DSided On", icon = 'MESH_DATA')
row.operator("view3d.display_double_sided_off",\
"DSided Off", icon = 'MESH_DATA')
row = col.row()
row.operator("view3d.display_x_ray_on",\
"XRay On", icon = 'GHOST_ENABLED')
row.operator("view3d.display_x_ray_off",\
"XRay Off", icon = 'GHOST_ENABLED')
row = col.row()
row.separator()
row = col.row()
scene = context.scene
row.prop(scene, "BoundingMode")
# main class for Scene Visualization
class VIEW3D_PT_SceneVisualization(bpy.types.Panel):
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_label = "Scene Visualization"
bl_options = {"DEFAULT_CLOSED"}
def draw(self, context):
layout = self.layout
# Tools
scene = context.scene
render = scene.render
space = context.space_data
layout.prop(space, "show_manipulator")
layout.prop(space, "show_outline_selected")
layout.prop(space, "show_only_render")
layout.prop(space, "show_textured_solid")
layout.prop(space, "show_backface_culling")
layout.prop(space, "show_all_objects_origin")
layout.prop(render,"use_simplify", "Simplify")
if scene.render.use_simplify == True:
layout.label("Settings :")
row = layout.row()
box = row.box()
box.prop(render, "simplify_subdivision", "Subdivision")
box.prop(render, "simplify_shadow_samples", "Shadow Samples")
box.prop(render, "simplify_child_particles", "Child Particles")
box.prop(render, "simplify_ao_sss", "AO and SSS")
layout.operator("view3d.display_simplify")
# main class for Modifier Tools
class VIEW3D_PT_ModifierTools(bpy.types.Panel):
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_label = "Modifier Tools"
bl_options = {"DEFAULT_CLOSED"}
def draw(self, context):
layout = self.layout
# Tools
layout.label("Modifiers", icon = 'MODIFIER')
col = layout.column(align=True)
col.alignment = 'EXPAND'
row = col.row()
row.operator("view3d.display_modifiers_render_on",\
icon = 'RENDER_STILL')
row.operator("view3d.display_modifiers_render_off")
row.operator("view3d.display_modifiers_viewport_on",
icon = 'RESTRICT_VIEW_OFF')
row.operator("view3d.display_modifiers_viewport_off")
col = layout.column(align=True)
col.alignment = 'EXPAND'
row = col.row()
row.operator("view3d.display_modifiers_edit_on", icon = 'EDITMODE_HLT')
row.operator("view3d.display_modifiers_edit_off")
row.operator("view3d.display_modifiers_cage_on",\
icon = 'EDITMODE_DEHLT')
row.operator("view3d.display_modifiers_cage_off")
row = layout.row(align=True)
row.operator("view3d.display_modifiers_expand", icon = 'TRIA_DOWN')
row.operator("view3d.display_modifiers_collapse", icon = 'TRIA_RIGHT')
row = layout.row(align=True)
row.operator("view3d.display_modifiers_apply", icon = 'MODIFIER')
row.operator("view3d.display_modifiers_delete", icon = 'X')
row = layout.row(align=True)
row.operator("view3d.display_modifiers_set_dummy",\
icon = 'OUTLINER_OB_ARMATURE')
# register the classes
def register():
bpy.utils.register_class(FastNavigate)
bpy.utils.register_class(DisplayTextured)
bpy.utils.register_class(DisplaySolid)
bpy.utils.register_class(DisplayWire)
bpy.utils.register_class(DisplayBounds)
bpy.utils.register_class(DisplayWireframeOn)
bpy.utils.register_class(DisplayWireframeOff)
bpy.utils.register_class(DisplayBoundsOn)
bpy.utils.register_class(DisplayBoundsOff)
bpy.utils.register_class(DisplayShadeSmooth)
bpy.utils.register_class(DisplayShadeFlat)
bpy.utils.register_class(DisplayShadelessOn)
bpy.utils.register_class(DisplayShadelessOff)
bpy.utils.register_class(DisplayDoubleSidedOn)
bpy.utils.register_class(DisplayDoubleSidedOff)
bpy.utils.register_class(DisplayXRayOn)
bpy.utils.register_class(DisplayXRayOff)
bpy.utils.register_class(DisplayModifiersRenderOn)
bpy.utils.register_class(DisplayModifiersRenderOff)
bpy.utils.register_class(DisplayModifiersViewportOn)
bpy.utils.register_class(DisplayModifiersViewportOff)
bpy.utils.register_class(DisplayModifiersEditOn)
bpy.utils.register_class(DisplayModifiersEditOff)
bpy.utils.register_class(DisplayModifiersCageOn)
bpy.utils.register_class(DisplayModifiersCageOff)
bpy.utils.register_class(DisplayModifiersExpand)
bpy.utils.register_class(DisplayModifiersCollapse)
bpy.utils.register_class(DisplayModifiersApply)
bpy.utils.register_class(DisplayModifiersDelete)
bpy.utils.register_class(DisplayAddDummy)
bpy.utils.register_class(DisplaySimplify)
bpy.utils.register_module(__name__)
pass
def unregister():
bpy.utils.unregister_class(FastNavigate)
bpy.utils.unregister_class(DisplayTextured)
bpy.utils.unregister_class(DisplaySolid)
bpy.utils.unregister_class(DisplayWire)
bpy.utils.unregister_class(DisplayBounds)
bpy.utils.unregister_class(DisplayShadeSmooth)
bpy.utils.unregister_class(DisplayShadeFlat)
bpy.utils.unregister_class(DisplayShadelessOn)
bpy.utils.unregister_class(DisplayShadelessOff)
bpy.utils.unregister_class(DisplayWireframeOn)
bpy.utils.unregister_class(DisplayWireframeOff)
bpy.utils.unregister_class(DisplayBoundsOn)
bpy.utils.unregister_class(DisplayBoundsOff)
bpy.utils.unregister_class(DisplayDoubleSidedOn)
bpy.utils.unregister_class(DisplayDoubleSidedOff)
bpy.utils.unregister_class(DisplayXRayOn)
bpy.utils.unregister_class(DisplayXRayOff)
bpy.utils.unregister_class(DisplayModifiersRenderOn)
bpy.utils.unregister_class(DisplayModifiersRenderOff)
bpy.utils.unregister_class(DisplayModifiersViewportOn)
bpy.utils.unregister_class(DisplayModifiersViewportOff)
bpy.utils.unregister_class(DisplayModifiersEditOn)
bpy.utils.unregister_class(DisplayModifiersEditOff)
bpy.utils.unregister_class(DisplayModifiersCageOn)
bpy.utils.unregister_class(DisplayModifiersCageOff)
bpy.utils.unregister_class(DisplayModifiersExpand)
bpy.utils.unregister_class(DisplayModifiersCollapse)
bpy.utils.unregister_class(DisplayModifiersApply)
bpy.utils.unregister_class(DisplayModifiersDelete)
bpy.utils.unregister_class(DisplayAddDummy)
bpy.utils.unregister_class(DisplaySimplify)
bpy.utils.unregister_module(__name__)
pass
if __name__ == "__main__":
register()