How do i create a plugin



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 12/10/2006 at 07:40, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   9.6 
    Platform:   Windows  ;   
    Language(s) :   C.O.F.F.E.E  ;  C++  ;

    ---------
    Hi,
    i study computer science at university of applied science in Regensburg Germany, but i am a beginner in programming for cinema.
    My question is relativ simple i think, why does this code do not work when i try it to execute in the script manager but it works when i save the code in win editor as .cof file?
    Error message in the console:
    [Fail] Script 'test': To many parameters What does this message mean exactly and where can i find a list with the meanings of the c4d messages?
    Thanks for help
    What should the code like therewith it works. The code ist a example from the sdk.
    var opers;
    var PLUGIN_ID = 1000001;
    var MENU_NAME = "Calculator";
    var HELP_STR =  "A Calculator";
    var PLUGIN_TITLE = "Calculator";
    enum
    {
         DLG_EDIT_BOX = 1000,
         DLG_NUM_0 = 1001,
         DLG_NUM_1,
         DLG_NUM_2,
         DLG_NUM_3,
         DLG_NUM_4,
         DLG_NUM_5,
         DLG_NUM_6,
         DLG_NUM_7,
         DLG_NUM_8,
         DLG_NUM_9,
         DLG_ADD,
         DLG_SUB,
         DLG_MUL,
         DLG_DIV,
         DLG_POINT,
         DLG_EQUAL,
         DLG_ROW1,
         DLG_ROW2,
         DLG_ROW3,
         DLG_ROW4,
         DLG_NUMPAD,
         DLG_OPERPAD,
         DLG_CALC,
         _DUMMY_

    class CalcDialog : GeModalDialog
    {
       private:
          var text;
         var stack;
          var op;
     public:
      CalcDialog();
      CreateLayout();
      Command(id, msg);
    }
    CalcDialog::CalcDialog()
    {
     super();
    }
    CalcDialog::CreateLayout()
    {
     SetTitle(PLUGIN_TITLE);
     AddEditText(DLG_EDIT_BOX, 0, 200, 0);
     
     AddGroupBeginH(DLG_CALC, BFH_SCALEFIT, 1, "", 0);
      AddGroupBeginV(DLG_NUMPAD, BFH_SCALEFIT, 1, "", 0);
       AddGroupBeginH(DLG_ROW1, BFH_SCALEFIT, 1, "", 0);
        AddButton(DLG_NUM_7, BFH_SCALEFIT, 0, 0, "7");
        AddButton(DLG_NUM_8, BFH_SCALEFIT, 0, 0, "8");
        AddButton(DLG_NUM_9, BFH_SCALEFIT, 0, 0, "9");
       AddGroupEnd();
       AddGroupBeginH(DLG_ROW2, BFH_SCALEFIT, 1, "", 0);
        AddButton(DLG_NUM_4, BFH_SCALEFIT, 0, 0, "4");
        AddButton(DLG_NUM_5, BFH_SCALEFIT, 0, 0, "5");
        AddButton(DLG_NUM_6, BFH_SCALEFIT, 0, 0, "6");
       AddGroupEnd();
       AddGroupBeginH(DLG_ROW3, BFH_SCALEFIT, 1, "", 0);
        AddButton(DLG_NUM_1, BFH_SCALEFIT, 0, 0, "1");
        AddButton(DLG_NUM_2, BFH_SCALEFIT, 0, 0, "2");
        AddButton(DLG_NUM_3, BFH_SCALEFIT, 0, 0, "3");
       AddGroupEnd();
       AddGroupBeginH(DLG_ROW4, BFH_SCALEFIT, 1, "", 0);
        AddButton(DLG_NUM_0, BFH_SCALEFIT, 0, 0, "0");
        AddButton(DLG_POINT, BFH_SCALEFIT, 0, 0, ".");
        AddButton(DLG_EQUAL, BFH_SCALEFIT, 0, 0, "=");
       AddGroupEnd();
      AddGroupEnd();
      AddGroupBeginV(DLG_OPERPAD, BFH_SCALEFIT, 1, "", 0);
       AddButton(DLG_ADD, BFH_SCALEFIT, 0, 0, "+");
       AddButton(DLG_SUB, BFH_SCALEFIT, 0, 0, "-");
       AddButton(DLG_MUL, BFH_SCALEFIT, 0, 0, "*");
       AddButton(DLG_DIV, BFH_SCALEFIT, 0, 0, "/");
      AddGroupEnd();
     AddGroupEnd();
     
     return;
    }
    //tests the passed value to see if number could be represented as an int
    TestInt(num)
    {
        if (float(int(num)) == float(num))
        {                         //num when passed is a float
                                //(or it could be an int)
                                                   //we see make sure the passed value is
                                                   //an int by using int(num)
                                                   //this will remove any decimal
                                                   //percision i.e. 6.775 = 6
                                                   //converting this back to a float
                                                   //would give us 6.0 then we check to
                                                   //see if this is the same as the
                                                   //original value passed to us.
            return TRUE;                           //if so return TRUE.
        }
        else
        {  
         return FALSE;                         //otherwise return FALSE.
        }
    }
    //pass a number and get the string to display properly formated.
    //i.e. 7.645 will apear as 7.645 instead of 7.64500000
    Format(num)
    {
     var per, ans, inum;
     var format, str;
     
     inum = int(num);                         //find the non-decimal
                                  //part of the number i.e 7
     ans = num - inum;                        //take the non-decimal
                                  //number and subtract it
                                              //from the orginal to get the
                                               //decimal part. i.e. 7.645 - 7 = 0.645.
     for (per = 0; !TestInt(ans); per++)
     {                                   //per records the amount of
                                                            //digits after the decimal
                                                             // point. Test to see if
                                                             //ans is not an integer if
                                                             //so follow through in the
                                                             //loop, if not bail.
            ans *= 10;                                       //multiply ans by 10 to
                                                             //reduce the percision by
                                                             //1. increment the per by
                                                             //1. Loop again.
     }
    //the idea behind the previous 'for loop' is this, say we had .5643:
    //1) test to see if .5643 is an int (a whole number with no fractional part)
    //2) if not multiply it by 10 to get 5.643, and increment per by 1 so per = 1.
    //3)keep going until .5643 becomes an int
    //example:
    //.5643 * 10 = 5.643      ;        per = 1     ;       5.643 is not an int
    //                                                     therefore continue
    //5.643 * 10 = 56.43      ;        per = 2     ;       56.43 is not an int
    //                                                     therefore continue
    //56.43 * 10 = 564.3      ;        per = 3     ;       564.3 is not an int
    //                                                     therefore continue
    //564.3 * 10 = 5643       ;        per = 4     ;       5643 is an int therefore
    //                                                     stop.
     format = "." + tostring(per, "d") + "f";          //creates the formatting string we need
                                                         //cinema allows you to combine
                                                         //two string together by using
                                                         //a '+' sign. So you could say:
                                                         //var name = "John" + " Doe";
                                                         //to get "John Doe". so we are
                                                         //taking a "." and adding the
                                                         //string we get from the
                                                         //tostring(per, "d") function.
                                                         //The "d" means to use per as
                                                         //an integer for string
                                                         //conversion. The format string
                                                         //now equals ".4" + "f", which
                                                         //as we
                                                         //know is ".4f", which we will
                                                         //use as the format string in
                                                         //the next tostring function.
     str = tostring(num, format);                        //this tostring function is used to
                                  //convert the number
                                                         //into the proper floating
                                                         //point format. ".4f" means        
                                                         //convert the number as a float
                                                         //with 4 digits after the
                                                         //decimal point.
     return str;                        //return newly formatted string.
    }

    CalcAdd(op1, op2) { return (op1 + op2); }         //function is called when calc needs
                                                      //to add
    CalcSub(op1, op2) { return (op1 - op2); }         //called when calc needs to subtract
    CalcMul(op1, op2) { return (op1 * op2); }         //called when calc needs to multiply
    CalcDiv(op1, op2)
    {                                        //called when calc needs to divide
       if (!op2)
       {                             //check to see if we are dividing by zero.
        return "Divide by Zero Error";
       }
     return (op1 / op2);                   //otherwise return result of operation.
    }

    CalcDialog::Command(id, msg)
    {
     var c = "0";

    if (id == DLG_EDIT_BOX)
     {                                     //we got input from the text
                                                       //edit box
      text = GetString(DLG_EDIT_BOX);                 //grab the string from the box
                                                      //and store it into text
          var len = sizeof(text);                       //find the size of the string
                                                        //(strlen for the C programmers)
       
          len = (len > 0) ? len-1 : 0;                    //subtract 1 from our
                                                           //length if we have
                                                           //length.
         
          if (sizeof(text) > 0)
          {                                     //check if we have
                                                         //characters in our
                                                         //string.
       if (!isdigit(text[len]) && text[len] != 46)
       {                           //grab the last letter on
                                                        //the string test to see
                                                           //if it is a letter AND
                                                         //isn't a decimalpoint(46)
             text = strmid(text, 0, len);                //if so set text equal to
                                                          //the string minus the
                                                         //character just typed in.
              SetString(DLG_EDIT_BOX, text);            //update the dialog's text
                                                        //edit box.
                                                         //we do this so letters
                                                         //can't be inputed into
                                                         //our calculator, because
                                                         //this would be bad.
        return;
       }
      }
     }
     if (id <= DLG_NUM_9 && id >= DLG_NUM_0)
     {                                //check to see if the id is
                                                          //within the num pad.
      var num = id - DLG_NUM_0;                         //since our ids are
                                                        //enumerated they go in
                                                        //order.
                                                          //meaning DLG_NUM_0 is 2
                                                           //less than DLG_NUM_2
                                                           //therefore we can subtract
                                                          //the id from DLG_NUM_0 to
                                                          //get the actual number. 
      text = GetString(DLG_EDIT_BOX);                   //get the text so we can
                                                          //add to it
      c = tostring(num, "d");                           //store the number as a
                                                           //string.
      
      text = text + c;                                  //add this number to the
                                                        //text.
       SetString(DLG_EDIT_BOX, text);                    //refresh the text edit
                                                           //box.
       } 
     if (id <= DLG_DIV && id >= DLG_ADD)
     {                                  //id is an operation (check
                                                         //enums).
      var num = id - DLG_ADD;                           //same as before instead
                                                        //use DLG_ADD.
      op = num;                                         //store as operator (0 is
                                                        //+, 1 is minus, etc).
      stack = text;                                     //stack now holds the value
                                                        //we are using for
      text = "";                                       //calculation. Clear the
                                                        //text.
      SetString(DLG_EDIT_BOX, text);                    //refresh text edit box
                                                        //(display).
     }
     if (id == DLG_POINT)
     {                                         //point has been clicked.
      text = GetString(DLG_EDIT_BOX);                   //get the string
      text = text + ".";                                //add the decimal point
      SetString(DLG_EDIT_BOX, text);                    //refresh the display.
     }
     if (id == DLG_EQUAL)
     {                                          //equals signs has been
                                                         //clicked.
      var func = opers[op];                             //get the function from our
                                                        //array.
                                                         //see main for a better
                                                         //explaination
      //func now contains the location of the function for the proper operator.
      //if op = 0 look up slot 0 which has CalcAdd in it.
      var ans = func(evaluate(stack), evaluate(text));  //call the function
                                                          //evaluating both the
                                                          //stack.
                                                            //and text parameters.
                                                            //evaluate will convert
                                                            //the strings into
                                                            //numbers, among other
                                                            //usefull things.
          if (typeof(ans) == DT_STRING)
          {                                  //check if the return
                                                         //value is a string
           stack = text = ans;                           //if so just print it to
                                                         //the display
          } else
          {
            
           stack = text = Format(ans);               //otherwise format it
                                                           //before you print it
          }
       SetString(DLG_EDIT_BOX, stack);                 //refresh display
     } 
     
    }

    class CalcMenu : MenuPlugin
    {
    public:
     CalcMenu();
     GetHelp();
     GetID();
     GetName();
     Execute(doc);
    }
    CalcMenu::CalcMenu()     { super(); }
    CalcMenu::GetID()        { return PLUGIN_ID; }
    CalcMenu::GetName()      { return MENU_NAME; }
    CalcMenu::GetHelp()      { return HELP_STR; }
    CalcMenu::Execute(doc)
    {
     var d = new(CalcDialog);
     d->Open(-1, -1);

    return;
    }
    main()
    {
     opers = new(array,4);
                        //opers is going to store the location of
                        //where our 4 main functions are going to go.
     opers[0] = CalcAdd;           //slot zero stores the add function.
     opers[1] = CalcSub;           //slot 1 stores the subtract function.
     opers[2] = CalcMul;           //slot 2 stores the multiply function.
     opers[3] = CalcDiv;           //slot 3 stores the division function.
     Register(CalcMenu);
    }


Log in to reply