Take the 2-minute tour ×
Blender Stack Exchange is a question and answer site for people who use Blender to create 3D graphics, animations, or games. It's 100% free, no registration required.

I have had a look at Baking smoke on a headless machine, however, I cannot figure out my way from there to bake dynamic paint on a headless machine. This is what I have come up with by now:

import bpy

for scene in bpy.data.scenes:
    for object in scene.objects:
        for modifier in object.modifiers:
            if modifier.type == 'DYNAMIC_PAINT':
                override = {'scene': scene, 'object': object}
                bpy.ops.dpaint.bake(override)
                break

However, I get:

PyContext 'window' not found
PyContext 'window' not found
PyContext 'window' not found
Error: Bake failed: invalid canvas
Error: Bake failed: invalid canvas

Traceback (most recent call last):
  File "/home/horazont/baker.py", line 8, in <module>
    bpy.ops.dpaint.bake(override)
  File "/usr/share/blender/2.69/scripts/modules/bpy/ops.py", line 186, in __call__
    ret = op_call(self.idname_py(), C_dict, kw, C_exec, C_undo)
RuntimeError: Error: Bake failed: invalid canvas


Blender quit

Which parameters do I have to pass to the operator?

share|improve this question

1 Answer 1

up vote 4 down vote accepted
import bpy

obj=bpy.data.objects['Cube']
modifier=obj.modifiers['Dynamic Paint']
canvas_surface=modifier.canvas_settings.canvas_surfaces['Surface']
point_cache=canvas_surface.point_cache

context={}
context['blend_data']=bpy.data
context['scene']=bpy.data.scenes['Scene']
context['active_object']=obj
context['point_cache']=point_cache

bpy.ops.ptcache.bake(context,bake=True)

Objects can be both a brush and a canvas. The baking is done by the surfaces of the canvas. So an additional iteration is necessary.

#...
for modifier in obj.modifiers:
    if modifier.type=='DYNAMIC_PAINT':
        #additional iteration
        for canvas_surface in modifier.canvas_settings.canvas_surfaces:
             context['active_object']=obj
             context['point_cache']=canvas_surface.point_cache
             bpy.ops.ptcache.bake(context,bake=True)
share|improve this answer
    
Made an edit. modifier.ui_type is used by the user interface to remember the state of the tab and does not indicate wether the object is a brush or a canvas. in fact it can be both. –  pink vertex Feb 4 at 15:44

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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