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

    Getting a tag from a Link field

    SDK Help
    0
    5
    543
    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 03/06/2014 at 16:01, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   14 
      Platform:      Mac OSX  ; 
      Language(s) :     C++  ;

      ---------
      I my shader parameters I have a link field that can be empty or contain a tag (a custom tag that I created).
      How, in C++ can I get the content of the link field?
      I'm using this code:

      BaseContainer * data = sh->GetDataInstance();
      BaseTag * the_tag = (BaseTag* ) data->GetBaseLink(TAG_OBJECT);

      But this seems to crash Cinema4D.
      Damn! So many castings!!! What am I doing wrong?

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

        On 03/06/2014 at 20:16, xxxxxxxx wrote:

        Try it like this.

        //This is an example of getting the tag the user has dropped into the link gizmo with the ID of MYLINK  
        //In this case the tag is a custom tag...So we get it by it's plugin ID#  
          
        INITRENDERRESULT MyShader::InitRender(BaseShader *sh, const InitRenderStruct &irs)  
        {  
          BaseContainer *data = sh->GetDataInstance();  
          
          BaseTag *myTag = (BaseTag* )data->GetLink(MYLINK, GetActiveDocument(), TAG_PLUGIN_ID);   
          if(myTag) GePrint(myTag->GetName());  
          
          return INITRENDERRESULT_OK;  
        }
        

        -ScottA

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

          On 04/06/2014 at 02:41, xxxxxxxx wrote:

          Thank you so much, Scott. Got it working (still lots to do, though).
          Can't help thinking that this is way more complex than:

          def InitRender(self,sh,irs) :
               the_tag=sh[TAG_OBJECT]
               if the_tag is None: return c4d.INITRENDERRESULT_ASSETMISSING
               print the_tag.GetName()

          Also, GePrint requires a string and not all types of objects can be converted to strings. In python, if I print the_tag, I get something like:

          <c4d.BaseTag object called 'myshader/myshader' with ID 1234567 at 0x1128956b0>

          Can't I do the same in C++?

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

            On 04/06/2014 at 02:55, xxxxxxxx wrote:

            BaseContainer * data = sh->GetDataInstance();
            BaseTag * the_tag = (BaseTag* ) data->GetBaseLink(TAG_OBJECT);

            If you would've used a static_cast instead of a C-style cast, you would've seen an error
            at compilation time.

            Also, GePrint requires a string and not all types of objects can be converted to strings. In python, if I print the_tag, I get something like:

            <c4d.BaseTag object called 'myshader/myshader' with ID 1234567 at 0x1128956b0>

            Can't I do the same in C++?

            You can write yourself a little print function. You can use IsInstanceOf() to check if you
            got a tag, object or shader, etc.

            -Niklas

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

              On 04/06/2014 at 07:25, xxxxxxxx wrote:

              You might want to take a quick look at the second part of my C++ video tutorial Rui.
              I explain a few of the fundamentals like the GePrint().
              C++ requires more typing. But it's not necessarily "harder" than Python.
              More typing != harder.

              One of the most common things that is used in the C4D SDK is descriptions.
              Almost every time you see this in Python: obj[FOO] = fooValue
              It requires this in C++: obj->SetParameter(DescID(FOO), GeData(fooValue), DESCFLAGS_SET_0);

              Python wraps things up into tiny little packages that are short to type. But it's not "easier" than C++.
              Once you type this stuff few hundred times. You won't notice it so much.
              Also once you have built up enough C++ notes. You'll cut an paste a lot of code instead of typing it.

              The way I often work is that I play around in Python and try out a few ideas.
              Then once I have the idea formed into a solid idea. I then switch over to C++ and make the actual plugin there.
              If you can seamlessly jump back and forth from Python & C++. You'll have C4D by the nuts. 😉

              -ScottA

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