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

    Constraint tag properties

    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 07/04/2017 at 06:11, xxxxxxxx wrote:

      All help is appreciated!
      I am stuck at the moment.

      -Pim

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

        On 07/04/2017 at 06:56, xxxxxxxx wrote:

        I don't have a c++ environnent atm.
        But here a python code which work and where you could easily port it into C++

        import c4d
          
        def main() :
            tag = doc.GetActiveTag()
            
            #useless but c++ code style
            bc = c4d.BaseContainer()
            
            #Get the bc
            bc = tag.GetParameter(c4d.DescID(50004), c4d.DESCFLAGS_GET_0)
            
            #Change the value to 2 => Z+
            #Not sure it's a long maybe Int32 Don't know but oyu get the idea
            bc.SetLong(3, c4d.ID_CA_CONSTRAINT_TAG_AXIS_ZP)
            
            #Reassign the bc
            tag.SetParameter(c4d.DescID(50004), bc, c4d.DESCFLAGS_SET_0)
            c4d.EventAdd()
          
        if __name__=='__main__':
            main()
        

        After maybe there is a more efficiency method to do it. But I guess this one will work.
        Hope it's help.

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

          On 07/04/2017 at 09:12, xxxxxxxx wrote:

          Hi Pim,

          sorry for letting you wait. Unfortunately I'm not done with your case, yet, but I don't want to leave you without any answer before the weekend.
          In general your code seems to be working here. The thing is, while running in debugger, it's internally running on a bunch of CriticalStop(), which I haven't found the reason for, yet. Neither a workaround. These critical stops might look to you as if C4D has crashed, while it actually has not and you can simply press "continue" in your debugger. So if I use your code in a CommandData and step over the CriticalStops then the outcome looks actually fine to me.
          So, I'm wondering, what is your actual issue. Is it the critical stops? I will investigate more in this direction Monday. But maybe you are having different issues, I have overlooked so far. In that case, please provide me with some more details.

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

            On 07/04/2017 at 09:18, xxxxxxxx wrote:

            Hi Andreas,

            I do not get a crash of some sort.
            The parameter is just not set.

            I will gr4ph0s solution.

            -Pim

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

              On 07/04/2017 at 09:20, xxxxxxxx wrote:

              Hm, that part seems to work nicely here. Maybe you are just lacking the EventAdd() in the end? Or other question I forgot to ask, in which context are you using the posted code? Is it in a CommandData or somewhere else?

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

                On 07/04/2017 at 09:42, xxxxxxxx wrote:

                Yes, I am using a commanddata.

                And I was wrong, cinema indeed seems to crash but I can continue, but the parameters are not set.
                And yes, I use an EventAdd() at the end.

                I will do some test.

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

                  On 07/04/2017 at 09:56, xxxxxxxx wrote:

                  Running outside the debugger does gives no crashes, but not all parameters are not set.

                  Tag name set.
                  Clamp is set.
                  Target is set.
                  ID_CA_CONSTRAINT_TAG_CLAMP_TO_SURFACE not set.
                  ID_CA_CONSTRAINT_TAG_AXIS_ZP not set.
                  Phong Normals not set.

                  constraintTag->SetName("C4Dome RL");
                  res = constraintTag->SetParameter(ID_CA_CONSTRAINT_TAG_CLAMP, TRUE, DESCFLAGS_SET_0);
                  res = constraintTag->SetParameter(50001, surfaceObject, DESCFLAGS_SET_0);			//set target
                  res = constraintTag->SetParameter(DescID(50004, 1), ID_CA_CONSTRAINT_TAG_CLAMP_TO_SURFACE, DESCFLAGS_SET_0);
                  res = constraintTag->SetParameter(DescID(50004, 3), ID_CA_CONSTRAINT_TAG_AXIS_ZP, DESCFLAGS_SET_0);				//set align = +z
                  res = constraintTag->SetParameter(DescID(50004, 4), 2, DESCFLAGS_SET_0);
                  
                  1 Reply Last reply Reply Quote 0
                  • H
                    Helper
                    last edited by

                    On 07/04/2017 at 10:14, xxxxxxxx wrote:

                    Hi gr4ph0s,

                    I cannot get your solution to work.
                    The compiler complains or cinema hangs (in de code below).

                    //Get the bc
                    BaseContainer* bc;
                    GeData d;
                    res = constraintTag->GetParameter(DescID(50004), d, DESCFLAGS_GET_0);
                    bc = d.GetContainer();
                    bc->SetInt32(1, ID_CA_CONSTRAINT_TAG_CLAMP_TO_SURFACE);
                        
                    //Reassign the bc
                    d.SetContainer(*bc);
                    constraintTag->SetParameter(DescID(50004), d, DESCFLAGS_SET_0);
                    
                    1 Reply Last reply Reply Quote 0
                    • H
                      Helper
                      last edited by

                      On 07/04/2017 at 11:37, xxxxxxxx wrote:

                      #include "c4d.h"
                      #include "c4d_symbols.h"
                      #include "tcaconstraint.h"
                      #include "main.h"
                        
                      #define ID_SWITCH_CONSTRAINT_TOOL 10000010
                        
                      class SwitchConstCommand : public CommandData
                          {
                      	Bool Execute(BaseDocument* doc)
                      	{
                              if (!doc)
                                  return false;
                        
                              BaseTag* tag = doc->GetActiveTag();
                              if (tag == nullptr)
                                  return false;
                        
                              if (tag->GetType() != 1019364)
                                  return false;
                        
                              BaseContainer* bc_tag = tag->GetDataInstance();
                              BaseContainer* bc_clamp = bc_tag->GetContainerInstance(50004);
                              bc_clamp->SetInt32(3, ID_CA_CONSTRAINT_TAG_AXIS_ZP);
                        
                              EventAdd();
                        
                      	return true;
                      	}
                      };
                        
                      Bool RegisterSwitchConst()
                          {
                          return RegisterCommandPlugin(ID_SWITCH_CONSTRAINT_TOOL, nullptr, 0, nullptr, String(), NewObjClear(SwitchConstCommand));
                          }
                      

                      Worked here. But I just start to learn C++ and the c++ sdk so they might have a better solution for doing this kind of stuff using directly SetParameter.

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

                        On 07/04/2017 at 12:49, xxxxxxxx wrote:

                        Thanks, it works.
                        I forgot to get the first container.

                        -Pim

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