CAWeightMgr Manual


The CAWeightMgr class represents the Weight Manager dialog window and its functionality. It gives access to the displayed tags (of type CAWeightTag) and joints.


The settings presented by the Weight Manager dialog are stored with the BaseDocument. They can be safely accessed with these functions:

The setting IDs are defined in oweightmgr.h.

// This example changes the settings that are displayed in the Weight Manager dialog.
// enable "Display Weighting"
// enable "Draw All Joints"
// enable "Points"
static Bool SetParameter(BaseDocument *doc, Int32 id, const GeData &newValue)
Definition: oweightmgr.h:51
Definition: oweightmgr.h:50
Definition: oweightmgr.h:48
const char * doc
Definition: pyerrors.h:226


The CAWeightMgr class accesses an internal cache. This internal cache is automatically updated if the Weight Manger window is opened or the weight tool is active. If this is not the case the internal cache must be updated manually to handle scene changes.

// This example creates and adds a weight tag and a skin object
// to the given polygon object. The joints stored in the given BaseArray
// are linked in the weight tag. The weight manager is updated
// and used to create auto-weights.
// add weight tag and skin object
if (wTag == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
if (sObject == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
CAWeightTag* const weightTag = wTag.Release();
BaseObject* const skinObject = sObject.Release();
doc->InsertObject(skinObject, polyObject, nullptr);
// add joints from a BaseArray
const Int jointCount = joints.GetCount();
for (Int i = 0; i < jointCount; ++i)
BaseObject* const joint = joints[i];
// select tag
doc->SetActiveTag(weightTag, SELECTION_NEW);
// update weight manager
// select all joints
// auto weight
Py_ssize_t i
Definition: abstract.h:645
Definition: ge_autoptr.h:37
TYPE * Release()
Definition: ge_autoptr.h:123
Definition: c4d_baseobject.h:225
void InsertTag(BaseTag *tp, BaseTag *pred=nullptr)
static Bool Update(BaseDocument *doc)
static void SelectAllJoints(BaseDocument *doc)
static Bool AutoWeight(BaseDocument *doc)
Definition: lib_ca.h:179
Int32 AddJoint(BaseObject *op)
maxon::Int Int
Definition: ge_sys_math.h:64
#define Oskin
Skin deformer.
Definition: ge_prepass.h:1082
Starts a new selection.
Definition: c4d_basedocument.h:389
Definition: memoryallocationbase.h:67

Weight Tags

The Weight Manager dialog displays the joints of multiple (selected) weight tags.

// This example loops through all Weight Tags
// displayed in the Weight Manager window.
// get tag count
const Int32 tagCount = CAWeightMgr::GetTagCount(doc);
if (tagCount == 0)
return maxon::IllegalArgumentError(MAXON_SOURCE_LOCATION);
// loop through all tags
for (Int32 tagIndex = 0; tagIndex < tagCount; ++tagIndex)
// print tag name
const CAWeightTag* const tag = CAWeightMgr::GetWeightTag(doc, tagIndex);
if (tag == nullptr)
return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
ApplicationOutput("Weight Tag: " + tag->GetName());
// print host object name
const BaseObject* const hostObject = CAWeightMgr::GetMeshObject(doc, tagIndex);
if (hostObject == nullptr)
return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
ApplicationOutput("Host Object: " + hostObject->GetName());
String GetName() const
Definition: c4d_baselist.h:2363
static CAWeightTag * GetWeightTag(BaseDocument *doc, Int32 tagIdx)
static BaseObject * GetMeshObject(BaseDocument *doc, Int32 tagIdx)
static Int32 GetTagCount(BaseDocument *doc)
maxon::Int32 Int32
Definition: ge_sys_math.h:60
#define ApplicationOutput(formatString,...)
Definition: debugdiagnostics.h:210


Each CAWeightTag stores weights for joints. These joints are displayed in the Weight Manager dialog.

// This example loops through all joints (influences)
// handled in the weight tag at the given index.
// get count
const Int32 jointCount = CAWeightMgr::GetJointCount(doc, tagIndex);
// loop through all joints
for (Int32 i = 0; i < jointCount; ++i)
const BaseObject* const joint = CAWeightMgr::GetJointObject(doc, tagIndex, i);
if (joint == nullptr)
return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
// print joint name
ApplicationOutput("Joint: " + joint->GetName());
static BaseObject * GetJointObject(BaseDocument *doc, Int32 tagIdx, Int32 jointIdx)
static Int32 GetJointCount(BaseDocument *doc, Int32 tagIdx)


It is possible to select joint objects in the Weight Manager. Several operations only apply to such selected objects.

The selection state of all joint objects can easily be managed with:

// This example loops through all selected objects. If the object
// is a joint it will also be selected in the weight manager.
// get all selected objects
if (objects == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
doc->GetActiveObjects(objects, GETACTIVEOBJECTFLAGS::CHILDREN);
// deselect all influences
// loop through all objects
for (Int32 i = 0; i < objects->GetCount(); ++i)
// get object
C4DAtom* const atom = objects->GetIndex(i);
BaseObject* const joint = static_cast<BaseObject*>(atom);
if (joint == nullptr)
return maxon::UnexpectedError(MAXON_SOURCE_LOCATION);
// check if joint
if (joint->IsInstanceOf(Ojoint))
// get id
const UInt64 id = CAWeightMgr::GetJointId(doc, weightTag, joint);
// check if selected
if (joint->GetBit(BIT_ACTIVE))
Bool GetBit(Int32 mask) const
Definition: c4d_baselist.h:2252
Definition: c4d_baselist.h:1377
Bool IsInstanceOf(Int32 id) const
Definition: c4d_baselist.h:1418
static Bool SelectJoint(BaseDocument *doc, Int32 tagIdx, Int32 jointIdx)
static void UnselectAllJoints(BaseDocument *doc)
static UInt64 GetJointId(BaseDocument *doc, const CAWeightTag *tag, const BaseObject *joint)
Definition: apibasemath.h:54
maxon::UInt64 UInt64
Definition: ge_sys_math.h:63
#define atom
Definition: graminit.h:72
#define BIT_ACTIVE
Definition: ge_prepass.h:876
Child objects are added to the selection too, provided they are selected. Otherwise only the topmost ...
#define Ojoint
Definition: ge_prepass.h:1081


The Weight Manager can lock a joint object to prevent unintended changes.

The lock state of all joint objects can be managed with:

// This example inverts the lock state of all influences
// in the weight tag with the given index.
// deselect all
// get count
const Int32 jointCount = CAWeightMgr::GetJointCount(doc, tagIndex);
// loop through all joints
for (Int32 i = 0; i < jointCount; ++i)
// check if locked
if (CAWeightMgr::IsJointLocked(doc, tagIndex, i) == false)
// select unlocked
// unlock all
// lock selected
static Bool LockSelectedJoints(BaseDocument *doc)
static Bool UnlockAllJoints(BaseDocument *doc)
static Bool IsJointLocked(BaseDocument *doc, Int32 tagIdx, Int32 jointIdx)


The weight algorithms are edited with these static functions:

The auto weight algorithm IDs are defined in maxon/autoweight.h, the settings in maxon/autoweight_attributes.h.

Several weight tools of the Weight Manager can be invoked with dedicated functions. These functions add an undo step.

The functions take the selection state of a joint object into account.

Copy and paste functions are:

// This example configures the Weight Manager settings and applies the "Auto Weight" function.
// get modes
const maxon::Id targetMode = maxon::AutoWeightAlgos::BoneglowClass().GetId();
// set mode
GeData geData;
// get settings
maxon::DataDictionary data = CAWeightMgr::GetAutoWeightDictionary(doc, targetMode) iferr_return;
// set settings
data.Set(maxon::ANIMATION::AUTOWEIGHT::BONEGLOW::USEVISIBILITY, true) iferr_return;
data.Set(maxon::ANIMATION::AUTOWEIGHT::BONEGLOW::VISIBILITYRATIO, 0.3_f) iferr_return;
// apply
static maxon::Result< maxon::DataDictionary > GetAutoWeightDictionary(BaseDocument *doc, const maxon::Id &autoweightId)
static maxon::Result< Int > GetAutoWeightAlgoIndex(BaseDocument *doc, const maxon::Id &id)
static maxon::Result< void > SetAutoWeightDictionary(BaseDocument *doc, maxon::DataDictionary dataDictionary, maxon::Id autoweightId)
Definition: c4d_gedata.h:83
void SetInt64(const Int64 &v)
Definition: c4d_gedata.h:579
Definition: apibaseid.h:253
Py_ssize_t * index
Definition: abstract.h:374
int64_t Int64
64 bit signed integer datatype.
Definition: apibase.h:178
Definition: oweightmgr.h:151
#define iferr_return
Definition: resultbase.h:1465

Further Reading