Blender 3.0: Python API¶
Bundled Python¶
zstandardpackage was added to bundled python to enable scripts to manipulate zstd-compressed .blend files (a5917175, see also the .blend file read/write release notes).
Text Editor¶
- The "Register" option to run Python scripts on startup no longer
requires a
.pyextension in the name (3e775a4fc5).
Other Additions¶
- Added multi-dimensional array support for
bpy.propsvector types (FloatVectorProperty,IntVectorProperty,BoolVectorProperty). (bc0a7d3fae).
Example that defines a 4x4 matrix property:
- Sequencer: Add Sequence.parent_meta() python API function (eec1ea0ccf)
- In a File Browser, a list of selected files can be queried via
bpy.context.selected_files(7ec839adfa). - In a File Browser,
FileSelectEntry.relative_pathgives a file's path (including the file name) relative to the currently displayed directory. This becomes relevant when the File Browser is set to show multiple levels of recursion. Multiple files with the same name may be visible then. So do not use the file name to reference file, useFileSelectEntry.relative_pathinstead. (79281336c0) mathutils.{Vector/Matrix/Euler/Color/Quaternion}now have anis_validattribute which can be used to check if their owner is still valid (0950cfd9d5).- Area maintenance "Close" can now be scripted, eg:
bpy.ops.screen.area_close({"area": bpy.context.screen.areas[0]}). (9290b41381) - User Interface: expose additional mouse cursors [
PICK_AREA,STOP,COPY,CROSS,MUTE,ZOOM_IN,ZOOM_OUT] (6bf8c95e52). - User Interface: new operator setting for
bl_optionscalledDEPENDS_ON_CURSORto be used so operators wait for input when accessed from menus (da2ba40268). - User Interface: support setting the cursor when
DEPENDS_ON_CURSORis used viaOperatorType.bl_cursor_pending(2a8e5128c1).
Other Changes¶
- Added functions to ensure and clear an RNA struct's IDProperties:
id_properties_clear()andid_properties_ensure()(c202d38659). - Added
Operator.poll_message_set(message, ...)
Operators can now set a message for why an operators poll function fails (ebe04bd3ca). - New
bpy.app.handlers.xr_session_start_prehandler that executes when starting a virtual reality session. Main use-case is to pass a VR controller action map (the XR equivalent of a key-map) to the session (cb12fb78ca). - New
XrSessionSettings.use_absolute_trackingproperty that, whentrue, allows the VR tracking origin to be defined independently of the headset position (36c0649d32). - New
XrSessionSettings.base_scaleproperty that defines the VR viewer's reference scale (3434a991ec). - New
XrSessionSettingsproperties for VR overlays (show_selection,show_controllers,show_custom_overlays) and controller visualization (controller_draw_style) (9dda65455b). - New
XrSessionStatemethods for VR actions (e844e9e8f3).- Action creation:
action_set_create(),action_create(),action_binding_create(),active_action_set_set(),controller_pose_actions_set() - Action querying:
action_state_get() - Haptics:
haptic_action_apply(),haptic_action_stop() - Controller poses:
controller_grip_location_get(),controller_grip_rotation_get(),controller_aim_location_get(),controller_aim_rotation_get()
- Action creation:
- New
XrSessionState.actionmapscollection property to store default VR action maps. Main use-case is to load default action maps from a Python script into this collection and then create actions for the session during thexr_session_start_prehandler (e844e9e8f3). - New
XrSessionState.navigation_location/rotation/scaleproperties that allow the VR viewer to navigate the viewport by adding these deltas to the viewer's base pose/scale (3434a991ec). - New
XR_ACTIONevent type andEvent.xrproperty for accessing XR event data such as input states and controller poses (cdeb506008). - New
XRregion type for drawing to the VR viewport (headset display) and mirror region. Add-ons can useSpace.draw_handler_add()with region typeXRand draw typePOST_VIEWfor VR custom drawing (9dda65455b). - New
Matrix.LocRotScaleconstructor for combining all transformation channels into a matrix in one call. (a86e815dd8).
Breaking Changes¶
- Replaced
PoseBone.custom_shape_scalescalar with aPoseBone.custom_shape_scale_xyzvector; in addition,custom_shape_translationandcustom_shape_rotation_eulerwere added. (fc5bf09fd8) - Renamed
bbone_curveiny/bbone_curveoutytobbone_curveinz/bbone_curveoutz. Combined scale channels intobbone_scalein.x/y/zandbbone_scaleout.x/y/zvectors, with originalyalso becomingzto make space for an actual Y scale channel. (682a74e090) - Remove unused
BMesh.from_objectdeform argument (ead084b6e1). - Remove
context.active_base(44db4e50b2). - Remove use of
wiki_urlfor add-onsbl_info(use "doc_url" instead) (aaa07a3a8f). - Remove
IDPropertyGroup.iteritems, nowkeys,values&itemsall use iterators (265d97556a). - Some RNA accessors were creating data, which is very bad on design
level for several reasons, the following were changed:
- Force fields and collision settings (
Object.field,Object.collision,ParticleSettings.force_field_1andParticleSettings.force_field_2). Object ones can beNoneand need to be added explicitly now (Collisionmodifier andforcefield_toggleoperator), particle ones are always generated together with particles settings. - ID preview can be
None, can use the newpreview_ensurefunction first then.
- Force fields and collision settings (
- Remove
bpy.app.binary_path_python(90b0fb135f) (usesys.executableinstead) - Replace
UI_EMBOSS_NONE_OR_STATUSwithNONE_OR_STATUSinUILayout.emboss(0afe4e81cb). - Remove non-functional
renderable_onlyarg frombpy.ops.wm.alembic_export(834e87af7b). - Move
preferences.view.show_layout_uitopreferences.apps.show_corner_split(9fee59a484). - Rename
bpy.types.TOPBAR_MT_appandbpy.types.TOPBAR_MT_app_systemtobpy.types.TOPBAR_MT_blenderandbpy.types.TOPBAR_MT_blender_system(58043c0637). - Remove icon
SMALL_TRI_RIGHT_VEC(useDISCLOSURE_TRI_RIGHTfor a similar icon). (368d794407).
IDProperty UI Data API¶
IDProperty UI data storage was refactored to remove the special
_RNA_UI subgroup, adding a proper manager for a property's UI data
(8b9a3b94fc).

_RNA_UI subgroup.

- Python objects with custom properties now have an
id_properties_ui(prop_name)method, which returns a manager for the UI data, with the following methods:update: Update UI data values, likemin=1.0ordefault="new_default"as_dict: Returns a dictionary containing the UI data valuesclear: Removes the property's UI data.update_from: Copy UI data between properties, even if they have different owners.
- Note: code that simply wants to create a property with UI data is
advised to switch to the
rna_idprop_ui_createutility function from therna_prop_uimodule, which has existed since 2.80 and was transparently updated to preserve compatibility through this change to the internals.
Supported UI Data
| Property Type | Min | Max | Soft Min | Soft Min | Step | Precision | Default | Subtype | Description |
|---|---|---|---|---|---|---|---|---|---|
| Float | X | X | X | X | X | X | X (and arrays) | X | X |
| Integer | X | X | X | X | X | X | X (and arrays) | X | X |
| String | X | X | X | ||||||
| ID | X | X |
Geometry Instancing¶
Previously, objects were the smallest unit of instancing. Now, object-data, such as meshes, can be instanced without creating an object with that data first. (5a9a16334c)
The API for accessing instances did not change, one just has to be more careful now.
import bpy
depsgraph = bpy.context.view_layer.depsgraph
for object_instance in depsgraph.object_instances:
if object_instance.is_instance:
print(object_instance.object.data, object_instance.instance_object.data)
Previously, .object.data and .instance_object.data were always
the same. Now they can be different and it is correct to use
.object.data.
object_instance.object: A temporary object wrapping the instance. References to this object must not be stored between loop iterations.object_instance.object.data: Actual object-data/geometry of the instance. This data should be rendered/exported. It can be stored between loop iterations and is still valid after the loop.object_instance.matrix_world: Transformation matrix of the instance.object_instance.instance_object: Object that created and owns the instance.object_instance.instance_object.data: Data of the object that created the instance. This should probably never be used now.
Use Keyword Only Arguments¶
addon_utils.module_bl_info2nd arginfo_basis.addon_utils.modules1stmodule_cache, 2nd argrefresh.addon_utils.modules_refresh1st argmodule_cache.bl_app_template_utils.activate1nd argtemplate_id.bl_app_template_utils.import_from_id2nd argignore_not_found.bl_app_template_utils.import_from_path2nd argignore_not_found.bl_keymap_utils.keymap_from_toolbar.generate2nd & 3rd argsuse_fallback_keys&use_reset.bl_keymap_utils.platform_helpers.keyconfig_data_oskey_from_ctrl2nd argfilter_fn.bl_ui_utils.bug_report_url.url_prefill_from_blender1st argaddon_info.bmesh.types.BMFace.copy1st & 2nd argsverts,edges.bmesh.types.BMesh.calc_volume1st argsigned.bmesh.types.BMesh.from_mesh2nd..4th argsface_normals,use_shape_key,shape_key_index.bmesh.types.BMesh.from_object3rd & 4th argscage,face_normals.bmesh.types.BMesh.transform2nd argfilter.bmesh.types.BMesh.update_edit_mesh2nd & 3rd argsloop_triangles,destructive.bmesh.types.{BMVertSeq,BMEdgeSeq,BMFaceSeq}.sort1st & 2nd argkey,reverse.bmesh.utils.face_split4th..6th argscoords,use_exist,example.bpy.data.libraries.load2nd..4th argslink,relative,assets_only.bpy.data.user_map1st..3rd argssubset,key_types,value_types.bpy.msgbus.subscribe_rna5th argoptions.bpy.path.abspath2nd & 3rd argsstart&library.bpy.path.clean_name2nd argreplace.bpy.path.ensure_ext3rd argcase_sensitive.bpy.path.module_names2nd argrecursive.bpy.path.relpath2nd argstart.bpy.types.EditBone.transform2nd & 3rd argscale,roll.bpy.types.Operator.as_keywords1st argignore.bpy.types.Struct.{keyframe_insert,keyframe_delete}2nd..5th argsindex,frame,group,options.bpy.types.WindowManager.popup_menu2nd & 3rd argtitle,icon.bpy.types.WindowManager.popup_menu_pie3rd & 4th argtitle,icon.bpy.utils.app_template_paths1st argsubdir.bpy.utils.app_template_paths1st argsubdir.bpy.utils.blend_paths1st..3rd argsabsolute,packed,local.bpy.utils.execfile2nd argmod.bpy.utils.keyconfig_set2nd argreport.bpy.utils.load_scripts1st & 2ndreload_scripts&refresh_scripts.bpy.utils.preset_find3rd & 4th argsdisplay_name,ext.bpy.utils.resource_path2nd & 3rd argmajor,minor.bpy.utils.script_paths1st..4th argssubdir,user_pref,check_all,use_user.bpy.utils.smpte_from_frame2nd & 3rd argsfps,fps_base.bpy.utils.smpte_from_seconds2nd & 3rd argsfps,fps_base.bpy.utils.system_resource2nd argsubdir.bpy.utils.time_from_frame2nd & 3rd argsfps,fps_base.bpy.utils.time_to_frame2nd & 3rd argsfps,fps_base.bpy.utils.units.to_string4th..6thprecision,split_unit,compatible_unit.bpy.utils.units.to_value4th argstr_ref_unit.bpy.utils.user_resource2nd & 3rd argssubdir,createbpy_extras.view3d_utils.location_3d_to_region_2d4th argdefault.bpy_extras.view3d_utils.region_2d_to_origin_3d4th argclamp.gpu.offscreen.unbind1st argrestore.gpu_extras.batch.batch_for_shader4th argindices.gpu_extras.batch.presets.draw_circle_2d4th argsegments.gpu_extras.presets.draw_circle_2d4th argsegments.imbuf.types.ImBuf.resize2nd argresize.imbuf.write2nd argfilepath.mathutils.kdtree.KDTree.find2nd argfilter.nodeitems_utils.NodeCategory3rd & 4th argdescriptions,items.nodeitems_utils.NodeItem2nd..4th argslabel,settings,poll.nodeitems_utils.NodeItemCustom1st & 2nd argpoll,draw.rna_prop_ui.draw5th arguse_edit.rna_prop_ui.rna_idprop_ui_get2nd argcreate.rna_prop_ui.rna_idprop_ui_prop_clear3rd argremove.rna_prop_ui.rna_idprop_ui_prop_get3rd argcreate.rna_xml.xml2rna2nd argroot_rna.rna_xml.xml_file_write4th argskip_typemap.
See commit (f29a738e23).
Motion Blur Velocities¶
Fluid and Alembic modifier properties for vertex velocities were removed. These were used for motion blur on meshes with changing topology, where vertex positions can't be matched with other frames. (128eb6c)
FluidDomainSettings.mesh_verticesMeshSequenceCacheModifier.vertex_velocities,MeshSequenceCacheModifier.has_velocity,MeshSequenceCacheModifier.read_velocity
Instead, renderers and exporters should use the velocity attribute
on meshes.
for attribute in mesh.attributes:
if attribute.name == 'velocity' and attribute.data_type == 'FLOAT_VECTOR':
print([item.vector for item in attribute.data])
The unit of velocity also changed, it is now Blender scene distance units per second. Previously vertex velocities were relative to frames instead of seconds.