Skip to content

Commit 020e87c

Browse files
author
Roberto De Ioris
committed
more robust factory_create_new()
1 parent 7d3e346 commit 020e87c

3 files changed

Lines changed: 50 additions & 12 deletions

File tree

Source/UnrealEnginePython/Private/UEPyEditor.cpp

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include "Runtime/AssetRegistry/Public/AssetRegistryModule.h"
99
#include "Kismet2/KismetEditorUtilities.h"
1010
#include "Editor/ContentBrowser/Public/ContentBrowserModule.h"
11-
11+
#include "Editor/UnrealEd/Public/PackageTools.h"
1212
#include "UnrealEd.h"
1313
#include "FbxMeshUtils.h"
1414
#include "Kismet2/BlueprintEditorUtils.h"
@@ -588,12 +588,41 @@ PyObject *py_unreal_engine_find_asset(PyObject * self, PyObject * args)
588588
FAssetData asset = AssetRegistryModule.Get().GetAssetByObjectPath(UTF8_TO_TCHAR(path));
589589
if (!asset.IsValid())
590590
{
591-
Py_INCREF(Py_None);
592-
return Py_None;
591+
Py_RETURN_NONE;
593592
}
594593
Py_RETURN_UOBJECT(asset.GetAsset());
595594
}
596595

596+
PyObject *py_unreal_engine_create_asset(PyObject * self, PyObject * args)
597+
{
598+
char *asset_name;
599+
char *package_path;
600+
PyObject *py_class;
601+
PyObject *py_factory;
602+
603+
if (!PyArg_ParseTuple(args, "ssOO:create_asset", &asset_name, &package_path, &py_class, &py_factory))
604+
{
605+
return nullptr;
606+
}
607+
608+
if (!GEditor)
609+
return PyErr_Format(PyExc_Exception, "no GEditor found");
610+
611+
UClass *uclass = ue_py_check_type<UClass>(py_class);
612+
if (!uclass)
613+
return PyErr_Format(PyExc_Exception, "argument is not a UClass");
614+
615+
UFactory *factory = ue_py_check_type<UFactory>(py_factory);
616+
if (!factory)
617+
return PyErr_Format(PyExc_Exception, "argument is not a UFactory");
618+
619+
FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools");
620+
UObject *uobject = AssetToolsModule.Get().CreateAsset(FString(UTF8_TO_TCHAR(asset_name)), FString(UTF8_TO_TCHAR(package_path)), uclass, factory);
621+
if (!uobject)
622+
return PyErr_Format(PyExc_Exception, "unable to create asset");
623+
Py_RETURN_UOBJECT(uobject);
624+
}
625+
597626
PyObject *py_unreal_engine_get_asset_referencers(PyObject * self, PyObject * args)
598627
{
599628
char *path;
@@ -1882,18 +1911,25 @@ PyObject *py_ue_factory_create_new(ue_PyUObject *self, PyObject * args)
18821911
if (!factory)
18831912
return PyErr_Format(PyExc_Exception, "uobject is not a Factory");
18841913

1885-
UPackage *outer = CreatePackage(nullptr, UTF8_TO_TCHAR(name));
1886-
if (!outer)
1887-
return PyErr_Format(PyExc_Exception, "unable to create package");
1888-
1889-
UClass *u_class = factory->GetSupportedClass();
1890-
18911914
char *obj_name = strrchr(name, '/') + 1;
18921915
if (strlen(obj_name) < 1)
18931916
{
18941917
return PyErr_Format(PyExc_Exception, "invalid object name");
18951918
}
18961919

1920+
FString PackageName = PackageTools::SanitizePackageName(FString(UTF8_TO_TCHAR(name)) + TEXT("/") + FString(UTF8_TO_TCHAR(obj_name)));
1921+
1922+
UPackage *outer = CreatePackage(nullptr, *PackageName);
1923+
if (!outer)
1924+
return PyErr_Format(PyExc_Exception, "unable to create package");
1925+
1926+
TArray<UPackage *> TopLevelPackages;
1927+
TopLevelPackages.Add(outer);
1928+
if (!PackageTools::HandleFullyLoadingPackages(TopLevelPackages, FText::FromString("Create a new object")))
1929+
return PyErr_Format(PyExc_Exception, "unable to fully load package");
1930+
1931+
UClass *u_class = factory->GetSupportedClass();
1932+
18971933
// avoid duplicates
18981934
if (u_class->IsChildOf<UBlueprint>())
18991935
{
@@ -1982,7 +2018,7 @@ PyObject *py_unreal_engine_add_level_to_world(PyObject *self, PyObject * args)
19822018
if (!PyArg_ParseTuple(args, "Os|O:add_level_to_world", &py_world, &name, &py_bool))
19832019
{
19842020
return NULL;
1985-
}
2021+
}
19862022

19872023
UWorld *u_world = ue_py_check_type<UWorld>(py_world);
19882024
if (!u_world)
@@ -2016,7 +2052,7 @@ PyObject *py_unreal_engine_add_level_to_world(PyObject *self, PyObject * args)
20162052
#endif
20172053

20182054
Py_RETURN_UOBJECT(level_streaming);
2019-
}
2055+
}
20202056

20212057
PyObject *py_unreal_engine_move_selected_actors_to_level(PyObject *self, PyObject * args)
20222058
{
@@ -2521,7 +2557,7 @@ PyObject *py_unreal_engine_export_assets(PyObject * self, PyObject * args)
25212557
if (!py_iter)
25222558
{
25232559
return PyErr_Format(PyExc_Exception, "argument is not an iterable of UObject");
2524-
}
2560+
}
25252561

25262562
while (PyObject *py_item = PyIter_Next(py_iter))
25272563
{

Source/UnrealEnginePython/Private/UEPyEditor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ PyObject *py_unreal_engine_get_asset(PyObject *, PyObject *);
1616
PyObject *py_unreal_engine_is_loading_assets(PyObject *, PyObject *);
1717
PyObject *py_unreal_engine_wait_for_assets(PyObject *, PyObject *);
1818
PyObject *py_unreal_engine_find_asset(PyObject *, PyObject *);
19+
PyObject *py_unreal_engine_create_asset(PyObject *, PyObject *);
1920
PyObject *py_unreal_engine_delete_object(PyObject *, PyObject *);
2021
PyObject *py_unreal_engine_get_assets(PyObject *, PyObject *);
2122
PyObject *py_unreal_engine_get_selected_assets(PyObject *, PyObject *);

Source/UnrealEnginePython/Private/UEPyModule.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ static PyMethodDef unreal_engine_methods[] = {
309309
{ "export_assets", py_unreal_engine_export_assets, METH_VARARGS, "" },
310310
{ "get_asset", py_unreal_engine_get_asset, METH_VARARGS, "" },
311311
{ "find_asset", py_unreal_engine_find_asset, METH_VARARGS, "" },
312+
{ "create_asset", py_unreal_engine_create_asset, METH_VARARGS, "" },
312313
{ "delete_object", py_unreal_engine_delete_object, METH_VARARGS, "" },
313314
{ "get_assets", py_unreal_engine_get_assets, METH_VARARGS, "" },
314315
{ "get_selected_assets", py_unreal_engine_get_selected_assets, METH_VARARGS, "" },

0 commit comments

Comments
 (0)