177 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# ##### 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 #####
 | 
						|
 | 
						|
# <pep8 compliant>
 | 
						|
 | 
						|
# semi-useful script, runs all operators in a number of different
 | 
						|
# contexts, cheap way to find misc small bugs but is in no way a complete test.
 | 
						|
#
 | 
						|
# only error checked for here is a segfault.
 | 
						|
 | 
						|
import bpy
 | 
						|
import sys
 | 
						|
 | 
						|
op_blacklist = (
 | 
						|
    "script.reload",
 | 
						|
    "export*.*",
 | 
						|
    "import*.*",
 | 
						|
    "*.save_*",
 | 
						|
    "*.read_*",
 | 
						|
    "*.open_*",
 | 
						|
    "*.link_append",
 | 
						|
    "render.render",
 | 
						|
    "*.*_export",
 | 
						|
    "*.*_import",
 | 
						|
    "wm.url_open",
 | 
						|
    "wm.doc_view",
 | 
						|
    "wm.path_open",
 | 
						|
    "help.operator_cheat_sheet",
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def filter_op_list(operators):
 | 
						|
    from fnmatch import fnmatchcase
 | 
						|
 | 
						|
    def is_op_ok(op):
 | 
						|
        for op_match in op_blacklist:
 | 
						|
            if fnmatchcase(op, op_match):
 | 
						|
                print("    skipping: %s (%s)" % (op, op_match))
 | 
						|
                return False
 | 
						|
        return True
 | 
						|
 | 
						|
    operators[:] = [op for op in operators if is_op_ok(op[0])]
 | 
						|
 | 
						|
 | 
						|
def run_ops(operators, setup_func=None):
 | 
						|
    print("\ncontext:", setup_func.__name__)
 | 
						|
    # first invoke
 | 
						|
    for op_id, op in operators:
 | 
						|
        if op.poll():
 | 
						|
            print("    operator:", op_id)
 | 
						|
            sys.stdout.flush()  # incase of crash
 | 
						|
 | 
						|
            # disable will get blender in a bad state and crash easy!
 | 
						|
            bpy.ops.wm.read_factory_settings()
 | 
						|
 | 
						|
            setup_func()
 | 
						|
 | 
						|
            for mode in ('EXEC_DEFAULT', 'INVOKE_DEFAULT'):
 | 
						|
                try:
 | 
						|
                    op(mode)
 | 
						|
                except:
 | 
						|
                    #import traceback
 | 
						|
                    #traceback.print_exc()
 | 
						|
                    pass
 | 
						|
 | 
						|
 | 
						|
# contexts
 | 
						|
def ctx_clear_scene():  # copied from batch_import.py
 | 
						|
    unique_obs = set()
 | 
						|
    for scene in bpy.data.scenes:
 | 
						|
        for obj in scene.objects[:]:
 | 
						|
            scene.objects.unlink(obj)
 | 
						|
            unique_obs.add(obj)
 | 
						|
 | 
						|
    # remove obdata, for now only worry about the startup scene
 | 
						|
    for bpy_data_iter in (bpy.data.objects, bpy.data.meshes, bpy.data.lamps, bpy.data.cameras):
 | 
						|
        for id_data in bpy_data_iter:
 | 
						|
            bpy_data_iter.remove(id_data)
 | 
						|
 | 
						|
 | 
						|
def ctx_editmode_mesh():
 | 
						|
    bpy.ops.object.mode_set(mode='EDIT')
 | 
						|
    bpy.ops.object.vertex_group_add()
 | 
						|
 | 
						|
 | 
						|
def ctx_editmode_curves():
 | 
						|
    bpy.ops.curve.primitive_nurbs_circle_add()
 | 
						|
    bpy.ops.object.mode_set(mode='EDIT')
 | 
						|
 | 
						|
 | 
						|
def ctx_editmode_surface():
 | 
						|
    bpy.ops.surface.primitive_nurbs_surface_torus_add()
 | 
						|
    bpy.ops.object.mode_set(mode='EDIT')
 | 
						|
 | 
						|
 | 
						|
def ctx_editmode_mball():
 | 
						|
    bpy.ops.object.metaball_add()
 | 
						|
    bpy.ops.object.mode_set(mode='EDIT')
 | 
						|
 | 
						|
 | 
						|
def ctx_editmode_text():
 | 
						|
    bpy.ops.object.text_add()
 | 
						|
    bpy.ops.object.mode_set(mode='EDIT')
 | 
						|
 | 
						|
 | 
						|
def ctx_editmode_armature():
 | 
						|
    bpy.ops.object.armature_add()
 | 
						|
    bpy.ops.object.mode_set(mode='EDIT')
 | 
						|
 | 
						|
 | 
						|
def ctx_editmode_lattice():
 | 
						|
    bpy.ops.object.add(type='LATTICE')
 | 
						|
    bpy.ops.object.mode_set(mode='EDIT')
 | 
						|
    # bpy.ops.object.vertex_group_add()
 | 
						|
 | 
						|
 | 
						|
def ctx_object_empty():
 | 
						|
    bpy.ops.object.add(type='EMPTY')
 | 
						|
 | 
						|
 | 
						|
def ctx_weightpaint():
 | 
						|
    bpy.ops.object.mode_set(mode='WEIGHT_PAINT')
 | 
						|
 | 
						|
 | 
						|
def main():
 | 
						|
    # bpy.ops.wm.read_factory_settings()
 | 
						|
    import bpy
 | 
						|
    operators = []
 | 
						|
    for mod_name in dir(bpy.ops):
 | 
						|
        mod = getattr(bpy.ops, mod_name)
 | 
						|
        for submod_name in dir(mod):
 | 
						|
            op = getattr(mod, submod_name)
 | 
						|
            operators.append(("%s.%s" % (mod_name, submod_name), op))
 | 
						|
 | 
						|
    operators.sort(key=lambda op: op[0])
 | 
						|
 | 
						|
    filter_op_list(operators)
 | 
						|
 | 
						|
    # for testing, mix the list up.
 | 
						|
    #operators.reverse()
 | 
						|
 | 
						|
    #import random
 | 
						|
    #random.shuffle(operators)
 | 
						|
 | 
						|
    # Run the operator tests in different contexts
 | 
						|
    run_ops(operators, setup_func=lambda: None)
 | 
						|
    run_ops(operators, setup_func=ctx_editmode_surface)
 | 
						|
    run_ops(operators, setup_func=ctx_object_empty)
 | 
						|
    run_ops(operators, setup_func=ctx_editmode_armature)
 | 
						|
    run_ops(operators, setup_func=ctx_editmode_mesh)
 | 
						|
    run_ops(operators, setup_func=ctx_clear_scene)
 | 
						|
    run_ops(operators, setup_func=ctx_editmode_curves)
 | 
						|
    run_ops(operators, setup_func=ctx_editmode_mball)
 | 
						|
    run_ops(operators, setup_func=ctx_editmode_text)
 | 
						|
    run_ops(operators, setup_func=ctx_weightpaint)
 | 
						|
    run_ops(operators, setup_func=ctx_editmode_lattice)
 | 
						|
 | 
						|
    print("finished")
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |