Open Search
    GeData Manual

    About

    GeData is a container class. This container is used to store data of all classic data types that are supported by Cinema 4D.

    Access

    A GeData object can be used to directly change the value of a parameter of a C4DAtom object:

    See also C4DAtom Manual.

    A BaseContainer object stores multiple values using GeData objects:

    See also BaseContainer Manual.

    // This example reads the "Radius" parameter of the selected sphere object using GeData.
    BaseObject* object = doc->GetActiveObject();
    // check if the active object is not a "Sphere" object
    if (object == nullptr || object->IsInstanceOf(Osphere) == false)
    return maxon::IllegalArgumentError(MAXON_SOURCE_LOCATION);
    GeData data;
    // access PRIM_SPHERE_RAD parameter
    if (!object->GetParameter(DescID(PRIM_SPHERE_RAD), data, DESCFLAGS_GET::NONE))
    return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
    // check if container contains a float value
    if (data.GetType() != DA_REAL)
    return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
    const Float radius = data.GetFloat();
    Definition: c4d_baseobject.h:225
    Definition: lib_description.h:330
    Definition: c4d_gedata.h:83
    Int32 GetType() const
    Definition: c4d_gedata.h:407
    Float GetFloat() const
    Definition: c4d_gedata.h:439
    static String FloatToString(Float32 v, Int32 vvk=-1, Int32 nnk=-3)
    Definition: c4d_string.h:529
    maxon::Float Float
    Definition: ge_sys_math.h:66
    @ DA_REAL
    Float.
    Definition: c4d_gedata.h:41
    #define Osphere
    Sphere.
    Definition: ge_prepass.h:1103
    #define MAXON_SOURCE_LOCATION
    Definition: memoryallocationbase.h:67
    #define ApplicationOutput(formatString,...)
    Definition: debugdiagnostics.h:210
    @ PRIM_SPHERE_RAD
    Definition: osphere.h:6
    const char * doc
    Definition: pyerrors.h:226
    Definition: object.h:105

    Data

    Type

    A GeData object stores data of a certain type.

    • GeData::SetDefault(): Sets the default value for the given data type.
    • DEFAULTVALUE: Dummy value for the constructor to initialize the object with the default value.
    // Code like this is typically used in a NodeData::Init() function to make sure complex data types are initialized
    BaseContainer& bc = ((BaseList2D*)node)->GetDataInstanceRef();
    @ DEFAULTVALUE
    Dummy value for the default value GeData constructor.
    Definition: c4d_gedata.h:65
    Definition: c4d_basecontainer.h:47
    GeData * SetData(Int32 id, const GeData &n)
    Definition: c4d_basecontainer.h:255
    Definition: c4d_baselist.h:2208
    @ DTYPE_BASELISTLINK
    BaseLink.
    Definition: lib_description.h:74
    Definition: node.h:10
    Note
    If the type is not set, GeData::GetType() returns DA_NIL.
    // Using GetType() it is possible to check if the returned value is of the expected type.
    GeData data;
    const Bool success = sphere->GetParameter(DescID(PRIM_SPHERE_RAD), data, DESCFLAGS_GET::NONE);
    if (!success)
    return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
    // check type
    if (data.GetType() != DA_REAL)
    return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
    const Float radius = data.GetFloat();
    maxon::Bool Bool
    Definition: ge_sys_math.h:55

    Access

    The GeData class offers access functions for all supported data types. "Set" functions set the value and also change the data type if needed. "Get" functions return the value and are only allowed to be used if the data type matches.

    Int32 and Bool data (data type DA_LONG):

    Int64 data (data type DA_LLONG):

    Float data (data type DA_REAL):

    See also Primitive Data Types Manual (Classic).

    Void pointers (data type DA_VOID):

    // This example stores a void pointer in a GeData object.
    GeData data;
    data.SetVoid(&object);
    // ...
    SomeObject* const obj = static_cast<SomeObject*>(data.GetVoid());
    void * GetVoid() const
    Definition: c4d_gedata.h:445
    void SetVoid(void *v)
    Definition: c4d_gedata.h:585
    PyObject * obj
    Definition: complexobject.h:60
    Note
    In general it is not recommended to use "raw" pointers, instead see BaseLink Manual.

    Raw memory (data type DA_BYTEARRAY):

    // This example stores some raw memory in a GeData object.
    GeData geData;
    geData.SetMemory(memory, memSize);
    const Char* const data = (Char*)geData.GetMemory(count);
    if (data != nullptr)
    {
    output.SetCString(data, count);
    }
    Py_ssize_t count
    Definition: abstract.h:640
    void * GetMemory(Int &count)
    Definition: c4d_gedata.h:546
    void SetMemory(void *data, Int count)
    Definition: c4d_gedata.h:592
    Definition: c4d_string.h:39
    Py_ssize_t char * output
    Definition: unicodeobject.h:985
    maxon::Char Char
    Definition: ge_sys_math.h:56
    maxon::Int Int
    Definition: ge_sys_math.h:64

    Vector objects (data type DA_VECTOR):

    See also Vector Manual (Classic).

    Matrix objects (data type DA_MATRIX):

    See also Matrix Manual (Classic).

    String objects and C4DUuid objects (data type DA_STRING):

    See also String Manual (Classic).

    Filename objects (data type DA_FILENAME):

    See also Filename Manual.

    C4DUuid objects: (data type DA_UUID):

    BaseTime objects (data type DA_TIME):

    See also BaseTime Manual.

    Tristate (data type DA_TRISTATE):

    See also TriState Manual.

    BaseContainer objects (data type DA_CONTAINER):

    // This example stores a BaseContainer in a GeData object.
    GeData data;
    {
    // store BaseContainer
    bc.InsData(100, "foobar");
    data.SetContainer(bc);
    }
    {
    // access stored BaseContainer
    if (bc == nullptr)
    return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
    ApplicationOutput("Container Content: " + bc->GetData(100).GetString());
    }
    const GeData & GetData(Int32 id) const
    Definition: c4d_basecontainer.h:262
    GeData * InsData(Int32 id, const GeData &n)
    Definition: c4d_basecontainer.h:238
    BaseContainer * GetContainer() const
    Definition: c4d_gedata.h:487
    void SetContainer(const BaseContainer &v)
    Definition: c4d_gedata.h:645
    const String & GetString() const
    Definition: c4d_gedata.h:463
    #define MAXON_SCOPE
    Definition: apibase.h:2841

    See also BaseContainer Manual.

    BaseLink objects (data type DA_ALIASLINK):

    See also BaseLink Manual.

    Custom data types:

    // This example accesses a custom data type value from a GeData object.
    // get data
    GeData data;
    if (!activeTag->GetParameter(DescLevel(EXPRESSION_PRIORITY), data, DESCFLAGS_GET::NONE))
    return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
    // get custom data type value
    PriorityData* const priorityData = static_cast<PriorityData*>(customData);
    if (priorityData == nullptr)
    return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
    // edit data
    activeTag->SetParameter(DescLevel(EXPRESSION_PRIORITY), data, DESCFLAGS_SET::NONE);
    CustomDataType * GetCustomDataType(Int32 datatype) const
    Definition: c4d_gedata.h:507
    Priority custom data type (CUSTOMGUI_PRIORITY_DATA).
    Definition: customgui_priority.h:80
    Bool SetPriorityValue(Int32 lValueID, const GeData &data)
    #define CUSTOMGUI_PRIORITY_DATA
    Priority custom data type ID.
    Definition: customgui_priority.h:23
    #define PRIORITYVALUE_CAMERADEPENDENT
    Bool Camera dependent.
    Definition: customgui_priority.h:36
    Base class for custom data types.
    Definition: c4d_customdatatype.h:51
    Represents a level within a DescID.
    Definition: lib_description.h:289
    @ EXPRESSION_PRIORITY
    Definition: texpression.h:6

    Copy

    The data of one GeData object can easily be copied to another object:

    // This example copies the data from one GeData
    // object to another.
    GeData stringData { "foobar" };
    GeData intData(100);
    stringData.CopyData(&intData, nullptr);
    // check if container contains a String
    if (intData.GetType() == DA_STRING)
    ApplicationOutput("Data: " + intData.GetString());
    @ DA_STRING
    String.
    Definition: c4d_gedata.h:47

    Clear

    A GeData object can be cleared.

    // This example stores a String in the given GeData object just do delete it.
    GeData data { "foobar" };
    // check if container contains a String
    if (data.GetType() == DA_STRING)
    ApplicationOutput("data contains a string"_s);
    data.Free();
    // check if data has no type (data is not set)
    if (data.GetType() == DA_NIL)
    ApplicationOutput("data is empty"_s);
    void Free()
    Deletes the internal data and sets the type to DA_NIL.
    Definition: c4d_gedata.h:337
    @ DA_NIL
    No value.
    Definition: c4d_gedata.h:38

    Compare

    Two GeData objects can be compared with the usual operators:

    // This example compares two GeData objects with the "same" value but different types.
    GeData intergerDataA;
    intergerDataA.SetInt32(123);
    GeData integerDataB;
    integerDataB.SetInt64(123);
    if (intergerDataA != integerDataB)
    ApplicationOutput("Data is different"_s);
    void SetInt32(Int32 v)
    Definition: c4d_gedata.h:573
    void SetInt64(const Int64 &v)
    Definition: c4d_gedata.h:579

    Disc I/O

    A GeData object can be stored in a HyperFile:

    // This example writes a GeData value to a HyperFile.
    if (hf == nullptr)
    return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
    // open HyperFile to write
    {
    hf->WriteGeData(data);
    hf->Close();
    }
    else
    {
    return maxon::IoError(MAXON_SOURCE_LOCATION, MaxonConvert(filename, MAXONCONVERTMODE::NONE), "Could not open file."_s);
    }
    PyCompilerFlags const char * filename
    Definition: ast.h:15
    maxon::Url MaxonConvert(const Filename &fn, MAXONCONVERTMODE convertMode)
    @ NONE
    No check if file exists under case-sensitive drives.
    Definition: ge_autoptr.h:37
    @ ANY
    Show an error dialog for any error.
    // This example reads a GeData value from a HyperFile stored on disc.
    if (hf == nullptr)
    return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
    // open HyperFile to read
    if (hf->Open(456, filename, FILEOPEN::READ, FILEDIALOG::ANY))
    {
    GeData data;
    hf->ReadGeData(&data);
    // check if container contains a String
    if (data.GetType() == DA_STRING)
    ApplicationOutput("Loaded GeData String: " + data.GetString());
    hf->Close();
    }
    else
    {
    return maxon::IoError(MAXON_SOURCE_LOCATION, MaxonConvert(filename, MAXONCONVERTMODE::NONE), "Could not open file."_s);
    }
    @ READ
    Open the file for reading.

    Further Reading