#!/usr/bin/env python import bpy # from mathutils import Matrix from mathutils import Vector # from mathutils import Euler print("How to use: paste into a Blender Text Editor panel, select" " object, Run Script") y_up = True enable_minetest = True class MessageBox(bpy.types.Operator): bl_idname = "message.messagebox" bl_label = "" message = bpy.props.StringProperty( name="message", description="message", default='' ) def execute(self, context): self.report({'INFO'}, self.message) print(self.message) return {'FINISHED'} def invoke(self, context, event): return context.window_manager.invoke_props_dialog(self, width=400) def draw(self, context): self.layout.label(self.message) self.layout.label("") # col = self.layout.column(align = True) # col.prop(context.scene, "my_string_prop") ob1 = bpy.context.active_object # works with 2.7 or 2.8 # try: # # See # # for o in context.scene.objects: # # o.select_get() returns bool! # # To select it automatically: o.select_set(bool) # except: # # Blender version <= 2.79 # ob1 = bpy.context.scene.objects.active bpy.utils.register_class(MessageBox) if ob1 is None: msg = "Nothing is selected." # WRONG: # self.report({'ERROR'}, msg) bpy.ops.message.messagebox('INVOKE_DEFAULT', message=msg) else: loc1 = ob1.location # loc1 = ob1.matrix_world.translation # See mesh = ob1.data # print("mesh:" + str(mesh)) # print("hasattr(mesh, 'vertices'):" + str(hasattr(mesh, # 'vertices'))) xMin = None # Define so None check is possible later. if (mesh is not None) and (not hasattr(mesh, 'vertices')): print("--can't calculate collisionbox for skeleton") elif mesh is not None: xMin = None yMin = None zMin = None xMax = None yMax = None zMax = None # See wm = ob1.matrix_world newNamePrefix = "Empty.from." + ob1.name i = 0 for vert in mesh.vertices: name = newNamePrefix + "." + str(i) # This matrix multiplication is NOT transitive. try: loc = wm @ vert.co except TypeError: loc = wm * vert.co # Blender <2.8 # See also vert.co.x (and y and z) bpy.ops.object.add(type='EMPTY', radius=.25, location=loc) bpy.context.active_object.name = name # Also consider sambler's answer at # : # new_obj = bpy.data.objects.new(name, None) # , 'EMPTY')?? # new_obj.location = (x,y,z) # bpy.context.scene.objects.link(new_obj) # add to scene # The add_named code below doesn't work: # bpy.ops.object.add_named(name="Empty" + ob1.name, # type='EMPTY', radius=.25, # location=loc) i += 1 # bpy.ops.message.messagebox('INVOKE_DEFAULT', message = msg) # Unregistering before user clicks the MessageBox will crash Blender! # bpy.utils.unregister_class(MessageBox)