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);
}