Open Search
    Core Messages Manual

    About

    Core messages are sent around Cinema 4D to inform various parts of the application about events and changes. This is happens so different parts of the interface can update their status (e.g. Attribute Manager, Viewport, etc.).

    Note
    Other important message types are messages sent to C4DAtom based elements (see C4DAtom Manual and NodeData::Message() Manual) and GUI messages (GUI and Interaction Messages Manual).

    EventAdd

    When the active document is changed by some operation one must inform Cinema 4D about this, so Cinema 4D can update the GUI.

    Valid flags are:

    Note
    This is only needed when the active document is changed. It is not needed when a virtual or internal document is edited or when objects are handled that are not part of a document.
    Events are not sent if no GUI exists (if CINEMAINFO::FORBID_GUI is true).
    Warning
    Do not use EventAdd() in a threaded context.
    // This example shows how to create a new "Cube" object and how to insert it into the document.
    BaseDocument* const document = GetActiveDocument();
    if (document == nullptr)
    return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
    BaseObject* const cubeObject = BaseObject::Alloc(Ocube);
    if (cubeObject == nullptr)
    return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
    cubeObject->SetName("This is a new object"_s);
    document->InsertObject(cubeObject, nullptr, nullptr);
    BaseDocument * GetActiveDocument()
    void EventAdd(EVENT eventflag=EVENT::NONE)
    Definition: c4d_basedocument.h:497
    void InsertObject(BaseObject *op, BaseObject *parent, BaseObject *pred, Bool checknames=false, Bool sendNotification=true)
    void SetName(const maxon::String &name, Bool setDirty=true)
    Definition: c4d_baselist.h:2419
    Definition: c4d_baseobject.h:248
    static BaseObject * Alloc(Int32 type)
    #define Ocube
    Cube.
    Definition: ge_prepass.h:1110
    #define MAXON_SOURCE_LOCATION
    Definition: memoryallocationbase.h:67

    Catching Messages

    Core messages are sent to update the GUI so it is possible to catch core messages in custom GUI elements:

    When EVMSG_CHANGE is received, GeDialog based custom panels typically re-initialize their values by calling GeDialog::InitValues().

    It is also possible to catch core messages with a MessageData plugin:

    // This example MessageData::CoreMessage() catches EVMSG_CHANGE to detect any change.
    Bool CoreMessage(Int32 id, const BaseContainer& bc)
    {
    if (id == EVMSG_CHANGE)
    {
    if (g_printMessage)
    ApplicationOutput("Something was changed.");
    }
    return true;
    }
    Definition: c4d_basecontainer.h:48
    maxon::Bool Bool
    Definition: ge_sys_math.h:55
    maxon::Int32 Int32
    Definition: ge_sys_math.h:60
    #define EVMSG_CHANGE
    Sent by EventAdd().
    Definition: ge_prepass.h:2716
    #define ApplicationOutput(formatString,...)
    Definition: debugdiagnostics.h:210

    A core message can contain a BaseContainer argument. This container may store these values:

    Message Types

    These are Cinema 4D's core messages:

    // This example catches EVMSG_ASYNCEDITORMOVE in a GeDialog.
    {
    // check if this core message is new
    if (CheckCoreMessage(bc))
    {
    const Int movement = (Int)bc.GetVoid(BFM_CORE_PAR1);
    switch (movement)
    {
    case MOVE_START: { ApplicationOutput("Start Movement"); break; }
    case MOVE_CONTINUE: { ApplicationOutput("Continue Movement"); break; }
    case MOVE_END: { ApplicationOutput("End Movement"); break; }
    }
    }
    break;
    }
    void * GetVoid(Int32 id, void *preset=nullptr) const
    Definition: c4d_basecontainer.h:380
    maxon::Int Int
    Definition: ge_sys_math.h:64
    @ BFM_CORE_PAR1
    ANY Parameter 1.
    Definition: gui.h:899
    #define MOVE_END
    Move ended. par2 == ESC.
    Definition: ge_prepass.h:2755
    #define EVMSG_ASYNCEDITORMOVE
    The user moved something in the editor window. Managers should update things like position fields.
    Definition: ge_prepass.h:2749
    #define MOVE_CONTINUE
    Move continued.
    Definition: ge_prepass.h:2754
    #define MOVE_START
    Move started.
    Definition: ge_prepass.h:2753
    // This example catches EVMSG_UPDATESCHEME in a GeDialog
    // to be informed when the scheme is changed.
    {
    // check if this core message is new
    if (CheckCoreMessage(bc))
    {
    const Int scheme = (Int)bc.GetVoid(BFM_CORE_PAR1);
    switch (scheme)
    {
    case SCHEME_DARK: { ApplicationOutput("Dark Scheme"); break; }
    case SCHEME_OTHER: { ApplicationOutput("Other Scheme"); break; }
    }
    }
    break;
    }
    #define EVMSG_UPDATESCHEME
    Scheme has been updated.
    Definition: ge_prepass.h:2759
    #define SCHEME_DARK
    Dark.
    Definition: ge_prepass.h:2761
    #define SCHEME_OTHER
    Other.
    Definition: ge_prepass.h:2762

    Custom Messages

    It is possible to send custom, asynchronous core messages. This can be used to send a message from a custom thread into the main thread.

    // This example sends a custom core message.
    SpecialEventAdd(ID_CUSTOMEVENT, 123, 456);
    void SpecialEventAdd(Int32 messageid, UInt p1=0, UInt p2=0)
    // This example catches a custom core message.
    case ID_CUSTOMEVENT:
    {
    const Int value1 = (Int)bc.GetVoid(BFM_CORE_PAR1);
    const Int value2 = (Int)bc.GetVoid(BFM_CORE_PAR2);
    const String value1String = String::IntToString(value1);
    const String value2String = String::IntToString(value2);
    ApplicationOutput("Value 1: " + value1String + ", value 2: " + value2String);
    break;
    }
    Definition: c4d_string.h:39
    static String IntToString(Int32 v)
    Definition: c4d_string.h:495
    @ BFM_CORE_PAR2
    ANY Parameter 2.
    Definition: gui.h:900

    Other Functions

    Other functions to send core messages are:

    // This example forces an update of the attribute manager.
    GeData SendCoreMessage(Int32 coreid, const BaseContainer &msg, Int32 eventid=0)
    #define COREMSG_CINEMA
    Requests to Cinema 4D core.
    Definition: c4d_general.h:1565
    #define COREMSG_CINEMA_FORCE_AM_UPDATE
    Forces an Attribute Manager update.
    Definition: c4d_gui.h:94

    Further Reading