Open Search
    TriState Manual

    About

    In Cinema 4D it is possible to select multiple scene elements at once. The Attribute Manager displays the parameters of all these selected objects. Only the parameters that are part of all selected objects are displayed. If the value of a given parameter is the same for all selected objects, this value is displayed in the Attribute Manager. But if the value of the parameter on the different objects is not the same a tristate is displayed instead, indicating that the values are not the same.

    TriState is a utility class to make it easy to handle multiple parameter values and to display them using GeDialog gadgets. The TriState template class can handle Bool, Int32, Float, Vector, BaseTime and String values. Typically the TriState class is only relevant to create CustomGuiData / iCustomGui based custom GUI elements.

    Note
    TriState elements are only handled with GeDialog gadgets. Parameter descriptions (Description elements) define the parameters of a C4DAtom based element and do not handle any TriState.
    // This example gets the names of all selected objects in a GeDialog::InitValues() function.
    // The object names are stored in a TriState object.
    // This TriState object is used to display the names with a text field element.
    // check if both the BaseDocument and the AtomArray are available
    if (doc && objects)
    {
    // get selected objects
    doc->GetActiveObjects(objects, GETACTIVEOBJECTFLAGS::NONE);
    // store all names in the TriState object
    TriState<String> triState;
    const Int32 count = objects->GetCount();
    for (Int32 i = 0; i < count; ++i)
    {
    // get name
    const BaseList2D* const bl = static_cast<BaseList2D*>(objects->GetIndex(i));
    if (bl)
    {
    const String name = bl->GetName();
    // store
    triState.Add(name);
    }
    }
    // the text field should display the value(s) stored in the TriState
    // if the string values are not the same the GUI element will display "Multiple Values"
    SetString(ID_OBJECTNAME, triState);
    }
    Py_ssize_t i
    Definition: abstract.h:645
    Py_ssize_t count
    Definition: abstract.h:640
    const char const char * name
    Definition: abstract.h:195
    BaseDocument * GetActiveDocument()
    Definition: ge_autoptr.h:37
    Definition: c4d_basedocument.h:497
    Definition: c4d_baselist.h:2376
    String GetName() const
    Definition: c4d_baselist.h:2543
    Definition: c4d_string.h:41
    Definition: c4d_gui.h:983
    void Add(const TYPE &val)
    Definition: c4d_gui.h:1029
    maxon::Int32 Int32
    Definition: ge_sys_math.h:56
    const char * doc
    Definition: pyerrors.h:226

    Functionality

    A TriState object stores multiple values:

    The stored values can be accessed and analysed with:

    // This example configures and uses a TriState object.
    TriState<Int32> triState;
    triState.Add(100);
    triState.Add(100);
    // check if the TriState is not empty and if all values are the same
    const Bool isNotTriState = triState.GetTri() == false;
    if (triState.HasChanged() && isNotTriState)
    ApplicationOutput("Everything is the same");
    // add a different value
    triState.Add(200);
    // check again
    if (triState.GetTri())
    {
    ApplicationOutput("now tristate"_s);
    const Int32 value = triState.GetValue();
    }
    PyObject * value
    Definition: abstract.h:715
    static String IntToString(Int32 v)
    Definition: c4d_string.h:497
    Bool GetTri() const
    Definition: c4d_gui.h:1005
    const TYPE & GetValue() const
    Definition: c4d_gui.h:1017
    Bool HasChanged() const
    Definition: c4d_gui.h:1023
    maxon::Bool Bool
    Definition: ge_sys_math.h:51
    #define ApplicationOutput(formatString,...)
    Definition: debugdiagnostics.h:204

    Further Reading