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