Extending Python - Global Constants

On 29/07/2016 at 09:33, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   13+ 
Platform:    Mac  ;  
Language(s) :     C++  ;   PYTHON  ;

---------
Howdy,

Is the function in the PythonLibrary class called "InitConstant()" the function to use to add global constants, like the coffee extension function AddGlobalSymbol()?

I tried using it but I don't know how to create the parameter "_PyObject *op" to pass to the function. Can you post an example?

Adios,
Cactus Dan

On 01/08/2016 at 02:16, xxxxxxxx wrote:

Hi,

Yes InitConstant() is the function to use. InitStringConstant() can be used to add string constants too.
The "_PyObject *op" parameter for InitConstant() is the module to add the constant to.
Here's some code:

if (pylib.InitModule("c4d.extendpyapi", moduleFunctions, "Extend Python API Module Example"))
{
	...
  
	// Retrieves c4d.extendpyapi module
	_PyObject* extendpyapi = pylib.GetModule("c4d.extendpyapi");
	if (extendpyapi == nullptr)
		return;
  
	// Initializes CUSTOMCONST and CUSTOMSTRINGCONST constants
	pylib.InitConstant(extendpyapi, "CUSTOMCONST", 4875);
	pylib.InitStringConstant(extendpyapi, "CUSTOMSTRINGCONST", "String Constant");
}

On 01/08/2016 at 06:42, xxxxxxxx wrote:

Howdy,

AHA! That makes sense. Thank you. 😉

Adios,
Cactus Dan

On 01/08/2016 at 07:08, xxxxxxxx wrote:

Howdy,

Hmmmm, the InitConstant() is returning false.

Here's my code:

// Initializes c4d.cdpy module
if(pylib.InitModule("c4d.cdpy", moduleFunctions, "Extend Python API"))
{
	GePrint("\'c4d.cdpy\' module successfully initialized");
	
	// Retrieves c4d.cdpy module
	_PyObject* cdpy = pylib.GetModule("c4d.cdpy");
	if(cdpy)
	{
		GePrint("Python module cdpy successfully retrieved");
		
		// Initializes CUSTOMCONST constant
		if(!pylib.InitConstant(cdpy, "CUSTOMCONST", 4875)) GePrint("Failed to init constant");
	}
}

Whats wrong?

Adios,
Cactus Dan

On 02/08/2016 at 14:56, xxxxxxxx wrote:

Howdy,

OK, so I got rid of all of my edits to the code you posted and went back to your copied and pasted code. Then added a couple of print statements:

// Initializes c4d.extendpyapi module
if (pylib.InitModule("c4d.extendpyapi", moduleFunctions, "Extend Python API"))
{	
	GePrint("\'c4d.extendpyapi\' module successfully initialized");
	
	// Retrieves c4d.extendpyapi module
	_PyObject* extendpyapi = pylib.GetModule("c4d.extendpyapi");
	if (extendpyapi == nullptr) return;
	
	GePrint("Successfully retrieved extendpyapi module");
	
	// Initializes CUSTOMCONST and CUSTOMSTRINGCONST constants
	if(!pylib.InitConstant(extendpyapi, "CUSTOMCONST", 4875))
		GePrint("Failed to init constant");
	if(!pylib.InitStringConstant(extendpyapi, "CUSTOMSTRINGCONST", "String Constant"))
		GePrint("Failed to init string constant");
}

... and the console prints "Failed to init constant" but does not print "Failed to init string constant". Is it a bug in the api? I tried this in both R13 and R17 with the same result.

Adios,
Cactus Dan

On 02/08/2016 at 15:48, xxxxxxxx wrote:

Howdy,

AHA! I've discovered that it is actually NOT failing to initialize the constant, but simply returning false.

When I use the constant in a script:

extendpyapi.PassParameters("a string of characters", extendpyapi.CUSTOMCONST, 10.25)

... it actually works and prints the value 4875 to the console.

Was I just being pannicky? 😊

Adios,
Cactus Dan

On 03/08/2016 at 02:19, xxxxxxxx wrote:

Hi,

Yes there's an issue in the implementation of PythonLibrary::InitConstant().
The function returns false even if the constant was successfully initialized.

On 03/08/2016 at 09:56, xxxxxxxx wrote:

Hi,

I've been following these threads with interest and I've got most of it working in R13.
So far I can successfully:
-Initialize the c4d.extendpyapi module.
-Call the extendpyapi_HelloPython() function that was posted on the other thread
-Add new Python constants

But I'm having trouble with the extendpyapi_PassParameters() function that was in the other thread.
I have added that function to the main.cpp file. And I'm guessing that I need to somehow point to it from inside of the InitExtendPython() method? But I have not been able to figure it out.
And then how do I call it from the script manager?

Thanks,
-ScottA

On 03/08/2016 at 10:12, xxxxxxxx wrote:

Howdy,

First increase the size of the array:

g_extendpyapi_functions->Resize(4);

...then add those other 2 functions to the module:

moduleFunctions[0].Init("HelloPython", (PyFn)extendpyapi_HelloPython, PYFN_FLAGS_NOARGS, "HelloPython() - Extend Python API");
moduleFunctions[1].Init("PassBaseList", (PyFn)extendpyapi_PassBaseList, PYFN_FLAGS_KEYWORDS, "PassBaseList() - Extend Python API");
moduleFunctions[2].Init("PassParameters", (PyFn)extendpyapi_PassParameters, PYFN_FLAGS_KEYWORDS, "PassParameters() - Extend Python API");
moduleFunctions[3].Init(String(), NULL, PYFN_FLAGS_0, String()); // Last dummy element!

Can you say, "DOH!" 😂

I also had trouble figuring out how to call it from the script manager because I didn't realize that everything needed the "extendpyapi." prefix. DOH!

Adios,
Cactus Dan

On 03/08/2016 at 11:09, xxxxxxxx wrote:

**DOH!
** Thanks Dan.

Everything is working **** now.

-ScottA

On 03/08/2016 at 11:19, xxxxxxxx wrote:

Howdy,

You're welcome. 😉

Adios,
Cactus Dan