Load and run Python scripts



  • On 26/01/2014 at 07:33, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   R15 
    Platform:   Windows  ;   
    Language(s) :     C++  ;

    ---------
    I trying to load and run a python script using the example given.
    It keeps coming up with FILEERROR = -100 = [FILEERROR_WRONG_VALUE](file:///D:/Users/pgrooff/Documents/pim/c4d/c++%20R15%20sdk/help/pages/ge_prepass/enum_FILEERROR560.html#fileerror_wrong_value9); ???

    What am I doing wrong?

    		case 1000:		//do command	
    		{
    		  Filename fn = "test.py";
    		  BaseList2D *op=(BaseList2D* )AllocListNode(ID_PYTHONSCRIPT);
      
    		  //BaseDocument *doc = GetActiveDocument();
    		  //Int32 error = ReadHyperFile(doc,op,fn,'scrp',nullptr);
      
    		  Int32 error = ReadHyperFile(nullptr,op,fn,'scrp',nullptr);
    		  GePrint ("error: " + String::IntToString(error));					// always FILEERROR_WRONG_VALUE?
      
    		  if (op && ReadHyperFile(nullptr,op,fn,'scrp',nullptr)==FILEERROR_NONE)
    		  {
    			BaseBitmap *ptr=nullptr;
    			op->Message(MSG_SCRIPT_EXECUTE,&ptr);
      
    			//annotations = op->GetDataInstance()->GetString(PYTHONSCRIPT_TEXT);
    		  }
    		  break;
    		}
    

    Note: I am doing the ReadHyperFile twice to get the FILEERROR more clear.
    The script is found, if else a -1 would be given.

    Also, I do not know how to define "annotations", String?



  • On 28/01/2014 at 07:44, xxxxxxxx wrote:

    Hi,

    I can confirm this issue with ReadHyperFile().
    I've got the same FILEERROR_WRONG_VALUE returned with a valid script filename.

    I've asked the developers on this issue.



  • On 29/01/2014 at 05:07, xxxxxxxx wrote:

    Hi,

    The documentation is wrong.
    The example code for ID_PYTHONSCRIPT only works with ID_COFFEESCRIPT because a Python script isn't a hyper file (a COFFEE script is).
    This is why ReadHyperFile() is always returning FILEERROR_WRONG_VALUE.

    The Python script content has to be put manually into PYTHONSCRIPT_TEXT.



  • On 29/01/2014 at 06:30, xxxxxxxx wrote:

    Thanks for the quick reply.
    Could you please provide an example?



  • On 29/01/2014 at 08:26, xxxxxxxx wrote:

    Here's how to execute a Python script with the C++ API:

    Filename fname = "path/to/script.py";
    AutoAlloc<BaseFile> file;
      
    // Allocate a Python script node
    BaseList2D* op = (BaseList2D* )AllocListNode(ID_PYTHONSCRIPT);
    if (op!=nullptr && file->Open(fname))
    {
      BaseContainer* data = op->GetDataInstance();
      if (data==nullptr)
        return false;
      
      // Allocate a memory buffer to hold the Python script file
      Int64 length = file->GetLength();
      Char* text = NewMem(Char, length+1);
      if (text==nullptr)
        return false;
      
      // Read the Python script
      Char ch;
      while (file->ReadChar(&ch))
        text[file->GetPosition()-1]= ch;
      
      text[length] = '\0';
      
      // Set the Python script text in the Python script node container
      data->SetString(PYTHONSCRIPT_TEXT, text);
      
      // Do not forget to delete the memory buffer for the script text
      DeleteMem(text);
      
      // Execute the script
      op->Message(MSG_SCRIPT_EXECUTE, nullptr);
    }
      
    // Delete the Python script node
    blDelete(op);
    


  • On 30/01/2014 at 05:15, xxxxxxxx wrote:

    Great, it works, thanks.
    One addition. Apparently there is some mismatch wit the end -of-line handling, because I have to add a remark (#) at the end of every line. But it works!

    import c4d  #
    from c4d import gui #
    #Welcome to the world of Python
    #
    #
    def main() :     #
        gui.MessageDialog('Hello World!')  #
    #
    if __name__=='__main__':    #
        main()                  #
    

Log in to reply