Skip to content

Commit 08d3638

Browse files
committed
added asset metadata tag api
1 parent 7d5bf4c commit 08d3638

4 files changed

Lines changed: 121 additions & 11 deletions

File tree

Source/UnrealEnginePython/Private/UEPyModule.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,12 @@ static PyMethodDef ue_PyUObject_methods[] = {
616616
#if WITH_EDITOR
617617
{ "get_thumbnail", (PyCFunction)py_ue_get_thumbnail, METH_VARARGS, "" },
618618
{ "render_thumbnail", (PyCFunction)py_ue_render_thumbnail, METH_VARARGS, "" },
619+
{"get_metadata_tag", (PyCFunction)py_ue_get_metadata_tag, METH_VARARGS, "" },
620+
{"set_metadata_tag", (PyCFunction)py_ue_set_metadata_tag, METH_VARARGS, "" },
621+
{ "metadata_tags", (PyCFunction)py_ue_metadata_tags, METH_VARARGS, "" },
622+
{ "has_metadata_tag", (PyCFunction)py_ue_has_metadata_tag, METH_VARARGS, "" },
623+
{"remove_metadata_tag", (PyCFunction)py_ue_remove_metadata_tag, METH_VARARGS, "" },
624+
619625
#endif
620626

621627
#if WITH_EDITOR
@@ -1856,10 +1862,10 @@ ue_PyUObject *ue_get_python_uobject(UObject *ue_obj)
18561862
UE_LOG(LogPython, Warning, TEXT("CREATED UPyObject at %p for %p %s"), ue_py_object, ue_obj, *ue_obj->GetName());
18571863
#endif
18581864
return ue_py_object;
1859-
}
1865+
}
18601866
return ret;
18611867

1862-
}
1868+
}
18631869

18641870
ue_PyUObject *ue_get_python_uobject_inc(UObject *ue_obj)
18651871
{
@@ -2883,8 +2889,8 @@ PyObject *py_ue_ufunction_call(UFunction *u_function, UObject *u_obj, PyObject *
28832889
#endif
28842890
}
28852891
#endif
2886-
}
28872892
}
2893+
}
28882894

28892895

28902896
Py_ssize_t tuple_len = PyTuple_Size(args);
@@ -2997,7 +3003,7 @@ PyObject *py_ue_ufunction_call(UFunction *u_function, UObject *u_obj, PyObject *
29973003
return ret;
29983004

29993005
Py_RETURN_NONE;
3000-
}
3006+
}
30013007

30023008
PyObject *ue_bind_pyevent(ue_PyUObject *u_obj, FString event_name, PyObject *py_callable, bool fail_on_wrong_property)
30033009
{
@@ -3057,8 +3063,8 @@ UFunction *unreal_engine_add_function(UClass *u_class, char *name, PyObject *py_
30573063
{
30583064
UE_LOG(LogPython, Error, TEXT("function %s is already registered"), UTF8_TO_TCHAR(name));
30593065
return nullptr;
3066+
}
30603067
}
3061-
}
30623068

30633069
UPythonFunction *function = NewObject<UPythonFunction>(u_class, UTF8_TO_TCHAR(name), RF_Public | RF_Transient | RF_MarkAsNative);
30643070
function->SetPyCallable(py_callable);
@@ -3379,7 +3385,7 @@ UFunction *unreal_engine_add_function(UClass *u_class, char *name, PyObject *py_
33793385
#endif
33803386

33813387
return function;
3382-
}
3388+
}
33833389

33843390
FGuid *ue_py_check_fguid(PyObject *py_obj)
33853391
{

Source/UnrealEnginePython/Private/UObject/UEPyObject.cpp

Lines changed: 84 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,87 @@ PyObject *py_ue_get_metadata(ue_PyUObject * self, PyObject * args)
482482
return PyErr_Format(PyExc_TypeError, "the object does not support MetaData");
483483
}
484484

485+
PyObject *py_ue_get_metadata_tag(ue_PyUObject * self, PyObject * args)
486+
{
487+
488+
ue_py_check(self);
489+
490+
char *metadata_tag_key;
491+
if (!PyArg_ParseTuple(args, "s:get_metadata_tag", &metadata_tag_key))
492+
{
493+
return nullptr;
494+
}
495+
496+
const FString& Value = self->ue_object->GetOutermost()->GetMetaData()->GetValue(self->ue_object, UTF8_TO_TCHAR(metadata_tag_key));
497+
return PyUnicode_FromString(TCHAR_TO_UTF8(*Value));
498+
}
499+
500+
PyObject *py_ue_has_metadata_tag(ue_PyUObject * self, PyObject * args)
501+
{
502+
503+
ue_py_check(self);
504+
505+
char *metadata_tag_key;
506+
if (!PyArg_ParseTuple(args, "s:has_metadata_tag", &metadata_tag_key))
507+
{
508+
return nullptr;
509+
}
510+
511+
if (self->ue_object->GetOutermost()->GetMetaData()->HasValue(self->ue_object, UTF8_TO_TCHAR(metadata_tag_key)))
512+
{
513+
Py_RETURN_TRUE;
514+
}
515+
Py_RETURN_FALSE;
516+
}
517+
518+
PyObject *py_ue_remove_metadata_tag(ue_PyUObject * self, PyObject * args)
519+
{
520+
521+
ue_py_check(self);
522+
523+
char *metadata_tag_key;
524+
if (!PyArg_ParseTuple(args, "s:remove_metadata_tag", &metadata_tag_key))
525+
{
526+
return nullptr;
527+
}
528+
529+
self->ue_object->GetOutermost()->GetMetaData()->RemoveValue(self->ue_object, UTF8_TO_TCHAR(metadata_tag_key));
530+
Py_RETURN_NONE;
531+
}
532+
533+
PyObject *py_ue_set_metadata_tag(ue_PyUObject * self, PyObject * args)
534+
{
535+
536+
ue_py_check(self);
537+
538+
char *metadata_tag_key;
539+
char *metadata_tag_value;
540+
if (!PyArg_ParseTuple(args, "ss:set_metadata_tag", &metadata_tag_key, &metadata_tag_value))
541+
{
542+
return nullptr;
543+
}
544+
545+
self->ue_object->GetOutermost()->GetMetaData()->SetValue(self->ue_object, UTF8_TO_TCHAR(metadata_tag_key), UTF8_TO_TCHAR(metadata_tag_value));
546+
Py_RETURN_NONE;
547+
}
548+
549+
550+
PyObject *py_ue_metadata_tags(ue_PyUObject * self, PyObject * args)
551+
{
552+
ue_py_check(self);
553+
554+
TMap<FName, FString> *TagsMap = self->ue_object->GetOutermost()->GetMetaData()->GetMapForObject(self->ue_object);
555+
if (!TagsMap)
556+
Py_RETURN_NONE;
557+
558+
PyObject* py_list = PyList_New(0);
559+
for (TPair< FName, FString>& Pair : *TagsMap)
560+
{
561+
PyList_Append(py_list, PyUnicode_FromString(TCHAR_TO_UTF8(*Pair.Key.ToString())));
562+
}
563+
return py_list;
564+
}
565+
485566
PyObject *py_ue_has_metadata(ue_PyUObject * self, PyObject * args)
486567
{
487568

@@ -498,11 +579,9 @@ PyObject *py_ue_has_metadata(ue_PyUObject * self, PyObject * args)
498579
UClass *u_class = (UClass *)self->ue_object;
499580
if (u_class->HasMetaData(FName(UTF8_TO_TCHAR(metadata_key))))
500581
{
501-
Py_INCREF(Py_True);
502-
return Py_True;
582+
Py_RETURN_TRUE;
503583
}
504-
Py_INCREF(Py_False);
505-
return Py_False;
584+
Py_RETURN_FALSE;
506585
}
507586

508587
if (self->ue_object->IsA<UField>())
@@ -1850,7 +1929,7 @@ PyObject *py_ue_add_property(ue_PyUObject * self, PyObject * args)
18501929
// TODO add default value
18511930

18521931
Py_RETURN_UOBJECT(u_property);
1853-
}
1932+
}
18541933

18551934
PyObject *py_ue_as_dict(ue_PyUObject * self, PyObject * args)
18561935
{

Source/UnrealEnginePython/Private/UObject/UEPyObject.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ PyObject *py_ue_get_metadata(ue_PyUObject *, PyObject *);
9797
PyObject *py_ue_set_metadata(ue_PyUObject *, PyObject *);
9898
PyObject *py_ue_has_metadata(ue_PyUObject *, PyObject *);
9999

100+
PyObject *py_ue_get_metadata_tag(ue_PyUObject *, PyObject *);
101+
PyObject *py_ue_set_metadata_tag(ue_PyUObject *, PyObject *);
102+
PyObject *py_ue_has_metadata_tag(ue_PyUObject *, PyObject *);
103+
PyObject *py_ue_remove_metadata_tag(ue_PyUObject *, PyObject *);
104+
PyObject *py_ue_metadata_tags(ue_PyUObject *, PyObject *);
105+
100106
PyObject *py_ue_import_custom_properties(ue_PyUObject *, PyObject *);
101107
#endif
102108

examples/asset_metadata_tag.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import unreal_engine as ue
2+
from unreal_engine.classes import EditorAssetLibrary
3+
4+
asset = ue.get_selected_assets()[0]
5+
6+
# reflection-based api
7+
EditorAssetLibrary.SetMetadataTag(asset, 'Foo', 'Bar')
8+
for value in EditorAssetLibrary.GetMetadataTagValues(asset):
9+
print(value)
10+
print(EditorAssetLibrary.GetMetadataTag(asset, 'Foo'))
11+
12+
13+
# native api
14+
asset.set_metadata_tag('Test001', 'Text002')
15+
asset.set_metadata_tag('Test003', 'Text004')
16+
for key in asset.metadata_tags():
17+
print(key)
18+
print(asset.has_metadata_tag('Foo')) # bool
19+
print(asset.get_metadata_tag('Test001'))

0 commit comments

Comments
 (0)