Boolean difference not making any diiference (Python scripting) I'm using Blender 2.76 on a Win 7 x64 machine.

I should warn you I'm new to Blender &amp; its Python API although I have used Python extensively before I'm no expert.

I run the following script after start up (ie the default cube is already in the 3D work space).

import bpy

cube1 = bpy.context.active_object
bpy.ops.transform.resize(value=(2.0, 2.0, 0.9))
bpy.ops.object.modifier_add(type = 'BOOLEAN')
bpy.ops.mesh.primitive_cube_add(location=(0.0, 0.0, 0.0))
cube2 = bpy.context.active_object
cube1.modifiers[0].object = cube2
cube1.modifiers[0].operation = 'DIFFERENCE'
bpy.ops.object.modifier_apply(apply_as='DATA',modifier=cube1.modifiers[0].name)


My aim is to create a square hole through cube1 but so far I end up with no change to anything.



I tried swapping cube1 for cube2 &amp; this cut cube2 with cube1.

import bpy

cube1 = bpy.context.active_object
bpy.ops.transform.resize(value=(2.0, 2.0, 0.9))
bpy.ops.mesh.primitive_cube_add(location=(0.0, 0.0, 0.0))
cube2 = bpy.context.active_object
bpy.ops.object.modifier_add(type = 'BOOLEAN')
cube2.modifiers[0].object = cube1
cube2.modifiers[0].operation = 'DIFFERENCE'
bpy.ops.object.modifier_apply(apply_as='DATA',modifier=cube2.modifiers[0].name)




So what am I missing here?

EDIT:

I tried to flip the normals of cube2 (see code below) as per the comment below but this appears to have had no effect.

import bpy, bmesh

cube1 = bpy.context.active_object
bpy.ops.transform.resize(value=(2.0, 2.0, 0.9))
bpy.ops.object.modifier_add(type = 'BOOLEAN')
bpy.ops.mesh.primitive_cube_add(location=(0.0, 0.0, 0.0))
cube2 = bpy.context.active_object

b_cube2 = bmesh.new()
b_cube2.from_mesh(cube2.data)

bpy.ops.object.mode_set(mode='EDIT')
for v in b_cube2.verts:
    v.select = True
bpy.ops.mesh.flip_normals()
bpy.ops.object.mode_set(mode='OBJECT')

b_cube2.to_mesh(cube2.data)
cube1.modifiers[0].object = cube2
cube1.modifiers[0].operation = 'DIFFERENCE'
bpy.ops.object.modifier_apply(apply_as='DATA',modifier=cube1.modifiers[0].name)
Setting the context object to cube1 with context.scene.objects.active = cube1 before running the apply modifier fixes it.  Object operators run on the context.active_object, which was cube2.

import bpy
context = bpy.context 
scene = context.scene
cube1 = context.active_object
bpy.ops.transform.resize(value=(2.0, 2.0, 0.9))
bpy.ops.object.modifier_add(type = 'BOOLEAN')
bpy.ops.mesh.primitive_cube_add(location=(0.0, 0.0, 0.0))
cube2 = context.active_object
cube1.modifiers[0].object = cube2
cube1.modifiers[0].operation = 'DIFFERENCE'

scene.objects.active = cube1
bpy.ops.object.modifier_apply(apply_as='DATA',modifier=cube1.modifiers[0].name)


A less operator-centric approach

import bpy
context = bpy.context 
scene = context.scene

cube1 = context.active_object
cube2 = cube1.copy()
# create a copy of mesh data, for bool mod
cube2.data = cube1.data.copy()
cube1.scale = (2.0, 2.0, 0.9)
mod = cube1.modifiers.new("SomeName", type='BOOLEAN')
mod.operation = 'DIFFERENCE'
# uncomment below to have cube2 in scene
#scene.objects.link(cube2)
mod.object = cube2
bpy.ops.object.modifier_apply(apply_as='DATA', modifier=mod.name)


The modifier apply operator can also be replaced with

scene.update()
cube1.data = cube1.to_mesh(scene, True, 'PREVIEW')
cube1.modifiers.remove(mod)