static char *rna_NlaStrip_path(PointerRNA *ptr) { NlaStrip *strip = (NlaStrip *)ptr->data; AnimData *adt = BKE_animdata_from_id(ptr->id.data); /* if we're attached to AnimData, try to resolve path back to AnimData */ if (adt) { NlaTrack *nlt; NlaStrip *nls; for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next) { for (nls = nlt->strips.first; nls; nls = nls->next) { if (nls == strip) { /* XXX but if we animate like this, the control will never work... */ char name_esc_nlt[sizeof(nlt->name) * 2]; char name_esc_strip[sizeof(strip->name) * 2]; BLI_strescape(name_esc_nlt, nlt->name, sizeof(name_esc_nlt)); BLI_strescape(name_esc_strip, strip->name, sizeof(name_esc_strip)); return BLI_sprintfN("animation_data.nla_tracks[\"%s\"].strips[\"%s\"]", name_esc_nlt, name_esc_strip); } } } } /* no path */ return BLI_strdup(""); }
/* Temporary wrapper for driver operators for buttons to make it easier to create * such drivers by rerouting all paths through the active object instead so that * they will get picked up by the dependency system. * * < C: context pointer - for getting active data * <> ptr: RNA pointer for property's datablock. May be modified as result of path remapping. * < prop: RNA definition of property to add for * * > returns: MEM_alloc'd string representing the path to the property from the given PointerRNA */ static char *get_driver_path_hack(bContext *C, PointerRNA *ptr, PropertyRNA *prop) { ID *id = (ID *)ptr->id.data; ScrArea *sa = CTX_wm_area(C); /* get standard path which may be extended */ char *basepath = RNA_path_from_ID_to_property(ptr, prop); char *path = basepath; /* in case no remapping is needed */ /* Remapping will only be performed in the Properties Editor, as only this * restricts the subspace of options to the 'active' data (a manageable state) */ // TODO: watch out for pinned context? if ((sa) && (sa->spacetype == SPACE_BUTS)) { Object *ob = CTX_data_active_object(C); if (ob && id) { /* only id-types which can be remapped to go through objects should be considered */ switch (GS(id->name)) { case ID_TE: /* textures */ { Material *ma = give_current_material(ob, ob->actcol); Tex *tex = give_current_material_texture(ma); /* assumes: texture will only be shown if it is active material's active texture it's ok */ if ((ID *)tex == id) { char name_esc_ma[(sizeof(ma->id.name) - 2) * 2]; char name_esc_tex[(sizeof(tex->id.name) - 2) * 2]; BLI_strescape(name_esc_ma, ma->id.name + 2, sizeof(name_esc_ma)); BLI_strescape(name_esc_tex, tex->id.name + 2, sizeof(name_esc_tex)); /* create new path */ // TODO: use RNA path functions to construct step by step instead? // FIXME: maybe this isn't even needed anymore... path = BLI_sprintfN("material_slots[\"%s\"].material.texture_slots[\"%s\"].texture.%s", name_esc_ma, name_esc_tex, basepath); /* free old one */ MEM_freeN(basepath); } break; } } /* fix RNA pointer, as we've now changed the ID root by changing the paths */ if (basepath != path) { /* rebase provided pointer so that it starts from object... */ RNA_pointer_create(&ob->id, ptr->type, ptr->data, ptr); } } } /* the path should now have been corrected for use */ return path; }
static char *rna_DynamicPaintSurface_path(PointerRNA *ptr) { DynamicPaintSurface *surface = (DynamicPaintSurface *)ptr->data; ModifierData *md = (ModifierData *)surface->canvas->pmd; char name_esc[sizeof(md->name) * 2]; char name_esc_surface[sizeof(surface->name) * 2]; BLI_strescape(name_esc, md->name, sizeof(name_esc)); BLI_strescape(name_esc_surface, surface->name, sizeof(name_esc_surface)); return BLI_sprintfN("modifiers[\"%s\"].canvas_settings.canvas_surfaces[\"%s\"]", name_esc, name_esc_surface); }
static char *rna_ShapeKeyPoint_path(PointerRNA *ptr) { ID *id = (ID *)ptr->id.data; Key *key = rna_ShapeKey_find_key(ptr->id.data); KeyBlock *kb; float *point = (float *)ptr->data; /* if we can get a key block, we can construct a path */ kb = rna_ShapeKeyData_find_keyblock(key, point); if (kb) { char name_esc_kb[sizeof(kb->name) * 2]; int index; if (ptr->type == &RNA_ShapeKeyBezierPoint) index = rna_ShapeKeyBezierPoint_get_index(kb, point); else index = rna_ShapeKeyPoint_get_index(key, kb, point); BLI_strescape(name_esc_kb, kb->name, sizeof(name_esc_kb)); if (GS(id->name) == ID_KE) return BLI_sprintfN("key_blocks[\"%s\"].data[%d]", name_esc_kb, index); else return BLI_sprintfN("shape_keys.key_blocks[\"%s\"].data[%d]", name_esc_kb, index); } else return NULL; /* XXX: there's really no way to resolve this... */ }
static char *rna_MaskLayer_path(PointerRNA *ptr) { MaskLayer *masklay = (MaskLayer *)ptr->data; char name_esc[sizeof(masklay->name) * 2]; BLI_strescape(name_esc, masklay->name, sizeof(name_esc)); return BLI_sprintfN("layers[\"%s\"]", name_esc); }
static PyObject *bpy_escape_identifier(PyObject *UNUSED(self), PyObject *value) { const char *value_str; Py_ssize_t value_str_len; char *value_escape_str; Py_ssize_t value_escape_str_len; PyObject *value_escape; size_t size; value_str = _PyUnicode_AsStringAndSize(value, &value_str_len); if (value_str == NULL) { PyErr_SetString(PyExc_TypeError, "expected a string"); return NULL; } size = (value_str_len * 2) + 1; value_escape_str = PyMem_MALLOC(size); value_escape_str_len = BLI_strescape(value_escape_str, value_str, size); if (value_escape_str_len == value_str_len) { Py_INCREF(value); value_escape = value; } else { value_escape = PyUnicode_FromStringAndSize(value_escape_str, value_escape_str_len); } PyMem_FREE(value_escape_str); return value_escape; }
char *BKE_path_from_ID_to_color_ramp(FreestyleLineStyle *linestyle, ColorBand *color_ramp) { LineStyleModifier *m; bool found = false; for (m = (LineStyleModifier *)linestyle->color_modifiers.first; m; m = m->next) { switch (m->type) { case LS_MODIFIER_ALONG_STROKE: if (color_ramp == ((LineStyleColorModifier_AlongStroke *)m)->color_ramp) found = true; break; case LS_MODIFIER_DISTANCE_FROM_CAMERA: if (color_ramp == ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp) found = true; break; case LS_MODIFIER_DISTANCE_FROM_OBJECT: if (color_ramp == ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp) found = true; break; case LS_MODIFIER_MATERIAL: if (color_ramp == ((LineStyleColorModifier_Material *)m)->color_ramp) found = true; break; } if (found) { char name_esc[sizeof(m->name) * 2]; BLI_strescape(name_esc, m->name, sizeof(name_esc)); return BLI_sprintfN("color_modifiers[\"%s\"].color_ramp", name_esc); } } printf("BKE_path_from_ID_to_color_ramp: No color ramps correspond to the given pointer.\n"); return NULL; }
static char *rna_ViewLayer_path(PointerRNA *ptr) { ViewLayer *srl = (ViewLayer *)ptr->data; char name_esc[sizeof(srl->name) * 2]; BLI_strescape(name_esc, srl->name, sizeof(name_esc)); return BLI_sprintfN("view_layers[\"%s\"]", name_esc); }
static char *rna_SmokeCollSettings_path(PointerRNA *ptr) { SmokeCollSettings *settings = (SmokeCollSettings *)ptr->data; ModifierData *md = (ModifierData *)settings->smd; char name_esc[sizeof(md->name) * 2]; BLI_strescape(name_esc, md->name, sizeof(name_esc)); return BLI_sprintfN("modifiers[\"%s\"].coll_settings", name_esc); }
static char *rna_FluidSettings_path(PointerRNA *ptr) { FluidsimSettings *fss = (FluidsimSettings *)ptr->data; ModifierData *md = (ModifierData *)fss->fmd; char name_esc[sizeof(md->name) * 2]; BLI_strescape(name_esc, md->name, sizeof(name_esc)); return BLI_sprintfN("modifiers[\"%s\"].settings", name_esc); }
static char *rna_BoidRule_path(PointerRNA *ptr) { BoidRule *rule = (BoidRule *)ptr->data; char name_esc[sizeof(rule->name) * 2]; BLI_strescape(name_esc, rule->name, sizeof(name_esc)); return BLI_sprintfN("rules[\"%s\"]", name_esc); /* XXX not unique */ }
static char *rna_GPencilLayer_path(PointerRNA *ptr) { bGPDlayer *gpl = (bGPDlayer *)ptr->data; char name_esc[sizeof(gpl->info) * 2]; BLI_strescape(name_esc, gpl->info, sizeof(name_esc)); return BLI_sprintfN("layers[\"%s\"]", name_esc); }
static char *rna_DynamicPaintBrushSettings_path(PointerRNA *ptr) { DynamicPaintBrushSettings *settings = (DynamicPaintBrushSettings *)ptr->data; ModifierData *md = (ModifierData *)settings->pmd; char name_esc[sizeof(md->name) * 2]; BLI_strescape(name_esc, md->name, sizeof(name_esc)); return BLI_sprintfN("modifiers[\"%s\"].brush_settings", name_esc); }
static char *rna_ShapeKey_path(PointerRNA *ptr) { KeyBlock *kb = (KeyBlock *)ptr->data; ID *id = ptr->id.data; char name_esc[sizeof(kb->name) * 2]; BLI_strescape(name_esc, kb->name, sizeof(name_esc)); if ((id) && (GS(id->name) != ID_KE)) return BLI_sprintfN("shape_keys.key_blocks[\"%s\"]", name_esc); else return BLI_sprintfN("key_blocks[\"%s\"]", name_esc); }
static char *rna_ClothCollisionSettings_path(PointerRNA *ptr) { Object *ob = (Object *)ptr->id.data; ModifierData *md = modifiers_findByType(ob, eModifierType_Cloth); if (md) { char name_esc[sizeof(md->name) * 2]; BLI_strescape(name_esc, md->name, sizeof(name_esc)); return BLI_sprintfN("modifiers[\"%s\"].collision_settings", name_esc); } else { return NULL; } }
void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track) { MovieTracking *tracking = &clip->tracking; MovieTrackingStabilization *stab = &tracking->stabilization; MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); bool has_bundle = false, update_stab = false; char track_name_escaped[MAX_NAME], prefix[MAX_NAME * 2]; if (track == act_track) tracking->act_track = NULL; if (track == stab->rot_track) { stab->rot_track = NULL; update_stab = true; } /* handle reconstruction display in 3d viewport */ if (track->flag & TRACK_HAS_BUNDLE) has_bundle = true; /* Make sure no plane will use freed track */ BKE_tracking_plane_tracks_remove_point_track(tracking, track); /* Delete f-curves associated with the track (such as weight, i.e.) */ BLI_strescape(track_name_escaped, track->name, sizeof(track_name_escaped)); BLI_snprintf(prefix, sizeof(prefix), "tracks[\"%s\"]", track_name_escaped); BKE_animdata_fix_paths_remove(&clip->id, prefix); BKE_tracking_track_free(track); BLI_freelinkN(tracksbase, track); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); if (update_stab) { tracking->stabilization.ok = false; WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); } DAG_id_tag_update(&clip->id, 0); if (has_bundle) WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL); }
static char *rna_Bone_path(PointerRNA *ptr) { ID *id = ptr->id.data; Bone *bone = (Bone *)ptr->data; char name_esc[sizeof(bone->name) * 2]; BLI_strescape(name_esc, bone->name, sizeof(name_esc)); /* special exception for trying to get the path where ID-block is Object * - this will be assumed to be from a Pose Bone... */ if (id) { if (GS(id->name) == ID_OB) { return BLI_sprintfN("pose.bones[\"%s\"].bone", name_esc); } } /* from armature... */ return BLI_sprintfN("bones[\"%s\"]", name_esc); }
void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track) { MovieTracking *tracking = &clip->tracking; MovieTrackingStabilization *stab = &tracking->stabilization; MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); MovieTrackingPlaneTrack *plane_track, *next_plane_track; ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); bool has_bundle = false, update_stab = false; char track_name_escaped[MAX_NAME], prefix[MAX_NAME * 2]; if (track == act_track) tracking->act_track = NULL; if (track == stab->rot_track) { stab->rot_track = NULL; update_stab = true; } /* handle reconstruction display in 3d viewport */ if (track->flag & TRACK_HAS_BUNDLE) has_bundle = true; /* Make sure no plane will use freed track */ for (plane_track = plane_tracks_base->first; plane_track; plane_track = next_plane_track) { bool found = false; int i; next_plane_track = plane_track->next; for (i = 0; i < plane_track->point_tracksnr; i++) { if (plane_track->point_tracks[i] == track) { found = true; break; } } if (!found) { continue; } if (plane_track->point_tracksnr > 4) { int track_index; MovieTrackingTrack **new_point_tracks; new_point_tracks = MEM_mallocN(sizeof(*new_point_tracks) * (plane_track->point_tracksnr - 1), "new point tracks array"); for (i = 0, track_index = 0; i < plane_track->point_tracksnr; i++) { if (plane_track->point_tracks[i] != track) { new_point_tracks[track_index++] = plane_track->point_tracks[i]; } } MEM_freeN(plane_track->point_tracks); plane_track->point_tracks = new_point_tracks; plane_track->point_tracksnr--; } else { /* Delete planes with less than 3 point tracks in it. */ BKE_tracking_plane_track_free(plane_track); BLI_freelinkN(plane_tracks_base, plane_track); } } /* Delete f-curves associated with the track (such as weight, i.e.) */ BLI_strescape(track_name_escaped, track->name, sizeof(track_name_escaped)); BLI_snprintf(prefix, sizeof(prefix), "tracks[\"%s\"]", track_name_escaped); BKE_animdata_fix_paths_remove(&clip->id, prefix); BKE_tracking_track_free(track); BLI_freelinkN(tracksbase, track); WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); if (update_stab) { tracking->stabilization.ok = false; WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); } DAG_id_tag_update(&clip->id, 0); if (has_bundle) WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL); }