Here's an updated version of float's answer. This solution is for Blender versions 2.93, 3.0, 3.1, 3.2, and 3.3
import bpy
import math
win = bpy.context.window
scr = win.screen
def use_temp_override():
version = bpy.app.version
major = version[0]
minor = version[1]
return not (major < 3 or (major == 3 and minor < 2))
def get_areas(type):
return [area for area in scr.areas if area.type == type]
def get_regions(areas):
return [region for region in areas[0].regions if region.type == 'WINDOW']
def execute():
bpy.context.scene.cursor.location = (0,0,0)
a = 10
b = 2
c = 3
d = 5
width = a + b
distance = b / 2
x = (distance / (width / 2)) * math.pi * 0.5
cCircle = math.sqrt(1 - x**2)
factor = c / cCircle
areas = get_areas('VIEW_3D')
# ========================================================================================
# (if) execute using temp override
# ========================================================================================
if use_temp_override():
with bpy.context.temp_override(window=win, area=areas[0], regions=get_regions(areas)[0], screen=scr):
bpy.ops.view3d.snap_cursor_to_center()
bpy.ops.curve.primitive_bezier_circle_add(radius=1, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))
bpy.ops.transform.resize(value=((width)/2, factor, 1), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
bpy.context.scene.cursor.location = (-((width) / 2 ) + b, 0, 0)
bpy.ops.object.origin_set(type='ORIGIN_CURSOR')
bpy.ops.transform.translate(value=((width/2) - b, 0, 0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
# ========================================================================================
# (else) execute using legacy override
# ========================================================================================
else:
override = {
'window': win,
'screen': scr,
'area': areas[0],
'region': get_regions(areas)[0],
}
bpy.ops.view3d.snap_cursor_to_center(override)
bpy.ops.curve.primitive_bezier_circle_add(override, radius=1, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))
bpy.ops.transform.resize(override, value=((width)/2, factor, 1), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
bpy.context.scene.cursor.location = (-((width) / 2 ) + b, 0, 0)
bpy.ops.object.origin_set(override, type='ORIGIN_CURSOR')
bpy.ops.transform.translate(override, value=((width/2) - b, 0, 0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
print("start ======")
execute()