I am not sure if this is a bug or intended behavior, but using bpy.ops.wm.read_factory_settings(use_empty=True) reduces the context to a state where is cannot be used for many common operators, such as bpy.ops.transform.*.
This snippet illustrates the issue:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pprint import pprint as pp
import bpy
def _get_ctx():
for window in bpy.context.window_manager.windows:
screen = window.screen
for area in screen.areas:
if area.type == "VIEW_3D":
ctx = bpy.context.copy()
ctx["window"] = window
ctx["screen"] = screen
ctx["area"] = area
ctx["active_object"] = None
ctx["selected_objects"] = []
return ctx
if name == "main":
bpy.ops.wm.read_factory_settings(use_empty=True)
bpy.ops.mesh.primitive_monkey_add(size=2, enter_editmode=False, location=(0, 0, 0))
# Current context is missing needed data
pp(bpy.context.copy())
try:
bpy.ops.transform.rotate(value=1.570796, orient_axis="X", orient_type="GLOBAL")
except RuntimeError as e:
print(e)
# Add missing bits to context
ctx = _get_ctx()
ctx["selected_objects"] = list(bpy.data.objects)
pp(ctx)
bpy.ops.transform.rotate(ctx, value=1.570796, orient_axis="X", orient_type="GLOBAL")
The same snippet produces different output depending on whether this is run via cli with --background where adding selected_objects is unnecessary, whereas running via the script editor it is necessary to add selected_objects.
This issue extends to many operators, which makes it a pain to track down what needs to be patched into the context...
I can see that a similar question has been asked here: read_factory_settings makes all other operators call fail in a python script ran at startup
But the suggested answer doesn't work for my usecase. I have a function where I nuke the scene using bpy.ops.wm.read_factory_settings(use_empty=True), import an fbx, and then export in a specified format. The function may be called multiple times in a row in a loop if multiple export formats are desired. My script works fine when run via cli with --background due to the fact that more of the context remains intact after the call to bpy.ops.wm.read_factory_settings(use_empty=True).
TLDR: Is there a way to get a clean, fully valid context (similar to what one would expect after opening a fresh install of Blender with factory settings after deleting all objects in the scene) after running bpy.ops.wm.read_factory_settings(use_empty=True)?