Skip to content

Commit 58d8d86

Browse files
author
Roberto De Ioris
committed
added enums magic importer
1 parent f68f871 commit 58d8d86

5 files changed

Lines changed: 91 additions & 1 deletion

File tree

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include "UnrealEnginePythonPrivatePCH.h"
2+
3+
static PyObject *ue_PyEnumsImporter_getattro(ue_PyEnumsImporter *self, PyObject *attr_name) {
4+
PyObject *ret = PyObject_GenericGetAttr((PyObject *)self, attr_name);
5+
if (!ret) {
6+
if (PyUnicode_Check(attr_name)) {
7+
char *attr = PyUnicode_AsUTF8(attr_name);
8+
if (attr[0] != '_') {
9+
UEnum *u_enum = FindObject<UEnum>(ANY_PACKAGE, UTF8_TO_TCHAR(attr));
10+
if (u_enum) {
11+
// swallow old exception
12+
PyErr_Clear();
13+
ue_PyUObject *u_ret = ue_get_python_wrapper(u_enum);
14+
if (!u_ret)
15+
return PyErr_Format(PyExc_Exception, "PyUObject is in invalid state");
16+
Py_INCREF(u_ret);
17+
return (PyObject *)u_ret;
18+
}
19+
}
20+
}
21+
}
22+
return ret;
23+
}
24+
25+
static PyTypeObject ue_PyEnumsImporterType = {
26+
PyVarObject_HEAD_INIT(NULL, 0)
27+
"unreal_engine.EnumsImporter", /* tp_name */
28+
sizeof(ue_PyEnumsImporter), /* tp_basicsize */
29+
0, /* tp_itemsize */
30+
0, /* tp_dealloc */
31+
0, /* tp_print */
32+
0, /* tp_getattr */
33+
0, /* tp_setattr */
34+
0, /* tp_reserved */
35+
0, /* tp_repr */
36+
0, /* tp_as_number */
37+
0, /* tp_as_sequence */
38+
0, /* tp_as_mapping */
39+
0, /* tp_hash */
40+
0, /* tp_call */
41+
0, /* tp_str */
42+
(getattrofunc)ue_PyEnumsImporter_getattro, /* tp_getattro */
43+
0, /* tp_setattro */
44+
0, /* tp_as_buffer */
45+
Py_TPFLAGS_DEFAULT, /* tp_flags */
46+
"Unreal Engine Enums Importer", /* tp_doc */
47+
0, /* tp_traverse */
48+
0, /* tp_clear */
49+
0, /* tp_richcompare */
50+
0, /* tp_weaklistoffset */
51+
0, /* tp_iter */
52+
0, /* tp_iternext */
53+
0, /* tp_methods */
54+
0,
55+
0,
56+
};
57+
58+
void ue_python_init_Enumsimporter(PyObject *ue_module) {
59+
ue_PyEnumsImporterType.tp_new = PyType_GenericNew;
60+
61+
if (PyType_Ready(&ue_PyEnumsImporterType) < 0)
62+
return;
63+
64+
Py_INCREF(&ue_PyEnumsImporterType);
65+
PyModule_AddObject(ue_module, "EnumsImporter", (PyObject *)&ue_PyEnumsImporterType);
66+
}
67+
68+
PyObject *py_ue_new_enumsimporter() {
69+
ue_PyEnumsImporter *ret = (ue_PyEnumsImporter *)PyObject_New(ue_PyEnumsImporter, &ue_PyEnumsImporterType);
70+
return (PyObject *)ret;
71+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
4+
5+
#include "UnrealEnginePython.h"
6+
7+
typedef struct {
8+
PyObject_HEAD
9+
/* Type-specific fields go here. */
10+
} ue_PyEnumsImporter;
11+
12+
PyObject *py_ue_new_enumsimporter();
13+
14+
void ue_python_init_enumsimporter(PyObject *);

‎Source/UnrealEnginePython/Private/UEPyModule.cpp‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,10 @@ void unreal_engine_init_py_module() {
466466
Py_INCREF(u_classes_importer);
467467
PyDict_SetItemString(py_sys_modules, "unreal_engine.classes", u_classes_importer);
468468

469+
PyObject *u_enums_importer = py_ue_new_enumsimporter();
470+
Py_INCREF(u_enums_importer);
471+
PyDict_SetItemString(py_sys_modules, "unreal_engine.enums", u_enums_importer);
472+
469473
// Collision channels
470474
PyDict_SetItemString(unreal_engine_dict, "COLLISION_CHANNEL_CAMERA", PyLong_FromLong(ECollisionChannel::ECC_Camera));
471475
PyDict_SetItemString(unreal_engine_dict, "COLLISION_CHANNEL_DESTRUCTIBLE", PyLong_FromLong(ECollisionChannel::ECC_Destructible));

‎Source/UnrealEnginePython/Private/UEPyUClassesImporter.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ static PyObject *ue_PyUClassesImporter_getattro(ue_PyUClassesImporter *self, PyO
55
if (!ret) {
66
if (PyUnicode_Check(attr_name)) {
77
char *attr = PyUnicode_AsUTF8(attr_name);
8-
if (isupper((int)attr[0])) {
8+
if (attr[0] != '_') {
99
UClass *u_class = FindObject<UClass>(ANY_PACKAGE, UTF8_TO_TCHAR(attr));
1010
if (u_class) {
1111
// swallow old exception

‎Source/UnrealEnginePython/Private/UnrealEnginePythonPrivatePCH.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
#include "UEPyCallable.h"
2929
#include "UEPyUClassesImporter.h"
30+
#include "UEPyENumsImporter.h"
3031

3132

3233
#define ue_py_check(py_u) if (!py_u->ue_object || !py_u->ue_object->IsValidLowLevel() || py_u->ue_object->IsPendingKillOrUnreachable())\

0 commit comments

Comments
 (0)