Open Search
    Take System Additional Information

    Messages

    The take system sends two messages to an object's NodeData::Message() method:

    // This code simply disables overrides for all parameters of the host object.
    {
    if (dao && dao->_descId)
    {
    dao->_allow = false;
    return true;
    }
    break;
    }
    #define MSG_DESCRIPTION_ALLOWOVERRIDE
    Sent before the Take override is added to allow it or not. The corresponding data is DescriptionAllow...
    Definition: c4d_baselist.h:440
    Definition: lib_description.h:1036
    const DescID * _descId
    Description ID to be overridden.
    Definition: lib_description.h:1047
    Bool _allow
    true if the parameter can be overridden, otherwise false.
    Definition: lib_description.h:1050

    and

    // This example catches the message MSG_DESCRIPTION_TAKECHANGED
    // to be informed what parameter was changed.
    {
    if (dtc && dtc->_descId)
    {
    const Int32 parameterID = (*dtc->_descId)[0].id;
    }
    break;
    }
    static String IntToString(Int32 v)
    Definition: c4d_string.h:495
    maxon::Int32 Int32
    Definition: ge_sys_math.h:60
    #define MSG_DESCRIPTION_TAKECHANGED
    Sent to each overridden node when the user changes the current Take. Sent to both the node storing th...
    Definition: c4d_baselist.h:441
    #define ApplicationOutput(formatString,...)
    Definition: debugdiagnostics.h:210
    Definition: lib_description.h:1060
    const DescID * _descId
    The description ID for the message, can be nullptr so is sent at the end of the operation just once.
    Definition: lib_description.h:1070
    Note
    It is also possible to send MSG_DESCRIPTION_ALLOWOVERRIDE to an object using Message() to check if a certain parameter can be overridden.

    Core Message

    The Take System sends a core message when the take changed.

    // This example shows how a MessageData plugin catches the EVMSG_TAKECHANGED message.
    Bool CoreMessage(Int32 id, const BaseContainer& bc)
    {
    if (id == EVMSG_TAKECHANGED)
    {
    ApplicationOutput("Take Changed");
    }
    return true;
    }
    Definition: c4d_basecontainer.h:48
    maxon::Bool Bool
    Definition: ge_sys_math.h:55
    #define EVMSG_TAKECHANGED
    Sent by the Take System when the current Take ID changed to let all managers react to the new status.
    Definition: ge_prepass.h:2750

    Custom Tags

    If a custom tag should appear in the Take Manager's context menu, it must use the flag TAG_ADDTOTAKEGROUP:

    Bool RegisterLookAtCamera(void)
    {
    return RegisterTagPlugin(ID_LOOKATCAMERATAG,
    GeLoadString(IDS_LOOKATCAMERA),
    LookAtCamera::Alloc,
    "Tlookatcameraexp",
    AutoBitmap("lookatcamera.tif"),
    0);
    }
    const String & GeLoadString(Int32 id)
    Bool RegisterTagPlugin(Int32 id, const maxon::String &str, Int32 info, DataAllocator *g, const maxon::String &description, BaseBitmap *icon, Int32 disklevel)
    A simple BaseBitmap wrapper created from a filename or resource ID.
    Definition: c4d_basebitmap.h:1538
    #define TAG_EXPRESSION
    The tag is an expression.
    Definition: c4d_basetag.h:34
    #define TAG_ADDTOTAKEGROUP
    The tag is added to the Take override groups system.
    Definition: c4d_basetag.h:37
    #define TAG_VISIBLE
    The tag can be seen in the Object Manager.
    Definition: c4d_basetag.h:31

    Custom GUIs

    It is possible to disable the override functionality for custom GUI elements. This can be useful if the GUI element does not manage data and only displays internal states of a node.

    if (!RegisterCustomGuiPlugin(GeLoadString(IDS_CUSTOMGUISTRING), CUSTOMGUI_DISALLOW_TAKESOVERRIDE, NewObjClear(SDKExampleCustomGUIString)))
    Bool RegisterCustomGuiPlugin(const maxon::String &str, Int32 info, CustomGuiData *dat)
    #define CUSTOMGUI_DISALLOW_TAKESOVERRIDE
    Disallows Takes override e.g. the GUI does not hold real data but just react to the node changes (e....
    Definition: c4d_customguidata.h:76

    Description GUI

    It is possible to create custom dialogs with the Description GUI element. With a parameter it is possible to disable the Take System for that GUI. This is needed e.g. if the GUI element is used to display a custom node.

    // This example configurse a new DescriptionCustomGui element.
    BaseContainer customguiSettings;
    customguiSettings.SetBool(DESCRIPTION_ALLOWFOLDING, true);
    customguiSettings.SetBool(DESCRIPTION_NO_TAKE_OVERRIDES, true);
    const Int32 guiFlags = BFH_SCALEFIT | BFV_SCALEFIT;
    void* customGUI = AddCustomGui(GADGET_ID, CUSTOMGUI_DESCRIPTION, ""_s, guiFlags, 400, 200, customguiSettings);
    DescriptionCustomGui* const descriptionGUI = static_cast<DescriptionCustomGui*>(customGUI);
    void SetBool(Int32 id, Bool b)
    Definition: c4d_basecontainer.h:572
    Definition: customgui_description.h:100
    #define CUSTOMGUI_DESCRIPTION
    Description custom GUI ID.
    Definition: customgui_description.h:21
    #define DESCRIPTION_NO_TAKE_OVERRIDES
    Bool: If true ignore the overrides enabling/disabling.
    Definition: customgui_description.h:38
    #define DESCRIPTION_ALLOWFOLDING
    Bool Allow folding.
    Definition: customgui_description.h:26
    @ BFV_SCALEFIT
    Scale fit. BFV_SCALE|BFV_FIT.
    Definition: gui.h:308
    @ BFH_SCALEFIT
    Scale fit. BFH_SCALE|BFH_FIT.
    Definition: gui.h:316

    Bits

    These bits are used by the Take System to mark objects and tags changed by it:

    // This example loops through the tags of the given object and checks if a tag was created by a BaseOverrideGroup.
    BaseTag* tag = object->GetFirstTag();
    while (tag != nullptr)
    {
    {
    const String message { "The Tag " + tag->GetName() + "was created by a BaseOverrideGroup" };
    }
    tag = tag->GetNext();
    }
    String GetName() const
    Definition: c4d_baselist.h:2412
    Definition: c4d_basetag.h:50
    BaseTag * GetNext()
    Definition: c4d_basetag.h:81
    Bool GetNBit(NBIT bit) const
    Definition: c4d_baselist.h:2043
    Definition: c4d_string.h:39
    const char * message
    Definition: pyerrors.h:189
    @ TAKE_LOCK
    A node in an override group cannot be changed.

    Take Rendering

    It is possible to check if the Take System is currently rendering in the background:

    // This example checks if takes are rendered. If not, the render process will be started.
    if (IsTakeRenderRunning() == false)
    CallCommand(431000068); // render marked takes to PV
    void CallCommand(Int32 id, Int32 subid=0)
    Bool IsTakeRenderRunning()

    Further Reading