Blender  V3.3
Classes | Typedefs | Functions
rna_path.cc File Reference
#include <cstdlib>
#include <stdlib.h>
#include <string.h>
#include "BLI_alloca.h"
#include "BLI_dynstr.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
#include "BLI_utildefines.h"
#include "BKE_idprop.h"
#include "BKE_idtype.h"
#include "DNA_ID.h"
#include "MEM_guardedalloc.h"
#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_path.h"
#include "RNA_prototypes.h"
#include "rna_access_internal.h"
#include "rna_internal.h"

Go to the source code of this file.

Classes

struct  IDP_Chain
 

Typedefs

typedef struct IDP_Chain IDP_Chain
 

Functions

static char * rna_path_token (const char **path, char *fixedbuf, int fixedlen)
 
static char * rna_path_token_in_brackets (const char **path, char *fixedbuf, int fixedlen, bool *r_quoted)
 
static bool rna_path_parse_collection_key (const char **path, PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_nextptr)
 
static bool rna_path_parse_array_index (const char **path, PointerRNA *ptr, PropertyRNA *prop, int *r_index)
 
static bool rna_path_parse (const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index, PointerRNA *r_item_ptr, ListBase *r_elements, const bool eval_pointer)
 
bool RNA_path_resolve (const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
 
bool RNA_path_resolve_full (const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index)
 
bool RNA_path_resolve_full_maybe_null (const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index)
 
bool RNA_path_resolve_property (const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
 
bool RNA_path_resolve_property_full (const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index)
 
bool RNA_path_resolve_property_and_item_pointer (const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, PointerRNA *r_item_ptr)
 
bool RNA_path_resolve_property_and_item_pointer_full (const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index, PointerRNA *r_item_ptr)
 
bool RNA_path_resolve_elements (PointerRNA *ptr, const char *path, ListBase *r_elements)
 
char * RNA_path_append (const char *path, const PointerRNA *UNUSED(ptr), PropertyRNA *prop, int intkey, const char *strkey)
 
static UNUSED_FUNCTION_WITH_RETURN_TYPE (char *, RNA_path_back)(const char *path)
 
const char * RNA_path_array_index_token_find (const char *rna_path, const PropertyRNA *array_prop)
 
static char * rna_idp_path_create (IDP_Chain *child_link)
 
static char * rna_idp_path (PointerRNA *ptr, IDProperty *haystack, IDProperty *needle, IDP_Chain *parent_link)
 
char * RNA_path_from_struct_to_idproperty (PointerRNA *ptr, IDProperty *needle)
 
static char * rna_path_from_ID_to_idpgroup (const PointerRNA *ptr)
 
IDRNA_find_real_ID_and_path (Main *bmain, ID *id, const char **r_path)
 
static char * rna_prepend_real_ID_path (Main *bmain, ID *id, char *path, ID **r_real_id)
 
char * RNA_path_from_ID_to_struct (const PointerRNA *ptr)
 
char * RNA_path_from_real_ID_to_struct (Main *bmain, const PointerRNA *ptr, struct ID **r_real)
 
static void rna_path_array_multi_from_flat_index (const int dimsize[RNA_MAX_ARRAY_LENGTH], const int totdims, const int index_dim, int index, int r_index_multi[RNA_MAX_ARRAY_LENGTH])
 
static void rna_path_array_multi_string_from_flat_index (const PointerRNA *ptr, PropertyRNA *prop, int index_dim, int index, char *index_str, int index_str_len)
 
char * RNA_path_from_ID_to_property_index (const PointerRNA *ptr, PropertyRNA *prop, int index_dim, int index)
 
char * RNA_path_from_ID_to_property (const PointerRNA *ptr, PropertyRNA *prop)
 
char * RNA_path_from_real_ID_to_property_index (Main *bmain, const PointerRNA *ptr, PropertyRNA *prop, int index_dim, int index, ID **r_real_id)
 
char * RNA_path_resolve_from_type_to_property (const PointerRNA *ptr, PropertyRNA *prop, const StructRNA *type)
 
char * RNA_path_full_ID_py (Main *bmain, ID *id)
 
char * RNA_path_full_struct_py (Main *bmain, const PointerRNA *ptr)
 
char * RNA_path_full_property_py_ex (Main *bmain, const PointerRNA *ptr, PropertyRNA *prop, int index, bool use_fallback)
 
char * RNA_path_full_property_py (Main *bmain, const PointerRNA *ptr, PropertyRNA *prop, int index)
 
char * RNA_path_struct_property_py (PointerRNA *ptr, PropertyRNA *prop, int index)
 
char * RNA_path_property_py (const PointerRNA *UNUSED(ptr), PropertyRNA *prop, int index)
 

Typedef Documentation

◆ IDP_Chain

typedef struct IDP_Chain IDP_Chain

Function Documentation

◆ RNA_find_real_ID_and_path()

ID* RNA_find_real_ID_and_path ( struct Main bmain,
struct ID id,
const char **  r_path 
)

Find the actual ID pointer and path from it to the given ID.

Parameters
idID reference to search the global owner for.
[out]r_pathPath from the real ID to the initial ID.
Returns
The ID pointer, or NULL in case of failure.

Definition at line 919 of file rna_path.cc.

References BKE_idtype_get_info_from_id(), BLI_assert_msg, ID::flag, GS, id, ID_GR, ID_NT, LIB_EMBEDDED_DATA, ID::name, NULL, and IDTypeInfo::owner_get.

Referenced by RNA_path_full_ID_py(), rna_prepend_real_ID_path(), and rna_property_override_property_real_id_owner().

◆ rna_idp_path()

static char* rna_idp_path ( PointerRNA ptr,
IDProperty haystack,
IDProperty needle,
IDP_Chain parent_link 
)
static

◆ rna_idp_path_create()

static char* rna_idp_path_create ( IDP_Chain child_link)
static

◆ RNA_path_append()

char* RNA_path_append ( const char *  path,
const PointerRNA UNUSEDptr,
PropertyRNA prop,
int  intkey,
const char *  strkey 
)

◆ RNA_path_array_index_token_find()

const char* RNA_path_array_index_token_find ( const char *  rna_path,
const PropertyRNA array_prop 
)

Search for the start of the 'rna array index' part of the given rna_path.

Given the root RNA pointer and resolved RNA property, and the RNA path, return the first character in rna_path that is part of the array index for the given property. Return NULL if none can be found, e.g. because the property is not an RNA array.

Parameters
array_propif not NULL, the PropertyRNA assumed to be the last one from the RNA path. Only used to ensure it is a valid array property.

Definition at line 693 of file rna_path.cc.

References PropertyRNA::arraydimension, BLI_assert, ELEM, NULL, PROP_BOOLEAN, PROP_FLOAT, PROP_INT, PropertyRNA::type, and UNLIKELY.

Referenced by BKE_lib_override_library_property_is_animated().

◆ rna_path_array_multi_from_flat_index()

static void rna_path_array_multi_from_flat_index ( const int  dimsize[RNA_MAX_ARRAY_LENGTH],
const int  totdims,
const int  index_dim,
int  index,
int  r_index_multi[RNA_MAX_ARRAY_LENGTH] 
)
static

◆ rna_path_array_multi_string_from_flat_index()

static void rna_path_array_multi_string_from_flat_index ( const PointerRNA ptr,
PropertyRNA prop,
int  index_dim,
int  index,
char *  index_str,
int  index_str_len 
)
static

◆ rna_path_from_ID_to_idpgroup()

static char* rna_path_from_ID_to_idpgroup ( const PointerRNA ptr)
static

◆ RNA_path_from_ID_to_property()

char* RNA_path_from_ID_to_property ( const PointerRNA ptr,
PropertyRNA prop 
)

◆ RNA_path_from_ID_to_property_index()

char* RNA_path_from_ID_to_property_index ( const PointerRNA ptr,
PropertyRNA prop,
int  index_dim,
int  index 
)
Parameters
index_dimThe dimension to show, 0 disables. 1 for 1d array, 2 for 2d. etc.
indexThe flattened index to use when index_dim > 0, this is expanded when used with multi-dimensional arrays.

Definition at line 1071 of file rna_path.cc.

References BLI_sprintfN(), BLI_str_escape(), PointerRNA::data, IDP_Chain::index, PropertyRNA::magic, MAX_IDPROP_NAME, MEM_freeN, NULL, PointerRNA::owner_id, ptr, RNA_MAGIC, RNA_MAX_ARRAY_LENGTH, rna_path_array_multi_string_from_flat_index(), RNA_path_from_ID_to_struct(), RNA_property_identifier(), RNA_struct_is_ID(), and PointerRNA::type.

Referenced by RNA_path_from_ID_to_property(), and RNA_path_from_real_ID_to_property_index().

◆ RNA_path_from_ID_to_struct()

char* RNA_path_from_ID_to_struct ( const PointerRNA ptr)

◆ RNA_path_from_real_ID_to_property_index()

char* RNA_path_from_real_ID_to_property_index ( Main bmain,
const PointerRNA ptr,
PropertyRNA prop,
int  index_dim,
int  index,
ID **  r_real_id 
)

◆ RNA_path_from_real_ID_to_struct()

char* RNA_path_from_real_ID_to_struct ( Main bmain,
const PointerRNA ptr,
struct ID **  r_real 
)

◆ RNA_path_from_struct_to_idproperty()

char* RNA_path_from_struct_to_idproperty ( PointerRNA ptr,
struct IDProperty needle 
)

Find the path from the structure referenced by the pointer to the runtime RNA-defined IDProperty object.

Note
Does not handle pure user-defined IDProperties (a.k.a. custom properties).
Parameters
ptrReference to the object owning the custom property storage.
needleCustom property object to find.
Returns
Relative path or NULL.

Definition at line 893 of file rna_path.cc.

References NULL, ptr, rna_idp_path(), and RNA_struct_idprops().

Referenced by rna_path_from_ID_to_idpgroup(), and UI_context_copy_to_selected_list().

◆ RNA_path_full_ID_py()

char* RNA_path_full_ID_py ( struct Main bmain,
struct ID id 
)

◆ RNA_path_full_property_py()

char* RNA_path_full_property_py ( Main bmain,
const PointerRNA ptr,
PropertyRNA prop,
int  index 
)

Definition at line 1293 of file rna_path.cc.

References IDP_Chain::index, ptr, and RNA_path_full_property_py_ex().

Referenced by WM_prop_pystring_assign().

◆ RNA_path_full_property_py_ex()

char* RNA_path_full_property_py_ex ( struct Main bmain,
const PointerRNA ptr,
PropertyRNA prop,
int  index,
bool  use_fallback 
)

Get the ID.struct.property as a python representation, eg: bpy.data.foo["bar"].some_struct.some_prop[10]

Definition at line 1245 of file rna_path.cc.

References BLI_sprintfN(), IDP_Chain::index, MEM_freeN, NULL, PointerRNA::owner_id, ptr, ret, RNA_path_from_ID_to_property(), RNA_path_full_ID_py(), RNA_property_array_check(), and RNA_property_identifier().

Referenced by copy_data_path_button_exec(), RNA_path_full_property_py(), and ui_tooltip_data_from_button_or_extra_icon().

◆ RNA_path_full_struct_py()

char* RNA_path_full_struct_py ( struct Main bmain,
const PointerRNA ptr 
)

Get the ID.struct as a python representation, eg: bpy.data.foo["bar"].some_struct

Definition at line 1217 of file rna_path.cc.

References BLI_sprintfN(), MEM_freeN, NULL, PointerRNA::owner_id, ptr, ret, RNA_path_from_ID_to_struct(), and RNA_path_full_ID_py().

Referenced by copy_data_path_button_exec(), rna_pointer_as_string__bldata(), and ui_tooltip_data_from_button_or_extra_icon().

◆ rna_path_parse()

static bool rna_path_parse ( const PointerRNA ptr,
const char *  path,
PointerRNA r_ptr,
PropertyRNA **  r_prop,
int *  r_index,
PointerRNA r_item_ptr,
ListBase r_elements,
const bool  eval_pointer 
)
static

Generic rna path parser.

Note
All parameters besides ptr and path are optional.
Parameters
ptrThe root of given RNA path.
pathThe RNA path.
r_ptrThe final RNA data holding the last property in path.
r_propThe final property of r_ptr, from path.
r_indexThe final index in the r_prop, if defined by path.
r_item_ptrOnly valid for Pointer and Collection, return the actual value of the pointer, or of the collection item. Mutually exclusive with eval_pointer option.
r_elementsA list of PropertyElemRNA items(pairs of PointerRNA, PropertyRNA that represent the whole given path).
eval_pointerIf true, and path leads to a Pointer property, or an item in a Collection property, r_ptr will be set to the value of that property, and r_prop will be NULL. Mutually exclusive with r_item_ptr.
Returns
true on success, false if the path is somehow invalid.

Definition at line 348 of file rna_path.cc.

References BLI_addtail(), BLI_assert, PointerRNA::data, IDP_GetPropertyFromGroup(), PropertyElemRNA::index, MEM_freeN, NULL, PropertyElemRNA::prop, PROP_COLLECTION, PROP_POINTER, PropertyElemRNA::ptr, ptr, rna_path_parse_array_index(), rna_path_parse_collection_key(), rna_path_token(), rna_path_token_in_brackets(), RNA_POINTER_INVALIDATE, RNA_property_pointer_get(), RNA_property_type(), RNA_struct_find_property(), RNA_struct_idprops(), and type.

Referenced by RNA_path_resolve(), RNA_path_resolve_elements(), RNA_path_resolve_full(), RNA_path_resolve_full_maybe_null(), RNA_path_resolve_property(), RNA_path_resolve_property_and_item_pointer(), RNA_path_resolve_property_and_item_pointer_full(), and RNA_path_resolve_property_full().

◆ rna_path_parse_array_index()

static bool rna_path_parse_array_index ( const char **  path,
PointerRNA ptr,
PropertyRNA prop,
int *  r_index 
)
static

◆ rna_path_parse_collection_key()

static bool rna_path_parse_collection_key ( const char **  path,
PointerRNA ptr,
PropertyRNA prop,
PointerRNA r_nextptr 
)
static
Returns
true when the key in the path is correctly parsed and found in the collection or when the path is empty.

Definition at line 164 of file rna_path.cc.

References PointerRNA::data, MEM_freeN, NULL, ptr, rna_path_token_in_brackets(), RNA_property_collection_lookup_int(), RNA_property_collection_lookup_string(), and RNA_property_collection_type_get().

Referenced by rna_path_parse().

◆ RNA_path_property_py()

char* RNA_path_property_py ( const PointerRNA UNUSEDptr,
PropertyRNA prop,
int  index 
)

◆ RNA_path_resolve()

bool RNA_path_resolve ( const PointerRNA ptr,
const char *  path,
PointerRNA r_ptr,
PropertyRNA **  r_prop 
)

Resolve the given RNA Path to find the pointer and/or property indicated by fully resolving the path.

Warning
Unlike RNA_path_resolve_property(), that one will try to follow RNAPointers, e.g. the path 'parent' applied to a RNAObject ptr will return the object.parent in r_ptr, and a NULL r_prop...
Note
Assumes all pointers provided are valid
Returns
True if path can be resolved to a valid "pointer + property" OR "pointer only"

Definition at line 503 of file rna_path.cc.

References PointerRNA::data, NULL, ptr, and rna_path_parse().

Referenced by DEG_get_evaluated_rna_pointer(), drw_uniform_property_lookup(), lookup_property(), radial_control_get_path(), RNA_property_path_from_ID_check(), UI_pie_menu_invoke_from_rna_enum(), and wm_msg_rna_update_by_id().

◆ RNA_path_resolve_elements()

bool RNA_path_resolve_elements ( PointerRNA ptr,
const char *  path,
struct ListBase r_elements 
)

Resolve the given RNA Path into a linked list of PropertyElemRNA's.

To be used when complex operations over path are needed, like e.g. get relative paths, to avoid too much string operations.

Returns
True if there was no error while resolving the path
Note
Assumes all pointers provided are valid

Definition at line 579 of file rna_path.cc.

References NULL, ptr, and rna_path_parse().

Referenced by blender::ed::outliner::OverrideRNAPathTreeBuilder::build_path(), and RNA_path_resolve_from_type_to_property().

◆ RNA_path_resolve_from_type_to_property()

char* RNA_path_resolve_from_type_to_property ( const PointerRNA ptr,
PropertyRNA prop,
const StructRNA type 
)

◆ RNA_path_resolve_full()

bool RNA_path_resolve_full ( const PointerRNA ptr,
const char *  path,
PointerRNA r_ptr,
PropertyRNA **  r_prop,
int *  r_index 
)

Resolve the given RNA Path to find the pointer and/or property + array index indicated by fully resolving the path.

Note
Assumes all pointers provided are valid.
Returns
True if path can be resolved to a valid "pointer + property" OR "pointer only"

Definition at line 515 of file rna_path.cc.

References PointerRNA::data, NULL, ptr, and rna_path_parse().

Referenced by BCAnimationCurve::add_value_from_rna(), blender::deg::DepsgraphRelationBuilder::build_animdata_curves_targets(), blender::deg::DepsgraphRelationBuilder::build_driver_data(), blender::deg::DepsgraphNodeBuilder::build_driver_id_property(), blender::deg::DepsgraphRelationBuilder::build_driver_id_property(), driver_get_variable_property(), blender::deg::RNAPathKey::RNAPathKey(), and screen_user_menu_draw().

◆ RNA_path_resolve_full_maybe_null()

bool RNA_path_resolve_full_maybe_null ( const PointerRNA ptr,
const char *  path,
PointerRNA r_ptr,
PropertyRNA **  r_prop,
int *  r_index 
)

A version of RNA_path_resolve_full doesn't check the value of PointerRNA.data.

Note
While it's correct to ignore the value of PointerRNA.data most callers need to know if the resulting pointer was found and not null.

Definition at line 525 of file rna_path.cc.

References NULL, ptr, and rna_path_parse().

Referenced by pyrna_struct_path_resolve().

◆ RNA_path_resolve_property()

bool RNA_path_resolve_property ( const PointerRNA ptr,
const char *  path,
PointerRNA r_ptr,
PropertyRNA **  r_prop 
)

◆ RNA_path_resolve_property_and_item_pointer()

bool RNA_path_resolve_property_and_item_pointer ( const PointerRNA ptr,
const char *  path,
PointerRNA r_ptr,
PropertyRNA **  r_prop,
PointerRNA r_item_ptr 
)

Resolve the given RNA Path to find both the pointer AND property indicated by fully resolving the path, and get the value of the Pointer property (or item of the collection).

This is a convenience method to avoid logic errors and ugly syntax, it combines both RNA_path_resolve and RNA_path_resolve_property in a single call.

Note
Assumes all pointers provided are valid.
Parameters
r_item_ptrThe final Pointer or Collection item value. You must check for its validity before use!
Returns
True only if both a valid pointer and property are found after resolving the path

Definition at line 553 of file rna_path.cc.

References PointerRNA::data, NULL, ptr, and rna_path_parse().

Referenced by RNA_struct_override_apply().

◆ RNA_path_resolve_property_and_item_pointer_full()

bool RNA_path_resolve_property_and_item_pointer_full ( const PointerRNA ptr,
const char *  path,
PointerRNA r_ptr,
PropertyRNA **  r_prop,
int *  r_index,
PointerRNA r_item_ptr 
)

Resolve the given RNA Path to find both the pointer AND property (as well as the array index) indicated by fully resolving the path, and get the value of the Pointer property (or item of the collection).

This is a convenience method to avoid logic errors and ugly syntax, it combines both RNA_path_resolve_full and RNA_path_resolve_property_full in a single call.

Note
Assumes all pointers provided are valid.
Parameters
r_item_ptrThe final Pointer or Collection item value. You must check for its validity before use!
Returns
True only if both a valid pointer and property are found after resolving the path

Definition at line 566 of file rna_path.cc.

References PointerRNA::data, NULL, ptr, and rna_path_parse().

◆ RNA_path_resolve_property_full()

bool RNA_path_resolve_property_full ( const PointerRNA ptr,
const char *  path,
PointerRNA r_ptr,
PropertyRNA **  r_prop,
int *  r_index 
)

Resolve the given RNA Path to find the pointer AND property (as well as the array index) indicated by fully resolving the path.

This is a convenience method to avoid logic errors and ugly syntax.

Note
Assumes all pointers provided are valid
Returns
True only if both a valid pointer and property are found after resolving the path

Definition at line 543 of file rna_path.cc.

References PointerRNA::data, NULL, ptr, and rna_path_parse().

Referenced by BKE_lib_override_rna_property_find(), dtar_get_prop_val(), and pyrna_struct_anim_args_parse_ex().

◆ RNA_path_struct_property_py()

char* RNA_path_struct_property_py ( PointerRNA ptr,
PropertyRNA prop,
int  index 
)

◆ rna_path_token()

static char* rna_path_token ( const char **  path,
char *  fixedbuf,
int  fixedlen 
)
static

Extract the first token from path.

Parameters
pathExtract the token from path, step the pointer to the beginning of the next token
Returns
The nil terminated token.

Definition at line 38 of file rna_path.cc.

References ELEM, len, MEM_mallocN, NULL, and UNLIKELY.

Referenced by rna_path_parse(), rna_path_parse_array_index(), and UNUSED_FUNCTION_WITH_RETURN_TYPE().

◆ rna_path_token_in_brackets()

static char* rna_path_token_in_brackets ( const char **  path,
char *  fixedbuf,
int  fixedlen,
bool r_quoted 
)
static

Extract the first token in brackets from path (with quoted text support).

  • [0] -> 0
  • ["Some\"Quote"]</tt> -> <tt>Some"Quote
Parameters
pathExtract the token from path, step the pointer to the beginning of the next token (past quoted text and brackets).
Returns
The nil terminated token.

Definition at line 78 of file rna_path.cc.

References BLI_assert, BLI_str_escape_find_quote(), BLI_str_unescape(), len, MEM_mallocN, NULL, and UNLIKELY.

Referenced by rna_path_parse(), rna_path_parse_array_index(), rna_path_parse_collection_key(), and UNUSED_FUNCTION_WITH_RETURN_TYPE().

◆ rna_prepend_real_ID_path()

static char* rna_prepend_real_ID_path ( Main bmain,
ID id,
char *  path,
ID **  r_real_id 
)
static

◆ UNUSED_FUNCTION_WITH_RETURN_TYPE()

static UNUSED_FUNCTION_WITH_RETURN_TYPE ( char *  ,
RNA_path_back   
) const
static