Skip to content

Commit 90295e6

Browse files
author
Marcus Tomlinson
committed
Allow creation of user class types from Python
1 parent b0895ab commit 90295e6

File tree

3 files changed

+44
-12
lines changed

3 files changed

+44
-12
lines changed

example/main.cpp

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,22 @@ class Simple
7979
std::string lastMessage;
8080
};
8181

82+
// Simple Class Factory
83+
// ====================
84+
class SimpleFactory
85+
{
86+
public:
87+
void* NewSimple( std::string firstMessage )
88+
{
89+
return new Simple( firstMessage );
90+
}
91+
92+
void DeleteSimple( void* simple )
93+
{
94+
delete ( ( Simple* )simple );
95+
}
96+
};
97+
8298
// Register Classes + Methods
8399
// ==========================
84100
ECS_REGISTER_CLASS( Simple )
@@ -88,6 +104,10 @@ ECS_REGISTER_METHOD_VOID( Simple, ShowLots, unsigned long, char* )
88104
ECS_REGISTER_METHOD_RETURN( Simple, GetLastMessage, std::string )
89105
ECS_REGISTER_METHOD_VOID( Simple, ShowPtr, void* )
90106

107+
ECS_REGISTER_CLASS( SimpleFactory )
108+
ECS_REGISTER_METHOD_RETURN( SimpleFactory, NewSimple, void*, std::string )
109+
ECS_REGISTER_METHOD_VOID( SimpleFactory, DeleteSimple, void* )
110+
91111
//=================================================================================================
92112

93113
// Main
@@ -103,17 +123,19 @@ int main()
103123
Ecs_Init_Simple_GetLastMessage();
104124
Ecs_Init_Simple_ShowPtr();
105125

126+
Ecs_Init_SimpleFactory();
127+
Ecs_Init_SimpleFactory_NewSimple();
128+
Ecs_Init_SimpleFactory_DeleteSimple();
129+
106130
// Initialize EcsPython
107131
// ====================
108132
Ecs_Initialize();
109133

110-
// Create New Class Instance
111-
// =========================
112-
Simple* newSimple = new Simple( "(first message)" );
113134

114-
// Expose Class Instance To Python
115-
// ===============================
116-
Ecs_Expose_Object( newSimple, "newSimple" );
135+
// Create And Expose Class Instance To Python
136+
// ==========================================
137+
Simple newSimple( "(first message)" );
138+
Ecs_Expose_Object( &newSimple, "newSimple" );
117139

118140
// Use Exposed Class Instance From Python
119141
// ======================================
@@ -136,9 +158,21 @@ int main()
136158

137159
// Use Class Instance From C++
138160
// ===========================
139-
std::cout << newSimple->GetLastMessage().c_str();
161+
std::cout << "Ok, " << newSimple.GetLastMessage().c_str() << std::endl;
162+
163+
164+
// Create And Expose Factory To Python
165+
// ===================================
166+
SimpleFactory simpleFactory;
167+
Ecs_Expose_Object( &simpleFactory, "simpleFactory" );
168+
169+
Ecs_Python_Cmd( "anotherSimple = Simple( simpleFactory.NewSimple( '\\'Allo ' ) )" );
170+
Ecs_Python_Cmd( "print( anotherSimple.GetLastMessage() + '\\'Allo!')" );
171+
Ecs_Python_Cmd( "simpleFactory.DeleteSimple( anotherSimple() )" );
172+
140173
getchar();
141174

175+
142176
// Finalize EcsPython
143177
// ==================
144178
Ecs_Finalize();

include/ecspython/EcsMacros.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ static void Ecs_Init##_##Class()\
186186
{\
187187
EcsPythonClassesDict.push_back( new EcsClass( #Class, typeid( Class ) ) );\
188188
EcsPythonClassesDef.append("class " #Class ":\n\
189+
\tdef __init__( self, ecsPtr ):\n\
190+
\t\tself._self = ecsPtr\n\
189191
\tdef __call__( self ):\n\
190192
\t\treturn self._self\n");\
191193
}

src/EcsPython.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,11 +209,7 @@ void _Ecs_Expose_Object( char* pyObject, std::string pyClassName, std::string py
209209
module = PyImport_ImportModule( "__main__" );
210210
PyObject_SetAttrString( module, "ecsPtr", newPyObject );
211211

212-
pythonCall.append( pyObjectName ).append( " = " ).append( pyClassName ).append( "()" );
213-
Ecs_Python_Cmd( pythonCall );
214-
215-
pythonCall.clear();
216-
pythonCall.append( pyObjectName ).append( "._self = ecsPtr" );
212+
pythonCall.append( pyObjectName ).append( " = " ).append( pyClassName ).append( "(ecsPtr)" );
217213
Ecs_Python_Cmd( pythonCall );
218214

219215
Ecs_Python_Cmd( "del ecsPtr" );

0 commit comments

Comments
 (0)