1
$\begingroup$

I'm using Blender 2.76 on a Win 7 x64 machine.

I should warn you I'm new to Blender & 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.

enter image description here

I tried swapping cube1 for cube2 & 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)

enter image description here

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)
$\endgroup$
2
  • $\begingroup$ The darker, smaller cube in your scene probably has reversed normals. Fix it by selecting all verts in edit mode and pressing Ctrl + N. This confuses the boolean modifier and might result with a different operation than expected. $\endgroup$ – TLousky Mar 3 '16 at 15:42
  • $\begingroup$ I just attempted to flip the normals (see EDIT in OP) but this seems to have had no effect. $\endgroup$ – DrBwts Mar 3 '16 at 16:26
2
$\begingroup$

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)
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.