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
    • Recent
    • Tags
    • Users
    • Login

    Strange Crashing

    Scheduled Pinned Locked Moved SDK Help
    10 Posts 0 Posters 830 Views
    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 Offline
      Helper
      last edited by

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

      On 07/09/2009 at 08:18, xxxxxxxx wrote:

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

      ---------
         Hello,

      I am trying to get a command button to call a certain function. This is Tool plugin.

      Here's the code in the message() which looks for the command button to be clicked.

      > `

        
      \>  Bool SculptTool::Message(BaseDocument* doc, BaseContainer& data, LONG type, void* t_data)  
      \>  {  
      \>    
      \>  switch (type)  
      \>       {  
      \>            case MSG_DESCRIPTION_COMMAND:  
      \>            {  
      \>            DescriptionCommand *dc = (DescriptionCommand* ) t_data;  
      \>            if (dc->id[0].id==COMMAND_SUBDIVIDE)  
      \>                 {  
      \>                 GePrint("Subdivide Button Clicked");  
      \>                 ModelingCommandData mdat;  
      \>                 BaseContainer bc;  
      \>                 mdat.bc = &bc;  
      \>              DoCommand(mdat);  
      \>                 }  
      \>            }  
      \>       }  
      \>       return TRUE;  
      \>  }  
      \>  
      

      `

      Here's the code in the DoCommand()

      > `

        
      \>  Bool SculptTool::DoCommand(ModelingCommandData &mdat;)  
      \>  {  
      \>  GePrint("In DoCommand");  
      \>  //CODE RELATED TO THE SUBDIVISION OPTIONS/////////////////////////////////  
      \>    
      \>       //Define Variables  
      \>    
      \>      PolygonObject *objPoly = ToPoly(mdat.doc->GetActiveObject());  
      \>       if (!objPoly) return FALSE;  
      \>    
      \>    
      \>       //Determine Attributes  
      \>    
      \>       if (mdat.bc->GetBool(HYPERNURBS_SUBDIVISION, TRUE)) //If HyperNURBS is checked  
      \>       {  
      \>       mdat.bc->SetBool(MDATA_SUBDIVIDE_HYPER, TRUE); //Set HyperNURBS subdivision  
      \>       }  
      \>       else  
      \>       {  
      \>       mdat.bc->SetBool(MDATA_SUBDIVIDE_HYPER, FALSE); //Disable HyperNURBS subdivision  
      \>       }  
      \>       mdat.bc->SetLong(MDATA_SUBDIVIDE_SUB, mdat.bc->GetLong(NUM_SUBDIVISIONS)); //Set Number of Subdivisions  
      \>       mdat.bc->SetReal(MDATA_SUBDIVIDE_ANGLE, mdat.bc->GetReal(MAX_ANGLE)); //Set Maxiumum Angle  
      \>              
      \>       //Subdivision Command  
      \>       SendModelingCommand(MCOMMAND_SUBDIVIDE, mdat);  
      \>       mdat.bc->SetLong(POLYGON_COUNT, objPoly->GetPolygonCount());  
      \>         
      \>       return TRUE;  
      \>    
      \>  //END SUBDIVISION OPTIONS/////////////////////////////////////////////////  
      \>    
      \>    
      \>  }  
      \>  
      

      `

      For some reason, C4D crashes whenever I click the command button. I get the "GePrint" message that says "InCommand" so I know the problem is happening in the DoCommand(). Or at least I think that's where it's happening.

      Does anyone have any ideas as to what would be causing C4D to crash?

      Thanks,

      ~Shawn

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

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

        On 07/09/2009 at 09:09, xxxxxxxx wrote:

        This line probably points to an empty document pointer.

        PolygonObject *objPoly = ToPoly(mdat.doc- >GetActiveObject());

        Always check for valid pointers!

        Fill the ModelingCommandData with the current document.

        cheers,
        Matthias

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

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

          On 07/09/2009 at 09:18, xxxxxxxx wrote:

          would I do that with something like this?

          BaseDocument* doc;
               mdat.doc = doc;

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

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

            On 07/09/2009 at 09:27, xxxxxxxx wrote:

            No, in this case you would simply pass the doc from the Message function.

            > \> Bool SculptTool::Message(BaseDocument\* doc, BaseContainer & data, LONG type, void\* t_data) \> { \>      ... \>       \>      mdat.doc = doc; \>       \>      ... \> } \>

            cheers,
            Matthias

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

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

              On 07/09/2009 at 09:32, xxxxxxxx wrote:

              Awesome. Okay now it doesn't crash, but the problem now is.. it doesn't do anything. . LOL I still get the "In DoCOmmand" message, so it is doing the command. but none of the code in DoCommand() is executing?

              Any thoughts there?

              Thanks a lot Matthias.

              ~Shawn

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

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

                On 07/09/2009 at 10:36, xxxxxxxx wrote:

                Any thoughts on why it's not doing anything?

                Thanks,

                ~Shawn

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

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

                  On 07/09/2009 at 11:45, xxxxxxxx wrote:

                  Since SendModelingCommand() works on objects, you MUST specify the object in ModelingCommandData:

                  mdat->op = objPoly;

                  Otherwise it doesn't do anything, yes. 🙂

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

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

                    On 07/09/2009 at 12:55, xxxxxxxx wrote:

                    okay I did that and it still does nothing. 😞 Any thoughts? I added
                    mdat->op = objPoly;

                    Here's new code for DoCommand()

                    > `

                      
                    \>  Bool SculptTool::DoCommand(ModelingCommandData &mdat;)  
                    \>  {  
                    \>  GePrint("In DoCommand");  
                    \>  //CODE RELATED TO THE SUBDIVISION OPTIONS/////////////////////////////////  
                    \>    
                    \>       //Define Variables  
                    \>    
                    \>      PolygonObject *objPoly = ToPoly(mdat.doc->GetActiveObject());  
                    \>       if (!objPoly) return FALSE;  
                    \>       mdat.op = objPoly;  
                    \>    
                    \>       //Determine Attributes  
                    \>    
                    \>       if (mdat.bc->GetBool(HYPERNURBS_SUBDIVISION, TRUE)) //If HyperNURBS is checked  
                    \>       {  
                    \>       mdat.bc->SetBool(MDATA_SUBDIVIDE_HYPER, TRUE); //Set HyperNURBS subdivision  
                    \>       }  
                    \>       else  
                    \>       {  
                    \>       mdat.bc->SetBool(MDATA_SUBDIVIDE_HYPER, FALSE); //Disable HyperNURBS subdivision  
                    \>       }  
                    \>       mdat.bc->SetLong(MDATA_SUBDIVIDE_SUB, mdat.bc->GetLong(NUM_SUBDIVISIONS)); //Set Number of Subdivisions  
                    \>       mdat.bc->SetReal(MDATA_SUBDIVIDE_ANGLE, mdat.bc->GetReal(MAX_ANGLE)); //Set Maxiumum Angle  
                    \>              
                    \>       //Subdivision Command  
                    \>       SendModelingCommand(MCOMMAND_SUBDIVIDE, mdat);  
                    \>       mdat.bc->SetLong(POLYGON_COUNT, objPoly->GetPolygonCount());//Shows the current polygon count  
                    \>    
                    \>         
                    \>       return TRUE;  
                    \>    
                    \>  //END SUBDIVISION OPTIONS/////////////////////////////////////////////////  
                    \>       GePrint("End Of DoCommand");  
                    \>    
                    \>  }  
                    \>  
                    

                    `

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

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

                      On 07/09/2009 at 13:57, xxxxxxxx wrote:

                      Have you checked the values being set in mdat, especially MDATA_SUBDIVIDE_SUB? This must be >0. mdat.mode should be MODIFY_ALL.

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

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

                        On 07/09/2009 at 14:36, xxxxxxxx wrote:

                        okay nothing happens when I click the button. But something very weird happens when I click the button and then resize the viewport frame. I click the button, nothing happens, then I resize the viewport frame and suddenly the cube in my viewport subdivides. But not by the number that is in the LONG NUM_SUBDIVISIONS. I am not sure where it is getting this number from ..

                        Here's the code I have in DoCommand().

                        Thanks for your help.

                        > `

                          
                        \>  Bool SculptTool::DoCommand(ModelingCommandData &mdat;)  
                        \>  {  
                        \>  GePrint("In DoCommand");  
                        \>  //CODE RELATED TO THE SUBDIVISION OPTIONS/////////////////////////////////  
                        \>    
                        \>       //Define Variables  
                        \>    
                        \>      PolygonObject *objPoly = ToPoly(mdat.doc->GetActiveObject());  
                        \>       if (!objPoly) return FALSE;  
                        \>       mdat.op = objPoly;  
                        \>       mdat.mode = MODIFY_ALL;  
                        \>    
                        \>       //Determine Attributes  
                        \>    
                        \>       if (mdat.bc->GetBool(HYPERNURBS_SUBDIVISION, TRUE)) //If HyperNURBS is checked  
                        \>       {  
                        \>       mdat.bc->SetBool(MDATA_SUBDIVIDE_HYPER, TRUE); //Set HyperNURBS subdivision  
                        \>       }  
                        \>       else  
                        \>       {  
                        \>       mdat.bc->SetBool(MDATA_SUBDIVIDE_HYPER, FALSE); //Disable HyperNURBS subdivision  
                        \>       }  
                        \>       mdat.bc->SetLong(MDATA_SUBDIVIDE_SUB, mdat.bc->GetLong(NUM_SUBDIVISIONS); //Set Number of Subdivisions  
                        \>       mdat.bc->SetReal(MDATA_SUBDIVIDE_ANGLE, mdat.bc->GetReal(MAX_ANGLE)); //Set Maxiumum Angle  
                        \>              
                        \>       //Subdivision Command  
                        \>       SendModelingCommand(MCOMMAND_SUBDIVIDE, mdat);  
                        \>       mdat.bc->SetLong(POLYGON_COUNT, objPoly->GetPolygonCount());//Shows the current polygon count  
                        \>    
                        \>         
                        \>       return TRUE;  
                        \>    
                        \>  //END SUBDIVISION OPTIONS/////////////////////////////////////////////////  
                        \>       GePrint("End Of DoCommand");  
                        \>    
                        \>  }  
                        \>  
                        

                        `

                        Weird huh?

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