Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Extending Python - Global Constants

    SDK Help
    0
    11
    1.1k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      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

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        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");
        }
        
        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

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

          Howdy,

          AHA! That makes sense. Thank you. 😉

          Adios,
          Cactus Dan

          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

            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

            1 Reply Last reply Reply Quote 0
            • H
              Helper
              last edited by

              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

              1 Reply Last reply Reply Quote 0
              • H
                Helper
                last edited by

                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

                1 Reply Last reply Reply Quote 0
                • H
                  Helper
                  last edited by

                  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.

                  1 Reply Last reply Reply Quote 0
                  • H
                    Helper
                    last edited by

                    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

                    1 Reply Last reply Reply Quote 0
                    • H
                      Helper
                      last edited by

                      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

                      1 Reply Last reply Reply Quote 0
                      • H
                        Helper
                        last edited by

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

                        **DOH!
                        ** Thanks Dan.

                        Everything is working **** now.

                        -ScottA

                        1 Reply Last reply Reply Quote 0
                        • H
                          Helper
                          last edited by

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

                          Howdy,

                          You're welcome. 😉

                          Adios,
                          Cactus Dan

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post