From 7642ff5d5660e9e2853053f8ae6d6fca85f05016 Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 19 Feb 2026 10:37:19 -0700 Subject: [PATCH] redefine and fix migrate basebody shapkeys --- ...character-migrator-workflow-integration.md | 1742 ++++++++++++++++- ops/migrator.py | 56 +- ui/operators.py | 16 +- ui/panels.py | 2 +- 4 files changed, 1785 insertions(+), 31 deletions(-) diff --git a/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md b/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md index 11c127c..e01a34d 100644 --- a/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md +++ b/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md @@ -3164,8 +3164,6 @@ The spec story transcript might use slightly different wording. Let me search fo - - --- @@ -3261,8 +3259,6 @@ I'll update the plan file to use these names. - - --- @@ -3304,7 +3300,6 @@ I'll update the plan file to use these names throughout (operator ids, class nam --- - Updating the plan to name each step after the spec story (Copy attributes, Migrate NLA, Custom properties, Bone constraints, Retarget relations, Replacement base body). @@ -3359,8 +3354,6 @@ Fixed the typo in the plan - I had "utils__init__.py" in one place, should be "u - - --- @@ -3412,8 +3405,6 @@ There's a typo: utils__init__.py should be utils/__init__.py in the link. Let me - - --- @@ -3433,7 +3424,6 @@ Plan is updated. Summary for the user. --- - Summary of updates to the plan: **Step names (from spec story)** @@ -3483,8 +3473,6 @@ I'll start by reading the current operators and panels to implement the changes. - - --- @@ -3536,7 +3524,6 @@ Let me implement the six operators. Each one: --- - Adding the six step operators and a shared pair-resolve helper: @@ -3559,7 +3546,6 @@ I made a mistake - I left duplicate/broken code in run_character_migration. Ther --- - Fixing run_character_migration: removing the duplicate loop and incorrect call. @@ -3584,6 +3570,993 @@ Now add the six operator classes to OPERATOR_CLASSES. +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ui\operators.py + +
+ +
+ +--- + +
Thought Process + +Now update the panel to add the six step buttons. Read the current CharMig section in panels.py. +
+ +--- + + + +--- + + +
Tool use: **todo_write** • Todo List + +- [x] Add six migrator step operators in ui/operators.py +- [x] Change run_character_migration to invoke six operators +- [-] Add six step buttons in CharMig panel +- [x] Migrator props and operators (run migration, pickers) +- [x] UI: CharMig section + Linked Libraries dropdown +- [x] Update blender_manifest.toml and __init__ registration + +
+
+ +--- + + +
Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\ui\panels.py + +
+
+ +--- + +
Thought Process + +I need to add the six step buttons after the "Run migration" button. Plan says: one row for "Run migration", then six buttons (row or column). I'll do one row for Run migration, then two rows of three step buttons to keep it compact. +
+ +--- + + + +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ui\panels.py + +
+ +
+ +--- + +
Thought Process + +Let me verify the operators - when calling bpy.ops.dlm.migrator_copy_attributes() from within another operator, Blender uses the current context. So we don't need to pass context. The return value of bpy.ops is a set like {'FINISHED'} or {'CANCELLED'}. So result != {"FINISHED"} is correct (we're comparing to a set literal). + +Let me double-check: in Blender, bpy.ops.some_op() returns a set. So result = bpy.ops.dlm.migrator_copy_attributes() gives a set. Comparing with {"FINISHED"} should work. Good. + +Read lints on the modified files. +
+ +--- + + + +--- + + +
+Tool use: **read_lints** + + +Parameters: + +```json +{ + "paths": [ + "T:\\Dynamic-Link-Manager\\ui\\operators.py", + "T:\\Dynamic-Link-Manager\\ui\\panels.py" + ] +} +``` +Result: + +```json +{ + "linterErrorsByFile": [ + { + "relativeWorkspacePath": "T:\\Dynamic-Link-Manager\\ui\\operators.py" + }, + { + "relativeWorkspacePath": "T:\\Dynamic-Link-Manager\\ui\\panels.py" + } + ] +} +``` +Status: **completed** + + +
+
+ +--- + + + +--- + +
Thought Process + +All good. Mark todo 3 as completed. +
+ +--- + + + +--- + + +
Tool use: **todo_write** • Todo List + +- [x] Add six migrator step operators in ui/operators.py +- [x] Change run_character_migration to invoke six operators +- [x] Add six step buttons in CharMig panel +- [x] Migrator props and operators (run migration, pickers) +- [x] UI: CharMig section + Linked Libraries dropdown +- [x] Update blender_manifest.toml and __init__ registration + +
+
+ +--- + +
Thought Process + +All tasks from the plan are done. Summary for the user. +
+ +--- + +Summary of what was done: + +**1. `run_character_migration` in `ui/operators.py`** +- Removed the wrong loop that called `migrator_copy_attributes` for every step. +- It now runs a single list of the six operator callables and invokes them in order; on the first non-`FINISHED` result it reports the step index and id and returns `CANCELLED`. + +**2. Operator registration** +- Appended the six migrator step operator classes to `OPERATOR_CLASSES`: + `DLM_OT_migrator_copy_attributes`, `DLM_OT_migrator_migrate_nla`, `DLM_OT_migrator_custom_properties`, `DLM_OT_migrator_bone_constraints`, `DLM_OT_migrator_retarget_relations`, `DLM_OT_migrator_replacement_base_body`. + +**3. CharMig panel in `ui/panels.py`** +- After the “Run migration” button, added six step buttons in two rows of three: + - Row 1: Copy attributes, Migrate NLA, Custom properties + - Row 2: Bone constraints, Retarget relations, Replacement base body + +Lints are clean. All related todos are completed. + +--- + +_**User**_ + +replacement base body does not create a library override on the repchar's basebody. + +--- + +_**Agent (model default, mode Agent)**_ + +
Thought Process + +The user is saying that the "replacement base body" step (step 6) does not create a library override on the replacement character's base body. I need to look at how step 6 is implemented in ops/migrator.py and fix it so it properly creates a library override on the base body mesh. + +Let me search for the step 6 implementation and understand what's happening with the base body and library override. +
+ +--- + + + + + +--- + + +
+Tool use: **ripgrep_raw_search** + + +Parameters: + +```json +{ + "pattern": "run_step_6|override_create|base.?body", + "path": "T:\\Dynamic-Link-Manager", + "glob": "*.py", + "caseInsensitive": false +} +``` +Additional data: + +```json +{ + "isPruned": true, + "pattern": "run_step_6|override_create|base.?body", + "path": "T:\\Dynamic-Link-Manager", + "outputMode": "content", + "totalFiles": 3, + "totalMatches": 14, + "topFiles": [ + { + "uri": "ops/migrator.py", + "matchCount": 4 + }, + { + "uri": "ui/operators.py", + "matchCount": 9 + }, + { + "uri": "ui/panels.py", + "matchCount": 1 + } + ] +} +``` +Status: **completed** + + +
+
+ +--- + + +
Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\ops\migrator.py + +
+
+ +--- + +
Thought Process + +I need to see the full run_step_6 function to understand how it finds the base body and applies override. The grep showed ob.data.override_create() at line 170 - so it's calling override on mesh data. In Blender, library override can be on the object (id_data) or on the object's data. For a linked mesh object, we typically need to override the object so we can work with it in the current file. Let me read the full step 6. +
+ +--- + + + + + +--- + + +
Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\ops\migrator.py + +
+
+ +--- + +
Thought Process + +I see the issue. The code only calls `ob.data.override_create()` on the **mesh data** when the mesh data is linked or has an override. But: + +1. In Blender, when you have a linked character, typically the **object** (the mesh object) is linked, not just the data. So we may need to call override on the **object** (`ob.override_create()`) to get a local override of the mesh object in the current file. If only the data is linked, then `ob.data.override_create()` would work for the data block. + +2. The user said "does not create a library override on the repchar's basebody" - so the override is not being created. Possible causes: + - We're only checking/overriding `ob.data` (mesh data). If the **object** is linked (from a linked collection), we need to override the object. In Blender 3.0+, linked objects have `ob.library` or `ob.override_library`. So we should call `ob.override_create()` for the object when the object is linked, and optionally `ob.data.override_create()` when the data is linked. + - The condition `getattr(ob.data, "library", None) or getattr(ob.data, "override_library", None)` might be wrong: in Blender, the attribute for linked data is typically `.library` (the Library datablock it comes from). So if the mesh data is linked, we need to create an override. But if the **object** is linked, the object itself needs to be overridden first—you can't override just the data of a linked object from the current file; the object is in the linked file. So the flow should be: if the **object** is linked (ob.library), call ob.override_create(). If the **object's data** is linked (ob.data.library), call ob.data.override_create(). + +Let me check Blender API: +- For a linked object: `id.library` is set (the library it comes from). +- `override_create()` creates a library override in the current file. + +So the fix should be: +1. If the **object** `ob` is linked (`getattr(ob, "library", None)`), call `ob.override_create()` so the object becomes an override in the current file. +2. If the **object's data** (mesh) is linked (`getattr(ob.data, "library", None)`), call `ob.data.override_create()`. + +Actually re-reading the plan/spec: "for each replacement's base body mesh ... if mesh data is linked or override, call override_create() only (no single-user copy)." + +So the spec says "mesh data" - but in practice, if the character is from a linked collection, the mesh *object* is often what's linked (the ob), and the ob.data might be shared or also linked. Creating an override on the object is usually what makes the instance editable in the current file; creating override on data makes the data block editable. For a mesh that's skinned to the armature, both the object and the data could be linked. So we should: +- If ob is linked: ob.override_create() +- If ob.data is linked: ob.data.override_create() + +I'll add both so the base body object and its data get overridden when they're linked. +
+ +--- + + +Checking how Blender exposes linked vs override state for objects and data: + + +--- + + +
+Tool use: **ripgrep_raw_search** + + +Parameters: + +```json +{ + "pattern": "library|override", + "path": "T:\\Dynamic-Link-Manager", + "glob": "*.py", + "caseInsensitive": false +} +``` +Additional data: + +```json +{ + "isPruned": true, + "pattern": "library|override", + "path": "T:\\Dynamic-Link-Manager", + "outputMode": "content", + "totalFiles": 7, + "totalMatches": 46, + "topFiles": [ + { + "uri": "ui/__init__.py", + "matchCount": 3 + }, + { + "uri": "ui/panels.py", + "matchCount": 3 + }, + { + "uri": "ui/properties.py", + "matchCount": 1 + }, + { + "uri": "ops/__init__.py", + "matchCount": 1 + }, + { + "uri": "ops/library.py", + "matchCount": 13 + }, + { + "uri": "ops/migrator.py", + "matchCount": 3 + }, + { + "uri": "ui/operators.py", + "matchCount": 22 + } + ] +} +``` +Status: **completed** + + +
+
+ +--- + +
Thought Process + +So in Blender, `id.library` is set when the datablock is linked from a library. The replacement character's base body could be: +1. A mesh **object** that is linked (ob.library) - then we need ob.override_create() +2. The mesh **data** that is linked (ob.data.library) - then we need ob.data.override_create() + +Currently step 6 only does ob.data.override_create(). If the mesh **object** is linked (which is common for linked characters - the whole hierarchy is linked), we need to override the object. So I'll add: +- If ob is linked: ob.override_create() +- If ob.data is linked: ob.data.override_create() + +That way the rep character's base body object gets an override when it's linked. +
+ +--- + + +Overriding the object when it's linked. Step 6 only called `ob.data.override_create()`; if the mesh object is linked we must call `ob.override_create()` so the base body becomes editable in the current file. + + +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ops\migrator.py + +
+ +
+ +--- + +
Thought Process + +I removed the check for `override_library` - if it's already an override we don't need to call override_create again. So we only call override_create when the id is linked (.library is set). Good. +
+ +--- + + +Step 6 is updated so the replacement character’s base body gets a library override correctly: + +1. **Object** – If the mesh **object** is linked (`ob.library`), we call `ob.override_create()` so the object becomes an override in the current file. That’s what was missing before and is usually needed when the character comes from a linked collection. +2. **Data** – If the mesh **data** is linked (`ob.data.library`), we call `ob.data.override_create()` so the mesh data block is overridden. + +Before, only the mesh data was overridden; linked mesh objects from a linked character stay linked until the object itself is overridden, so the base body object is now overridden as intended. + +--- + +_**User**_ + +@c:\Users\Nathan\.cursor\projects\t-Dynamic-Link-Manager\terminals\3.txt still no lib override created on mesh data CC_Base_Body.003 + +--- + +_**Agent (model default, mode Agent)**_ + +
Thought Process + +The user is saying that even after the fix, no library override is being created on the mesh data "CC_Base_Body.003". Let me look at the terminal output to see if there are any errors, and re-read the step 6 logic to understand what might be going wrong. + +Possible issues: +1. The base body detection might not be finding this mesh (e.g. name doesn't contain both "body" and "base" in the right way?) +2. The mesh might not have an Armature modifier pointing at rep +3. override_create() might be failing silently (we have except: pass) +4. Maybe the mesh data has a different linked state - e.g. it could be that we need to override in a specific order or the API is different + +Let me read the terminal file and the current step 6 code again. +
+ +--- + + + + + +--- + + +
Tool use: **read_file_v2** • Read file: c:\Users\Nathan\.cursor\projects\t-Dynamic-Link-Manager\terminals\3.txt + +
+
+ +--- + + +
Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\ops\migrator.py + +
+
+ +--- + +
Thought Process + +The terminal doesn't show a Python exception. The mesh is "CC_Base_Body.003" - so the object name has "Base" and "Body", and the data might be named similarly. So the mesh should be found (name_lower would contain "body" and "base"). + +The issue might be: +1. **Blender override API**: In Blender, for mesh **data** that is linked, you might need to use a different approach. Let me check - maybe `override_create()` on ID only works in certain contexts, e.g. when the blend is in a certain state, or we need to use `bpy.ops.wm.lib_override_create()` (operator) instead of the method on the id. + +2. **Order of operations**: Perhaps the object must be overridden first before we can override the data - and when we override the object, does the data automatically get overridden? Or maybe the mesh data is **instanced** by multiple objects (e.g. several CC_Base_Body.001, .002, .003) and they share the same mesh data - in that case the data might not be "linked" in the same way, or we need to override the data through the object. + +3. **Blender docs**: In Blender 3.0+, library override: `id.override_create()` creates an override. But I've read that for some datablocks the override might need to be created via the operator `bpy.ops.wm.lib_override_create()` with the id passed. Let me search for how Blender creates overrides on mesh data. + +Actually - re-reading the user message: "still no lib override created on **mesh data** CC_Base_Body.003". So they're talking about the mesh **data** (the Mesh datablock), not the object. So ob.data might be linked, and ob.data.override_create() is either not being called (ob.data.library is None?) or it's failing silently. + +Possibilities: +A) The mesh **data** is not considered "linked" - e.g. it could be that in their setup the object is linked but the mesh data is already local (shared from the library but not marked as library?). Unlikely - usually both are linked. +B) ob.data.override_create() is failing (we have except: pass). So we swallow the error. I should at least log or report the error so we can see. +C) Blender might require using the operator bpy.ops.wm.lib_override_create() for override creation in some cases. Let me check the Blender Python API - in 4.2/5.0, ID.override_create() exists. But maybe for Mesh data we need to use the operator with context? + +I'll search for Blender lib override create for mesh data. +
+ +--- + + +Checking Blender's override API for mesh data and whether we should use the operator instead: + + +--- + + +
+ Tool use: **web_search** • Searched web `undefined` • **1** results + +| Title | URL | Chunk | +|-------|-----|-------| +| Web search results for query: Blender Python override_create mesh data lib_override ID.library | | Links:
1. [IDOverrideLibrary(bpy_struct) ¶](https://docs.blender.org/api/current/bpy.types.IDOverrideLibrary.html)
2. [Create Library Override of Data Block](https://blender.stackexchange.com/questions/177650/create-library-override-of-data-block/177657)
3. [Library Overrides ¶](https://developer.blender.org/docs/features/core/overrides/library/)
4. [Library Overrides API](https://projects.blender.org/blender/blender/issues/86656)
5. [Library Overrides ](https://docs.blender.org/manual/nb/3.0/files/linked_libraries/library_overrides.html)

# Blender Python Library Overrides: `override_create()` and Related Functions

## Creating a Library Override

To create a library override of mesh data in Blender Python, use the `override_create()` method on the ID (data-block):[2]

```python
obj = bpy.context.view_layer.objects.active
obj.data.override_create(remap_local_usages=True)
```

The method is available on any ID data structure and accepts parameters like `remap_local_usages` to control whether local usages of that linked ID should be remapped to the new override.[2]

## Related Library Override API Functions

Additional methods are available through `ID.override_library` for managing overrides:[4]

- `override_library.reset(hierarchy=True)`: Reset the library overrides structure
- `override_library.destroy(hierarchy=True)`: Remove the override structure and remap usages to linked IDs
- `override_library.operations_update()`: Update override operations to reflect current differences
- `override_library.properties.remove()`: Remove a specific override property
- `override_library.properties[x].operations.remove()`: Remove a specific override operation

## How Library Overrides Work

Library overrides create local, editable copies of linked data-blocks.[3] They track which parts were edited, allowing changes from the linked source to be merged with local overrides when files are reopened. Multiple independent overrides of the same linked data can exist, and overrides are stored in the `IDOverrideLibrary` structure at the ID level.[3] | + +
+
+ +--- + + +
Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\ops\migrator.py + +
+
+ +--- + +
Thought Process + +The stackexchange link says we can use `obj.data.override_create(remap_local_usages=True)`. So the method exists. Maybe: +1. The mesh data isn't being detected as linked - e.g. in Blender 5 the attribute might be different, or the mesh could be instanced (same data block used by multiple objects from the library) so the data might not have .library set the way we expect. +2. We need to use the operator `bpy.ops.wm.lib_override_create()` instead - that might be the only way that works for nested datablocks. + +Let me check the Blender operator for creating overrides - maybe we need to use the operator with the id_root set to the mesh data. +
+ +--- + + + + + +--- + + +
+Tool use: **web_fetch** + + +Parameters: + +```json +{ + "url": "https://blender.stackexchange.com/questions/177650/create-library-override-of-data-block/177657" +} +``` +Result: + +```json +{ + "url": "https://blender.stackexchange.com/questions/177650/create-library-override-of-data-block/177657", + "markdown": "# Create Library Override of Data Block\n\n- Tags: python, linked-data, data-blocks\n- Score: 2\n- Views: 1,020\n- Answers: 1\n- Asked by: Helmy (113 rep)\n- Asked on: May 9, 2020\n- Last active: May 9, 2020\n- License: CC BY-SA 4.0\n\n---\n\n## Question\n\nI want to access the \"create library override\" of a linked object in the data-block panel like shown in the image below via Python. When I do this, nothing appeared in the info panel. Is there any possible way to do this?\n\n[![enter image description here](https://i.sstatic.net/kVlrc.jpg)](https://i.sstatic.net/kVlrc.jpg)\n\n---\n\n## Answer 1 — Score: 3\n\n- By: Helmy (113 rep)\n- Answered on: May 9, 2020\n\nGot it:\n\n```\nobj = bpy.context.view_layer.objects.active\nobj.data.override_create(remap_local_usages=True)\n```\n\nAPI link: [https://docs.blender.org/api/current/bpy.types.ID.html#bpy.types.ID.override\\_create](https://docs.blender.org/api/current/bpy.types.ID.html#bpy.types.ID.override_create)" +} +``` +User decision: **accepted** + +Status: **completed** + + +
+
+ +--- + + +
+Tool use: **ripgrep_raw_search** + + +Parameters: + +```json +{ + "pattern": "lib_override|override_create", + "path": "T:\\Dynamic-Link-Manager", + "caseInsensitive": false +} +``` +Additional data: + +```json +{ + "isPruned": true, + "pattern": "lib_override|override_create", + "path": "T:\\Dynamic-Link-Manager", + "outputMode": "content", + "totalFiles": 4, + "totalMatches": 30, + "topFiles": [ + { + "uri": ".specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md", + "matchCount": 13 + }, + { + "uri": "ops/migrator.py", + "matchCount": 2 + }, + { + "uri": "ops\\migrator.py", + "matchCount": 2 + }, + { + "uri": ".specstory\\history\\2026-02-18_23-39Z-character-migrator-workflow-integration.md", + "matchCount": 13 + } + ] +} +``` +Status: **completed** + + +
+
+ +--- + +
Thought Process + +So the answer says obj.data.override_create(remap_local_usages=True). Maybe we need to pass remap_local_usages=True for it to work? Or maybe the issue is that when the **object** is overridden first (ob.override_create()), Blender might replace the object's data reference with the same linked data - so the data is still linked. So we must explicitly call ob.data.override_create() **after** the object override, and we need to pass remap_local_usages=True so that the new override data gets used. + +Another possibility: in Blender, when you have a linked object that uses linked mesh data, calling ob.override_create() might only override the object, and the object's .data might still point to the linked mesh. So we need to call ob.data.override_create(remap_local_usages=True) to override the mesh data and have the object use the new override. So let me: +1. Always try to create override on mesh data when the data is linked (we already do this). +2. Use remap_local_usages=True as in the Blender answer. +3. Stop swallowing exceptions - at least log them so we can see if override_create is failing. Or we could report to the user. + +Actually re-reading again: "still no lib override created on **mesh data** CC_Base_Body.003". So the mesh **data** name is CC_Base_Body.003 (or the object name). So the mesh data block is still linked. That could mean: +- ob.data.library is None in our code (e.g. we're iterating over the wrong objects, or the rep_descendants don't include this mesh, or the mesh data is shared and has a different link state) +- or override_create() is failing silently + +Let me try: +1. Use the operator bpy.ops.wm.lib_override_create() - maybe that's the only reliable way. I need to check the operator signature. +2. Or call ob.data.override_create(remap_local_usages=True) and don't swallow exceptions - re-raise or report so we see the error. + +Checking Blender 4.2/5.0 API: ID.override_create(remap_local_usages=False). So we could try remap_local_usages=True. + +Also: maybe the mesh is found but it has no .library because in Blender 5 the mesh data might be shared across multiple linked object instances (e.g. CC_Base_Body, CC_Base_Body.001, CC_Base_Body.002, CC_Base_Body.003 - all might share one mesh data from the library). So ob.data could be the same Mesh datablock for several objects. That one mesh data would have .library set. So when we iterate rep_descendants we get one object that uses that data - and ob.data.library should be set. Unless... the object we're getting is already an override (we created ob.override_create() first), and when you override an object, does Blender create a new object that still references the same linked data? So after ob.override_create(), our `ob` might now be the override object, and ob.data might still be the linked mesh. So we need to call ob.data.override_create() - and that should work. Unless override_create on data requires something special. + +Let me try: +1. Call ob.data.override_create(remap_local_usages=True) as in the Blender answer. +2. If the object was overridden first, the object's data pointer might need to be updated - remap_local_usages=True might do that. +3. Stop silencing exceptions: report the error so the user sees it, or use a print for debugging. + +I'll add remap_local_usages=True and also try using the operator as a fallback. Let me check the operator. +
+ +--- + + +Checking the Blender API for `override_create` and the `wm.lib_override_create` operator: + + +--- + + +
+ Tool use: **web_search** • Searched web `undefined` • **1** results + +| Title | URL | Chunk | +|-------|-----|-------| +| Web search results for query: Blender wm.lib_override_create operator Python id_root | | Links:
1. [IDOverrideLibraryPropertyOperations(bpy_struct) ¶](https://docs.blender.org/api/current/bpy.types.IDOverrideLibraryPropertyOperations.html)
2. [Wm Operators - Blender Python API](https://docs.blender.org/api/current/bpy.ops.wm.html)
3. [Library Overrides ¶](https://developer.blender.org/docs/features/core/overrides/library/)
4. [LibOverride: Make fully editable when creating an experimental user setting. · 7cfea48752](https://projects.blender.org/blender/blender/commit/7cfea48752ebc544104d57d19736c201a98bc3cd)
5. [Library Overrides API](https://projects.blender.org/blender/blender/issues/86656)

# Blender Library Override Creation with `wm.lib_override_create`

The `wm.lib_override_create` operator is part of Blender's library override system, which allows creating local, editable copies of linked datablocks.[3]

## Key Concepts

Library overrides are defined at the ID (datablock) level and support override hierarchies.[3] An override hierarchy is represented by a single 'root' datablock, with dependencies explicitly linked back to that root through a pointer.[3] The `id_root` parameter specifies this root datablock for the override hierarchy.

## API Structure

The library override system includes these key operations:[5]
- `override_hierarchy_create`: Create an override hierarchy
- `override_library.reset()`: Reset the override structure
- `override_library.destroy()`: Remove the override and remap usages
- `override_library.operations_update()`: Update operations to reflect differences between override and linked data

## Data Storage

Library overrides store override operations (not operands) in an `IDOverrideLibrary` structure, which contains:[3]
- A reference to the linked source ID
- A list of `IDOverrideLibraryProperty` structs
- Multiple `IDOverrideLibraryPropertyOperation` structs defining specific override operations

The actual data is stored in the local override ID itself, not in the override structure.[3] | + +
+
+ +--- + + +
+ Tool use: **web_search** • Searched web `undefined` • **1** results + +| Title | URL | Chunk | +|-------|-----|-------| +| Web search results for query: Blender ID override_create remap_local_usages mesh data | | Links:
1. [IDOverrideLibrary(bpy_struct) ¶](https://docs.blender.org/api/current/bpy.types.IDOverrideLibrary.html)
2. [Create Library Override of Data Block](https://blender.stackexchange.com/questions/177650/create-library-override-of-data-block/177657)
3. [Library Overrides API](https://projects.blender.org/blender/blender/issues/86656)
4. [Library Overrides ](https://docs.blender.org/manual/en/3.0/files/linked_libraries/library_overrides.html)
5. [Library Overrides ¶](https://developer.blender.org/docs/features/core/overrides/library/)

# Blender ID override_create with remap_local_usages for Mesh Data

The `override_create()` method is used to create library overrides for linked data-blocks in Blender. For mesh data specifically, you can use:[2]

```python
obj = bpy.context.view_layer.objects.active
obj.data.override_create(remap_local_usages=True)
```

## Key Parameters

**`remap_local_usages`**: When set to `True`, all local usages of the linked ID will be remapped to the new local override.[2] When set to `False` (default), only specific usages are remapped depending on where the override is created.[4]

## Usage Contexts

- **Single Data-Block Override** via Outliner context menu: Remaps **all** local usages of the linked ID to the override.[4]
- **Single Data-Block Override** via data-block UI menu (Shift-LMB on chain icon): Remaps only that specific usage to the override.[4]

## Related API

The `override_create()` method is part of `bpy.types.ID` and can be used on any linkable data-block type, including mesh data.[2][3] Additional override-related methods include `override_hierarchy_create()`, `override_library.reset()`, `override_library.destroy()`, and `override_library.operations_update()`.[3] | + +
+
+ +--- + +
Thought Process + +So we should use ob.data.override_create(remap_local_usages=True). That might be what's missing - without remap_local_usages=True, the override might be created but the object might not be remapped to use it. + +Also: maybe the issue is that we're only calling override_create when ob.data.library is set. What if the mesh data is **indirectly** linked (e.g. through the object's hierarchy) or has override_library already? Let me also try calling override_create when the data is linked OR when it's already an override that we need to ensure is created - actually no, if it's already an override we don't need to create. So the condition is: create override when ob.data is linked (ob.data.library). + +One more possibility: when we have multiple objects sharing the same mesh data (CC_Base_Body, CC_Base_Body.001, ... all using one Mesh datablock), and we only iterate rep_descendants (descendants of the replacement armature), we might only get one of those objects - the one that is under the rep hierarchy. So we find that object, and ob.data is the shared mesh. That mesh could be linked. So we call ob.data.override_create(remap_local_usages=True). The remap_local_usages=True would remap all local usages of that linked mesh to the new override - so all objects in the current file that use that mesh would now use the override. That should work. + +Let me update the code to: +1. Use remap_local_usages=True when calling ob.data.override_create(). +2. Optionally: ensure we also run override_create on the object first when the object is linked (we already do that). Order: object first, then data - so the object override exists and points to the linked data; then we override the data with remap_local_usages=True so the object (and any other users) get the new override data. +3. Stop silencing exceptions - report or re-raise so we see failures. I'll use a try/except that reports the error with self.report in the operator - but run_step_6 doesn't have self. We could let the exception propagate so the operator's try/except catches it and reports. So I'll remove the bare `except: pass` and let it propagate, OR we could add a report callback. Simpler: just use remap_local_usages=True and if it still fails we don't swallow - actually the migrator doesn't have access to report. So the operator that calls run_step_6 has try/except and reports. So if we don't pass in run_step_6, the exception will propagate to the operator and get reported. So I'll remove the try/except in run_step_6 and use remap_local_usages=True - then any failure will be visible. Let me keep a try/except but re-raise so the operator sees it: `except Exception as e: raise` or just remove try/except. +
+ +--- + + +Using `remap_local_usages=True` so the mesh data override is created and all users (including the object) are remapped to it. Applying the change. + + +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ops\migrator.py + +
+ +
+ +--- + +
Thought Process + +If the mesh data still doesn't get overridden, the issue might be that we're not finding the mesh (e.g. "CC_Base_Body.003" - maybe the object name is that and the data name is different, and our name check might fail?). Or the mesh might be used only by an object that isn't in rep_descendants. Let me re-read the filter: we require "body" and "base" in name_lower (ob.name + " " + ob.data.name). "CC_Base_Body.003" has "base" and "body", so we're good. + +Another possibility: in Blender, when the **object** is linked and we call ob.override_create(), the new override object might be a different object - and we're still iterating with the old `ob` reference. So after ob.override_create(), does `ob` get updated in place to be the override, or does Blender replace it? In Blender's override system, override_create() typically works in place - the ID becomes an override. So `ob` should still be valid and now be an override. And ob.data might still point to the linked mesh until we call ob.data.override_create(remap_local_usages=True). + +One more thing: maybe the mesh data is not "linked" in the sense of having .library - e.g. it could be that the mesh data is instanced from the library by multiple objects and the data block in the current file is considered "local" but is a direct reference to the library data? I'm not 100% sure of Blender's internal behavior. Let me also try using the operator bpy.ops.wm.lib_override_create() with id_root=ob.data - that might be the more reliable way to create overrides on nested datablocks. Let me check the operator signature in the docs. +
+ +--- + + +Checking whether the operator is required for hierarchy overrides and verifying the logic. + + +--- + + +
+Tool use: **web_fetch** + + +Parameters: + +```json +{ + "url": "https://docs.blender.org/api/current/bpy.ops.wm.html" +} +``` +Result: + +```json +{ + "url": "https://docs.blender.org/api/current/bpy.ops.wm.html", + "markdown": "Wm Operators - Blender Python API\n\n# Wm Operators¶\n\nbpy.ops.wm.alembic_export(*, filepath='', check_existing=True, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=True, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', filter_glob='*.abc', start=-2147483648, end=-2147483648, xsamples=1, gsamples=1, sh_open=0.0, sh_close=1.0, selected=False, flatten=False, collection='', uvs=True, packuv=True, normals=True, vcolors=False, orcos=True, face_sets=False, subdiv_schema=False, apply_subdiv=False, curves_as_mesh=False, use_instancing=True, global_scale=1.0, triangulate=False, quad_method='SHORTEST_DIAGONAL', ngon_method='BEAUTY', export_hair=True, export_particles=True, export_custom_properties=True, as_background_job=False, evaluation_mode='RENDER', init_scene_frame_range=True)¶\n\nExport current scene in an Alembic archive\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nstart (int in [-inf, inf], (optional)) – Start Frame, Start frame of the export, use the default value to take the start frame of the current scene\n\nend (int in [-inf, inf], (optional)) – End Frame, End frame of the export, use the default value to take the end frame of the current scene\n\nxsamples (int in [1, 128], (optional)) – Transform Samples, Number of times per frame transformations are sampled\n\ngsamples (int in [1, 128], (optional)) – Geometry Samples, Number of times per frame object data are sampled\n\nsh_open (float in [-1, 1], (optional)) – Shutter Open, Time at which the shutter is open\n\nsh_close (float in [-1, 1], (optional)) – Shutter Close, Time at which the shutter is closed\n\nselected (boolean, (optional)) – Selected Objects Only, Export only selected objects\n\nflatten (boolean, (optional)) – Flatten Hierarchy, Do not preserve objects’ parent/children relationship\n\ncollection (string, (optional, never None)) – Collection\n\nuvs (boolean, (optional)) – UV Coordinates, Export UV coordinates\n\npackuv (boolean, (optional)) – Merge UVs\n\nnormals (boolean, (optional)) – Normals, Export normals\n\nvcolors (boolean, (optional)) – Color Attributes, Export color attributes\n\norcos (boolean, (optional)) – Generated Coordinates, Export undeformed mesh vertex coordinates\n\nface_sets (boolean, (optional)) – Face Sets, Export per face shading group assignments\n\nsubdiv_schema (boolean, (optional)) – Use Subdivision Schema, Export meshes using Alembic’s subdivision schema\n\napply_subdiv (boolean, (optional)) – Apply Subdivision Surface, Export subdivision surfaces as meshes\n\ncurves_as_mesh (boolean, (optional)) – Curves as Mesh, Export curves and NURBS surfaces as meshes\n\nuse_instancing (boolean, (optional)) – Use Instancing, Export data of duplicated objects as Alembic instances; speeds up the export and can be disabled for compatibility with other software\n\nglobal_scale (float in [0.0001, 1000], (optional)) – Scale, Value by which to enlarge or shrink the objects with respect to the world’s origin\n\ntriangulate (boolean, (optional)) – Triangulate, Export polygons (quads and n-gons) as triangles\n\nquad_method (enum in [Modifier Triangulate Quad Method Items](https://docs.blender.org/api/current/bpy_types_enum_items/modifier_triangulate_quad_method_items.html#rna-enum-modifier-triangulate-quad-method-items), (optional)) – Quad Method, Method for splitting the quads into triangles\n\nngon_method (enum in [Modifier Triangulate Ngon Method Items](https://docs.blender.org/api/current/bpy_types_enum_items/modifier_triangulate_ngon_method_items.html#rna-enum-modifier-triangulate-ngon-method-items), (optional)) – N-gon Method, Method for splitting the n-gons into triangles\n\nexport_hair (boolean, (optional)) – Export Hair, Exports hair particle systems as animated curves\n\nexport_particles (boolean, (optional)) – Export Particles, Exports non-hair particle systems\n\nexport_custom_properties (boolean, (optional)) – Export Custom Properties, Export custom properties to Alembic .userProperties\n\nas_background_job (boolean, (optional)) – Run as Background Job, Enable this to run the import in the background, disable to block Blender while importing. This option is deprecated; EXECUTE this operator to run in the foreground, and INVOKE it to run as a background job\n\nevaluation_mode (enum in [`'RENDER'`,`'VIEWPORT'`], (optional)) –\n\nSettings, Determines visibility of objects, modifier settings, and other areas where there are different settings for viewport and rendering\n\n`RENDER` Render – Use Render settings for object visibility, modifier settings, etc.\n\n`VIEWPORT` Viewport – Use Viewport settings for object visibility, modifier settings, etc.\n\nbpy.ops.wm.alembic_import(*, filepath='', directory='', files=None, check_existing=False, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=True, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, relative_path=True, display_type='DEFAULT', sort_method='', filter_glob='*.abc', scale=1.0, set_frame_range=True, validate_meshes=False, always_add_cache_reader=False, is_sequence=False, as_background_job=False)¶\n\nLoad an Alembic archive\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – Files\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\nrelative_path (boolean, (optional)) – Relative Path, Select the file relative to the blend file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nscale (float in [0.0001, 1000], (optional)) – Scale, Value by which to enlarge or shrink the objects with respect to the world’s origin\n\nset_frame_range (boolean, (optional)) – Set Frame Range, If checked, update scene’s start and end frame to match those of the Alembic archive\n\nvalidate_meshes (boolean, (optional)) – Validate Meshes, Ensure the data is valid (when disabled, data may be imported which causes crashes displaying or editing)\n\nalways_add_cache_reader (boolean, (optional)) – Always Add Cache Reader, Add cache modifiers and constraints to imported objects even if they are not animated so that they can be updated when reloading the Alembic archive\n\nis_sequence (boolean, (optional)) – Is Sequence, Set to true if the cache is split into separate files\n\nas_background_job (boolean, (optional)) – Run as Background Job, Enable this to run the export in the background, disable to block Blender while exporting. This option is deprecated; EXECUTE this operator to run in the foreground, and INVOKE it to run as a background job\n\nbpy.ops.wm.append(*, filepath='', directory='', filename='', files=None, check_existing=False, filter_blender=True, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=True, filemode=1, display_type='DEFAULT', sort_method='', link=False, do_reuse_local_id=False, clear_asset_data=False, autoselect=True, active_collection=True, instance_collections=False, instance_object_data=True, set_fake=False, use_recursive=True)¶\n\nAppend from a Library .blend file\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfilename (string, (optional, never None)) – File Name, Name of the file\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – Files\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nlink (boolean, (optional)) – Link, Link the objects or data-blocks rather than appending\n\ndo_reuse_local_id (boolean, (optional)) – Re-Use Local Data, Try to re-use previously matching appended data-blocks instead of appending a new copy\n\nclear_asset_data (boolean, (optional)) – Clear Asset Data, Don’t add asset meta-data or tags from the original data-block\n\nautoselect (boolean, (optional)) – Select, Select new objects\n\nactive_collection (boolean, (optional)) – Active Collection, Put new objects on the active collection\n\ninstance_collections (boolean, (optional)) – Instance Collections, Create instances for collections, rather than adding them directly to the scene\n\ninstance_object_data (boolean, (optional)) – Instance Object Data, Create instances for object data which are not referenced by any objects\n\nset_fake (boolean, (optional)) – Fake User, Set “Fake User” for appended items (except objects and collections)\n\nuse_recursive (boolean, (optional)) – Localize All, Localize all appended data, including those indirectly linked from other libraries\n\nbpy.ops.wm.batch_rename(*, data_type='OBJECT', data_source='SELECT', actions=None)¶\n\nRename multiple items at once\n\nParameters:\n\ndata_type (enum in [`'OBJECT'`,`'COLLECTION'`,`'MATERIAL'`,`'MESH'`,`'CURVE'`,`'META'`,`'VOLUME'`,`'GREASEPENCIL'`,`'ARMATURE'`,`'LATTICE'`,`'LIGHT'`,`'LIGHT_PROBE'`,`'CAMERA'`,`'SPEAKER'`,`'BONE'`,`'NODE'`,`'SEQUENCE_STRIP'`,`'ACTION_CLIP'`,`'SCENE'`,`'BRUSH'`], (optional)) – Type, Type of data to rename\n\ndata_source (enum in [`'SELECT'`,`'ALL'`], (optional)) – Source\n\nactions (`bpy_prop_collection` of`BatchRenameAction`, (optional)) – actions\n\nFile:\n\n[startup/bl_operators/wm.py:3280](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L3280)\n\nbpy.ops.wm.blend_strings_utf8_validate()¶\n\nCheck and fix all strings in current .blend file to be valid UTF-8 Unicode (needed for some old, 2.4x area files)\n\nFile:\n\n[startup/bl_operators/file.py:289](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/file.py#L289)\n\nbpy.ops.wm.call_asset_shelf_popover(*, name='')¶\n\nOpen a predefined asset shelf in a popup\n\nParameters:\n\nname (string, (optional, never None)) – Asset Shelf Name, Identifier of the asset shelf to display\n\nbpy.ops.wm.call_menu(*, name='')¶\n\nOpen a predefined menu\n\nParameters:\n\nname (string, (optional, never None)) – Name, Name of the menu\n\nbpy.ops.wm.call_menu_pie(*, name='')¶\n\nOpen a predefined pie menu\n\nParameters:\n\nname (string, (optional, never None)) – Name, Name of the pie menu\n\nbpy.ops.wm.call_panel(*, name='', keep_open=True)¶\n\nOpen a predefined panel\n\nParameters:\n\nname (string, (optional, never None)) – Name, Name of the menu\n\nkeep_open (boolean, (optional)) – Keep Open\n\nbpy.ops.wm.clear_recent_files(*, remove='ALL')¶\n\nClear the recent files list\n\nParameters:\n\nremove (enum in [`'ALL'`,`'MISSING'`], (optional)) – Remove\n\nbpy.ops.wm.collection_export_all()¶\n\nInvoke all configured exporters for all collections\n\nbpy.ops.wm.context_collection_boolean_set(*, data_path_iter='', data_path_item='', type='TOGGLE')¶\n\nSet boolean values for a collection of items\n\nParameters:\n\ndata_path_iter (string, (optional, never None)) – data_path_iter, The data path relative to the context, must point to an iterable\n\ndata_path_item (string, (optional, never None)) – data_path_item, The data path from each iterable to the value (int or float)\n\ntype (enum in [`'TOGGLE'`,`'ENABLE'`,`'DISABLE'`], (optional)) – Type\n\nFile:\n\n[startup/bl_operators/wm.py:875](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L875)\n\nbpy.ops.wm.context_cycle_array(*, data_path='', reverse=False)¶\n\nSet a context array value (useful for cycling the active mesh edit mode)\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nreverse (boolean, (optional)) – Reverse, Cycle backwards\n\nFile:\n\n[startup/bl_operators/wm.py:673](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L673)\n\nbpy.ops.wm.context_cycle_enum(*, data_path='', reverse=False, wrap=False)¶\n\nToggle a context value\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nreverse (boolean, (optional)) – Reverse, Cycle backwards\n\nwrap (boolean, (optional)) – Wrap, Wrap back to the first/last values\n\nFile:\n\n[startup/bl_operators/wm.py:624](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L624)\n\nbpy.ops.wm.context_cycle_int(*, data_path='', reverse=False, wrap=False)¶\n\nSet a context value (useful for cycling active material, shape keys, groups, etc.)\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nreverse (boolean, (optional)) – Reverse, Cycle backwards\n\nwrap (boolean, (optional)) – Wrap, Wrap back to the first/last values\n\nFile:\n\n[startup/bl_operators/wm.py:584](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L584)\n\nbpy.ops.wm.context_menu_enum(*, data_path='')¶\n\nUndocumented, consider [contributing](https://developer.blender.org/).\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nFile:\n\n[startup/bl_operators/wm.py:703](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L703)\n\nbpy.ops.wm.context_modal_mouse(*, data_path_iter='', data_path_item='', header_text='', input_scale=0.01, invert=False, initial_x=0)¶\n\nAdjust arbitrary values with mouse input\n\nParameters:\n\ndata_path_iter (string, (optional, never None)) – data_path_iter, The data path relative to the context, must point to an iterable\n\ndata_path_item (string, (optional, never None)) – data_path_item, The data path from each iterable to the value (int or float)\n\nheader_text (string, (optional, never None)) – Header Text, Text to display in header during scale\n\ninput_scale (float in [-inf, inf], (optional)) – input_scale, Scale the mouse movement by this value before applying the delta\n\ninvert (boolean, (optional)) – invert, Invert the mouse input\n\ninitial_x (int in [-inf, inf], (optional)) – initial_x\n\nFile:\n\n[startup/bl_operators/wm.py:1014](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L1014)\n\nbpy.ops.wm.context_pie_enum(*, data_path='')¶\n\nUndocumented, consider [contributing](https://developer.blender.org/).\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nFile:\n\n[startup/bl_operators/wm.py:735](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L735)\n\nbpy.ops.wm.context_scale_float(*, data_path='', value=1.0)¶\n\nScale a float context value\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nvalue (float in [-inf, inf], (optional)) – Value, Assign value\n\nFile:\n\n[startup/bl_operators/wm.py:338](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L338)\n\nbpy.ops.wm.context_scale_int(*, data_path='', value=1.0, always_step=True)¶\n\nScale an int context value\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nvalue (float in [-inf, inf], (optional)) – Value, Assign value\n\nalways_step (boolean, (optional)) – Always Step, Always adjust the value by a minimum of 1 when ‘value’ is not 1.0\n\nFile:\n\n[startup/bl_operators/wm.py:376](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L376)\n\nbpy.ops.wm.context_set_boolean(*, data_path='', value=True)¶\n\nSet a context value\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nvalue (boolean, (optional)) – Value, Assignment value\n\nFile:\n\n[startup/bl_operators/wm.py:267](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L267)\n\nbpy.ops.wm.context_set_enum(*, data_path='', value='')¶\n\nSet a context value\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nvalue (string, (optional, never None)) – Value, Assignment value (as a string)\n\nFile:\n\n[startup/bl_operators/wm.py:267](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L267)\n\nbpy.ops.wm.context_set_float(*, data_path='', value=0.0, relative=False)¶\n\nSet a context value\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nvalue (float in [-inf, inf], (optional)) – Value, Assignment value\n\nrelative (boolean, (optional)) – Relative, Apply relative to the current value (delta)\n\nFile:\n\n[startup/bl_operators/wm.py:267](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L267)\n\nbpy.ops.wm.context_set_id(*, data_path='', value='')¶\n\nSet a context value to an ID data-block\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nvalue (string, (optional, never None)) – Value, Assign value\n\nFile:\n\n[startup/bl_operators/wm.py:817](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L817)\n\nbpy.ops.wm.context_set_int(*, data_path='', value=0, relative=False)¶\n\nSet a context value\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nvalue (int in [-inf, inf], (optional)) – Value, Assign value\n\nrelative (boolean, (optional)) – Relative, Apply relative to the current value (delta)\n\nFile:\n\n[startup/bl_operators/wm.py:267](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L267)\n\nbpy.ops.wm.context_set_string(*, data_path='', value='')¶\n\nSet a context value\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nvalue (string, (optional, never None)) – Value, Assign value\n\nFile:\n\n[startup/bl_operators/wm.py:267](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L267)\n\nbpy.ops.wm.context_set_value(*, data_path='', value='')¶\n\nSet a context value\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nvalue (string, (optional, never None)) – Value, Assignment value (as a string)\n\nFile:\n\n[startup/bl_operators/wm.py:480](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L480)\n\nbpy.ops.wm.context_toggle(*, data_path='', module='')¶\n\nToggle a context value\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nmodule (string, (optional, never None)) – Module, Optionally override the context with a module\n\nFile:\n\n[startup/bl_operators/wm.py:504](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L504)\n\nbpy.ops.wm.context_toggle_enum(*, data_path='', value_1='', value_2='')¶\n\nToggle a context value\n\nParameters:\n\ndata_path (string, (optional, never None)) – Context Attributes, Context data-path (expanded using visible windows in the current .blend file)\n\nvalue_1 (string, (optional, never None)) – Value, Toggle enum\n\nvalue_2 (string, (optional, never None)) – Value, Toggle enum\n\nFile:\n\n[startup/bl_operators/wm.py:545](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L545)\n\nbpy.ops.wm.debug_menu(*, debug_value=0)¶\n\nOpen a popup to set the debug level\n\nParameters:\n\ndebug_value (int in [-32768, 32767], (optional)) – Debug Value\n\nbpy.ops.wm.doc_view(*, doc_id='')¶\n\nOpen online reference docs in a web browser\n\nParameters:\n\ndoc_id (string, (optional, never None)) – Doc ID\n\nFile:\n\n[startup/bl_operators/wm.py:1361](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L1361)\n\nbpy.ops.wm.doc_view_manual(*, doc_id='')¶\n\nLoad online manual\n\nParameters:\n\ndoc_id (string, (optional, never None)) – Doc ID\n\nFile:\n\n[startup/bl_operators/wm.py:1334](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L1334)\n\nbpy.ops.wm.doc_view_manual_ui_context()¶\n\nView a context based online manual in a web browser\n\nbpy.ops.wm.drop_blend_file(*, filepath='')¶\n\nUndocumented, consider [contributing](https://developer.blender.org/).\n\nParameters:\n\nfilepath (string, (optional, never None)) – filepath\n\nFile:\n\n[startup/bl_operators/wm.py:3655](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L3655)\n\nbpy.ops.wm.drop_import_file(*, directory='', files=None)¶\n\nOperator that allows file handlers to receive file drops\n\nParameters:\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – Files\n\nbpy.ops.wm.fbx_import(*, filepath='', directory='', files=None, check_existing=False, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', global_scale=1.0, mtl_name_collision_mode='MAKE_UNIQUE', import_colors='SRGB', use_custom_normals=True, use_custom_props=True, use_custom_props_enum_as_string=True, import_subdivision=False, ignore_leaf_bones=False, validate_meshes=True, use_anim=True, anim_offset=1.0, filter_glob='*.fbx')¶\n\nImport FBX file into current scene\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – Files\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nglobal_scale (float in [1e-06, 1e+06], (optional)) – Scale\n\nmtl_name_collision_mode (enum in [`'MAKE_UNIQUE'`,`'REFERENCE_EXISTING'`], (optional)) –\n\nMaterial Name Collision, Behavior when the name of an imported material conflicts with an existing material\n\n`MAKE_UNIQUE` Make Unique – Import each FBX material as a unique Blender material.\n\n`REFERENCE_EXISTING` Reference Existing – If a material with the same name already exists, reference that instead of importing.\n\nimport_colors (enum in [`'NONE'`,`'SRGB'`,`'LINEAR'`], (optional)) –\n\nVertex Colors, Import vertex color attributes\n\n`NONE` None – Do not import color attributes.\n\n`SRGB` sRGB – Vertex colors in the file are in sRGB color space.\n\n`LINEAR` Linear – Vertex colors in the file are in linear color space.\n\nuse_custom_normals (boolean, (optional)) – Custom Normals, Import custom normals, if available (otherwise Blender will compute them)\n\nuse_custom_props (boolean, (optional)) – Custom Properties, Import user properties as custom properties\n\nuse_custom_props_enum_as_string (boolean, (optional)) – Enums As Strings, Store custom property enumeration values as strings\n\nimport_subdivision (boolean, (optional)) – Subdivision Data, Import FBX subdivision information as subdivision surface modifiers\n\nignore_leaf_bones (boolean, (optional)) – Ignore Leaf Bones, Ignore the last bone at the end of each chain (used to mark the length of the previous bone)\n\nvalidate_meshes (boolean, (optional)) – Validate Meshes, Ensure the data is valid (when disabled, data may be imported which causes crashes displaying or editing)\n\nuse_anim (boolean, (optional)) – Import Animation, Import FBX animation\n\nanim_offset (float in [-1e+06, 1e+06], (optional)) – Offset, Offset to apply to animation timestamps, in frames\n\nfilter_glob (string, (optional, never None)) – Extension Filter\n\nbpy.ops.wm.grease_pencil_export_pdf(*, filepath='', check_existing=True, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=True, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', use_fill=True, selected_object_type='ACTIVE', frame_mode='ACTIVE', stroke_sample=0.0, use_uniform_width=False)¶\n\nExport Grease Pencil to PDF\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nuse_fill (boolean, (optional)) – Fill, Export strokes with fill enabled\n\nselected_object_type (enum in [`'ACTIVE'`,`'SELECTED'`,`'VISIBLE'`], (optional)) –\n\nObject, Which objects to include in the export\n\n`ACTIVE` Active – Include only the active object.\n\n`SELECTED` Selected – Include selected objects.\n\n`VISIBLE` Visible – Include all visible objects.\n\nframe_mode (enum in [`'ACTIVE'`,`'SELECTED'`,`'SCENE'`], (optional)) –\n\nFrames, Which frames to include in the export\n\n`ACTIVE` Active – Include only active frame.\n\n`SELECTED` Selected – Include selected frames.\n\n`SCENE` Scene – Include all scene frames.\n\nstroke_sample (float in [0, 100], (optional)) – Sampling, Precision of stroke sampling. Low values mean a more precise result, and zero disables sampling\n\nuse_uniform_width (boolean, (optional)) – Uniform Width, Export strokes with uniform width\n\nbpy.ops.wm.grease_pencil_export_svg(*, filepath='', check_existing=True, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=True, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', use_fill=True, selected_object_type='ACTIVE', frame_mode='ACTIVE', stroke_sample=0.0, use_uniform_width=False, use_clip_camera=False)¶\n\nExport Grease Pencil to SVG\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nuse_fill (boolean, (optional)) – Fill, Export strokes with fill enabled\n\nselected_object_type (enum in [`'ACTIVE'`,`'SELECTED'`,`'VISIBLE'`], (optional)) –\n\nObject, Which objects to include in the export\n\n`ACTIVE` Active – Include only the active object.\n\n`SELECTED` Selected – Include selected objects.\n\n`VISIBLE` Visible – Include all visible objects.\n\nframe_mode (enum in [`'ACTIVE'`,`'SELECTED'`,`'SCENE'`], (optional)) –\n\nFrames, Which frames to include in the export\n\n`ACTIVE` Active – Include only active frame.\n\n`SELECTED` Selected – Include selected frames.\n\n`SCENE` Scene – Include all scene frames.\n\nstroke_sample (float in [0, 100], (optional)) – Sampling, Precision of stroke sampling. Low values mean a more precise result, and zero disables sampling\n\nuse_uniform_width (boolean, (optional)) – Uniform Width, Export strokes with uniform width\n\nuse_clip_camera (boolean, (optional)) – Clip Camera, Clip drawings to camera size when exporting in camera view\n\nbpy.ops.wm.grease_pencil_import_svg(*, filepath='', directory='', files=None, check_existing=False, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=True, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, relative_path=True, display_type='DEFAULT', sort_method='', resolution=10, scale=10.0, use_scene_unit=False)¶\n\nImport SVG into Grease Pencil\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – Files\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\nrelative_path (boolean, (optional)) – Relative Path, Select the file relative to the blend file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nresolution (int in [1, 100000], (optional)) – Resolution, Resolution of the generated strokes\n\nscale (float in [1e-06, 1e+06], (optional)) – Scale, Scale of the final strokes\n\nuse_scene_unit (boolean, (optional)) – Scene Unit, Apply current scene’s unit (as defined by unit scale) to imported data\n\nbpy.ops.wm.id_linked_relocate(*, id_session_uid=0, filepath='', directory='', filename='', check_existing=False, filter_blender=True, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=True, filemode=1, relative_path=True, display_type='DEFAULT', sort_method='', link=True, do_reuse_local_id=False, clear_asset_data=False, autoselect=True, active_collection=False, instance_collections=False, instance_object_data=False)¶\n\nRelocate a linked ID, i.e. select another ID to link, and remap its local usages to that newly linked data-block). Currently only designed as an internal operator, not directly exposed to the user\n\nParameters:\n\nid_session_uid (int in [0, inf], (optional)) – Linked ID Session UID, Unique runtime identifier for the linked ID to relocate\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfilename (string, (optional, never None)) – File Name, Name of the file\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\nrelative_path (boolean, (optional)) – Relative Path, Select the file relative to the blend file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nlink (boolean, (optional)) – Link, Link the objects or data-blocks rather than appending\n\ndo_reuse_local_id (boolean, (optional)) – Re-Use Local Data, Try to re-use previously matching appended data-blocks instead of appending a new copy\n\nclear_asset_data (boolean, (optional)) – Clear Asset Data, Don’t add asset meta-data or tags from the original data-block\n\nautoselect (boolean, (optional)) – Select, Select new objects\n\nactive_collection (boolean, (optional)) – Active Collection, Put new objects on the active collection\n\ninstance_collections (boolean, (optional)) – Instance Collections, Create instances for collections, rather than adding them directly to the scene\n\ninstance_object_data (boolean, (optional)) – Instance Object Data, Create instances for object data which are not referenced by any objects\n\nbpy.ops.wm.interface_theme_preset_add(*, name='', remove_name=False, remove_active=False)¶\n\nAdd a custom theme to the preset list\n\nParameters:\n\nname (string, (optional, never None)) – Name, Name of the preset, used to make the path name\n\nremove_name (boolean, (optional)) – remove_name\n\nremove_active (boolean, (optional)) – remove_active\n\nFile:\n\n[startup/bl_operators/presets.py:119](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/presets.py#L119)\n\nbpy.ops.wm.interface_theme_preset_remove(*, name='', remove_name=False, remove_active=True)¶\n\nRemove a custom theme from the preset list\n\nParameters:\n\nname (string, (optional, never None)) – Name, Name of the preset, used to make the path name\n\nremove_name (boolean, (optional)) – remove_name\n\nremove_active (boolean, (optional)) – remove_active\n\nFile:\n\n[startup/bl_operators/presets.py:119](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/presets.py#L119)\n\nbpy.ops.wm.interface_theme_preset_save(*, name='', remove_name=False, remove_active=True)¶\n\nSave a custom theme in the preset list\n\nParameters:\n\nname (string, (optional, never None)) – Name, Name of the preset, used to make the path name\n\nremove_name (boolean, (optional)) – remove_name\n\nremove_active (boolean, (optional)) – remove_active\n\nFile:\n\n[startup/bl_operators/presets.py:711](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/presets.py#L711)\n\nbpy.ops.wm.keyconfig_preset_add(*, name='', remove_name=False, remove_active=False)¶\n\nAdd a custom keymap configuration to the preset list\n\nParameters:\n\nname (string, (optional, never None)) – Name, Name of the preset, used to make the path name\n\nremove_name (boolean, (optional)) – remove_name\n\nremove_active (boolean, (optional)) – remove_active\n\nFile:\n\n[startup/bl_operators/presets.py:119](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/presets.py#L119)\n\nbpy.ops.wm.keyconfig_preset_remove(*, name='', remove_name=False, remove_active=True)¶\n\nRemove a custom keymap configuration from the preset list\n\nParameters:\n\nname (string, (optional, never None)) – Name, Name of the preset, used to make the path name\n\nremove_name (boolean, (optional)) – remove_name\n\nremove_active (boolean, (optional)) – remove_active\n\nFile:\n\n[startup/bl_operators/presets.py:119](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/presets.py#L119)\n\nbpy.ops.wm.lib_reload(*, library='', filepath='', directory='', filename='', hide_props_region=True, check_existing=False, filter_blender=True, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, relative_path=True, display_type='DEFAULT', sort_method='')¶\n\nReload the given library\n\nParameters:\n\nlibrary (string, (optional, never None)) – Library, Library to reload\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfilename (string, (optional, never None)) – File Name, Name of the file\n\nhide_props_region (boolean, (optional)) – Hide Operator Properties, Collapse the region displaying the operator settings\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\nrelative_path (boolean, (optional)) – Relative Path, Select the file relative to the blend file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nbpy.ops.wm.lib_relocate(*, library='', filepath='', directory='', filename='', files=None, hide_props_region=True, check_existing=False, filter_blender=True, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, relative_path=True, display_type='DEFAULT', sort_method='')¶\n\nRelocate the given library to one or several others\n\nParameters:\n\nlibrary (string, (optional, never None)) – Library, Library to relocate\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfilename (string, (optional, never None)) – File Name, Name of the file\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – Files\n\nhide_props_region (boolean, (optional)) – Hide Operator Properties, Collapse the region displaying the operator settings\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\nrelative_path (boolean, (optional)) – Relative Path, Select the file relative to the blend file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nbpy.ops.wm.link(*, filepath='', directory='', filename='', files=None, check_existing=False, filter_blender=True, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=True, filemode=1, relative_path=True, display_type='DEFAULT', sort_method='', link=True, do_reuse_local_id=False, clear_asset_data=False, autoselect=True, active_collection=True, instance_collections=True, instance_object_data=True)¶\n\nLink from a Library .blend file\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfilename (string, (optional, never None)) – File Name, Name of the file\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – Files\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\nrelative_path (boolean, (optional)) – Relative Path, Select the file relative to the blend file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nlink (boolean, (optional)) – Link, Link the objects or data-blocks rather than appending\n\ndo_reuse_local_id (boolean, (optional)) – Re-Use Local Data, Try to re-use previously matching appended data-blocks instead of appending a new copy\n\nclear_asset_data (boolean, (optional)) – Clear Asset Data, Don’t add asset meta-data or tags from the original data-block\n\nautoselect (boolean, (optional)) – Select, Select new objects\n\nactive_collection (boolean, (optional)) – Active Collection, Put new objects on the active collection\n\ninstance_collections (boolean, (optional)) – Instance Collections, Create instances for collections, rather than adding them directly to the scene\n\ninstance_object_data (boolean, (optional)) – Instance Object Data, Create instances for object data which are not referenced by any objects\n\nbpy.ops.wm.memory_statistics()¶\n\nPrint memory statistics to the console\n\nbpy.ops.wm.obj_export(*, filepath='', check_existing=True, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', export_animation=False, start_frame=-2147483648, end_frame=2147483647, forward_axis='NEGATIVE_Z', up_axis='Y', global_scale=1.0, apply_modifiers=True, apply_transform=True, export_eval_mode='DAG_EVAL_VIEWPORT', export_selected_objects=False, export_uv=True, export_normals=True, export_colors=False, export_materials=True, export_pbr_extensions=False, path_mode='AUTO', export_triangulated_mesh=False, export_curves_as_nurbs=False, export_object_groups=False, export_material_groups=False, export_vertex_groups=False, export_smooth_groups=False, smooth_group_bitflags=False, filter_glob='*.obj;*.mtl', collection='')¶\n\nSave the scene to a Wavefront OBJ file\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nexport_animation (boolean, (optional)) – Export Animation, Export multiple frames instead of the current frame only\n\nstart_frame (int in [-inf, inf], (optional)) – Start Frame, The first frame to be exported\n\nend_frame (int in [-inf, inf], (optional)) – End Frame, The last frame to be exported\n\nforward_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nForward Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nup_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nUp Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nglobal_scale (float in [0.0001, 10000], (optional)) – Scale, Value by which to enlarge or shrink the objects with respect to the world’s origin\n\napply_modifiers (boolean, (optional)) – Apply Modifiers, Apply modifiers to exported meshes\n\napply_transform (boolean, (optional)) – Apply Transform, Apply object transforms to exported vertices\n\nexport_eval_mode (enum in [`'DAG_EVAL_RENDER'`,`'DAG_EVAL_VIEWPORT'`], (optional)) –\n\nObject Properties, Determines properties like object visibility, modifiers etc., where they differ for Render and Viewport\n\n`DAG_EVAL_RENDER` Render – Export objects as they appear in render.\n\n`DAG_EVAL_VIEWPORT` Viewport – Export objects as they appear in the viewport.\n\nexport_selected_objects (boolean, (optional)) – Export Selected Objects, Export only selected objects instead of all supported objects\n\nexport_uv (boolean, (optional)) – Export UVs\n\nexport_normals (boolean, (optional)) – Export Normals, Export per-face normals if the face is flat-shaded, per-face-corner normals if smooth-shaded\n\nexport_colors (boolean, (optional)) – Export Colors, Export per-vertex colors\n\nexport_materials (boolean, (optional)) – Export Materials, Export MTL library. There must be a Principled-BSDF node for image textures to be exported to the MTL file\n\nexport_pbr_extensions (boolean, (optional)) – Export Materials with PBR Extensions, Export MTL library using PBR extensions (roughness, metallic, sheen, coat, anisotropy, transmission)\n\npath_mode (enum in [`'AUTO'`,`'ABSOLUTE'`,`'RELATIVE'`,`'MATCH'`,`'STRIP'`,`'COPY'`], (optional)) –\n\nPath Mode, Method used to reference paths\n\n`AUTO` Auto – Use relative paths with subdirectories only.\n\n`ABSOLUTE` Absolute – Always write absolute paths.\n\n`RELATIVE` Relative – Write relative paths where possible.\n\n`MATCH` Match – Match absolute/relative setting with input path.\n\n`STRIP` Strip – Write filename only.\n\n`COPY` Copy – Copy the file to the destination path.\n\nexport_triangulated_mesh (boolean, (optional)) – Export Triangulated Mesh, All ngons with four or more vertices will be triangulated. Meshes in the scene will not be affected. Behaves like Triangulate Modifier with ngon-method: “Beauty”, quad-method: “Shortest Diagonal”, min vertices: 4\n\nexport_curves_as_nurbs (boolean, (optional)) – Export Curves as NURBS, Export curves in parametric form instead of exporting as mesh\n\nexport_object_groups (boolean, (optional)) – Export Object Groups, Append mesh name to object name, separated by a ‘_’\n\nexport_material_groups (boolean, (optional)) – Export Material Groups, Generate an OBJ group for each part of a geometry using a different material\n\nexport_vertex_groups (boolean, (optional)) – Export Vertex Groups, Export the name of the vertex group of a face. It is approximated by choosing the vertex group with the most members among the vertices of a face\n\nexport_smooth_groups (boolean, (optional)) – Export Smooth Groups, Generate smooth groups identifiers for each group of smooth faces, as unique integer values by default\n\nsmooth_group_bitflags (boolean, (optional)) – Bitflags Smooth Groups, If exporting smoothgroups, generate ‘bitflags’ values for the groups, instead of unique integer values. The same bitflag value can be re-used for different groups of smooth faces, as long as they have no common sharp edges or vertices\n\nfilter_glob (string, (optional, never None)) – Extension Filter\n\ncollection (string, (optional, never None)) – Collection\n\nbpy.ops.wm.obj_import(*, filepath='', directory='', files=None, check_existing=False, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', global_scale=1.0, clamp_size=0.0, forward_axis='NEGATIVE_Z', up_axis='Y', use_split_objects=True, use_split_groups=False, import_vertex_groups=False, validate_meshes=True, close_spline_loops=True, collection_separator='', mtl_name_collision_mode='MAKE_UNIQUE', filter_glob='*.obj;*.mtl')¶\n\nLoad a Wavefront OBJ scene\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – Files\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nglobal_scale (float in [0.0001, 10000], (optional)) – Scale, Value by which to enlarge or shrink the objects with respect to the world’s origin\n\nclamp_size (float in [0, 1000], (optional)) – Clamp Bounding Box, Resize the objects to keep bounding box under this value. Value 0 disables clamping\n\nforward_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nForward Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nup_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nUp Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nuse_split_objects (boolean, (optional)) – Split By Object, Import each OBJ ‘o’ as a separate object\n\nuse_split_groups (boolean, (optional)) – Split By Group, Import each OBJ ‘g’ as a separate object\n\nimport_vertex_groups (boolean, (optional)) – Vertex Groups, Import OBJ groups as vertex groups\n\nvalidate_meshes (boolean, (optional)) – Validate Meshes, Ensure the data is valid (when disabled, data may be imported which causes crashes displaying or editing)\n\nclose_spline_loops (boolean, (optional)) – Detect Cyclic Curves, Join curve endpoints if overlapping control points are detected (if disabled, no curves will be cyclic)\n\ncollection_separator (string, (optional, never None)) – Path Separator, Character used to separate objects name into hierarchical structure\n\nmtl_name_collision_mode (enum in [`'MAKE_UNIQUE'`,`'REFERENCE_EXISTING'`], (optional)) –\n\nMaterial Name Collision, How to handle naming collisions when importing materials\n\n`MAKE_UNIQUE` Make Unique – Create new materials with unique names for each OBJ file.\n\n`REFERENCE_EXISTING` Reference Existing – Use existing materials with same name instead of creating new ones.\n\nfilter_glob (string, (optional, never None)) – Extension Filter\n\nbpy.ops.wm.open_mainfile(*, filepath='', hide_props_region=True, check_existing=False, filter_blender=True, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', load_ui=True, use_scripts=False, display_file_selector=True, state=0)¶\n\nOpen a Blender file\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\nhide_props_region (boolean, (optional)) – Hide Operator Properties, Collapse the region displaying the operator settings\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nload_ui (boolean, (optional)) – Load UI, Load user interface setup in the .blend file\n\nuse_scripts (boolean, (optional)) – Trusted Source, Allow .blend file to execute scripts automatically, default available from system preferences\n\ndisplay_file_selector (boolean, (optional)) – Display File Selector\n\nstate (int in [-inf, inf], (optional)) – State\n\nbpy.ops.wm.operator_cheat_sheet()¶\n\nList all the operators in a text-block, useful for scripting\n\nFile:\n\n[startup/bl_operators/wm.py:2254](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2254)\n\nbpy.ops.wm.operator_defaults()¶\n\nSet the active operator to its default values\n\nbpy.ops.wm.operator_pie_enum(*, data_path='', prop_string='')¶\n\nUndocumented, consider [contributing](https://developer.blender.org/).\n\nParameters:\n\ndata_path (string, (optional, never None)) – Operator, Operator name (in Python as string)\n\nprop_string (string, (optional, never None)) – Property, Property name (as a string)\n\nFile:\n\n[startup/bl_operators/wm.py:777](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L777)\n\nbpy.ops.wm.operator_preset_add(*, name='', remove_name=False, remove_active=False, operator='')¶\n\nAdd or remove an Operator Preset\n\nParameters:\n\nname (string, (optional, never None)) – Name, Name of the preset, used to make the path name\n\nremove_name (boolean, (optional)) – remove_name\n\nremove_active (boolean, (optional)) – remove_active\n\noperator (string, (optional, never None)) – Operator\n\nFile:\n\n[startup/bl_operators/presets.py:119](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/presets.py#L119)\n\nbpy.ops.wm.operator_presets_cleanup(*, operator='', properties=None)¶\n\nRemove outdated operator properties from presets that may cause problems\n\nParameters:\n\noperator (string, (optional, never None)) – operator\n\nproperties (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – properties\n\nFile:\n\n[startup/bl_operators/presets.py:924](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/presets.py#L924)\n\nbpy.ops.wm.owner_disable(*, owner_id='')¶\n\nDisable add-on for workspace\n\nParameters:\n\nowner_id (string, (optional, never None)) – UI Tag\n\nFile:\n\n[startup/bl_operators/wm.py:2302](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2302)\n\nbpy.ops.wm.owner_enable(*, owner_id='')¶\n\nEnable add-on for workspace\n\nParameters:\n\nowner_id (string, (optional, never None)) – UI Tag\n\nFile:\n\n[startup/bl_operators/wm.py:2287](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2287)\n\nbpy.ops.wm.path_open(*, filepath='')¶\n\nOpen a path in a file browser\n\nParameters:\n\nfilepath (string, (optional, never None)) – filepath\n\nFile:\n\n[startup/bl_operators/wm.py:1167](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L1167)\n\nbpy.ops.wm.ply_export(*, filepath='', check_existing=True, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', forward_axis='Y', up_axis='Z', global_scale=1.0, apply_modifiers=True, export_selected_objects=False, collection='', export_uv=True, export_normals=False, export_colors='SRGB', export_attributes=True, export_triangulated_mesh=False, ascii_format=False, filter_glob='*.ply')¶\n\nSave the scene to a PLY file\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nforward_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nForward Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nup_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nUp Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nglobal_scale (float in [0.0001, 10000], (optional)) – Scale, Value by which to enlarge or shrink the objects with respect to the world’s origin\n\napply_modifiers (boolean, (optional)) – Apply Modifiers, Apply modifiers to exported meshes\n\nexport_selected_objects (boolean, (optional)) – Export Selected Objects, Export only selected objects instead of all supported objects\n\ncollection (string, (optional, never None)) – Source Collection, Export only objects from this collection (and its children)\n\nexport_uv (boolean, (optional)) – Export UVs\n\nexport_normals (boolean, (optional)) – Export Vertex Normals, Export specific vertex normals if available, export calculated normals otherwise\n\nexport_colors (enum in [`'NONE'`,`'SRGB'`,`'LINEAR'`], (optional)) –\n\nExport Vertex Colors, Export vertex color attributes\n\n`NONE` None – Do not import/export color attributes.\n\n`SRGB` sRGB – Vertex colors in the file are in sRGB color space.\n\n`LINEAR` Linear – Vertex colors in the file are in linear color space.\n\nexport_attributes (boolean, (optional)) – Export Vertex Attributes, Export custom vertex attributes\n\nexport_triangulated_mesh (boolean, (optional)) – Export Triangulated Mesh, All ngons with four or more vertices will be triangulated. Meshes in the scene will not be affected. Behaves like Triangulate Modifier with ngon-method: “Beauty”, quad-method: “Shortest Diagonal”, min vertices: 4\n\nascii_format (boolean, (optional)) – ASCII Format, Export file in ASCII format, export as binary otherwise\n\nfilter_glob (string, (optional, never None)) – Extension Filter\n\nbpy.ops.wm.ply_import(*, filepath='', directory='', files=None, check_existing=False, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', global_scale=1.0, use_scene_unit=False, forward_axis='Y', up_axis='Z', merge_verts=False, import_colors='SRGB', import_attributes=True, filter_glob='*.ply')¶\n\nImport an PLY file as an object\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – Files\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nglobal_scale (float in [1e-06, 1e+06], (optional)) – Scale\n\nuse_scene_unit (boolean, (optional)) – Scene Unit, Apply current scene’s unit (as defined by unit scale) to imported data\n\nforward_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nForward Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nup_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nUp Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nmerge_verts (boolean, (optional)) – Merge Vertices, Merges vertices by distance\n\nimport_colors (enum in [`'NONE'`,`'SRGB'`,`'LINEAR'`], (optional)) –\n\nVertex Colors, Import vertex color attributes\n\n`NONE` None – Do not import/export color attributes.\n\n`SRGB` sRGB – Vertex colors in the file are in sRGB color space.\n\n`LINEAR` Linear – Vertex colors in the file are in linear color space.\n\nimport_attributes (boolean, (optional)) – Vertex Attributes, Import custom vertex attributes\n\nfilter_glob (string, (optional, never None)) – Extension Filter\n\nbpy.ops.wm.previews_batch_clear(*, files=None, directory='', filter_blender=True, filter_folder=True, use_scenes=True, use_collections=True, use_objects=True, use_intern_data=True, use_trusted=False, use_backups=True)¶\n\nClear selected .blend file’s previews\n\nParameters:\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – files\n\ndirectory (string, (optional, never None)) – directory\n\nfilter_blender (boolean, (optional)) – filter_blender\n\nfilter_folder (boolean, (optional)) – filter_folder\n\nuse_scenes (boolean, (optional)) – Scenes, Clear scenes’ previews\n\nuse_collections (boolean, (optional)) – Collections, Clear collections’ previews\n\nuse_objects (boolean, (optional)) – Objects, Clear objects’ previews\n\nuse_intern_data (boolean, (optional)) – Materials & Textures, Clear ‘internal’ previews (materials, textures, images, etc.)\n\nuse_trusted (boolean, (optional)) – Trusted Blend Files, Enable Python evaluation for selected files\n\nuse_backups (boolean, (optional)) – Save Backups, Keep a backup (.blend1) version of the files when saving with cleared previews\n\nFile:\n\n[startup/bl_operators/file.py:204](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/file.py#L204)\n\nbpy.ops.wm.previews_batch_generate(*, files=None, directory='', filter_blender=True, filter_folder=True, use_scenes=True, use_collections=True, use_objects=True, use_intern_data=True, use_trusted=False, use_backups=True)¶\n\nGenerate selected .blend file’s previews\n\nParameters:\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – Collection of file paths with common`directory` root\n\ndirectory (string, (optional, never None)) – Root path of all files listed in`files` collection\n\nfilter_blender (boolean, (optional)) – Show Blender files in the File Browser\n\nfilter_folder (boolean, (optional)) – Show folders in the File Browser\n\nuse_scenes (boolean, (optional)) – Scenes, Generate scenes’ previews\n\nuse_collections (boolean, (optional)) – Collections, Generate collections’ previews\n\nuse_objects (boolean, (optional)) – Objects, Generate objects’ previews\n\nuse_intern_data (boolean, (optional)) – Materials & Textures, Generate ‘internal’ previews (materials, textures, images, etc.)\n\nuse_trusted (boolean, (optional)) – Trusted Blend Files, Enable Python evaluation for selected files\n\nuse_backups (boolean, (optional)) – Save Backups, Keep a backup (.blend1) version of the files when saving with generated previews\n\nFile:\n\n[startup/bl_operators/file.py:95](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/file.py#L95)\n\nbpy.ops.wm.previews_clear(*, id_type={})¶\n\nClear data-block previews (only for some types like objects, materials, textures, etc.)\n\nParameters:\n\nid_type (enum set in {`'ALL'`,`'GEOMETRY'`,`'SHADING'`,`'SCENE'`,`'COLLECTION'`,`'OBJECT'`,`'MATERIAL'`,`'LIGHT'`,`'WORLD'`,`'TEXTURE'`,`'IMAGE'`}, (optional)) –\n\nData-Block Type, Which data-block previews to clear\n\n`ALL` All Types.\n\n`GEOMETRY` All Geometry Types – Clear previews for scenes, collections and objects.\n\n`SHADING` All Shading Types – Clear previews for materials, lights, worlds, textures and images.\n\n`SCENE` Scenes.\n\n`COLLECTION` Collections.\n\n`OBJECT` Objects.\n\n`MATERIAL` Materials.\n\n`LIGHT` Lights.\n\n`WORLD` Worlds.\n\n`TEXTURE` Textures.\n\n`IMAGE` Images.\n\nbpy.ops.wm.previews_ensure()¶\n\nEnsure data-block previews are available and up-to-date (to be saved in .blend file, only for some types like materials, textures, etc.)\n\nbpy.ops.wm.properties_add(*, data_path='')¶\n\nAdd your own property to the data-block\n\nParameters:\n\ndata_path (string, (optional, never None)) – Property Edit, Property data_path edit\n\nFile:\n\n[startup/bl_operators/wm.py:2136](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2136)\n\nbpy.ops.wm.properties_context_change(*, context='')¶\n\nJump to a different tab inside the properties editor\n\nParameters:\n\ncontext (string, (optional, never None)) – Context\n\nFile:\n\n[startup/bl_operators/wm.py:2179](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2179)\n\nbpy.ops.wm.properties_edit(*, data_path='', property_name='', property_type='FLOAT', is_overridable_library=False, description='', use_soft_limits=False, array_length=3, default_int=(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), min_int=-10000, max_int=10000, soft_min_int=-10000, soft_max_int=10000, step_int=1, default_bool=(False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False), default_float=(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), min_float=-10000.0, max_float=-10000.0, soft_min_float=-10000.0, soft_max_float=-10000.0, precision=3, step_float=0.1, subtype='', default_string='', id_type='OBJECT', eval_string='')¶\n\nChange a custom property’s type, or adjust how it is displayed in the interface\n\nParameters:\n\ndata_path (string, (optional, never None)) – Property Edit, Property data_path edit\n\nproperty_name (string, (optional, never None)) – Property Name, Property name edit\n\nproperty_type (enum in [`'FLOAT'`,`'FLOAT_ARRAY'`,`'INT'`,`'INT_ARRAY'`,`'BOOL'`,`'BOOL_ARRAY'`,`'STRING'`,`'DATA_BLOCK'`,`'PYTHON'`], (optional)) –\n\nType\n\n`FLOAT` Float – A single floating-point value.\n\n`FLOAT_ARRAY` Float Array – An array of floating-point values.\n\n`INT` Integer – A single integer.\n\n`INT_ARRAY` Integer Array – An array of integers.\n\n`BOOL` Boolean – A true or false value.\n\n`BOOL_ARRAY` Boolean Array – An array of true or false values.\n\n`STRING` String – A string value.\n\n`DATA_BLOCK` Data-Block – A data-block value.\n\n`PYTHON` Python – Edit a Python value directly, for unsupported property types.\n\nis_overridable_library (boolean, (optional)) – Library Overridable, Allow the property to be overridden when the data-block is linked\n\ndescription (string, (optional, never None)) – Description\n\nuse_soft_limits (boolean, (optional)) – Soft Limits, Limits the Property Value slider to a range, values outside the range must be inputted numerically\n\narray_length (int in [1, 32], (optional)) – Array Length\n\ndefault_int (int array of 32 items in [-inf, inf], (optional)) – Default Value\n\nmin_int (int in [-inf, inf], (optional)) – Min\n\nmax_int (int in [-inf, inf], (optional)) – Max\n\nsoft_min_int (int in [-inf, inf], (optional)) – Soft Min\n\nsoft_max_int (int in [-inf, inf], (optional)) – Soft Max\n\nstep_int (int in [1, inf], (optional)) – Step\n\ndefault_bool (boolean array of 32 items, (optional)) – Default Value\n\ndefault_float (float array of 32 items in [-inf, inf], (optional)) – Default Value\n\nmin_float (float in [-inf, inf], (optional)) – Min\n\nmax_float (float in [-inf, inf], (optional)) – Max\n\nsoft_min_float (float in [-inf, inf], (optional)) – Soft Min\n\nsoft_max_float (float in [-inf, inf], (optional)) – Soft Max\n\nprecision (int in [0, 8], (optional)) – Precision\n\nstep_float (float in [0.001, inf], (optional)) – Step\n\nsubtype (enum in [], (optional)) – Subtype\n\ndefault_string (string, (optional, never None)) – Default Value\n\nid_type (enum in [`'ACTION'`,`'ARMATURE'`,`'BRUSH'`,`'CACHEFILE'`,`'CAMERA'`,`'COLLECTION'`,`'CURVE'`,`'CURVES'`,`'FONT'`,`'GREASEPENCIL'`,`'GREASEPENCIL_V3'`,`'IMAGE'`,`'KEY'`,`'LATTICE'`,`'LIBRARY'`,`'LIGHT'`,`'LIGHT_PROBE'`,`'LINESTYLE'`,`'MASK'`,`'MATERIAL'`,`'MESH'`,`'META'`,`'MOVIECLIP'`,`'NODETREE'`,`'OBJECT'`,`'PAINTCURVE'`,`'PALETTE'`,`'PARTICLE'`,`'POINTCLOUD'`,`'SCENE'`,`'SCREEN'`,`'SOUND'`,`'SPEAKER'`,`'TEXT'`,`'TEXTURE'`,`'VOLUME'`,`'WINDOWMANAGER'`,`'WORKSPACE'`,`'WORLD'`], (optional)) – ID Type\n\neval_string (string, (optional, never None)) – Value, Python value for unsupported custom property types\n\nFile:\n\n[startup/bl_operators/wm.py:1869](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L1869)\n\nbpy.ops.wm.properties_edit_value(*, data_path='', property_name='', eval_string='')¶\n\nEdit the value of a custom property\n\nParameters:\n\ndata_path (string, (optional, never None)) – Property Edit, Property data_path edit\n\nproperty_name (string, (optional, never None)) – Property Name, Property name edit\n\neval_string (string, (optional, never None)) – Value, Value for custom property types that can only be edited as a Python expression\n\nFile:\n\n[startup/bl_operators/wm.py:2093](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2093)\n\nbpy.ops.wm.properties_remove(*, data_path='', property_name='')¶\n\nInternal use (edit a property data_path)\n\nParameters:\n\ndata_path (string, (optional, never None)) – Property Edit, Property data_path edit\n\nproperty_name (string, (optional, never None)) – Property Name, Property name edit\n\nFile:\n\n[startup/bl_operators/wm.py:2193](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2193)\n\nbpy.ops.wm.quit_blender()¶\n\nQuit Blender\n\nbpy.ops.wm.radial_control(*, data_path_primary='', data_path_secondary='', use_secondary='', rotation_path='', color_path='', fill_color_path='', fill_color_override_path='', fill_color_override_test_path='', zoom_path='', image_id='', secondary_tex=False, release_confirm=False)¶\n\nSet some size property (e.g. brush size) with mouse wheel\n\nParameters:\n\ndata_path_primary (string, (optional, never None)) – Primary Data Path, Primary path of property to be set by the radial control\n\ndata_path_secondary (string, (optional, never None)) – Secondary Data Path, Secondary path of property to be set by the radial control\n\nuse_secondary (string, (optional, never None)) – Use Secondary, Path of property to select between the primary and secondary data paths\n\nrotation_path (string, (optional, never None)) – Rotation Path, Path of property used to rotate the texture display\n\ncolor_path (string, (optional, never None)) – Color Path, Path of property used to set the color of the control\n\nfill_color_path (string, (optional, never None)) – Fill Color Path, Path of property used to set the fill color of the control\n\nfill_color_override_path (string, (optional, never None)) – Fill Color Override Path\n\nfill_color_override_test_path (string, (optional, never None)) – Fill Color Override Test\n\nzoom_path (string, (optional, never None)) – Zoom Path, Path of property used to set the zoom level for the control\n\nimage_id (string, (optional, never None)) – Image ID, Path of ID that is used to generate an image for the control\n\nsecondary_tex (boolean, (optional)) – Secondary Texture, Tweak brush secondary/mask texture\n\nrelease_confirm (boolean, (optional)) – Confirm On Release, Finish operation on key release\n\nbpy.ops.wm.read_factory_settings(*, use_factory_startup_app_template_only=False, app_template='Template', use_empty=False)¶\n\nLoad factory default startup file and preferences. To make changes permanent, use “Save Startup File” and “Save Preferences”\n\nParameters:\n\nuse_factory_startup_app_template_only (boolean, (optional)) – Factory Startup App-Template Only\n\nuse_empty (boolean, (optional)) – Empty, After loading, remove everything except scenes, windows, and workspaces. This makes it possible to load the startup file with its scene configuration and window layout intact, but no objects, materials, animations, …\n\nbpy.ops.wm.read_factory_userpref(*, use_factory_startup_app_template_only=False)¶\n\nLoad factory default preferences. To make changes to preferences permanent, use “Save Preferences”\n\nParameters:\n\nuse_factory_startup_app_template_only (boolean, (optional)) – Factory Startup App-Template Only\n\nbpy.ops.wm.read_history()¶\n\nReloads history and bookmarks\n\nbpy.ops.wm.read_homefile(*, filepath='', load_ui=True, use_splash=False, use_factory_startup=False, use_factory_startup_app_template_only=False, app_template='Template', use_empty=False)¶\n\nOpen the default file\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to an alternative start-up file\n\nload_ui (boolean, (optional)) – Load UI, Load user interface setup from the .blend file\n\nuse_splash (boolean, (optional)) – Splash\n\nuse_factory_startup (boolean, (optional)) – Factory Startup, Load the default (‘factory startup’) blend file. This is independent of the normal start-up file that the user can save\n\nuse_factory_startup_app_template_only (boolean, (optional)) – Factory Startup App-Template Only\n\nuse_empty (boolean, (optional)) – Empty, After loading, remove everything except scenes, windows, and workspaces. This makes it possible to load the startup file with its scene configuration and window layout intact, but no objects, materials, animations, …\n\nbpy.ops.wm.read_userpref()¶\n\nLoad last saved preferences\n\nbpy.ops.wm.recover_auto_save(*, filepath='', hide_props_region=True, check_existing=False, filter_blender=True, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=False, filter_blenlib=False, filemode=8, display_type='LIST_VERTICAL', sort_method='', use_scripts=False)¶\n\nOpen an automatically saved file to recover it\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\nhide_props_region (boolean, (optional)) – Hide Operator Properties, Collapse the region displaying the operator settings\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nuse_scripts (boolean, (optional)) – Trusted Source, Allow .blend file to execute scripts automatically, default available from system preferences\n\nbpy.ops.wm.recover_last_session(*, use_scripts=False)¶\n\nOpen the last closed file (“quit.blend”)\n\nParameters:\n\nuse_scripts (boolean, (optional)) – Trusted Source, Allow .blend file to execute scripts automatically, default available from system preferences\n\nbpy.ops.wm.redraw_timer(*, type='DRAW', iterations=10, time_limit=0.0)¶\n\nSimple redraw timer to test the speed of updating the interface\n\nParameters:\n\ntype (enum in [`'DRAW'`,`'DRAW_SWAP'`,`'DRAW_WIN'`,`'DRAW_WIN_SWAP'`,`'ANIM_STEP'`,`'ANIM_PLAY'`,`'UNDO'`], (optional)) –\n\nType\n\n`DRAW` Draw Region – Draw region.\n\n`DRAW_SWAP` Draw Region & Swap – Draw region and swap.\n\n`DRAW_WIN` Draw Window – Draw window.\n\n`DRAW_WIN_SWAP` Draw Window & Swap – Draw window and swap.\n\n`ANIM_STEP` Animation Step – Animation steps.\n\n`ANIM_PLAY` Animation Play – Animation playback.\n\n`UNDO` Undo/Redo – Undo and redo.\n\niterations (int in [1, inf], (optional)) – Iterations, Number of times to redraw\n\ntime_limit (float in [0, inf], (optional)) – Time Limit, Seconds to run the test for (override iterations)\n\nbpy.ops.wm.revert_mainfile(*, use_scripts=False)¶\n\nReload the saved file\n\nParameters:\n\nuse_scripts (boolean, (optional)) – Trusted Source, Allow .blend file to execute scripts automatically, default available from system preferences\n\nbpy.ops.wm.save_as_mainfile(*, filepath='', hide_props_region=True, check_existing=True, filter_blender=True, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', compress=False, relative_remap=True, copy=False)¶\n\nSave the current file in the desired location\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\nhide_props_region (boolean, (optional)) – Hide Operator Properties, Collapse the region displaying the operator settings\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\ncompress (boolean, (optional)) – Compress, Write compressed .blend file\n\nrelative_remap (boolean, (optional)) – Remap Relative, Remap relative paths when saving to a different directory\n\ncopy (boolean, (optional)) – Save Copy, Save a copy of the actual working state but does not make saved file active\n\nbpy.ops.wm.save_homefile()¶\n\nMake the current file the default startup file\n\nbpy.ops.wm.save_mainfile(*, filepath='', hide_props_region=True, check_existing=True, filter_blender=True, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', compress=False, relative_remap=False, exit=False, incremental=False)¶\n\nSave the current Blender file\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\nhide_props_region (boolean, (optional)) – Hide Operator Properties, Collapse the region displaying the operator settings\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\ncompress (boolean, (optional)) – Compress, Write compressed .blend file\n\nrelative_remap (boolean, (optional)) – Remap Relative, Remap relative paths when saving to a different directory\n\nexit (boolean, (optional)) – Exit, Exit Blender after saving\n\nincremental (boolean, (optional)) – Incremental, Save the current Blender file with a numerically incremented name that does not overwrite any existing files\n\nbpy.ops.wm.save_userpref()¶\n\nMake the current preferences default\n\nbpy.ops.wm.search_menu()¶\n\nPop-up a search over all menus in the current context\n\nbpy.ops.wm.search_operator()¶\n\nPop-up a search over all available operators in current context\n\nbpy.ops.wm.search_single_menu(*, menu_idname='', initial_query='')¶\n\nPop-up a search for a menu in current context\n\nParameters:\n\nmenu_idname (string, (optional, never None)) – Menu Name, Menu to search in\n\ninitial_query (string, (optional, never None)) – Initial Query, Query to insert into the search box\n\nbpy.ops.wm.set_stereo_3d(*, display_mode='ANAGLYPH', anaglyph_type='RED_CYAN', interlace_type='ROW_INTERLEAVED', use_interlace_swap=False, use_sidebyside_crosseyed=False)¶\n\nToggle 3D stereo support for current window (or change the display mode)\n\nParameters:\n\ndisplay_mode (enum in [Stereo3D Display Items](https://docs.blender.org/api/current/bpy_types_enum_items/stereo3d_display_items.html#rna-enum-stereo3d-display-items), (optional)) – Display Mode\n\nanaglyph_type (enum in [Stereo3D Anaglyph Type Items](https://docs.blender.org/api/current/bpy_types_enum_items/stereo3d_anaglyph_type_items.html#rna-enum-stereo3d-anaglyph-type-items), (optional)) – Anaglyph Type\n\ninterlace_type (enum in [Stereo3D Interlace Type Items](https://docs.blender.org/api/current/bpy_types_enum_items/stereo3d_interlace_type_items.html#rna-enum-stereo3d-interlace-type-items), (optional)) – Interlace Type\n\nuse_interlace_swap (boolean, (optional)) – Swap Left/Right, Swap left and right stereo channels\n\nuse_sidebyside_crosseyed (boolean, (optional)) – Cross-Eyed, Right eye should see left image and vice versa\n\nbpy.ops.wm.set_working_color_space(*, convert_colors=True, working_space='')¶\n\nChange the working color space of all colors in this blend file\n\nParameters:\n\nconvert_colors (boolean, (optional)) – Convert Colors in All Data-blocks, Change colors in all data-blocks to the new working space\n\nworking_space (enum in [], (optional)) – Working Space, Color space to set\n\nbpy.ops.wm.splash()¶\n\nOpen the splash screen with release info\n\nbpy.ops.wm.splash_about()¶\n\nOpen a window with information about Blender\n\nbpy.ops.wm.stl_export(*, filepath='', check_existing=True, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', ascii_format=False, use_batch=False, export_selected_objects=False, collection='', global_scale=1.0, use_scene_unit=False, forward_axis='Y', up_axis='Z', apply_modifiers=True, filter_glob='*.stl')¶\n\nSave the scene to an STL file\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nascii_format (boolean, (optional)) – ASCII Format, Export file in ASCII format, export as binary otherwise\n\nuse_batch (boolean, (optional)) – Batch Export, Export each object to a separate file\n\nexport_selected_objects (boolean, (optional)) – Export Selected Objects, Export only selected objects instead of all supported objects\n\ncollection (string, (optional, never None)) – Source Collection, Export only objects from this collection (and its children)\n\nglobal_scale (float in [1e-06, 1e+06], (optional)) – Scale\n\nuse_scene_unit (boolean, (optional)) – Scene Unit, Apply current scene’s unit (as defined by unit scale) to exported data\n\nforward_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nForward Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nup_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nUp Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\napply_modifiers (boolean, (optional)) – Apply Modifiers, Apply modifiers to exported meshes\n\nfilter_glob (string, (optional, never None)) – Extension Filter\n\nbpy.ops.wm.stl_import(*, filepath='', directory='', files=None, check_existing=False, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=False, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', global_scale=1.0, use_scene_unit=False, use_facet_normal=False, forward_axis='Y', up_axis='Z', use_mesh_validate=True, filter_glob='*.stl')¶\n\nImport an STL file as an object\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ndirectory (string, (optional, never None)) – Directory, Directory of the file\n\nfiles (`bpy_prop_collection` of`OperatorFileListElement`, (optional)) – Files\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nglobal_scale (float in [1e-06, 1e+06], (optional)) – Scale\n\nuse_scene_unit (boolean, (optional)) – Scene Unit, Apply current scene’s unit (as defined by unit scale) to imported data\n\nuse_facet_normal (boolean, (optional)) – Facet Normals, Use (import) facet normals (note that this will still give flat shading)\n\nforward_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nForward Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nup_axis (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nUp Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nuse_mesh_validate (boolean, (optional)) – Validate Mesh, Ensure the data is valid (when disabled, data may be imported which causes crashes displaying or editing)\n\nfilter_glob (string, (optional, never None)) – Extension Filter\n\nbpy.ops.wm.sysinfo(*, filepath='')¶\n\nGenerate system information, saved into a text file\n\nParameters:\n\nfilepath (string, (optional, never None)) – filepath\n\nFile:\n\n[startup/bl_operators/wm.py:2222](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2222)\n\nbpy.ops.wm.tool_set_by_brush_type(*, brush_type='', space_type='EMPTY')¶\n\nLook up the most appropriate tool for the given brush type and activate that\n\nParameters:\n\nbrush_type (string, (optional, never None)) – Brush Type, Brush type identifier for which the most appropriate tool will be looked up\n\nspace_type (enum in [`'EMPTY'`,`'VIEW_3D'`,`'IMAGE_EDITOR'`,`'NODE_EDITOR'`,`'SEQUENCE_EDITOR'`,`'CLIP_EDITOR'`,`'DOPESHEET_EDITOR'`,`'GRAPH_EDITOR'`,`'NLA_EDITOR'`,`'TEXT_EDITOR'`,`'CONSOLE'`,`'INFO'`,`'TOPBAR'`,`'STATUSBAR'`,`'OUTLINER'`,`'PROPERTIES'`,`'FILE_BROWSER'`,`'SPREADSHEET'`,`'PREFERENCES'`], (optional)) – Type\n\nFile:\n\n[startup/bl_operators/wm.py:2436](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2436)\n\nbpy.ops.wm.tool_set_by_id(*, name='', cycle=False, as_fallback=False, space_type='EMPTY')¶\n\nSet the tool by name (for key-maps)\n\nParameters:\n\nname (string, (optional, never None)) – Identifier, Identifier of the tool\n\ncycle (boolean, (optional)) – Cycle, Cycle through tools in this group\n\nas_fallback (boolean, (optional)) – Set Fallback, Set the fallback tool instead of the primary tool\n\nspace_type (enum in [`'EMPTY'`,`'VIEW_3D'`,`'IMAGE_EDITOR'`,`'NODE_EDITOR'`,`'SEQUENCE_EDITOR'`,`'CLIP_EDITOR'`,`'DOPESHEET_EDITOR'`,`'GRAPH_EDITOR'`,`'NLA_EDITOR'`,`'TEXT_EDITOR'`,`'CONSOLE'`,`'INFO'`,`'TOPBAR'`,`'STATUSBAR'`,`'OUTLINER'`,`'PROPERTIES'`,`'FILE_BROWSER'`,`'SPREADSHEET'`,`'PREFERENCES'`], (optional)) – Type\n\nFile:\n\n[startup/bl_operators/wm.py:2345](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2345)\n\nbpy.ops.wm.tool_set_by_index(*, index=0, cycle=False, expand=True, as_fallback=False, space_type='EMPTY')¶\n\nSet the tool by index (for key-maps)\n\nParameters:\n\nindex (int in [-inf, inf], (optional)) – Index in Toolbar\n\ncycle (boolean, (optional)) – Cycle, Cycle through tools in this group\n\nexpand (boolean, (optional)) – expand, Include tool subgroups\n\nas_fallback (boolean, (optional)) – Set Fallback, Set the fallback tool instead of the primary\n\nspace_type (enum in [`'EMPTY'`,`'VIEW_3D'`,`'IMAGE_EDITOR'`,`'NODE_EDITOR'`,`'SEQUENCE_EDITOR'`,`'CLIP_EDITOR'`,`'DOPESHEET_EDITOR'`,`'GRAPH_EDITOR'`,`'NLA_EDITOR'`,`'TEXT_EDITOR'`,`'CONSOLE'`,`'INFO'`,`'TOPBAR'`,`'STATUSBAR'`,`'OUTLINER'`,`'PROPERTIES'`,`'FILE_BROWSER'`,`'SPREADSHEET'`,`'PREFERENCES'`], (optional)) – Type\n\nFile:\n\n[startup/bl_operators/wm.py:2395](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2395)\n\nbpy.ops.wm.toolbar()¶\n\nUndocumented, consider [contributing](https://developer.blender.org/).\n\nFile:\n\n[startup/bl_operators/wm.py:2503](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2503)\n\nbpy.ops.wm.toolbar_fallback_pie()¶\n\nUndocumented, consider [contributing](https://developer.blender.org/).\n\nFile:\n\n[startup/bl_operators/wm.py:2527](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2527)\n\nbpy.ops.wm.toolbar_prompt()¶\n\nLeader key like functionality for accessing tools\n\nFile:\n\n[startup/bl_operators/wm.py:2627](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L2627)\n\nbpy.ops.wm.url_open(*, url='')¶\n\nOpen a website in the web browser\n\nParameters:\n\nurl (string, (optional, never None)) – URL, URL to open\n\nFile:\n\n[startup/bl_operators/wm.py:1074](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L1074)\n\nbpy.ops.wm.url_open_preset(*, type='')¶\n\nOpen a preset website in the web browser\n\nParameters:\n\ntype (enum in [], (optional)) – Site\n\nFile:\n\n[startup/bl_operators/wm.py:1144](https://projects.blender.org/blender/blender/src/branch/main/scripts/startup/bl_operators/wm.py#L1144)\n\nbpy.ops.wm.usd_export(*, filepath='', check_existing=True, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=True, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, display_type='DEFAULT', sort_method='', filter_glob='*.usd', selected_objects_only=False, collection='', export_animation=False, export_hair=False, export_uvmaps=True, rename_uvmaps=True, export_mesh_colors=True, export_normals=True, export_materials=True, export_subdivision='BEST_MATCH', export_armatures=True, only_deform_bones=False, export_shapekeys=True, use_instancing=False, evaluation_mode='RENDER', generate_preview_surface=True, generate_materialx_network=False, convert_orientation=False, export_global_forward_selection='NEGATIVE_Z', export_global_up_selection='Y', export_textures_mode='NEW', overwrite_textures=False, relative_paths=True, xform_op_mode='TRS', root_prim_path='/root', export_custom_properties=True, custom_properties_namespace='userProperties', author_blender_name=True, convert_world_material=True, allow_unicode=True, export_meshes=True, export_lights=True, export_cameras=True, export_curves=True, export_points=True, export_volumes=True, triangulate_meshes=False, quad_method='SHORTEST_DIAGONAL', ngon_method='BEAUTY', usdz_downscale_size='KEEP', usdz_downscale_custom_size=128, merge_parent_xform=False, convert_scene_units='METERS', meters_per_unit=1.0)¶\n\nExport current scene in a USD archive\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nselected_objects_only (boolean, (optional)) – Selection Only, Only export selected objects. Unselected parents of selected objects are exported as empty transform\n\ncollection (string, (optional, never None)) – Collection\n\nexport_animation (boolean, (optional)) – Animation, Export all frames in the render frame range, rather than only the current frame\n\nexport_hair (boolean, (optional)) – Hair, Export hair particle systems as USD curves\n\nexport_uvmaps (boolean, (optional)) – UV Maps, Include all mesh UV maps in the export\n\nrename_uvmaps (boolean, (optional)) – Rename UV Maps, Rename active render UV map to “st” to match USD conventions\n\nexport_mesh_colors (boolean, (optional)) – Color Attributes, Include mesh color attributes in the export\n\nexport_normals (boolean, (optional)) – Normals, Include normals of exported meshes in the export\n\nexport_materials (boolean, (optional)) – Materials, Export viewport settings of materials as USD preview materials, and export material assignments as geometry subsets\n\nexport_subdivision (enum in [`'IGNORE'`,`'TESSELLATE'`,`'BEST_MATCH'`], (optional)) –\n\nSubdivision, Choose how subdivision modifiers will be mapped to the USD subdivision scheme during export\n\n`IGNORE` Ignore – Scheme = None. Export base mesh without subdivision.\n\n`TESSELLATE` Tessellate – Scheme = None. Export subdivided mesh.\n\n`BEST_MATCH` Best Match – Scheme = Catmull-Clark, when possible. Reverts to exporting the subdivided mesh for the Simple subdivision type.\n\nexport_armatures (boolean, (optional)) – Armatures, Export armatures and meshes with armature modifiers as USD skeletons and skinned meshes\n\nonly_deform_bones (boolean, (optional)) – Only Deform Bones, Only export deform bones and their parents\n\nexport_shapekeys (boolean, (optional)) – Shape Keys, Export shape keys as USD blend shapes\n\nuse_instancing (boolean, (optional)) – Instancing, Export instanced objects as references in USD rather than real objects\n\nevaluation_mode (enum in [`'RENDER'`,`'VIEWPORT'`], (optional)) –\n\nUse Settings for, Determines visibility of objects, modifier settings, and other areas where there are different settings for viewport and rendering\n\n`RENDER` Render – Use Render settings for object visibility, modifier settings, etc.\n\n`VIEWPORT` Viewport – Use Viewport settings for object visibility, modifier settings, etc.\n\ngenerate_preview_surface (boolean, (optional)) – USD Preview Surface Network, Generate an approximate USD Preview Surface shader representation of a Principled BSDF node network\n\ngenerate_materialx_network (boolean, (optional)) – MaterialX Network, Generate a MaterialX network representation of the materials\n\nconvert_orientation (boolean, (optional)) – Convert Orientation, Convert orientation axis to a different convention to match other applications\n\nexport_global_forward_selection (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nForward Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nexport_global_up_selection (enum in [`'X'`,`'Y'`,`'Z'`,`'NEGATIVE_X'`,`'NEGATIVE_Y'`,`'NEGATIVE_Z'`], (optional)) –\n\nUp Axis\n\n`X` X – Positive X axis.\n\n`Y` Y – Positive Y axis.\n\n`Z` Z – Positive Z axis.\n\n`NEGATIVE_X`-X – Negative X axis.\n\n`NEGATIVE_Y`-Y – Negative Y axis.\n\n`NEGATIVE_Z`-Z – Negative Z axis.\n\nexport_textures_mode (enum in [`'KEEP'`,`'PRESERVE'`,`'NEW'`], (optional)) –\n\nExport Textures, Texture export method\n\n`KEEP` Keep – Use original location of textures.\n\n`PRESERVE` Preserve – Preserve file paths of textures from already imported USD files. Export remaining textures to a ‘textures’ folder next to the USD file.\n\n`NEW` New Path – Export textures to a ‘textures’ folder next to the USD file.\n\noverwrite_textures (boolean, (optional)) – Overwrite Textures, Overwrite existing files when exporting textures\n\nrelative_paths (boolean, (optional)) – Relative Paths, Use relative paths to reference external files (i.e. textures, volumes) in USD, otherwise use absolute paths\n\nxform_op_mode (enum in [`'TRS'`,`'TOS'`,`'MAT'`], (optional)) –\n\nXform Ops, The type of transform operators to write\n\n`TRS` Translate, Rotate, Scale – Export with translate, rotate, and scale Xform operators.\n\n`TOS` Translate, Orient, Scale – Export with translate, orient quaternion, and scale Xform operators.\n\n`MAT` Matrix – Export matrix operator.\n\nroot_prim_path (string, (optional, never None)) – Root Prim, If set, add a transform primitive with the given path to the stage as the parent of all exported data\n\nexport_custom_properties (boolean, (optional)) – Custom Properties, Export custom properties as USD attributes\n\ncustom_properties_namespace (string, (optional, never None)) – Namespace, If set, add the given namespace as a prefix to exported custom property names. This only applies to property names that do not already have a prefix (e.g., it would apply to name ‘bar’ but not ‘foo:bar’) and does not apply to blender object and data names which are always exported in the ‘userProperties:blender’ namespace\n\nauthor_blender_name (boolean, (optional)) – Blender Names, Author USD custom attributes containing the original Blender object and object data names\n\nconvert_world_material (boolean, (optional)) – World Dome Light, Convert the world material to a USD dome light. Currently works for simple materials, consisting of an environment texture connected to a background shader, with an optional vector multiply of the texture color\n\nallow_unicode (boolean, (optional)) – Allow Unicode, Preserve UTF-8 encoded characters when writing USD prim and property names (requires software utilizing USD 24.03 or greater when opening the resulting files)\n\nexport_meshes (boolean, (optional)) – Meshes, Export all meshes\n\nexport_lights (boolean, (optional)) – Lights, Export all lights\n\nexport_cameras (boolean, (optional)) – Cameras, Export all cameras\n\nexport_curves (boolean, (optional)) – Curves, Export all curves\n\nexport_points (boolean, (optional)) – Point Clouds, Export all point clouds\n\nexport_volumes (boolean, (optional)) – Volumes, Export all volumes\n\ntriangulate_meshes (boolean, (optional)) – Triangulate Meshes, Triangulate meshes during export\n\nquad_method (enum in [Modifier Triangulate Quad Method Items](https://docs.blender.org/api/current/bpy_types_enum_items/modifier_triangulate_quad_method_items.html#rna-enum-modifier-triangulate-quad-method-items), (optional)) – Quad Method, Method for splitting the quads into triangles\n\nngon_method (enum in [Modifier Triangulate Ngon Method Items](https://docs.blender.org/api/current/bpy_types_enum_items/modifier_triangulate_ngon_method_items.html#rna-enum-modifier-triangulate-ngon-method-items), (optional)) – N-gon Method, Method for splitting the n-gons into triangles\n\nusdz_downscale_size (enum in [`'KEEP'`,`'256'`,`'512'`,`'1024'`,`'2048'`,`'4096'`,`'CUSTOM'`], (optional)) –\n\nUSDZ Texture Downsampling, Choose a maximum size for all exported textures\n\n`KEEP` Keep – Keep all current texture sizes.\n\n`256` 256 – Resize to a maximum of 256 pixels.\n\n`512` 512 – Resize to a maximum of 512 pixels.\n\n`1024` 1024 – Resize to a maximum of 1024 pixels.\n\n`2048` 2048 – Resize to a maximum of 2048 pixels.\n\n`4096` 4096 – Resize to a maximum of 4096 pixels.\n\n`CUSTOM` Custom – Specify a custom size.\n\nusdz_downscale_custom_size (int in [64, 16384], (optional)) – USDZ Custom Downscale Size, Custom size for downscaling exported textures\n\nmerge_parent_xform (boolean, (optional)) – Merge parent Xform, Merge USD primitives with their Xform parent if possible. USD does not allow nested UsdGeomGprims, intermediary Xform prims will be defined to keep the USD file valid when encountering object hierarchies.\n\nconvert_scene_units (enum in [`'METERS'`,`'KILOMETERS'`,`'CENTIMETERS'`,`'MILLIMETERS'`,`'INCHES'`,`'FEET'`,`'YARDS'`,`'CUSTOM'`], (optional)) –\n\nUnits, Set the USD Stage meters per unit to the chosen measurement, or a custom value\n\n`METERS` Meters – Scene meters per unit to 1.0.\n\n`KILOMETERS` Kilometers – Scene meters per unit to 1000.0.\n\n`CENTIMETERS` Centimeters – Scene meters per unit to 0.01.\n\n`MILLIMETERS` Millimeters – Scene meters per unit to 0.001.\n\n`INCHES` Inches – Scene meters per unit to 0.0254.\n\n`FEET` Feet – Scene meters per unit to 0.3048.\n\n`YARDS` Yards – Scene meters per unit to 0.9144.\n\n`CUSTOM` Custom – Specify a custom scene meters per unit value.\n\nmeters_per_unit (float in [0.0001, 1000], (optional)) – Meters Per Unit, Custom value for meters per unit in the USD Stage\n\nbpy.ops.wm.usd_import(*, filepath='', check_existing=False, filter_blender=False, filter_backup=False, filter_image=False, filter_movie=False, filter_python=False, filter_font=False, filter_sound=False, filter_text=False, filter_archive=False, filter_btx=False, filter_alembic=False, filter_usd=True, filter_obj=False, filter_volume=False, filter_folder=True, filter_blenlib=False, filemode=8, relative_path=True, display_type='DEFAULT', sort_method='', filter_glob='*.usd', scale=1.0, set_frame_range=True, import_cameras=True, import_curves=True, import_lights=True, import_materials=True, import_meshes=True, import_volumes=True, import_shapes=True, import_skeletons=True, import_blendshapes=True, import_points=True, import_subdivision=False, support_scene_instancing=True, import_visible_only=True, create_collection=False, read_mesh_uvs=True, read_mesh_colors=True, read_mesh_attributes=True, prim_path_mask='', import_guide=False, import_proxy=False, import_render=True, import_all_materials=False, import_usd_preview=True, set_material_blend=True, light_intensity_scale=1.0, mtl_purpose='MTL_FULL', mtl_name_collision_mode='MAKE_UNIQUE', import_textures_mode='IMPORT_PACK', import_textures_dir='//textures/', tex_name_collision_mode='USE_EXISTING', property_import_mode='ALL', validate_meshes=False, create_world_material=True, import_defined_only=True, merge_parent_xform=True, apply_unit_conversion_scale=True)¶\n\nImport USD stage into current scene\n\nParameters:\n\nfilepath (string, (optional, never None)) – File Path, Path to file\n\ncheck_existing (boolean, (optional)) – Check Existing, Check and warn on overwriting existing files\n\nfilter_blender (boolean, (optional)) – Filter .blend files\n\nfilter_backup (boolean, (optional)) – Filter .blend files\n\nfilter_image (boolean, (optional)) – Filter image files\n\nfilter_movie (boolean, (optional)) – Filter movie files\n\nfilter_python (boolean, (optional)) – Filter Python files\n\nfilter_font (boolean, (optional)) – Filter font files\n\nfilter_sound (boolean, (optional)) – Filter sound files\n\nfilter_text (boolean, (optional)) – Filter text files\n\nfilter_archive (boolean, (optional)) – Filter archive files\n\nfilter_btx (boolean, (optional)) – Filter btx files\n\nfilter_alembic (boolean, (optional)) – Filter Alembic files\n\nfilter_usd (boolean, (optional)) – Filter USD files\n\nfilter_obj (boolean, (optional)) – Filter OBJ files\n\nfilter_volume (boolean, (optional)) – Filter OpenVDB volume files\n\nfilter_folder (boolean, (optional)) – Filter folders\n\nfilter_blenlib (boolean, (optional)) – Filter Blender IDs\n\nfilemode (int in [1, 9], (optional)) – File Browser Mode, The setting for the file browser mode to load a .blend file, a library or a special file\n\nrelative_path (boolean, (optional)) – Relative Path, Select the file relative to the blend file\n\ndisplay_type (enum in [`'DEFAULT'`,`'LIST_VERTICAL'`,`'LIST_HORIZONTAL'`,`'THUMBNAIL'`], (optional)) –\n\nDisplay Type\n\n`DEFAULT` Default – Automatically determine display type for files.\n\n`LIST_VERTICAL` Short List – Display files as short list.\n\n`LIST_HORIZONTAL` Long List – Display files as a detailed list.\n\n`THUMBNAIL` Thumbnails – Display files as thumbnails.\n\nsort_method (enum in [], (optional)) – File sorting mode\n\nscale (float in [0.0001, 1000], (optional)) – Scale, Value by which to enlarge or shrink the objects with respect to the world’s origin\n\nset_frame_range (boolean, (optional)) – Set Frame Range, Update the scene’s start and end frame to match those of the USD archive\n\nimport_cameras (boolean, (optional)) – Cameras\n\nimport_curves (boolean, (optional)) – Curves\n\nimport_lights (boolean, (optional)) – Lights\n\nimport_materials (boolean, (optional)) – Materials\n\nimport_meshes (boolean, (optional)) – Meshes\n\nimport_volumes (boolean, (optional)) – Volumes\n\nimport_shapes (boolean, (optional)) – USD Shapes\n\nimport_skeletons (boolean, (optional)) – Armatures\n\nimport_blendshapes (boolean, (optional)) – Shape Keys\n\nimport_points (boolean, (optional)) – Point Clouds\n\nimport_subdivision (boolean, (optional)) – Import Subdivision Scheme, Create subdivision surface modifiers based on the USD SubdivisionScheme attribute\n\nsupport_scene_instancing (boolean, (optional)) – Scene Instancing, Import USD scene graph instances as collection instances\n\nimport_visible_only (boolean, (optional)) – Visible Primitives Only, Do not import invisible USD primitives. Only applies to primitives with a non-animated visibility attribute. Primitives with animated visibility will always be imported\n\ncreate_collection (boolean, (optional)) – Create Collection, Add all imported objects to a new collection\n\nread_mesh_uvs (boolean, (optional)) – UV Coordinates, Read mesh UV coordinates\n\nread_mesh_colors (boolean, (optional)) – Color Attributes, Read mesh color attributes\n\nread_mesh_attributes (boolean, (optional)) – Mesh Attributes, Read USD Primvars as mesh attributes\n\nprim_path_mask (string, (optional, never None)) – Path Mask, Import only the primitive at the given path and its descendants. Multiple paths may be specified in a list delimited by commas or semicolons\n\nimport_guide (boolean, (optional)) – Guide, Import guide geometry\n\nimport_proxy (boolean, (optional)) – Proxy, Import proxy geometry\n\nimport_render (boolean, (optional)) – Render, Import final render geometry\n\nimport_all_materials (boolean, (optional)) – Import All Materials, Also import materials that are not used by any geometry. Note that when this option is false, materials referenced by geometry will still be imported\n\nimport_usd_preview (boolean, (optional)) – Import USD Preview, Convert UsdPreviewSurface shaders to Principled BSDF shader networks\n\nset_material_blend (boolean, (optional)) – Set Material Blend, If the Import USD Preview option is enabled, the material blend method will automatically be set based on the shader’s opacity and opacityThreshold inputs\n\nlight_intensity_scale (float in [0.0001, 10000], (optional)) – Light Intensity Scale, Scale for the intensity of imported lights\n\nmtl_purpose (enum in [`'MTL_ALL_PURPOSE'`,`'MTL_PREVIEW'`,`'MTL_FULL'`], (optional)) –\n\nMaterial Purpose, Attempt to import materials with the given purpose. If no material with this purpose is bound to the primitive, fall back on loading any other bound material\n\n`MTL_ALL_PURPOSE` All Purpose – Attempt to import ‘allPurpose’ materials..\n\n`MTL_PREVIEW` Preview – Attempt to import ‘preview’ materials. Load ‘allPurpose’ materials as a fallback.\n\n`MTL_FULL` Full – Attempt to import ‘full’ materials. Load ‘allPurpose’ or ‘preview’ materials, in that order, as a fallback.\n\nmtl_name_collision_mode (enum in [`'MAKE_UNIQUE'`,`'REFERENCE_EXISTING'`], (optional)) –\n\nMaterial Name Collision, Behavior when the name of an imported material conflicts with an existing material\n\n`MAKE_UNIQUE` Make Unique – Import each USD material as a unique Blender material.\n\n`REFERENCE_EXISTING` Reference Existing – If a material with the same name already exists, reference that instead of importing.\n\nimport_textures_mode (enum in [`'IMPORT_NONE'`,`'IMPORT_PACK'`,`'IMPORT_COPY'`], (optional)) –\n\nImport Textures, Behavior when importing textures from a USDZ archive\n\n`IMPORT_NONE` None – Don’t import textures.\n\n`IMPORT_PACK` Packed – Import textures as packed data.\n\n`IMPORT_COPY` Copy – Copy files to textures directory.\n\nimport_textures_dir (string, (optional, never None)) – Textures Directory, Path to the directory where imported textures will be copied\n\ntex_name_collision_mode (enum in [`'USE_EXISTING'`,`'OVERWRITE'`], (optional)) –\n\nFile Name Collision, Behavior when the name of an imported texture file conflicts with an existing file\n\n`USE_EXISTING` Use Existing – If a file with the same name already exists, use that instead of copying.\n\n`OVERWRITE` Overwrite – Overwrite existing files.\n\nproperty_import_mode (enum in [`'NONE'`,`'USER'`,`'ALL'`], (optional)) –\n\nCustom Properties, Behavior when importing USD attributes as Blender custom properties\n\n`NONE` None – Do not import USD custom attributes.\n\n`USER` User – Import USD attributes in the ‘userProperties’ namespace as Blender custom properties. The namespace will be stripped from the property names.\n\n`ALL` All Custom – Import all USD custom attributes as Blender custom properties. Namespaces will be retained in the property names.\n\nvalidate_meshes (boolean, (optional)) – Validate Meshes, Ensure the data is valid (when disabled, data may be imported which causes crashes displaying or editing)\n\ncreate_world_material (boolean, (optional)) – World Dome Light, Convert the first discovered USD dome light to a world background shader\n\nimport_defined_only (boolean, (optional)) – Defined Primitives Only, Import only defined USD primitives. When disabled this allows importing USD primitives which are not defined, such as those with an override specifier\n\nmerge_parent_xform (boolean, (optional)) – Merge parent Xform, Allow USD primitives to merge with their Xform parent if they are the only child in the hierarchy\n\napply_unit_conversion_scale (boolean, (optional)) – Apply Unit Conversion Scale, Scale the scene objects by the USD stage’s meters per unit value. This scaling is applied in addition to the value specified in the Scale option\n\nbpy.ops.wm.window_close()¶\n\nClose the current window\n\nbpy.ops.wm.window_fullscreen_toggle()¶\n\nToggle the current window full-screen\n\nbpy.ops.wm.window_new()¶\n\nCreate a new window\n\nbpy.ops.wm.window_new_main()¶\n\nCreate a new main window with its own workspace and scene selection\n\nbpy.ops.wm.xr_navigation_fly(*, mode='VIEWER_FORWARD', snap_turn_threshold=0.95, lock_location_z=False, lock_direction=False, speed_frame_based=False, turn_speed_factor=0.333333, fly_speed_factor=0.333333, speed_interpolation0=(0.0, 0.0), speed_interpolation1=(1.0, 1.0), alt_mode='VIEWER_FORWARD', alt_lock_location_z=False, alt_lock_direction=False)¶\n\nMove/turn relative to the VR viewer or controller\n\nParameters:\n\nmode (enum in [`'FORWARD'`,`'BACK'`,`'LEFT'`,`'RIGHT'`,`'UP'`,`'DOWN'`,`'TURNLEFT'`,`'TURNRIGHT'`,`'VIEWER_FORWARD'`,`'VIEWER_BACK'`,`'VIEWER_LEFT'`,`'VIEWER_RIGHT'`,`'CONTROLLER_FORWARD'`], (optional)) –\n\nMode, Fly mode\n\n`FORWARD` Forward – Move along navigation forward axis.\n\n`BACK` Back – Move along navigation back axis.\n\n`LEFT` Left – Move along navigation left axis.\n\n`RIGHT` Right – Move along navigation right axis.\n\n`UP` Up – Move along navigation up axis.\n\n`DOWN` Down – Move along navigation down axis.\n\n`TURNLEFT` Turn Left – Turn counter-clockwise around navigation up axis.\n\n`TURNRIGHT` Turn Right – Turn clockwise around navigation up axis.\n\n`VIEWER_FORWARD` Viewer Forward – Move along viewer’s forward axis.\n\n`VIEWER_BACK` Viewer Back – Move along viewer’s back axis.\n\n`VIEWER_LEFT` Viewer Left – Move along viewer’s left axis.\n\n`VIEWER_RIGHT` Viewer Right – Move along viewer’s right axis.\n\n`CONTROLLER_FORWARD` Controller Forward – Move along controller’s forward axis.\n\nsnap_turn_threshold (float in [0, 1], (optional)) – Snap Turn Threshold, Input state threshold when using snap turn\n\nlock_location_z (boolean, (optional)) – Lock Elevation, Prevent changes to viewer elevation\n\nlock_direction (boolean, (optional)) – Lock Direction, Limit movement to viewer’s initial direction\n\nspeed_frame_based (boolean, (optional)) – Frame Based Speed, Apply fixed movement deltas every update\n\nturn_speed_factor (float in [0, 1], (optional)) – Turn Speed Factor, Ratio between the min and max turn speed\n\nfly_speed_factor (float in [0, 1], (optional)) – Fly Speed Factor, Ratio between the min and max fly speed\n\nspeed_interpolation0 ([mathutils.Vector](https://docs.blender.org/api/current/mathutils.html#mathutils.Vector) of 2 items in [0, 1], (optional)) – Speed Interpolation 0, First cubic spline control point between min/max speeds\n\nspeed_interpolation1 ([mathutils.Vector](https://docs.blender.org/api/current/mathutils.html#mathutils.Vector) of 2 items in [0, 1], (optional)) – Speed Interpolation 1, Second cubic spline control point between min/max speeds\n\nalt_mode (enum in [`'FORWARD'`,`'BACK'`,`'LEFT'`,`'RIGHT'`,`'UP'`,`'DOWN'`,`'TURNLEFT'`,`'TURNRIGHT'`,`'VIEWER_FORWARD'`,`'VIEWER_BACK'`,`'VIEWER_LEFT'`,`'VIEWER_RIGHT'`,`'CONTROLLER_FORWARD'`], (optional)) –\n\nMode (Alt), Fly mode when hands are swapped\n\n`FORWARD` Forward – Move along navigation forward axis.\n\n`BACK` Back – Move along navigation back axis.\n\n`LEFT` Left – Move along navigation left axis.\n\n`RIGHT` Right – Move along navigation right axis.\n\n`UP` Up – Move along navigation up axis.\n\n`DOWN` Down – Move along navigation down axis.\n\n`TURNLEFT` Turn Left – Turn counter-clockwise around navigation up axis.\n\n`TURNRIGHT` Turn Right – Turn clockwise around navigation up axis.\n\n`VIEWER_FORWARD` Viewer Forward – Move along viewer’s forward axis.\n\n`VIEWER_BACK` Viewer Back – Move along viewer’s back axis.\n\n`VIEWER_LEFT` Viewer Left – Move along viewer’s left axis.\n\n`VIEWER_RIGHT` Viewer Right – Move along viewer’s right axis.\n\n`CONTROLLER_FORWARD` Controller Forward – Move along controller’s forward axis.\n\nalt_lock_location_z (boolean, (optional)) – Lock Elevation (Alt), When hands are swapped, prevent changes to viewer elevation\n\nalt_lock_direction (boolean, (optional)) – Lock Direction (Alt), When hands are swapped, limit movement to viewer’s initial direction\n\nbpy.ops.wm.xr_navigation_grab(*, lock_location=False, lock_location_z=False, lock_rotation=False, lock_rotation_z=False, lock_scale=False)¶\n\nNavigate the VR scene by grabbing with controllers\n\nParameters:\n\nlock_location (boolean, (optional)) – Lock Location, Prevent changes to viewer location\n\nlock_location_z (boolean, (optional)) – Lock Elevation, Prevent changes to viewer elevation\n\nlock_rotation (boolean, (optional)) – Lock Rotation, Prevent changes to viewer rotation\n\nlock_rotation_z (boolean, (optional)) – Lock Up Orientation, Prevent changes to viewer up orientation\n\nlock_scale (boolean, (optional)) – Lock Scale, Prevent changes to viewer scale\n\nbpy.ops.wm.xr_navigation_reset(*, location=True, rotation=True, scale=True)¶\n\nReset VR navigation deltas relative to session base pose\n\nParameters:\n\nlocation (boolean, (optional)) – Location, Reset location deltas\n\nrotation (boolean, (optional)) – Rotation, Reset rotation deltas\n\nscale (boolean, (optional)) – Scale, Reset scale deltas\n\nbpy.ops.wm.xr_navigation_swap_hands()¶\n\nSwap VR navigation controls between left / right controllers\n\nbpy.ops.wm.xr_navigation_teleport(*, teleport_axes=(True, True, True), interpolation=1.0, offset=0.25, selectable_only=True, distance=80.0, gravity=0.1, raycast_scale=0.02, destination_scale=0.05, sample_count=48, from_viewer=False, axis=(0.0, 0.0, -1.0), hit_color=(0.35, 0.35, 1.0, 1.0), miss_color=(1.0, 0.35, 0.35, 1.0), fallback_color=(0.35, 0.35, 1.0, 1.0))¶\n\nSet VR viewer location to controller raycast hit location\n\nParameters:\n\nteleport_axes (boolean array of 3 items, (optional)) – Teleport Axes, Enabled teleport axes in navigation space\n\ninterpolation (float in [0, 1], (optional)) – Interpolation, Interpolation factor between viewer and hit locations\n\noffset (float in [0, inf], (optional)) – Offset, Offset along hit normal to subtract from final location\n\nselectable_only (boolean, (optional)) – Selectable Only, Only allow selectable objects to influence raycast result\n\ndistance (float in [0, inf], (optional)) – Maximum raycast distance\n\ngravity (float in [0, inf], (optional)) – Gravity, Downward curvature applied to raycast\n\nraycast_scale (float in [0, inf], (optional)) – Raycast Scale, Width of the raycast visualization\n\ndestination_scale (float in [0, inf], (optional)) – Destination Scale, Width of the destination visualization\n\nsample_count (int in [2, inf], (optional)) – Sample Count, Number of interpolation samples for the raycast visualization\n\nfrom_viewer (boolean, (optional)) – From Viewer, Use viewer pose as raycast origin\n\naxis ([mathutils.Vector](https://docs.blender.org/api/current/mathutils.html#mathutils.Vector) of 3 items in [-1, 1], (optional)) – Axis, Raycast axis in controller/viewer space\n\nhit_color (float array of 4 items in [0, 1], (optional)) – Hit Color, Color of raycast when it succeeds\n\nmiss_color (float array of 4 items in [0, 1], (optional)) – Miss Color, Color of raycast when it misses\n\nfallback_color (float array of 4 items in [0, 1], (optional)) – Fallback Color, Color of raycast when a fallback case succeeds\n\nbpy.ops.wm.xr_session_toggle()¶\n\nOpen a view for use with virtual reality headsets, or close it if already opened" +} +``` +User decision: **accepted** + +Status: **completed** + + +
+
+ +--- + +
Thought Process + +The file was written - let me grep for lib_override in that file. +
+ +--- + + + + + +--- + + +
+Tool use: **ripgrep_raw_search** + + +Parameters: + +```json +{ + "pattern": "lib_override|override_create", + "path": "T:\\Dynamic-Link-Manager\\agent-tools", + "caseInsensitive": false +} +``` +Additional data: + +```json +{ + "isPruned": true, + "pattern": "lib_override|override_create", + "path": "T:\\Dynamic-Link-Manager\\agent-tools", + "outputMode": "content", + "totalFiles": 0, + "totalMatches": 0, + "topFiles": [] +} +``` +Status: **completed** + + +
+
+ +--- + +
Thought Process + +The doc file might have been saved with different content. Let me try adding a fallback: use bpy.ops.wm.lib_override_create() with the id_root set to the mesh data. I need to find the operator parameters. From the web search it said "id_root parameter specifies this root datablock". So we'd do something like bpy.ops.wm.lib_override_create(id_root=ob.data). But that might create a hierarchy from that root - so it could work for mesh data as root. + +Actually, re-reading the user message again: "still no lib override created on **mesh data** CC_Base_Body.003". So they're specifically saying the mesh DATA (the Mesh ID) doesn't get an override. So either: +1. We're not reaching that code (mesh not in rep_descendants, or name check fails, or armature modifier check fails). +2. ob.data.library is None for that mesh (so we skip the override_create). +3. override_create() is failing (we pass silently). + +For (2): In linked characters, often the object is linked and the object's data is the same linked mesh. So when we're iterating, ob is a linked object and ob.data is the mesh - and that mesh could be used by many objects (CC_Base_Body, .001, .002, .003). So ob.data.library should be set. Unless - in Blender, when you link a collection, do the objects get linked and the mesh data get linked separately? So each linked object has .library, and the mesh data also has .library. So both should be set. I'll add a fallback: use the operator to create override on the data when the direct call doesn't work, and/or always try the operator for the data block. Let me look up the operator. +
+ +--- + + +Checking Blender's Python API for override creation: + + +--- + + +
+ Tool use: **web_search** • Searched web `undefined` • **1** results + +| Title | URL | Chunk | +|-------|-----|-------| +| Web search results for query: bpy.ops.wm.lib_override_create id_root parameter Blender 4 | | Links:
1. [IDOverrideLibrary(bpy_struct) ¶](https://docs.blender.org/api/current/bpy.types.IDOverrideLibrary.html)
2. [IDOverrideLibraryPropertyOperations(bpy_struct) ¶](https://docs.blender.org/api/current/bpy.types.IDOverrideLibraryPropertyOperations.html)
3. [Library Overrides ¶](https://developer.blender.org/docs/features/core/overrides/library/)
4. [Library Overrides API](https://projects.blender.org/blender/blender/issues/86656)
5. [LibOverride: Make fully editable when creating an experimental user setting. · 7cfea48752](https://projects.blender.org/blender/blender/commit/7cfea48752ebc544104d57d19736c201a98bc3cd)

I was unable to find specific documentation about the `bpy.ops.wm.lib_override_create` operator or its `id_root` parameter in the provided search results.

The search results contain information about library overrides in Blender, including the `IDOverrideLibrary` data structure[1][2] and general library override concepts[3], but they do not document the specific operator you're asking about or its parameters.

To find information about `bpy.ops.wm.lib_override_create` and the `id_root` parameter, you would need to:
- Check the official Blender Python API documentation for the `bpy.ops.wm` operators module
- Review Blender's source code or commit history related to library override operators
- Consult the Blender manual or developer documentation specifically for window manager (wm) operators in Blender 4 | + +
+
+ +--- + +
Thought Process + +I've added remap_local_usages=True. Let me also ensure we're not missing the case where the mesh data is the same across several objects - we only need to override it once. So the current code should be fine: we iterate, find the base body mesh object(s), and for each we try to override object and data. If two objects share the same mesh data, we'd call ob.data.override_create(remap_local_usages=True) on the first and that would create the override and remap all usages - so the second object would now be using the override data and ob.data.library would be None when we get to it. Good. + +I'll leave the fix at remap_local_usages=True. If it still doesn't work, the next step would be to not swallow exceptions so the user sees the actual error, or to use the operator. I'll also add a small comment and consider not silencing the data override exception so we get feedback - actually let me remove the try/except for the data override so that if it fails, the operator's try/except in the UI will catch and report it. That way the user will see why it failed. +
+ +--- + + +Allowing the data-override exception to propagate so the operator can report it: + + +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ops\migrator.py + +
+ +
+ +--- + +
Thought Process + +Now if override_create fails, the exception will propagate to the operator and get reported. And we're using remap_local_usages=True so that when we create the override on the mesh data, all local users (including the object) get remapped to use the new override mesh. This should fix the issue where the mesh data wasn't getting an override. +
+ +--- + + +Summary of changes: + +1. **`remap_local_usages=True`** + The mesh data override is now created with `ob.data.override_create(remap_local_usages=True)`. That makes Blender remap all local users of the linked mesh to the new override, so the replacement character’s object (and any others using that mesh) end up using the overridden mesh data instead of the linked one. + +2. **No silent failure** + The `try/except` around the mesh data override was removed. If `override_create()` raises (e.g. invalid state or API restriction), the exception will propagate to the “Replacement base body” operator and be reported in the UI, so you can see the real error. + +Run “Replacement base body” again. If the mesh data still isn’t overridden, the operator should now show the exact Blender error message. + +--- + +_**User**_ + +We should rename the operator to "migrate BaseBody shapekeys" + +--- + +_**Agent (model default, mode Agent)**_ + +
Thought Process + +The user wants to rename the "Replacement base body" operator to "migrate BaseBody shapekeys". I need to: + +1. In ui/operators.py: change the class name, bl_idname, and bl_label for the replacement base body operator. The bl_idname would need to change - but changing bl_idname can break existing keymaps/saved files, so I'll need to update: + - Class name: e.g. DLM_OT_migrator_replacement_base_body -> DLM_OT_migrator_basebody_shapekeys or similar + - bl_idname: dlm.migrator_replacement_base_body -> dlm.migrator_basebody_shapekeys + - bl_label: "Replacement base body" -> "Migrate BaseBody shapekeys" (user said "migrate BaseBody shapekeys") + +2. In ui/panels.py: update the button that calls this operator - both the operator id and the text/label. + +3. In ui/operators.py: DLM_OT_run_character_migration invokes the six steps - need to update the reference from migrator_replacement_base_body to migrator_basebody_shapekeys. + +4. MIGRATOR_STEP_OPS tuple in operators.py - update the string id. + +Let me search for all usages of "replacement_base_body" and "Replacement base body" in the codebase. +
+ +--- + + + + + +--- + + +
+Tool use: **ripgrep_raw_search** + + +Parameters: + +```json +{ + "pattern": "replacement_base_body|Replacement base body", + "path": "T:\\Dynamic-Link-Manager", + "glob": "*.py", + "caseInsensitive": false +} +``` +Additional data: + +```json +{ + "isPruned": true, + "pattern": "replacement_base_body|Replacement base body", + "path": "T:\\Dynamic-Link-Manager", + "outputMode": "content", + "totalFiles": 4, + "totalMatches": 10, + "topFiles": [ + { + "uri": "ops\\migrator.py", + "matchCount": 1 + }, + { + "uri": "ops/migrator.py", + "matchCount": 1 + }, + { + "uri": "ui/panels.py", + "matchCount": 1 + }, + { + "uri": "ui/operators.py", + "matchCount": 7 + } + ] +} +``` +Status: **completed** + + +
+
+ +--- + +
Thought Process + +I'll rename to "migrate BaseBody shapekeys" - so: +- bl_label = "Migrate BaseBody shapekeys" +- bl_idname = "dlm.migrator_basebody_shapekeys" (short, clear) +- Class name = DLM_OT_migrator_basebody_shapekeys + +Update all 6 places in operators.py and 1 in panels.py. I'll leave the docstring in migrator.py as-is (it's internal) unless the user wants that too - they said "the operator" so I'll just change the operator class and UI. +
+ +--- + + + --- @@ -3598,3 +4571,744 @@ Now add the six operator classes to OPERATOR_CLASSES. --- + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ui\operators.py + +
+ +
+ +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ui\operators.py + +
+ +
+ +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ui\operators.py + +
+ +
+ +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ui\operators.py + +
+ +
+ +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ui\panels.py + +
+ +
+ +--- + +
Thought Process + +All replacements done. The run_character_migration execute() uses a list of operator callables - I updated the one that was bpy.ops.dlm.migrator_replacement_base_body. Let me verify there are no remaining references and that the steps list is correct. +
+ +--- + + + + + +--- + + +
+Tool use: **ripgrep_raw_search** + + +Parameters: + +```json +{ + "pattern": "replacement_base_body|basebody_shapekeys", + "path": "T:\\Dynamic-Link-Manager", + "glob": "*.py", + "caseInsensitive": false +} +``` +Additional data: + +```json +{ + "isPruned": true, + "pattern": "replacement_base_body|basebody_shapekeys", + "path": "T:\\Dynamic-Link-Manager", + "outputMode": "content", + "totalFiles": 4, + "totalMatches": 12, + "topFiles": [ + { + "uri": "ui\\panels.py", + "matchCount": 1 + }, + { + "uri": "ui\\operators.py", + "matchCount": 5 + }, + { + "uri": "ui/operators.py", + "matchCount": 5 + }, + { + "uri": "ui/panels.py", + "matchCount": 1 + } + ] +} +``` +Status: **completed** + + +
+
+ +--- + +
Thought Process + +All references are updated. No old "replacement_base_body" left in the Python files (the ops/migrator.py one is just a docstring for run_step_6, not the operator). Done. +
+ +--- + + +Summary of renames: + +- **Operator class:** `DLM_OT_migrator_replacement_base_body` → `DLM_OT_migrator_basebody_shapekeys` +- **bl_idname:** `dlm.migrator_replacement_base_body` → `dlm.migrator_basebody_shapekeys` +- **bl_label / button text:** "Replacement base body" → "Migrate BaseBody shapekeys" +- **Success message:** "Replacement base body done." → "Migrate BaseBody shapekeys done." + +References in `OPERATOR_CLASSES`, `MIGRATOR_STEP_OPS`, the run-all steps list, and the panel button are updated to use the new id and label. + +--- + +_**User**_ + +The library override still isn't being created on the mesh. @c:\Users\Nathan\.cursor\projects\t-Dynamic-Link-Manager\terminals\3.txt Ah, it says shift click to clear the library override and toggle if it can be edited. That's what we need to do. Is that a different operation? + +--- + +_**Agent (model default, mode Agent)**_ + +
Thought Process + +The user is saying that the library override still isn't being created on the mesh. They're referring to something in the terminal that says "shift click to clear the library override and toggle if it can be edited" - so they're describing UI behavior in Blender (likely in the Outliner or data-block menu) where you can make a linked datablock editable. That might be a different operation than `override_create()`. + +In Blender: +1. **Library Override** - creates a local override of linked data so you can edit it; changes sync with the library on reload in a defined way. +2. **Make Local** (or "Make Editable") - could be a different thing: e.g. "Make Single User" / copy the data so it's no longer linked, or "Make Library Override" which is override_create. + +The "shift click to clear the library override and toggle if it can be edited" sounds like the Outliner's behavior where: +- Click on the library/override icon might "make override" or "make editable" +- Shift+click might clear the override or toggle editability + +So the user might need a different Blender API call. Let me search for what "make editable" or "make local" or "toggle editable" does for linked data in Blender Python - it could be that we need to use an operator like `bpy.ops.outliner.id_operation(type='OVERRIDE_LIBRARY_CREATE')` or similar, or there's a specific "make editable" operation. + +Actually re-reading again: "shift click to clear the library override and toggle if it can be edited. That's what we need to do." - So they want to do whatever that shift-click does. So we need to find the Blender operator or API that corresponds to "make this linked data editable" in the way the UI does it. That could be: +1. override_create() - which we're already calling +2. Some other operator like lib_override_make_editable or similar + +Let me search the web for Blender make linked data editable operator, outliner library override shift click. +
+ +--- + + +Checking the terminal and searching for the Blender operation that makes linked data editable (e.g. the Outliner shift-click behavior). + + +--- + + +
Tool use: **read_file_v2** • Read file: c:\Users\Nathan\.cursor\projects\t-Dynamic-Link-Manager\terminals\3.txt + +
+
+ +--- + + +
+ Tool use: **web_search** • Searched web `undefined` • **1** results + +| Title | URL | Chunk | +|-------|-----|-------| +| Web search results for query: Blender make linked data editable operator Python override library make editable | | Links:
1. [What context does make_links_data need?](https://blender.stackexchange.com/questions/141338/what-context-does-make-links-data-need)
2. [Edit Linked Library ](https://docs.blender.org/manual/en/3.6/addons/object/edit_linked_library.html)
3. [creating a linked library collection with an override hierarchy in python is near impossible.](https://projects.blender.org/blender/blender/issues/99790)
4. [How to make a blender library override in python](https://blender.stackexchange.com/questions/289245/how-to-make-a-blender-library-override-in-python)
5. [Create Library Override of Data Block](https://blender.stackexchange.com/questions/177650/create-library-override-of-data-block/177657)

# Making Linked Data Editable in Blender with Python

## Library Override Methods

To make linked data editable in Blender via Python, use the low-level API instead of operators when possible:

**For collections:**
```python
col = bpy.data.collections[collection_name]
col.override_hierarchy_create(bpy.context.scene, bpy.context.view_layer, do_fully_editable=True)
```[4]

**For individual data blocks:**
```python
obj = bpy.context.view_layer.objects.active
obj.data.override_create(remap_local_usages=True)
```[5]

## Context Override for Operators

When using operators like `bpy.ops.object.make_links_data`, proper context override is critical. You need to override the window, screen, area, and region:[1]

```python
import bpy
area_type = 'VIEW_3D'
areas = [area for area in bpy.context.window.screen.areas if area.type == area_type]
override = \{
'window': bpy.context.window,
'screen': bpy.context.window.screen,
'area': areas[0],
'region': [region for region in areas[0].regions if region.type == 'WINDOW'][0]
\}
```[1]

## Making Overrides Editable

For making library overrides editable, use the `outliner.id_operation` with proper context override:[3]

```python
for window in bpy.context.window_manager.windows:
screen = window.screen
for area in screen.areas:
if area.type == 'OUTLINER':
with bpy.context.temp_override(window=window, area=area):
bpy.ops.outliner.id_operation(type='OVERRIDE_LIBRARY_MAKE_EDITABLE')
break
```[3]

The direct API approach using `override_hierarchy_create()` is generally more reliable than operators for automation.[4] | + +
+
+ +--- + +
Thought Process + +The search found that there's an operator `bpy.ops.outliner.id_operation(type='OVERRIDE_LIBRARY_MAKE_EDITABLE')` - but that runs in Outliner context and operates on the selection. So the "shift click" to make editable might be triggering something like OVERRIDE_LIBRARY_MAKE_EDITABLE or creating an override in a different way. + +There's also `override_hierarchy_create` for collections with `do_fully_editable=True`. For a single mesh data block, we're using `override_create(remap_local_usages=True)`. + +Let me search more specifically for Blender outliner id_operation OVERRIDE_LIBRARY and what types exist, and whether there's a "create override" vs "make editable" distinction. +
+ +--- + + + + + +--- + + +
+ Tool use: **web_search** • Searched web `undefined` • **1** results + +| Title | URL | Chunk | +|-------|-----|-------| +| Web search results for query: Blender outliner id_operation OVERRIDE_LIBRARY type Python create hierarchy | | Links:
1. [IDOverrideLibrary(bpy_struct) ¶](https://docs.blender.org/api/current/bpy.types.IDOverrideLibrary.html)
2. [IDOverrideLibraryPropertyOperations(bpy_struct) ¶](https://docs.blender.org/api/current/bpy.types.IDOverrideLibraryPropertyOperations.html)
3. [Outliner Operators — Blender Python API](https://docs.blender.org/api/2.80/bpy.ops.outliner.html)
4. [creating a linked library collection with an override hierarchy in python is near impossible.](https://projects.blender.org/blender/blender/issues/99790)
5. [Outliner, Library Overrides: List child objects under parents · f9a805164a](https://projects.blender.org/blender/blender/commit/f9a805164a944c3b5762f07e535536b9f425651f)

# Blender Outliner ID_Operation and Override Library

Based on the search results, here's what you need to know about working with `id_operation` and library overrides in Blender Python:

## ID_Operation Types

The `bpy.ops.outliner.id_operation()` operator supports the following types:[3]
- `UNLINK`
- `LOCAL`
- `SINGLE`
- `DELETE`
- `REMAP`
- `COPY`
- `PASTE`
- `ADD_FAKE`
- `CLEAR_FAKE`
- `RENAME`
- `SELECT_LINKED`

**Important Note:** `OVERRIDE_LIBRARY_MAKE_EDITABLE` is not a valid enum value for this operator in version 3.2.2, despite being available in the UI when run from the text editor.[4]

## Working with Library Overrides

To work with library overrides in Python, use the `IDOverrideLibrary` class and related types like `IDOverrideLibraryPropertyOperations`.[1][2] These provide the core functionality for managing library override hierarchies programmatically.

## Context Requirements

When calling outliner operators from an addon, you need proper context setup:[4] Use `bpy.context.temp_override()` to set the window and outliner area context, as the operator requires an active outliner editor context to function properly.

## Hierarchy Creation

Library override hierarchies can be displayed and managed through the Outliner's tree display system, which has dedicated support for listing child objects under parent objects in override hierarchies.[5] | + +
+
+ +--- + + +
+ Tool use: **web_search** • Searched web `undefined` • **1** results + +| Title | URL | Chunk | +|-------|-----|-------| +| Web search results for query: Blender override_hierarchy_create do_fully_editable mesh object Python | | Links:
1. [How to make a blender library override in python](https://blender.stackexchange.com/questions/289245/how-to-make-a-blender-library-override-in-python)
2. [IDOverrideLibrary(bpy_struct) ¶](https://docs.blender.org/api/current/bpy.types.IDOverrideLibrary.html)
3. [BMesh Module (bmesh) ¶](https://docs.blender.org/api/current/bmesh.html?highlight=from_edit_mesh)
4. [Operators (bpy.ops) ](https://docs.blender.org/api/3.6/bpy.ops.html)
5. [Modes and Mesh Access - Blender Python API](https://docs.blender.org/api/current/info_gotchas_meshes.html)

# Blender `override_hierarchy_create` with `do_fully_editable` for Mesh Objects

To create a library override in Python for a mesh object with full editability, use the `override_hierarchy_create()` method on a collection:[1]

```python
col = bpy.data.collections[collection_name]
col.override_hierarchy_create(bpy.context.scene, bpy.context.view_layer, do_fully_editable=True)
```

This method is a lower-level API alternative to the `bpy.ops.object.make_override_library` operator.[1] The `do_fully_editable=True` parameter makes all objects in the hierarchy fully editable.[1]

**Note:** This approach makes everything in the collection editable. If you need more granular control over which specific objects become editable, the `do_fully_editable` parameter may not provide that selectivity.[1]

For reference, the method is documented in the [Blender Python API](https://docs.blender.org/api/current/bpy.types.ID.html#bpy.types.ID.override_hierarchy_create).[1] | + +
+
+ +--- + +
Thought Process + +So there are two different things: +1. `override_create()` on an ID - creates a library override of that single datablock. +2. `override_hierarchy_create()` on a **collection** - creates overrides for the whole hierarchy, and `do_fully_editable=True` makes everything in it editable (which might be what the UI "shift click" does - make the override "fully editable" so you can edit it). + +So maybe the issue is: +- We create an override with `override_create()`, but the override might be created in a "non-editable" or restricted state by default. +- The UI "shift click to toggle if it can be edited" might set the override to "fully editable" - and that could be a property on the override (override_library) like `hierarchy_root` or something that controls editability. + +Let me search for "fully editable" override Blender Python. +
+ +--- + + + + + +--- + + +
+ Tool use: **web_search** • Searched web `undefined` • **1** results + +| Title | URL | Chunk | +|-------|-----|-------| +| Web search results for query: Blender library override "fully editable" Python ID.override_library | | Links:
1. [IDOverrideLibrary(bpy_struct) ¶](https://docs.blender.org/api/current/bpy.types.IDOverrideLibrary.html)
2. [How to make a blender library override in python](https://blender.stackexchange.com/questions/289245/how-to-make-a-blender-library-override-in-python)
3. [Library Overrides ¶](https://developer.blender.org/docs/features/core/overrides/library/)
4. [No way to make a library override on a collection 'editable' from the outliner or properties](https://projects.blender.org/blender/blender/issues/109808)
5. [LibOverride: Make fully editable when creating an experimental user setting. · 7cfea48752](https://projects.blender.org/blender/blender/commit/7cfea48752ebc544104d57d19736c201a98bc3cd)

# Blender Library Override "Fully Editable" Python

To make a library override "fully editable" in Python, use the `override_hierarchy_create()` method with the `do_fully_editable` parameter:[2]

```python
col = bpy.data.collections[collection_name]
col.override_hierarchy_create(bpy.context.scene, bpy.context.view_layer, do_fully_editable=True)
```

This method creates a library override on a collection and all its dependencies.[2] The `do_fully_editable=True` parameter marks all properties in the override hierarchy as editable, rather than only tracking which properties have been locally modified.[3]

**Note:** This approach will make everything in the hierarchy editable. If you need finer control over which specific properties are editable, you would need to work with the lower-level `IDOverrideLibrary` structure directly, though this is more complex.[1][2]

The `override_hierarchy_create()` method is documented in the [Blender Python API reference](https://docs.blender.org/api/current/bpy.types.ID.html#bpy.types.ID.override_hierarchy_create).[2] | + +
+
+ +--- + + +
+Tool use: **ripgrep_raw_search** + + +Parameters: + +```json +{ + "pattern": "override_create|override_hierarchy", + "path": "T:\\Dynamic-Link-Manager\\ops\\migrator.py", + "contextBefore": 0, + "contextAfter": 2, + "caseInsensitive": false +} +``` +Additional data: + +```json +{ + "isPruned": true, + "pattern": "override_create|override_hierarchy", + "path": "T:\\Dynamic-Link-Manager\\ops\\migrator.py", + "outputMode": "content", + "totalFiles": 1, + "totalMatches": 2, + "topFiles": [ + { + "uri": "ops\\migrator.py", + "matchCount": 6 + } + ] +} +``` +Status: **completed** + + +
+
+ +--- + +
Thought Process + +So the key insight is: +1. `override_hierarchy_create()` is for **collections** - it takes a scene and view_layer and creates overrides for the whole hierarchy with `do_fully_editable=True` to make everything editable. +2. For a single object or mesh, we use `override_create()`. + +The user said "shift click to clear the library override and **toggle if it can be edited**". So there are two actions: +- One click: maybe "create override" or "make override" +- Shift+click: "toggle if it can be edited" + +So "make editable" might mean: take an existing override and mark it as fully editable. That could be a different API - perhaps on the override we need to set something like `id.override_library.do_fully_editable` or similar after creating the override. + +Let me check the Blender API for ID.override_library and do_fully_editable. +
+ +--- + + + + + +--- + + +
+Tool use: **web_fetch** + + +Parameters: + +```json +{ + "url": "https://docs.blender.org/api/current/bpy.types.IDOverrideLibrary.html" +} +``` +Result: + +```json +{ + "url": "https://docs.blender.org/api/current/bpy.types.IDOverrideLibrary.html", + "markdown": "IDOverrideLibrary(bpy_struct) - Blender Python API\n\n# IDOverrideLibrary(bpy_struct)¶\n\nbase class — [bpy_struct](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct)\n\nclass bpy.types.IDOverrideLibrary(bpy_struct)¶\n\nStruct gathering all data needed by overridden linked IDs\n\nhierarchy_root¶\n\nLibrary override ID used as root of the override hierarchy this ID is a member of\n\nType:\n\n[ID](https://docs.blender.org/api/current/bpy.types.ID.html#bpy.types.ID), (readonly)\n\nis_in_hierarchy¶\n\nWhether this library override is defined as part of a library hierarchy, or as a single, isolated and autonomous override\n\nType:\n\nboolean, default True\n\nis_system_override¶\n\nWhether this library override exists only for the override hierarchy, or if it is actually editable by the user\n\nType:\n\nboolean, default False\n\nproperties¶\n\nList of overridden properties\n\nType:\n\n[IDOverrideLibraryProperties](https://docs.blender.org/api/current/bpy.types.IDOverrideLibraryProperties.html#bpy.types.IDOverrideLibraryProperties) [bpy_prop_collection](https://docs.blender.org/api/current/bpy.types.bpy_prop_collection.html#bpy.types.bpy_prop_collection) of [IDOverrideLibraryProperty](https://docs.blender.org/api/current/bpy.types.IDOverrideLibraryProperty.html#bpy.types.IDOverrideLibraryProperty), (readonly)\n\nreference¶\n\nLinked ID used as reference by this override\n\nType:\n\n[ID](https://docs.blender.org/api/current/bpy.types.ID.html#bpy.types.ID), (readonly)\n\noperations_update()¶\n\nUpdate the library override operations based on the differences between this override ID and its reference\n\nreset(*, do_hierarchy=True, set_system_override=False)¶\n\nReset this override to match again its linked reference ID\n\nParameters:\n\ndo_hierarchy (boolean, (optional)) – Also reset all the dependencies of this override to match their reference linked IDs\n\nset_system_override (boolean, (optional)) – Reset all user-editable overrides as (non-editable) system overrides\n\ndestroy(*, do_hierarchy=True)¶\n\nDelete this override ID and remap its usages to its linked reference ID instead\n\nParameters:\n\ndo_hierarchy (boolean, (optional)) – Also delete all the dependencies of this override and remap their usages to their reference linked IDs\n\nresync(scene, *, view_layer=None, residual_storage=None, do_hierarchy_enforce=False, do_whole_hierarchy=False)¶\n\nResync the data-block and its sub-hierarchy, or the whole hierarchy if requested\n\nParameters:\n\nscene ([Scene](https://docs.blender.org/api/current/bpy.types.Scene.html#bpy.types.Scene), (never None)) – The scene to operate in (for contextual things like keeping active object active, ensuring all overridden objects remain instantiated, etc.)\n\nview_layer ([ViewLayer](https://docs.blender.org/api/current/bpy.types.ViewLayer.html#bpy.types.ViewLayer), (optional)) – The view layer to operate in (same usage as the`scene` data, in case it is not provided the scene’s collection will be used instead)\n\nresidual_storage ([Collection](https://docs.blender.org/api/current/bpy.types.Collection.html#bpy.types.Collection), (optional)) – Collection where to store objects that are instantiated in any other collection anymore (garbage collection, will be created if needed and none is provided)\n\ndo_hierarchy_enforce (boolean, (optional)) – Enforce restoring the dependency hierarchy between data-blocks to match the one from the reference linked hierarchy (WARNING: if some ID pointers have been purposely overridden, these will be reset to their default value)\n\ndo_whole_hierarchy (boolean, (optional)) – Resync the whole hierarchy this data-block belongs to, not only its own sub-hierarchy\n\nReturns:\n\nSuccess, Whether the resync process was successful or not\n\nReturn type:\n\nboolean\n\nclassmethod bl_rna_get_subclass(id, default=None, /)¶ Parameters:\n\nid (str) – The RNA type identifier.\n\nReturns:\n\nThe RNA type or default when not found.\n\nReturn type:\n\n[bpy.types.Struct](https://docs.blender.org/api/current/bpy.types.Struct.html#bpy.types.Struct) subclass\n\nclassmethod bl_rna_get_subclass_py(id, default=None, /)¶ Parameters:\n\nid (str) – The RNA type identifier.\n\nReturns:\n\nThe class or default when not found.\n\nReturn type:\n\ntype\n\n## Inherited Properties¶\n\n[bpy_struct.id_data](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.id_data)\n\n## Inherited Functions¶\n\n[bpy_struct.as_pointer](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.as_pointer)\n\n[bpy_struct.driver_add](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.driver_add)\n\n[bpy_struct.driver_remove](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.driver_remove)\n\n[bpy_struct.get](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.get)\n\n[bpy_struct.id_properties_clear](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.id_properties_clear)\n\n[bpy_struct.id_properties_ensure](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.id_properties_ensure)\n\n[bpy_struct.id_properties_ui](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.id_properties_ui)\n\n[bpy_struct.is_property_hidden](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.is_property_hidden)\n\n[bpy_struct.is_property_overridable_library](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.is_property_overridable_library)\n\n[bpy_struct.is_property_readonly](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.is_property_readonly)\n\n[bpy_struct.is_property_set](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.is_property_set)\n\n[bpy_struct.items](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.items)\n\n[bpy_struct.keyframe_delete](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.keyframe_delete)\n\n[bpy_struct.keyframe_insert](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.keyframe_insert)\n\n[bpy_struct.keys](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.keys)\n\n[bpy_struct.path_from_id](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.path_from_id)\n\n[bpy_struct.path_from_module](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.path_from_module)\n\n[bpy_struct.path_resolve](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.path_resolve)\n\n[bpy_struct.pop](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.pop)\n\n[bpy_struct.property_overridable_library_set](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.property_overridable_library_set)\n\n[bpy_struct.property_unset](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.property_unset)\n\n[bpy_struct.rna_ancestors](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.rna_ancestors)\n\n[bpy_struct.type_recast](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.type_recast)\n\n[bpy_struct.values](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.values)\n\n## References¶\n\n[ID.override_library](https://docs.blender.org/api/current/bpy.types.ID.html#bpy.types.ID.override_library)" +} +``` +User decision: **accepted** + +Status: **completed** + + +
+
+ +--- + + +
+Tool use: **web_fetch** + + +Parameters: + +```json +{ + "url": "https://docs.blender.org/api/current/bpy.types.ID.html" +} +``` +Result: + +```json +{ + "url": "https://docs.blender.org/api/current/bpy.types.ID.html", + "markdown": "ID(bpy_struct) - Blender Python API\n\n# ID(bpy_struct)¶\n\nbase class — [bpy_struct](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct)\n\nsubclasses — [Action](https://docs.blender.org/api/current/bpy.types.Action.html#bpy.types.Action), [Annotation](https://docs.blender.org/api/current/bpy.types.Annotation.html#bpy.types.Annotation), [Armature](https://docs.blender.org/api/current/bpy.types.Armature.html#bpy.types.Armature), [Brush](https://docs.blender.org/api/current/bpy.types.Brush.html#bpy.types.Brush), [CacheFile](https://docs.blender.org/api/current/bpy.types.CacheFile.html#bpy.types.CacheFile), [Camera](https://docs.blender.org/api/current/bpy.types.Camera.html#bpy.types.Camera), [Collection](https://docs.blender.org/api/current/bpy.types.Collection.html#bpy.types.Collection), [Curve](https://docs.blender.org/api/current/bpy.types.Curve.html#bpy.types.Curve), [Curves](https://docs.blender.org/api/current/bpy.types.Curves.html#bpy.types.Curves), [FreestyleLineStyle](https://docs.blender.org/api/current/bpy.types.FreestyleLineStyle.html#bpy.types.FreestyleLineStyle), [GreasePencil](https://docs.blender.org/api/current/bpy.types.GreasePencil.html#bpy.types.GreasePencil), [Image](https://docs.blender.org/api/current/bpy.types.Image.html#bpy.types.Image), [Key](https://docs.blender.org/api/current/bpy.types.Key.html#bpy.types.Key), [Lattice](https://docs.blender.org/api/current/bpy.types.Lattice.html#bpy.types.Lattice), [Library](https://docs.blender.org/api/current/bpy.types.Library.html#bpy.types.Library), [Light](https://docs.blender.org/api/current/bpy.types.Light.html#bpy.types.Light), [LightProbe](https://docs.blender.org/api/current/bpy.types.LightProbe.html#bpy.types.LightProbe), [Mask](https://docs.blender.org/api/current/bpy.types.Mask.html#bpy.types.Mask), [Material](https://docs.blender.org/api/current/bpy.types.Material.html#bpy.types.Material), [Mesh](https://docs.blender.org/api/current/bpy.types.Mesh.html#bpy.types.Mesh), [MetaBall](https://docs.blender.org/api/current/bpy.types.MetaBall.html#bpy.types.MetaBall), [MovieClip](https://docs.blender.org/api/current/bpy.types.MovieClip.html#bpy.types.MovieClip), [NodeTree](https://docs.blender.org/api/current/bpy.types.NodeTree.html#bpy.types.NodeTree), [Object](https://docs.blender.org/api/current/bpy.types.Object.html#bpy.types.Object), [PaintCurve](https://docs.blender.org/api/current/bpy.types.PaintCurve.html#bpy.types.PaintCurve), [Palette](https://docs.blender.org/api/current/bpy.types.Palette.html#bpy.types.Palette), [ParticleSettings](https://docs.blender.org/api/current/bpy.types.ParticleSettings.html#bpy.types.ParticleSettings), [PointCloud](https://docs.blender.org/api/current/bpy.types.PointCloud.html#bpy.types.PointCloud), [Scene](https://docs.blender.org/api/current/bpy.types.Scene.html#bpy.types.Scene), [Screen](https://docs.blender.org/api/current/bpy.types.Screen.html#bpy.types.Screen), [Sound](https://docs.blender.org/api/current/bpy.types.Sound.html#bpy.types.Sound), [Speaker](https://docs.blender.org/api/current/bpy.types.Speaker.html#bpy.types.Speaker), [Text](https://docs.blender.org/api/current/bpy.types.Text.html#bpy.types.Text), [Texture](https://docs.blender.org/api/current/bpy.types.Texture.html#bpy.types.Texture), [VectorFont](https://docs.blender.org/api/current/bpy.types.VectorFont.html#bpy.types.VectorFont), [Volume](https://docs.blender.org/api/current/bpy.types.Volume.html#bpy.types.Volume), [WindowManager](https://docs.blender.org/api/current/bpy.types.WindowManager.html#bpy.types.WindowManager), [WorkSpace](https://docs.blender.org/api/current/bpy.types.WorkSpace.html#bpy.types.WorkSpace), [World](https://docs.blender.org/api/current/bpy.types.World.html#bpy.types.World)\n\nclass bpy.types.ID(bpy_struct)¶\n\nBase type for data-blocks, defining a unique name, linking from other libraries and garbage collection\n\nasset_data¶\n\nAdditional data for an asset data-block\n\nType:\n\n[AssetMetaData](https://docs.blender.org/api/current/bpy.types.AssetMetaData.html#bpy.types.AssetMetaData)\n\nid_type¶\n\nType identifier of this data-block\n\nType:\n\nenum in [Id Type Items](https://docs.blender.org/api/current/bpy_types_enum_items/id_type_items.html#rna-enum-id-type-items), default`'ACTION'`, (readonly)\n\nis_editable¶\n\nThis data-block is editable in the user interface. Linked data-blocks are not editable, except if they were loaded as editable assets.\n\nType:\n\nboolean, default False, (readonly)\n\nis_embedded_data¶\n\nThis data-block is not an independent one, but is actually a sub-data of another ID (typical example: root node trees or master collections)\n\nType:\n\nboolean, default False, (readonly)\n\nis_evaluated¶\n\nWhether this ID is runtime-only, evaluated data-block, or actual data from .blend file\n\nType:\n\nboolean, default False, (readonly)\n\nis_library_indirect¶\n\nIs this ID block linked indirectly\n\nType:\n\nboolean, default False, (readonly)\n\nis_linked_packed¶\n\nThis data-block is linked and packed into the .blend file\n\nType:\n\nboolean, default False, (readonly)\n\nis_missing¶\n\nThis data-block is a place-holder for missing linked data (i.e. it is [an override of] a linked data that could not be found anymore)\n\nType:\n\nboolean, default False, (readonly)\n\nis_runtime_data¶\n\nThis data-block is runtime data, i.e. it won’t be saved in .blend file. Note that e.g. evaluated IDs are always runtime, so this value is only editable for data-blocks in Main data-base.\n\nType:\n\nboolean, default False\n\nlibrary¶\n\nLibrary file the data-block is linked from\n\nType:\n\n[Library](https://docs.blender.org/api/current/bpy.types.Library.html#bpy.types.Library), (readonly)\n\nlibrary_weak_reference¶\n\nWeak reference to a data-block in another library .blend file (used to re-use already appended data instead of appending new copies)\n\nType:\n\n[LibraryWeakReference](https://docs.blender.org/api/current/bpy.types.LibraryWeakReference.html#bpy.types.LibraryWeakReference), (readonly)\n\nname¶\n\nUnique data-block ID name (within a same type and library)\n\nType:\n\nstring, default “”, (never None)\n\nname_full¶\n\nUnique data-block ID name, including library one if any\n\nType:\n\nstring, default “”, (readonly, never None)\n\noriginal¶\n\nActual data-block from .blend file (Main database) that generated that evaluated one\n\nType:\n\n`ID`, (readonly)\n\noverride_library¶\n\nLibrary override data\n\nType:\n\n[IDOverrideLibrary](https://docs.blender.org/api/current/bpy.types.IDOverrideLibrary.html#bpy.types.IDOverrideLibrary), (readonly)\n\npreview¶\n\nPreview image and icon of this data-block (always None if not supported for this type of data)\n\nType:\n\n[ImagePreview](https://docs.blender.org/api/current/bpy.types.ImagePreview.html#bpy.types.ImagePreview), (readonly)\n\nsession_uid¶\n\nA session-wide unique identifier for the data block that remains the same across renames and internal reallocations, unchanged when reloading the file\n\nType:\n\nint in [-inf, inf], default 0, (readonly)\n\ntag¶\n\nTools can use this to tag data for their own purposes (initial state is undefined)\n\nType:\n\nboolean, default False\n\nuse_extra_user¶\n\nIndicates whether an extra user is set or not (mainly for internal/debug usages)\n\nType:\n\nboolean, default False\n\nuse_fake_user¶\n\nSave this data-block even if it has no users\n\nType:\n\nboolean, default False\n\nusers¶\n\nNumber of times this data-block is referenced\n\nType:\n\nint in [0, inf], default 0, (readonly)\n\nbl_system_properties_get(*, do_create=False)¶\n\nDEBUG ONLY. Internal access to runtime-defined RNA data storage, intended solely for testing and debugging purposes. Do not access it in regular scripting work, and in particular, do not assume that it contains writable data\n\nParameters:\n\ndo_create (boolean, (optional)) – Ensure that system properties are created if they do not exist yet\n\nReturns:\n\nThe system properties root container, or None if there are no system properties stored in this data yet, and its creation was not requested\n\nReturn type:\n\n[PropertyGroup](https://docs.blender.org/api/current/bpy.types.PropertyGroup.html#bpy.types.PropertyGroup)\n\nrename(name, *, mode='NEVER')¶\n\nMore refined handling in case the new name collides with another ID’s name\n\nParameters:\n\nname (string, (never None)) – New name to rename the ID to, if empty will re-use the current ID name\n\nmode (enum in [`'NEVER'`,`'ALWAYS'`,`'SAME_ROOT'`], (optional)) –\n\nHow to handle name collision, in case the requested new name is already used by another ID of the same type\n\n`NEVER` Never Rename – Never rename an existing ID whose name would conflict, the currently renamed ID will get a numeric suffix appended to its new name.\n\n`ALWAYS` Always Rename – Always rename an existing ID whose name would conflict, ensuring that the currently renamed ID will get requested name.\n\n`SAME_ROOT` Rename If Same Root – Only rename an existing ID whose name would conflict if its name root (everything besides the numerical suffix) is the same as the existing name of the currently renamed ID.\n\nReturns:\n\nHow did the renaming of the data-block went on\n\n`UNCHANGED` Unchanged – The ID was not renamed, e.g. because it is already named as requested.\n\n`UNCHANGED_COLLISION` Unchanged Due to Collision – The ID was not renamed, because requested name would have collided with another existing ID’s name, and the automatically adjusted name was the same as the current ID’s name.\n\n`RENAMED_NO_COLLISION` Renamed Without Collision – The ID was renamed as requested, without creating any name collision.\n\n`RENAMED_COLLISION_ADJUSTED` Renamed With Collision – The ID was renamed with adjustment of the requested name, to avoid a name collision.\n\n`RENAMED_COLLISION_FORCED` Renamed Enforced With Collision – The ID was renamed as requested, also renaming another ID to avoid a name collision.\n\nReturn type:\n\nenum in [`'UNCHANGED'`,`'UNCHANGED_COLLISION'`,`'RENAMED_NO_COLLISION'`,`'RENAMED_COLLISION_ADJUSTED'`,`'RENAMED_COLLISION_FORCED'`]\n\nevaluated_get(depsgraph)¶\n\nGet corresponding evaluated ID from the given dependency graph. Note that this does not ensure the dependency graph is fully evaluated, it just returns the result of the last evaluation.\n\nParameters:\n\ndepsgraph ([Depsgraph](https://docs.blender.org/api/current/bpy.types.Depsgraph.html#bpy.types.Depsgraph), (never None)) – Dependency graph to perform lookup in\n\nReturns:\n\nNew copy of the ID\n\nReturn type:\n\n`ID`\n\ncopy()¶\n\nCreate a copy of this data-block (not supported for all data-blocks). The result is added to the Blend-File Data (Main database), with all references to other data-blocks ensured to be from within the same Blend-File Data.\n\nReturns:\n\nNew copy of the ID\n\nReturn type:\n\n`ID`\n\nasset_mark()¶\n\nEnable easier reuse of the data-block through the Asset Browser, with the help of customizable metadata (like previews, descriptions and tags)\n\nasset_clear()¶\n\nDelete all asset metadata and turn the asset data-block back into a normal data-block\n\nasset_generate_preview()¶\n\nGenerate preview image (might be scheduled in a background thread)\n\noverride_create(*, remap_local_usages=False)¶\n\nCreate an overridden local copy of this linked data-block (not supported for all data-blocks)\n\nParameters:\n\nremap_local_usages (boolean, (optional)) – Whether local usages of the linked ID should be remapped to the new library override of it\n\nReturns:\n\nNew overridden local copy of the ID\n\nReturn type:\n\n`ID`\n\noverride_hierarchy_create(scene, view_layer, *, reference=None, do_fully_editable=False)¶\n\nCreate an overridden local copy of this linked data-block, and most of its dependencies when it is a Collection or and Object\n\nParameters:\n\nscene ([Scene](https://docs.blender.org/api/current/bpy.types.Scene.html#bpy.types.Scene), (never None)) – In which scene the new overrides should be instantiated\n\nview_layer ([ViewLayer](https://docs.blender.org/api/current/bpy.types.ViewLayer.html#bpy.types.ViewLayer), (never None)) – In which view layer the new overrides should be instantiated\n\nreference (`ID`, (optional)) – Another ID (usually an Object or Collection) used as a hint to decide where to instantiate the new overrides\n\ndo_fully_editable (boolean, (optional)) – Make all library overrides generated by this call fully editable by the user (none will be ‘system overrides’)\n\nReturns:\n\nNew overridden local copy of the root ID\n\nReturn type:\n\n`ID`\n\nuser_clear()¶\n\nClear the user count of a data-block so its not saved, on reload the data will be removed\n\nThis function is for advanced use only, misuse can crash Blender since the user count is used to prevent data being removed when it is used.\n\n```\n# This example shows what _not_ to do, and will crash Blender.\nimport bpy\n\n# Object which is in the scene.\nobj = bpy.data.objects[\"Cube\"]\n\n# Without this, removal would raise an error.\nobj.user_clear()\n\n# Runs without an exception but will crash on redraw.\nbpy.data.objects.remove(obj)\n\n```\n\nuser_remap(new_id)¶\n\nReplace all usage in the .blend file of this ID by new given one\n\nParameters:\n\nnew_id (`ID`, (never None)) – New ID to use\n\nmake_local(*, clear_proxy=True, clear_liboverride=False, clear_asset_data=True)¶\n\nMake this data-block local, return local one (may be a copy of the original, in case it is also indirectly used)\n\nParameters:\n\nclear_proxy (boolean, (optional)) – Deprecated, has no effect\n\nclear_liboverride (boolean, (optional)) – Remove potential library override data from the newly made local data\n\nclear_asset_data (boolean, (optional)) – Remove potential asset metadata so the newly local data-block is not treated as asset data-block and won’t show up in asset libraries\n\nReturns:\n\nThis ID, or the new ID if it was copied\n\nReturn type:\n\n`ID`\n\nuser_of_id(id)¶\n\nCount the number of times that ID uses/references given one\n\nParameters:\n\nid (`ID`, (never None)) – ID to count usages\n\nReturns:\n\nNumber of usages/references of given id by current data-block\n\nReturn type:\n\nint in [0, inf]\n\nanimation_data_create()¶\n\nCreate animation data to this ID, note that not all ID types support this\n\nReturns:\n\nNew animation data or nullptr\n\nReturn type:\n\n[AnimData](https://docs.blender.org/api/current/bpy.types.AnimData.html#bpy.types.AnimData)\n\nanimation_data_clear()¶\n\nClear animation on this ID\n\nupdate_tag(*, refresh={})¶\n\nTag the ID to update its display data, e.g. when calling`bpy.types.Scene.update`\n\nParameters:\n\nrefresh (enum set in {`'OBJECT'`,`'DATA'`,`'TIME'`}, (optional)) – Type of updates to perform\n\npreview_ensure()¶\n\nEnsure that this ID has preview data (if ID type supports it)\n\nReturns:\n\nThe existing or created preview\n\nReturn type:\n\n[ImagePreview](https://docs.blender.org/api/current/bpy.types.ImagePreview.html#bpy.types.ImagePreview)\n\nclassmethod bl_rna_get_subclass(id, default=None, /)¶ Parameters:\n\nid (str) – The RNA type identifier.\n\nReturns:\n\nThe RNA type or default when not found.\n\nReturn type:\n\n[bpy.types.Struct](https://docs.blender.org/api/current/bpy.types.Struct.html#bpy.types.Struct) subclass\n\nclassmethod bl_rna_get_subclass_py(id, default=None, /)¶ Parameters:\n\nid (str) – The RNA type identifier.\n\nReturns:\n\nThe class or default when not found.\n\nReturn type:\n\ntype\n\n## Inherited Properties¶\n\n[bpy_struct.id_data](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.id_data)\n\n## Inherited Functions¶\n\n[bpy_struct.as_pointer](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.as_pointer)\n\n[bpy_struct.driver_add](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.driver_add)\n\n[bpy_struct.driver_remove](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.driver_remove)\n\n[bpy_struct.get](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.get)\n\n[bpy_struct.id_properties_clear](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.id_properties_clear)\n\n[bpy_struct.id_properties_ensure](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.id_properties_ensure)\n\n[bpy_struct.id_properties_ui](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.id_properties_ui)\n\n[bpy_struct.is_property_hidden](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.is_property_hidden)\n\n[bpy_struct.is_property_overridable_library](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.is_property_overridable_library)\n\n[bpy_struct.is_property_readonly](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.is_property_readonly)\n\n[bpy_struct.is_property_set](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.is_property_set)\n\n[bpy_struct.items](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.items)\n\n[bpy_struct.keyframe_delete](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.keyframe_delete)\n\n[bpy_struct.keyframe_insert](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.keyframe_insert)\n\n[bpy_struct.keys](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.keys)\n\n[bpy_struct.path_from_id](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.path_from_id)\n\n[bpy_struct.path_from_module](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.path_from_module)\n\n[bpy_struct.path_resolve](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.path_resolve)\n\n[bpy_struct.pop](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.pop)\n\n[bpy_struct.property_overridable_library_set](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.property_overridable_library_set)\n\n[bpy_struct.property_unset](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.property_unset)\n\n[bpy_struct.rna_ancestors](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.rna_ancestors)\n\n[bpy_struct.type_recast](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.type_recast)\n\n[bpy_struct.values](https://docs.blender.org/api/current/bpy.types.bpy_struct.html#bpy.types.bpy_struct.values)\n\n## References¶\n\n[bpy.context.annotation_data_owner](https://docs.blender.org/api/current/bpy.context.html#bpy.context.annotation_data_owner)\n\n[bpy.context.id](https://docs.blender.org/api/current/bpy.context.html#bpy.context.id)\n\n[bpy.context.selected_ids](https://docs.blender.org/api/current/bpy.context.html#bpy.context.selected_ids)\n\n[bpy.context.texture_user](https://docs.blender.org/api/current/bpy.context.html#bpy.context.texture_user)\n\n[Action.fcurve_ensure_for_datablock](https://docs.blender.org/api/current/bpy.types.Action.html#bpy.types.Action.fcurve_ensure_for_datablock)\n\n[ActionSlot.users](https://docs.blender.org/api/current/bpy.types.ActionSlot.html#bpy.types.ActionSlot.users)\n\n[AssetRepresentation.local_id](https://docs.blender.org/api/current/bpy.types.AssetRepresentation.html#bpy.types.AssetRepresentation.local_id)\n\n[BlendData.pack_linked_ids_hierarchy](https://docs.blender.org/api/current/bpy.types.BlendData.html#bpy.types.BlendData.pack_linked_ids_hierarchy)\n\n[BlendData.pack_linked_ids_hierarchy](https://docs.blender.org/api/current/bpy.types.BlendData.html#bpy.types.BlendData.pack_linked_ids_hierarchy)\n\n[BlendDataObjects.new](https://docs.blender.org/api/current/bpy.types.BlendDataObjects.html#bpy.types.BlendDataObjects.new)\n\n[BlendImportContextItem.id](https://docs.blender.org/api/current/bpy.types.BlendImportContextItem.html#bpy.types.BlendImportContextItem.id)\n\n[BlendImportContextItem.library_override_id](https://docs.blender.org/api/current/bpy.types.BlendImportContextItem.html#bpy.types.BlendImportContextItem.library_override_id)\n\n[BlendImportContextItem.reusable_local_id](https://docs.blender.org/api/current/bpy.types.BlendImportContextItem.html#bpy.types.BlendImportContextItem.reusable_local_id)\n\n[Depsgraph.id_eval_get](https://docs.blender.org/api/current/bpy.types.Depsgraph.html#bpy.types.Depsgraph.id_eval_get)\n\n[Depsgraph.id_eval_get](https://docs.blender.org/api/current/bpy.types.Depsgraph.html#bpy.types.Depsgraph.id_eval_get)\n\n[Depsgraph.ids](https://docs.blender.org/api/current/bpy.types.Depsgraph.html#bpy.types.Depsgraph.ids)\n\n[DepsgraphUpdate.id](https://docs.blender.org/api/current/bpy.types.DepsgraphUpdate.html#bpy.types.DepsgraphUpdate.id)\n\n[DopeSheet.source](https://docs.blender.org/api/current/bpy.types.DopeSheet.html#bpy.types.DopeSheet.source)\n\n[DriverTarget.id](https://docs.blender.org/api/current/bpy.types.DriverTarget.html#bpy.types.DriverTarget.id)\n\n`ID.copy`\n\n`ID.evaluated_get`\n\n`ID.make_local`\n\n`ID.original`\n\n`ID.override_create`\n\n`ID.override_hierarchy_create`\n\n`ID.override_hierarchy_create`\n\n`ID.user_of_id`\n\n`ID.user_remap`\n\n[IDOverrideLibrary.hierarchy_root](https://docs.blender.org/api/current/bpy.types.IDOverrideLibrary.html#bpy.types.IDOverrideLibrary.hierarchy_root)\n\n[IDOverrideLibrary.reference](https://docs.blender.org/api/current/bpy.types.IDOverrideLibrary.html#bpy.types.IDOverrideLibrary.reference)\n\n[IDOverrideLibraryPropertyOperation.subitem_local_id](https://docs.blender.org/api/current/bpy.types.IDOverrideLibraryPropertyOperation.html#bpy.types.IDOverrideLibraryPropertyOperation.subitem_local_id)\n\n[IDOverrideLibraryPropertyOperation.subitem_reference_id](https://docs.blender.org/api/current/bpy.types.IDOverrideLibraryPropertyOperation.html#bpy.types.IDOverrideLibraryPropertyOperation.subitem_reference_id)\n\n[IDOverrideLibraryPropertyOperations.add](https://docs.blender.org/api/current/bpy.types.IDOverrideLibraryPropertyOperations.html#bpy.types.IDOverrideLibraryPropertyOperations.add)\n\n[IDOverrideLibraryPropertyOperations.add](https://docs.blender.org/api/current/bpy.types.IDOverrideLibraryPropertyOperations.html#bpy.types.IDOverrideLibraryPropertyOperations.add)\n\n[IDViewerPathElem.id](https://docs.blender.org/api/current/bpy.types.IDViewerPathElem.html#bpy.types.IDViewerPathElem.id)\n\n[Key.user](https://docs.blender.org/api/current/bpy.types.Key.html#bpy.types.Key.user)\n\n[KeyingSetPath.id](https://docs.blender.org/api/current/bpy.types.KeyingSetPath.html#bpy.types.KeyingSetPath.id)\n\n[KeyingSetPaths.add](https://docs.blender.org/api/current/bpy.types.KeyingSetPaths.html#bpy.types.KeyingSetPaths.add)\n\n[MaskParent.id](https://docs.blender.org/api/current/bpy.types.MaskParent.html#bpy.types.MaskParent.id)\n\n[NodeTree.get_from_context](https://docs.blender.org/api/current/bpy.types.NodeTree.html#bpy.types.NodeTree.get_from_context)\n\n[NodeTree.get_from_context](https://docs.blender.org/api/current/bpy.types.NodeTree.html#bpy.types.NodeTree.get_from_context)\n\n[NodesModifierDataBlock.id](https://docs.blender.org/api/current/bpy.types.NodesModifierDataBlock.html#bpy.types.NodesModifierDataBlock.id)\n\n[Object.data](https://docs.blender.org/api/current/bpy.types.Object.html#bpy.types.Object.data)\n\n[PropertyGroupItem.id](https://docs.blender.org/api/current/bpy.types.PropertyGroupItem.html#bpy.types.PropertyGroupItem.id)\n\n[SpaceFileBrowser.activate_asset_by_id](https://docs.blender.org/api/current/bpy.types.SpaceFileBrowser.html#bpy.types.SpaceFileBrowser.activate_asset_by_id)\n\n[SpaceNodeEditor.id](https://docs.blender.org/api/current/bpy.types.SpaceNodeEditor.html#bpy.types.SpaceNodeEditor.id)\n\n[SpaceNodeEditor.id_from](https://docs.blender.org/api/current/bpy.types.SpaceNodeEditor.html#bpy.types.SpaceNodeEditor.id_from)\n\n[SpaceProperties.pin_id](https://docs.blender.org/api/current/bpy.types.SpaceProperties.html#bpy.types.SpaceProperties.pin_id)\n\n[UILayout.template_action](https://docs.blender.org/api/current/bpy.types.UILayout.html#bpy.types.UILayout.template_action)\n\n[UILayout.template_path_builder](https://docs.blender.org/api/current/bpy.types.UILayout.html#bpy.types.UILayout.template_path_builder)\n\n[UILayout.template_preview](https://docs.blender.org/api/current/bpy.types.UILayout.html#bpy.types.UILayout.template_preview)\n\n[UILayout.template_preview](https://docs.blender.org/api/current/bpy.types.UILayout.html#bpy.types.UILayout.template_preview)" +} +``` +User decision: **accepted** + +Status: **completed** + + +
+
+ +--- + +
Thought Process + +I see: `is_system_override` - "Whether this library override exists only for the override hierarchy, or if it is actually editable by the user" - so when False, it's editable by the user. So maybe after creating the override we need to ensure is_system_override is False? Let me check the ID.html for override_create and override_hierarchy_create. +
+ +--- + + + + + +--- + + +
+Tool use: **ripgrep_raw_search** + + +Parameters: + +```json +{ + "pattern": "override_create|override_hierarchy|do_fully", + "path": "C:\\Users\\Nathan\\.cursor\\projects\\t-Dynamic-Link-Manager\\agent-tools\\ce1deae4-c7ce-4345-9a71-2256b4251b6a.txt", + "contextBefore": 0, + "contextAfter": 5, + "caseInsensitive": false +} +``` +Additional data: + +```json +{ + "isPruned": true, + "pattern": "override_create|override_hierarchy|do_fully", + "path": "C:\\Users\\Nathan\\.cursor\\projects\\t-Dynamic-Link-Manager\\agent-tools\\ce1deae4-c7ce-4345-9a71-2256b4251b6a.txt", + "outputMode": "content", + "totalFiles": 1, + "totalMatches": 6, + "topFiles": [ + { + "uri": "C:\\Users\\Nathan\\.cursor\\projects\\t-Dynamic-Link-Manager\\agent-tools\\ce1deae4-c7ce-4345-9a71-2256b4251b6a.txt", + "matchCount": 28 + } + ] +} +``` +Status: **completed** + + +
+
+ +--- + +
Thought Process + +So: +- `override_create(remap_local_usages=False)` - Create an overridden local copy of this linked data-block. Doesn't have do_fully_editable. +- `override_hierarchy_create(scene, view_layer, reference=None, do_fully_editable=False)` - For Collection or Object, creates override and dependencies. **do_fully_editable** - "Make all library overrides generated by this call fully editable by the user (none will be 'system overrides')". + +So for a single mesh **object**, we could try `ob.override_hierarchy_create(scene, view_layer, do_fully_editable=True)` instead of `ob.override_create()`. That would create the override with full editability. And the doc says "when it is a Collection or an Object" - so it works on Object! So we could: +1. For the object: use `ob.override_hierarchy_create(context.scene, context.view_layer, do_fully_editable=True)` instead of `ob.override_create()`. That might create the object override and possibly its data as well, and make them fully editable. +2. For the mesh data: if the object hierarchy create doesn't pull in the mesh data, we might still need ob.data.override_create(remap_local_usages=True). + +But wait - override_hierarchy_create returns "New overridden local copy of the root ID" - so it might create a new object and we'd be left with a reference to the old linked object. We need to run step 6 in a context where we have context.scene and context.view_layer. The migrator run_step_6 doesn't receive context - it only gets (orig, rep, rep_descendants). So we'd need to pass context to run_step_6 to use override_hierarchy_create. + +Let me check - does override_hierarchy_create on an Object require the object to be in the scene? It takes scene and view_layer. So we need to pass context into run_step_6. Let me check the call sites. +
+ +--- + + +Checking the migrator signature and whether we can use `override_hierarchy_create` on the object (with context): + + +--- + + +
Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\ops\migrator.py + +
+
+ +--- + + +
+Tool use: **ripgrep_raw_search** + + +Parameters: + +```json +{ + "pattern": "run_step_6\\(", + "path": "T:\\Dynamic-Link-Manager", + "caseInsensitive": false +} +``` +Additional data: + +```json +{ + "isPruned": true, + "pattern": "run_step_6\\(", + "path": "T:\\Dynamic-Link-Manager", + "outputMode": "content", + "totalFiles": 6, + "totalMatches": 10, + "topFiles": [ + { + "uri": "ui/operators.py", + "matchCount": 1 + }, + { + "uri": ".specstory\\history\\2026-02-18_23-39Z-character-migrator-workflow-integration.md", + "matchCount": 2 + }, + { + "uri": "ops\\migrator.py", + "matchCount": 2 + }, + { + "uri": "ops/migrator.py", + "matchCount": 2 + }, + { + "uri": ".specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md", + "matchCount": 2 + }, + { + "uri": "ui\\operators.py", + "matchCount": 1 + } + ] +} +``` +Status: **completed** + + +
+
+ +--- + +
Thought Process + +The Blender API says: +- `override_hierarchy_create(scene, view_layer, *, reference=None, do_fully_editable=False)` on an ID - "Create an overridden local copy of this linked data-block, and most of its dependencies when it is a Collection or an Object" + +So for an **Object** (the mesh object), we can call `ob.override_hierarchy_create(scene, view_layer, do_fully_editable=True)`. That would create overrides for the object and "most of its dependencies" - which likely includes the mesh data. And do_fully_editable=True would make them all user-editable (not system overrides). + +The catch: the doc says "Returns: New overridden local copy of the root ID". So it might return a new object - meaning the hierarchy might be replaced in the scene. So we'd need to use the returned object for the rest of the step (shape keys, etc.). Let me try adding context to run_step_6 and using override_hierarchy_create on the object when it's linked. That way we create the override the same way as the UI (hierarchy + fully editable). + +I'll: +1. Add an optional `context` parameter to run_step_6 so we can pass scene/view_layer when available. +2. When the object is linked and context is provided: call `ob.override_hierarchy_create(context.scene, context.view_layer, do_fully_editable=True)`. The return value is the new override root - we might need to then get the mesh object from the scene again (or the override might be in-place; I need to check). Actually the doc says "New overridden local copy of the root ID" - so it creates a NEW object. So the old `ob` might still point to the linked one, and the new override might be in the collection. So after calling override_hierarchy_create we might need to find the new object in rep_descendants again... Actually when you create an override hierarchy from an object, Blender typically replaces the instance in the scene with the override. So the object we have might get "replaced" - i.e. the same name might now refer to the override. Let me check - actually in Blender, override_hierarchy_create might replace the linked object in the view layer with the override, so ob might become invalid or the override might be a different object. I'll try: call override_hierarchy_create(do_fully_editable=True), then continue with the rest of the loop. If the API replaces in place, ob might now be the override; if it returns a new ID, we might need to use the returned value. The Blender docs say "Returns: New overridden local copy of the root ID" - so we get a new object back. So we should do: + new_ob = ob.override_hierarchy_create(context.scene, context.view_layer, do_fully_editable=True) + ob = new_ob # use the override for shape key assignment + # and then do the shape key action on ob.data (which would now be the override's data) + +3. When context is not provided (e.g. run_full_migration), we keep the current override_create() behavior for backward compatibility. + +Actually re-reading the user message again: "Ah, it says shift click to clear the library override and toggle if it can be edited. That's what we need to do. Is that a different operation?" + +So the user is asking: the UI has a "shift click" that toggles whether the override can be edited. So the operation we need might be "make the override editable" (toggle), not "create the override". So maybe: +1. First we need to create the override (which we're trying to do with override_create). +2. Then we need to make it "editable" - which might be setting is_system_override = False or using some "make editable" API. + +But the user said the override "still isn't being created" - so the first step might still be failing. Then they said "shift click ... toggle if it can be edited. That's what we need to do. Is that a different operation?" - so they're asking if we need to do that toggle operation. So maybe: +- Option A: Use override_hierarchy_create(do_fully_editable=True) so the override is created AND made fully editable in one go. +- Option B: After override_create(), call something to make it editable (e.g. set a flag). + +Let me try Option A: pass context to run_step_6 and use override_hierarchy_create for the object when it's linked. That should create the override hierarchy (object + mesh data) and make it fully editable. I'll need to update the operator to pass context. +
+ +--- + + +Using `override_hierarchy_create(do_fully_editable=True)` for the mesh object so we create the override and make it editable like the UI. Implementing it. + + +--- + + +
Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\ui\operators.py + +
+
+ +--- + +
Thought Process + +I'll: +1. Change run_step_6 to accept an optional context: run_step_6(orig, rep, rep_descendants, context=None). +2. When context is provided and the object is linked, use ob.override_hierarchy_create(context.scene, context.view_layer, do_fully_editable=True) instead of ob.override_create(). The API says it works on Object and creates override + dependencies (likely including mesh data), and do_fully_editable makes them user-editable. +3. When we use override_hierarchy_create, it returns the new override root - we should use that for the rest of the loop iteration (shape keys etc.). So: new_ob = ob.override_hierarchy_create(...); ob = new_ob. Then we don't need to call ob.data.override_create() separately if the hierarchy create already pulled in the mesh. But if the mesh data is still linked after hierarchy create, we'd still need to override it. Let me try hierarchy create first and see - and only do ob.data.override_create if data is still linked. +4. When context is not provided (e.g. from run_full_migration), keep current behavior (override_create). +5. Update the operator to pass context: run_step_6(orig, rep, rep_descendants, context). +6. Update run_full_migration to pass context when it calls run_step_6. +
+ +--- + + +Updating the migrator to use `override_hierarchy_create(do_fully_editable=True)` when context is available, and passing context from the operator. + + +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ops\migrator.py + +
+ +
+ +--- + +
Thought Process + +Now I need to update the call sites to pass context. run_full_migration has context, and the operator has context. So: +1. In ui/operators.py: run_step_6(orig, rep, rep_descendants, context) +2. In ops/migrator.py run_full_migration: run_step_6(orig, rep, rep_descendants, context) +
+ +--- + + + + + +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ui\operators.py + +
+ +
+ +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\ops\migrator.py + +
+ +
+ +--- + +
Thought Process + +override_hierarchy_create returns the new override ID. So after ob = ob.override_hierarchy_create(...), ob is the new override object. But we're iterating over rep_descendants which was computed once - so the list might still contain the old linked object reference. Using list(rep_descendants) so we don't modify the iterable. The new override object might have a different name or be the same - in Blender, when you create an override from a linked object, the override typically replaces the linked instance in the scene, so the object in the collection might now be the override. So "ob" after the call might need to be the returned value for the rest of the block (shape keys etc.). I already set ob = ob.override_hierarchy_create(...) so the rest of the loop uses the override. Good. + +One issue: if override_hierarchy_create fails, we fall back to ob.override_create() - but then ob is still the original. If override_create() also fails we pass. Then we check ob.data.library - at that point ob might still be the linked object, so ob.data could still be linked. So we still try ob.data.override_create(remap_local_usages=True). Good. +
+ +--- + + + + + +--- + + +
+Tool use: **read_lints** + + +Parameters: + +```json +{ + "paths": [ + "T:\\Dynamic-Link-Manager\\ops\\migrator.py", + "T:\\Dynamic-Link-Manager\\ui\\operators.py" + ] +} +``` +Result: + +```json +{ + "linterErrorsByFile": [ + { + "relativeWorkspacePath": "T:\\Dynamic-Link-Manager\\ops\\migrator.py" + }, + { + "relativeWorkspacePath": "T:\\Dynamic-Link-Manager\\ui\\operators.py" + } + ] +} +``` +Status: **completed** + + +
+
+ +--- + +
Thought Process + +All good. Let me summarize for the user. +
+ +--- + + +Summary of what’s in place: + +**Yes – it’s a different (stronger) operation.** +The UI “shift click” behavior is about making the override **editable**, not just creating it. In the API that’s done by creating the override with **“fully editable”** so it’s not a system override. + +**Change in code** + +1. **`run_step_6`** now takes an optional **`context`** and uses it when the mesh **object** is linked: + - If `context` is provided: call **`ob.override_hierarchy_create(context.scene, context.view_layer, do_fully_editable=True)`** instead of `ob.override_create()`. + - That creates the override **and** makes it user-editable (same idea as the UI “toggle if it can be edited”). + - If that call fails, it falls back to `ob.override_create()`. + - If `context` is missing (e.g. script use), behavior stays as before: only `ob.override_create()`. + +2. **Mesh data** is unchanged: when `ob.data` is still linked we still call **`ob.data.override_create(remap_local_usages=True)`** (after the object override is created). + +3. **Call sites** now pass **`context`** into `run_step_6`: + - The “Migrate BaseBody shapekeys” operator passes `context`. + - `run_full_migration(context)` passes `context`. + +So when you run the operator from the UI, the base body object (and its mesh data) is overridden using the same “create override and make it editable” path as the Outliner shift-click, via **`override_hierarchy_create(..., do_fully_editable=True)`**. + +--- + +_**User**_ + +@c:\Users\Nathan\.cursor\projects\t-Dynamic-Link-Manager\terminals\3.txt let's add debug, because it's still not editable. I want to make it so the user doesn't need to select the object, go to data tab, and shift click the lib override button. + +--- + diff --git a/ops/migrator.py b/ops/migrator.py index 7de8a41..c5122ff 100644 --- a/ops/migrator.py +++ b/ops/migrator.py @@ -151,9 +151,9 @@ def run_step_5(orig, rep, rep_descendants, orig_to_rep): m.object = rep -def run_step_6(orig, rep, rep_descendants): - """Replacement base body: library override only, then shape-key action.""" - for ob in rep_descendants: +def run_step_6(orig, rep, rep_descendants, context=None): + """Replacement base body: library override (fully editable when context given), then shape-key action.""" + for ob in list(rep_descendants): if ob.type != "MESH": continue name_lower = (ob.name + " " + (ob.data.name if ob.data else "")).lower() @@ -165,11 +165,51 @@ def run_step_6(orig, rep, rep_descendants): break else: continue - if getattr(ob.data, "library", None) or getattr(ob.data, "override_library", None): + # Debug: base body mesh state before override handling. + _lib = getattr(ob.data, "library", None) + _ol = getattr(ob.data, "override_library", None) + _sys = getattr(_ol, "is_system_override", None) if _ol else None + print(f"[DLM step6] {ob.name} data: linked={_lib is not None}, override={_ol is not None}, is_system_override={_sys}") + # Library override: use hierarchy create (fully editable) when context available, else single-id override. + if getattr(ob, "library", None): + if context: + try: + ob = ob.override_hierarchy_create( + context.scene, context.view_layer, do_fully_editable=True + ) + except Exception: + try: + ob.override_create() + except Exception: + pass + else: + try: + ob.override_create() + except Exception: + pass + if getattr(ob.data, "library", None): try: - ob.data.override_create() - except Exception: - pass + ob.data.override_create(remap_local_usages=True) + # Make override user-editable (same as shift-click in data tab). + ol = getattr(ob.data, "override_library", None) + if ol is not None and getattr(ol, "is_system_override", None) is not None: + try: + ol.is_system_override = False + except Exception as e: + print(f"[DLM step6] {ob.name} set is_system_override=False: {e}") + except Exception as e: + print(f"[DLM step6] {ob.name} ob.data.override_create: {e}") + elif getattr(ob.data, "override_library", None): + ol = ob.data.override_library + if getattr(ol, "is_system_override", False): + try: + ol.is_system_override = False + except Exception as e: + print(f"[DLM step6] {ob.name} set is_system_override=False: {e}") + # Debug: state after override handling. + _ol2 = getattr(ob.data, "override_library", None) + _sys2 = getattr(_ol2, "is_system_override", None) if _ol2 else None + print(f"[DLM step6] {ob.name} after: override={_ol2 is not None}, is_system_override={_sys2} (False=editable)") if ob.data.shape_keys: if not ob.data.shape_keys.animation_data: ob.data.shape_keys.animation_data_create() @@ -205,7 +245,7 @@ def run_full_migration(context): run_step_3(orig, rep) run_step_4(orig, rep, orig_to_rep) run_step_5(orig, rep, rep_descendants, orig_to_rep) - run_step_6(orig, rep, rep_descendants) + run_step_6(orig, rep, rep_descendants, context) except Exception as e: return False, str(e) return True, f"Migrated {orig.name} → {rep.name}" diff --git a/ui/operators.py b/ui/operators.py index 42523d3..a9af392 100644 --- a/ui/operators.py +++ b/ui/operators.py @@ -358,9 +358,9 @@ class DLM_OT_migrator_retarget_relations(Operator): return {"CANCELLED"} -class DLM_OT_migrator_replacement_base_body(Operator): - bl_idname = "dlm.migrator_replacement_base_body" - bl_label = "Replacement base body" +class DLM_OT_migrator_basebody_shapekeys(Operator): + bl_idname = "dlm.migrator_basebody_shapekeys" + bl_label = "Migrate BaseBody shapekeys" bl_options = {"REGISTER", "UNDO"} def execute(self, context): @@ -372,8 +372,8 @@ class DLM_OT_migrator_replacement_base_body(Operator): from ..ops.migrator import run_step_6 from ..utils import descendants rep_descendants = descendants(rep) - run_step_6(orig, rep, rep_descendants) - self.report({"INFO"}, "Replacement base body done.") + run_step_6(orig, rep, rep_descendants, context) + self.report({"INFO"}, "Migrate BaseBody shapekeys done.") return {"FINISHED"} except Exception as e: self.report({"ERROR"}, str(e)) @@ -386,7 +386,7 @@ MIGRATOR_STEP_OPS = ( "dlm.migrator_custom_properties", "dlm.migrator_bone_constraints", "dlm.migrator_retarget_relations", - "dlm.migrator_replacement_base_body", + "dlm.migrator_basebody_shapekeys", ) @@ -402,7 +402,7 @@ class DLM_OT_run_character_migration(Operator): bpy.ops.dlm.migrator_custom_properties, bpy.ops.dlm.migrator_bone_constraints, bpy.ops.dlm.migrator_retarget_relations, - bpy.ops.dlm.migrator_replacement_base_body, + bpy.ops.dlm.migrator_basebody_shapekeys, ] for i, op in enumerate(steps): result = op() @@ -464,5 +464,5 @@ OPERATOR_CLASSES = [ DLM_OT_migrator_custom_properties, DLM_OT_migrator_bone_constraints, DLM_OT_migrator_retarget_relations, - DLM_OT_migrator_replacement_base_body, + DLM_OT_migrator_basebody_shapekeys, ] diff --git a/ui/panels.py b/ui/panels.py index da1f0b5..fa482cc 100644 --- a/ui/panels.py +++ b/ui/panels.py @@ -92,7 +92,7 @@ class DLM_PT_main_panel(Panel): row = box.row(align=True) row.operator("dlm.migrator_bone_constraints", text="Bone constraints") row.operator("dlm.migrator_retarget_relations", text="Retarget relations") - row.operator("dlm.migrator_replacement_base_body", text="Replacement base body") + row.operator("dlm.migrator_basebody_shapekeys", text="Migrate BaseBody shapekeys") # Linked Libraries: header row (always), main box only when expanded missing_count = sum(1 for lib in props.linked_libraries if lib.is_missing)