Open Search
    AtomArray Manual

    About

    An AtomArray object is used to store multiple pointers to C4DAtom based elements. See C4DAtom Manual.

    Access

    An AtomArray is typically used to define a selection of scene elements:

    See also BaseDocument Selections.

    Allocation/Deallocation

    An AtomArray object can be created with the usual tools.

    Array Elements

    Several functions can be used to edit the elements of the array:

    // This example creates an AtomArray to get the selected elements of a BaseDocument.
    if (selection == nullptr)
    return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
    // get selection
    doc->GetSelection(selection);
    // loop through selected elements
    for (Int32 i = 0; i < selection->GetCount(); ++i)
    {
    C4DAtom* const atom = selection->GetIndex(i);
    if (atom == nullptr)
    return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
    // check if the given C4DAtom is a BaseList2D element
    if (atom->IsInstanceOf(Tbaselist2d))
    {
    const BaseList2D* const baseList2d = static_cast<BaseList2D*>(atom);
    ApplicationOutput("Name: " + baseList2d->GetName());
    }
    }
    Py_ssize_t i
    Definition: abstract.h:645
    Definition: ge_autoptr.h:37
    Definition: c4d_baselist.h:2208
    String GetName() const
    Definition: c4d_baselist.h:2381
    Definition: c4d_baselist.h:1395
    maxon::Int32 Int32
    Definition: ge_sys_math.h:60
    #define atom
    Definition: graminit.h:72
    #define MAXON_SOURCE_LOCATION
    Definition: memoryallocationbase.h:67
    #define ApplicationOutput(formatString,...)
    Definition: debugdiagnostics.h:210
    #define Tbaselist2d
    2D list.
    Definition: ge_prepass.h:986
    const char * doc
    Definition: pyerrors.h:226

    Objects of a certain type can be removed from the array:

    // This example gets all selected objects of the given BaseDocument.
    // The selection is reduced to point objects.
    // get selection
    doc->GetActiveObjects(selection, GETACTIVEOBJECTFLAGS::NONE);
    selection->FilterObject(NOTOK, Opoint);
    const Int32 objCount = selection->GetCount();
    ApplicationOutput("Number of selected point objects: " + String::IntToString(objCount));
    static String IntToString(Int32 v)
    Definition: c4d_string.h:495
    #define NOTOK
    Definition: ge_sys_math.h:267
    #define Opoint
    Point - PointObject.
    Definition: ge_prepass.h:1081

    Two AtomArray objects can be compared:

    Drag and Drop

    AtomArray objects are also often used to define arguments of drag and drop operations.

    // This example checks the received drag&drop message in a GeDialog.
    {
    Int32 type = 0;
    void* object = nullptr;
    // get drag object
    GetDragObject(msg, &type, &object);
    // the object is an AtomArray
    if (type == DRAGTYPE_ATOMARRAY && object)
    {
    AtomArray* const dragObjects = static_cast<AtomArray*>(object);
    // end of drag
    if (msg.GetInt32(BFM_DRAG_FINISHED))
    {
    ApplicationOutput(".........."_s);
    // check UserID
    // NOTE: replace ID_OBJECTMANAGER with 100004709 define with real value to get rid of '#include "../../../../resource/modules/newman/c4d_symbols.h"'
    if (dragObjects->GetUserID() == 100004709)
    ApplicationOutput("Drag from the Object Manager"_s);
    // loop through all dragged objects
    for (Int32 i = 0; i < dragObjects->GetCount(); ++i)
    {
    C4DAtom* draggedAtom = dragObjects->GetIndex(i);
    // PrintName() is a custom function
    PrintName(draggedAtom);
    }
    // get preferred element
    C4DAtom* preferredAtom = dragObjects->GetPreferred();
    // PrintName() is a custom function
    PrintName(preferredAtom);
    }
    else
    {
    return SetDragDestination(MOUSE_COPY);
    }
    }
    return false;
    break;
    }
    PyObject * object
    Definition: asdl.h:7
    Definition: c4d_baselist.h:1651
    Int32 GetUserID() const
    Definition: c4d_baselist.h:1749
    Int32 GetCount() const
    Definition: c4d_baselist.h:1682
    C4DAtom * GetPreferred() const
    Definition: c4d_baselist.h:1780
    C4DAtom * GetIndex(Int32 idx) const
    Definition: c4d_baselist.h:1697
    @ BFM_DRAG_FINISHED
    Bool Drag finished.
    Definition: gui.h:787
    @ DRAGTYPE_ATOMARRAY
    AtomArray.
    Definition: gui.h:776
    @ BFM_DRAGRECEIVE
    Drag receive. (See DragAndDrop.)
    Definition: gui.h:764
    static const Int32 MOUSE_COPY
    Copy cursor.
    Definition: ge_prepass.h:2705
    PyObject ** type
    Definition: pycore_pyerrors.h:34
    const char const char * msg
    Definition: object.h:438

    Copy

    AtomArray objects can be copied with:

    // This example gets all selected objects of the given BaseDocument.
    // The point object selection is copied into a separate AtomArray.
    // get selection
    doc->GetActiveObjects(selection, GETACTIVEOBJECTFLAGS::NONE);
    AutoAlloc<AtomArray> pointObjects;
    if (pointObjects == nullptr)
    return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
    // copy the references of all point object into the given AtomArray
    if (selection->CopyToFilter(pointObjects, NOTOK, Opoint))
    {
    const Int32 objCount = pointObjects->GetCount();
    ApplicationOutput("Number of selected point objects: " + String::IntToString(objCount));
    }

    Further Reading