4

A Text Datablock named "Text" exists. Within a 3D View operator, I'm attempting to generate the dialog for writing this Datablock to a file, where the user can select a folder and choose a filename. In my 3D View operator, I have:

def execute(self, context):
    area_type = bpy.context.area.type
    bpy.context.area.type = 'TEXT_EDITOR'
    context.space_data.text = bpy.data.texts["Text"]
    bpy.ops.text.save('INVOKE_DEFAULT')
    bpy.context.area.type = area_type

However, when executing the line bpy.ops.text.save(), the following error occurs:

File "/usr/share/blender/scripts/modules/bpy/ops.py", line 188, in \_\_call\_\_

ret = op_call(self.idname_py(), None, kw)
RuntimeError: Operator bpy.ops.text.save.poll() failed, context is incorrect

I expect I must better specify the context for bpy.ops.text.save. Any hints, advice, or a solution would be very welcomed. Thank you.

gandalf3
  • 157,169
  • 58
  • 601
  • 1,133

1 Answers1

4

About 'INVOKE_DEFAULT' and context override

While you can often override a context not all operators support it.

Examples of context overrides, in particular this one: context override in text editor, see also a more extensive explanation of context overriding. Avoid doing this whenever possible, there is in this case an alternative.

A more sane alternative.

I recommend that you spawn your own file save dialog - a template for that code exists. See Text Editor > Templates > Python > Operator File Export

To save a Text Datablock to disk is easy.

destination = '/home/zeffii/Desktop/file.txt'

text_reference = bpy.data.texts['Text'] with open(destination, 'w') as outfile: outfile.write(text_reference.as_string())

zeffii
  • 39,634
  • 9
  • 103
  • 186