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

    Make Description Parameter Uneditable

    Cinema 4D SDK
    r23 2023 python windows
    2
    3
    496
    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.
    • ThomasBT
      ThomasB
      last edited by

      Hi folks,

      I am to stupid for this I guess 🙂

      I created an Object Plugin and so the res, header and str files.
      The plugin works fine so far. But now I want to make some parameters uneditable, when the user switches a LONG with some Quicktabradio buttons, because some parameters have no impact when a specific mode is entered.

      I was able to hide the parameters successfully in my nodedata.GedDescription(self, node, id......) function
      with setBool...
      But when the plugin is getting started for the first time, it looks odd when some parameters suddenly appear once the user clicked some buttons. It is confusing.

      But as I have read in the forum it doesn´t work with the c4d.DESC_EDITABLE Description.

      So do I have to use the NodeData.GetDEnabling Method?

      so do I have to overload this function in my class with and what do I have to write in this class:

      def GetDEnabling(self, node, id, t_data, flags, itemdesc):
              pass
      
      
      • Where do I have to call this function? In my GetDDescription Method?

      .
      so for clarifying??
      node = op
      id = c4d.PY_LED_ANIMATION_DISTANCE
      t_data = c4d.DESC_EDITABLE

      • what is itemdesc????**

      • the itemdesc argument do I get the container with **```

      decription.GetParameterI(c4d.PY_LED_ANIMATION_DISTANCE, ar=None)
      

      I do not really understand some things here.

      ===============================================

      ok in the following figure you can see the entry

        1. Modus id = c4d.PY_LED_MODE with Quicktabradio int 0=dynamisch, 1=fest, 2=Buchstaben Ticker
        1. Animationdistanz id = c4d.PY_LED_ANIMATION_DISTANCE
        1. Vertikale Animationsdistanz id = c4d.LED_VERT_ANIMATION_DISTANCE

      once the user checks Modus/dynamisch the parameter 2. and 3. should turn to Not-Editable.
      If he checks Modus/fest and Modus/Buchstaben Ticker it should be editable

      Screenshot 2023-01-12 224420.png

      Best Regards
      Tom

      Thanks,
      T.S.B

      ferdinandF 1 Reply Last reply Reply Quote 0
      • ferdinandF
        ferdinand @ThomasB
        last edited by ferdinand

        Hello @thomasb,

        thank you for reaching out to us. I assume when you say that you want to make a parameter 'uneditable', you mean that you want it to be disabled, greyed out as the X.Max parameter is in the screen below. It is not possible to make an element uneditable, read only, without changing its appearance in this manner (there are some exceptions as edit fields which can be made read only without being greyed out, but this is then handled on a per gadget-basis flag level and usually not something you always can or should mess around with in descriptions).

        bd1284c4-0f2f-4098-b7ce-b7bbcbcc78d8-image.png

        To take the grey-out route, you indeed must use NodeData.GetDEnabling. This is, however, not a function you must call, but one you must overwrite. Cinema 4D will call the method for each parameter in a node each time its description is evaluated. You can then return True to keep the parameter enabled, and False to disable it. If this is not what you want, the other common approach is to hide elements, typically whole groups, by setting c4d.DESC_HIDE to True on that element. To do that, you must overwrite NodeData.GetDDescription and the whole endeavor is considerably more complicated than en- or disabling elements.

        So, when you have this description resource:

        // The description defintion of the tag Tmmover.
        CONTAINER Tmmover
        {
          NAME Tmmover;
          INCLUDE Texpression;
        
          // The main "Tag" tab of the tag.
          GROUP ID_TAGPROPERTIES
          {
            // The tag can either bake an animation into a track or do what tags are actually meant to do,
            // drive the animation procedurally.
            LONG ID_MMOVER_MODE 
            {
              CYCLE
              {
                ID_MMOVER_MODE_PROCEDURAL;
                ID_MMOVER_MODE_TRACK;
              }
            }
        
            // A subcontainer to place parameters in a two column layout.
            GROUP 
            {
              COLUMNS 2;
        
              // The minimum and maxium time for the animation.
              BASETIME ID_MMOVER_ANIMATION_MIN { ANIM OFF; MIN 0; }
              BASETIME ID_MMOVER_ANIMATION_MAX { ANIM OFF; MIN 0; }
              // The minimum and maximum offset of an x-axis offset animation of the host object.
              REAL ID_MMOVER_AXIS_X_MIN { UNIT METER; STEP 0.1; }
              REAL ID_MMOVER_AXIS_X_MAX { UNIT METER; STEP 0.1; }
            }
          }
        }
        

        And then implement GetDEnabling for the tag like this:

            def GetDEnabling(self, node: c4d.GeListNode, did: c4d.DescID, t_data: object, flags: int, 
                             itemdesc: c4d.BaseContainer) -> bool:
                """Called by Cinema 4D to enable or disable the parameter with the ID #did.
                """
                # When the polled parameter is the maximum x-value parameter and the mode drop-down is
                # set to track, disable the parameter.
                if (did[0].id == c4d.ID_MMOVER_AXIS_X_MAX and 
                   node[c4d.ID_MMOVER_MODE] == c4d.ID_MMOVER_MODE_TRACK):
                   return False
        
                # All other parameters and cases should be enabled.
                return True
        

        The tag will behave as follows in the Attribute Manager:

        getdenabling.gif

        There are also multiple GetDEnabling examples to be found on our GitHub, both for Python and C++.

        Cheers,
        Ferdinand

        MAXON SDK Specialist
        developers.maxon.net

        ThomasBT 1 Reply Last reply Reply Quote 2
        • ThomasBT
          ThomasB @ferdinand
          last edited by

          @ferdinand
          As always thank you very much Ferdinand, it works as expected

          Thanks,
          T.S.B

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