Page MenuHome

object_drop_to_ground.py

object_drop_to_ground.py

# ##### 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_addon_info = {
"name": "Drop to ground",
"author": "Unnikrishnan(kodemax), Florian Meyer(testscreenings)",
"version": (1, 0),
"blender": (2, 5, 5),
"api": 33333,
"location": "Tool shelf",
"description": "Drops the selected objects to the active object",
"warning": "Before using it do :- ctrl+a -> apply rotation on the object to be dropped",
"wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/Scripts/Object/Drop_to_ground",
"tracker_url": "",
"category": "Object"}
import bpy
from bpy.props import *
import mathutils
import math
def get_align_matrix(location, normal):
up = mathutils.Vector((0,0,1))
angle = normal.angle(up)
axis = up.cross(normal)
mat_rot = mathutils.Matrix.Rotation(angle, 4, axis)
mat_loc = mathutils.Matrix.Translation(location)
mat_align = mat_loc * mat_rot
return mat_align
def get_lowest_Coord1(ob):
matrix = ob.matrix_world.copy()
verts = ob.data.vertices
lowest = mathutils.Vector((0,0,10000))
for vert in verts:
if (vert.co * matrix).z < lowest.z:
lowest = vert.co * matrix
return lowest
def do_drop(context,tmpObj, ob):
print('\n', ob.name)
lowest = get_lowest_Coord1(ob)
location, normal, index = tmpObj.ray_cast(lowest, lowest + mathutils.Vector((0,0,-10000)))
if not index == -1:
temp = (bpy.context.scene.cursor_location).copy()
bpy.context.scene.cursor_location = lowest
bpy.ops.object.origin_set(type = 'ORIGIN_CURSOR')
sca = ob.scale.copy()
mat_align = get_align_matrix(location, normal)
ob.matrix_world = mat_align
ob.scale = sca
bpy.context.scene.cursor_location = temp
bpy.ops.object.origin_set(type = 'ORIGIN_GEOMETRY')
else:
print('\nno hit')
return
def main(self, context):
print('\n_______START__________')
obs = bpy.context.selected_objects
ground = bpy.context.active_object
obs.remove(ground)
context = bpy.context
sc = context.scene
tmpMesh = ground.create_mesh(sc, True, 'PREVIEW')
tmpMesh.transform(ground.matrix_world)
tmpObj = bpy.data.objects.new('tmpGround', tmpMesh)
tmpObj.update(sc, 1, 1, 1)
sc.objects.link(tmpObj)
sc.update()
for ob in obs:
bpy.ops.object.select_all(action='DESELECT')
ob.select = True
do_drop(context, tmpObj, ob)
bpy.ops.object.select_all(action='DESELECT')
tmpObj.select = True
bpy.ops.object.delete('EXEC_DEFAULT')
for ob in obs:
ob.select = True
ground.select = True
class VIEW3D_PT_tools_drop_to_ground(bpy.types.Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
bl_label = "Drop to ground"
bl_context = "objectmode"
def draw(self, context):
active_obj = context.active_object
layout = self.layout
col = layout.column(align=True)
col.operator("object.drop_to_ground", text="Drop")
class OBJECT_OT_drop_to_ground(bpy.types.Operator):
"""Drop to ground"""
bl_idname = "object.drop_to_ground"
bl_label = "Drop to ground"
bl_description = "Drops selected objects onto the active object"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
main(self, context)
return {'FINISHED'}
#### REGISTER ####
def register():
pass
def unregister():
pass
if __name__ == '__main__':
register()

File Metadata

Mime Type
text/x-python
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
5b/22/61f5e06359a07395122b816f30af

Event Timeline