Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    TreeView in material description

    SDK Help
    0
    11
    1.0k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 06/04/2004 at 00:45, xxxxxxxx wrote:

      So far I found out: You always need a CustomGuiData AND an according CustomDataTypeClass with it.
      I continue working on it, if I know how all of that works, I'll post a howto 🙂

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

        On 06/04/2004 at 02:13, xxxxxxxx wrote:

        Here's an example of a custom GUI: (Originally from MSA. I'm not sure if I've posted it here before.)

            
            
            struct SplinePos : public CustomDataType {...}  
              
            LONG convfrom[] =  
            {  
              ID_GV_VALUE_TYPE_REAL  
            };
            
            
            
            
            LONG convto[] =  
            {  
              ID_GV_VALUE_TYPE_REAL  
            };
            
            
            
            
            class MSASplinePos : public CustomDataTypeClass  
            {  
            INSTANCEOF(MSASplinePos,CustomDataTypeClass)  
            public:  
              virtual LONG GetId() { return MSA_SPLINEPOS_DATATYPE_ID; }
            
            
            
            
              virtual CustomDataType* AllocData() { return gNew SplinePos; };  
              virtual void FreeData(CustomDataType* data) { SplinePos* d = static_cast<SplinePos*>(data); gDelete(d); }
            
            
            
            
              virtual Bool CopyData(const CustomDataType* src, CustomDataType* dst, GeAliasTrans *aliastrans)  
              {   
                const SplinePos* s = static_cast<const SplinePos*>(src);   
                SplinePos* d = static_cast<SplinePos*>(dst);  
                if (!s || !d) return FALSE;   
                  
                *d = *s;  
                  
                return TRUE;   
              }
            
            
            
            
              virtual LONG Compare(const CustomDataType* d1,const CustomDataType* d2)  
              {   
                const SplinePos* s1 = static_cast<const SplinePos*>(d1);   
                const SplinePos* s2 = static_cast<const SplinePos*>(d2);  
                if (!s1 || !s2) return FALSE; 
            
            
            
            
                return (*s1 == *s2) ? 0 : (*s1 < *s2 ? -1 : 1);   
              }
            
            
            
            
              virtual Bool WriteData(const CustomDataType *t_d,HyperFile *hf)  
              {  
                if (!t_d || !hf) return FALSE;  
                const SplinePos* s = static_cast<const SplinePos*>(t_d);  
                  
                // level == 0  
                hf->WriteReal(s->m_value);  
                hf->WriteLong(s->m_unit);
            
            
            
            
                return TRUE;  
              }  
                
              virtual Bool ReadData(CustomDataType *t_d, HyperFile *hf, LONG level)  
              {  
                if (!t_d || !hf) return FALSE;  
                SplinePos* s = static_cast<SplinePos*>(t_d);
            
            
            
            
                if (level >= 0)  
                {  
                  hf->ReadReal(&s->m_value);  
                  hf->ReadLong(&s->m_unit);  
                }
            
            
            
            
                return TRUE;  
              }
            
            
            
            
              virtual Bool _GetDescription(const CustomDataType *data, Description &res, LONG &flags,  
                                           const BaseContainer &parentdescription, DescID *singledescid)  
              {  
                const SplinePos* s = static_cast<const SplinePos*>(data);  
                if (!s) return FALSE;
            
            
            
            
                BaseContainer value = GetCustomDataTypeDefault(DTYPE_REAL);  
                value.SetString(DESC_NAME, GeLoadString(MSA_SPLINEPOS_VALUE_TEXT));  
                value.SetLong(DESC_UNIT, UnitToFormat(s->m_unit));  
                res.SetParameter(DescLevel(MSA_SPLINEPOS, DTYPE_REAL, MSA_SPLINEPOS_DATATYPE_ID), value, DESCID_ROOT);  
                
                BaseContainer unit = GetCustomDataTypeDefault(DTYPE_LONG);  
                unit.SetString(DESC_NAME, GeLoadString(MSA_SPLINEPOS_UNIT_TEXT));  
                BaseContainer cycle;  
                cycle.SetString(UNIT_METER, "m");  
                cycle.SetString(UNIT_PERCENT, "%");  
                cycle.SetString(UNIT_POINT, "p");  
                unit.SetContainer(DESC_CYCLE, cycle);  
                res.SetParameter(DescLevel(MSA_SPLINEPOS_UNIT, DTYPE_LONG, MSA_SPLINEPOS_DATATYPE_ID), unit, DESCID_ROOT);
            
            
            
            
                flags |= DESCFLAGS_DESC_LOADED;
            
            
            
            
                return SUPER::_GetDescription(data, res, flags, parentdescription, singledescid);  
              }
            
            
            
            
              virtual Bool GetParameter(const CustomDataType *data,const DescID &id,GeData &t_data,LONG &flags)  
              {  
                const SplinePos* s = static_cast<const SplinePos*>(data);  
                if (!s) return FALSE;
            
            
            
            
                if (id[0].id == MSA_SPLINEPOS)  
                {  
                  t_data = s->m_value;  
                  flags |= DESCFLAGS_PARAM_GET;  
                }  
                else if (id[0].id == MSA_SPLINEPOS_UNIT)  
                {  
                  t_data = s->m_unit;  
                  flags |= DESCFLAGS_PARAM_GET;  
                }
            
            
            
            
                return SUPER::GetParameter(data, id, t_data, flags);  
              }
            
            
            
            
              virtual Bool SetDParameter(CustomDataType *data,const DescID &id,const GeData &t_data,LONG &flags)  
              {  
                SplinePos* s = static_cast<SplinePos*>(data);  
                if (!s) return FALSE;
            
            
            
            
                if (id[0].id == MSA_SPLINEPOS)  
                {  
                  s->m_value = t_data.GetReal();  
                  flags |= DESCFLAGS_PARAM_SET;  
                }  
                else if (id[0].id == MSA_SPLINEPOS_UNIT)  
                {  
                  s->m_unit = t_data.GetLong();  
                  flags |= DESCFLAGS_PARAM_SET;  
                }  
                  
                return SUPER::SetDParameter(data, id, t_data, flags);  
              }
            
            
            
            
              
              virtual void GetDefaultProperties(BaseContainer &data)   
              {  
                data.SetLong(DESC_CUSTOMGUI, MSA_SPLINEPOS_GUI_ID);  
                data.SetLong(DESC_ANIMATE, DESC_ANIMATE_ON);  
              }
            
            
            
            
              virtual CHAR *GetResourceSym() { return "MSA_SPLINEPOS"; }
            
            
            
            
              
              virtual LONG GetConversionsFrom(LONG *&table)  
              {  
                table = convfrom;  
                return sizeof(convfrom)/sizeof(LONG);   
              }  
                
              virtual GvError ConvertFromGv(LONG type, const void *const src, LONG cpu_id, CustomDataType *dst)  
              {  
                SplinePos* d = static_cast<SplinePos*>(dst);  
                if (!d) return GV_CALC_ERR_NOT_VALID;
            
            
            
            
                switch (type)  
                {  
                case ID_GV_VALUE_TYPE_REAL:  
                  {  
                    d->m_value = ((Real* ) src)[cpu_id];  
                    d->m_unit = -1;  
                  } return GV_CALC_ERR_NONE;  
                }
            
            
            
            
                return SUPER::ConvertFromGv(type, src, cpu_id, dst);  
              }  
                
              virtual LONG GetConversionsTo(LONG *&table)  
              {  
                table = convto;  
                return sizeof(convto)/sizeof(LONG);   
              }  
                
              virtual GvError ConvertToGv(LONG type,const CustomDataType *src,void *dst,LONG cpu_id)  
              {  
                const SplinePos* s = static_cast<const SplinePos*>(src);  
                if (!s) return GV_CALC_ERR_NOT_VALID;
            
            
            
            
                switch (type)  
                {  
                case ID_GV_VALUE_TYPE_REAL:   
                  {  
                    ((Real* ) dst)[cpu_id] = s->m_value;  
                  } return GV_CALC_ERR_NONE;  
                }
            
            
            
            
                return SUPER::ConvertToGv(type,src,dst,cpu_id);  
              }
            
            
            
            
            };
            
            
            
            
            static LONG restypetable[] = { MSA_SPLINEPOS_DATATYPE_ID };
            
            
            
            
            class MSASplinePosDialog : public iCustomGui  
            {  
            INSTANCEOF(MSASplinePosDialog, iCustomGui)  
            private:  
              SplinePos m_pos;  
              Bool m_tristate;
            
            
            
            
            public:  
              MSASplinePosDialog(const BaseContainer &settings, CUSTOMGUIPLUGIN *plugin)   
                : iCustomGui(settings, plugin), m_tristate(false), m_Settings(settings) { }
            
            
            
            
              virtual Bool CreateLayout (void)  
              {  
                return LoadDialogResource(MSA_SPLINEPOS_DIALOG, NULL, 0);  
              }  
                
              virtual Bool InitValues()  
              {  
                switch(m_pos.m_unit)  
                {  
                case UNIT_METER:  
                  SetReal(MSA_SPLINEPOS, m_pos.m_value, MINREAL, MAXREAL, 1.0, FORMAT_METER, 0.0, 0.0, FALSE, m_tristate); break;  
                case UNIT_PERCENT:  
                  SetReal(MSA_SPLINEPOS, m_pos.m_value, MINREAL, MAXREAL, 0.01, FORMAT_PERCENT, 0.0, 0.0, FALSE, m_tristate); break;  
                case UNIT_POINT:  
                default:  
                  SetReal(MSA_SPLINEPOS, m_pos.m_value, MINREAL, MAXREAL, 1.0, FORMAT_REAL, 0.0, 0.0, FALSE, m_tristate); break;  
                }  
                SetLong(MSA_SPLINEPOS_UNIT, m_pos.m_unit);
            
            
            
            
                // We cannot look at the return value from SetReal()/SetLong() since it's broken in 8.503  
                return TRUE;  
              }
            
            
            
            
              virtual Bool Command(LONG id, const BaseContainer& msg)  
              {  
                switch (id)  
                {  
                case MSA_SPLINEPOS:  
                case MSA_SPLINEPOS_UNIT:  
                  {  
                    BaseContainer m(msg);  
                    m.SetLong(BFM_ACTION_ID, GetId());  
                    m.RemoveData(BFM_ACTION_VALUE);  
                    m.SetData(BFM_ACTION_VALUE, GetData().GetValue());  
                    SendParentMessage(m);  
                    break;  
                  }  
                }
            
            
            
            
                return TRUE;  
              }  
                
              virtual Bool SetData(const TriState<GeData> &tristate)  
              {  
                SplinePos* d = static_cast<SplinePos*>(   
                  tristate.GetValue().GetCustomDataType(MSA_SPLINEPOS_DATATYPE_ID));
            
            
            
            
                if (!d) return FALSE;  
                  
                m_pos = *d;  
                m_tristate = tristate.GetTri();
            
            
            
            
                return InitValues();  
              }  
                
              virtual TriState<GeData> GetData()  
              {  
                GetLong(MSA_SPLINEPOS_UNIT, m_pos.m_unit);  
                GetReal(MSA_SPLINEPOS, m_pos.m_value);  
                  
                return GeData(m_pos);  
              }
            
            
            
            
              
            private:  
              BaseContainer m_Settings;  
            };
            
            
            
            
            class MSASplinePosGUI : public CustomGuiData  
            {  
            public:  
              virtual LONG GetId() { return MSA_SPLINEPOS_GUI_ID; }
            
            
            
            
              virtual CDialog* Alloc(const BaseContainer &settings)  
              {  
                MSASplinePosDialog* dlg = gNew MSASplinePosDialog(settings, GetPlugin());  
                if (!dlg) return NULL;  
                  
                CDialog *cdlg = dlg->Get();  
                if (!cdlg) return NULL;  
                  
                return cdlg;  
              }
            
            
            
            
              virtual void Free(CDialog *dlg, void *userdata)  
              {  
                if (!dlg || !userdata) return;  
                MSASplinePosDialog *sub = static_cast<MSASplinePosDialog*>(userdata);  
                gDelete(sub);  
              }
            
            
            
            
              virtual CHAR *GetResourceSym()  
              {  
                return "MSA_SPLINEPOS_GUI";  
              }
            
            
            
            
              virtual LONG GetResourceDataType(LONG *&table)   
              {   
                table = restypetable;   
                return sizeof(restypetable)/sizeof(LONG);   
              }  
            };
            
            
            
            
             
            
            
            
            
            Bool RegisterMSASplinePos()  
            {  
              static BaseCustomGuiLib mylib;  
              ClearMem(&mylib,sizeof(mylib));  
              FillBaseCustomGui(mylib);
            
            
            
            
              return InstallLibrary(MSA_SPLINEPOS_GUI_ID, &mylib, 1000, sizeof(mylib))  
                  
                     &&  
                       
                     RegisterCustomDataTypePlugin("MSA SplinePos", 0*PLUGINFLAG_HIDE |   
                       CUSTOMDATATYPE_INFO_HASSUBDESCRIPTION |   
                       CUSTOMDATATYPE_INFO_NEEDDATAFORSUBDESC |  
                       CUSTOMDATATYPE_INFO_SUBDESCRIPTIONDISABLEGUI, gNew MSASplinePos, 0)
            
            
            
            
                     &&  
                        
                     RegisterCustomGuiPlugin("MSA SplinePos GUI", 0*PLUGINFLAG_HIDE, gNew MSASplinePosGUI);  
            }
        
        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

          On 06/04/2004 at 08:12, xxxxxxxx wrote:

          With the source code I'm going on, and my plugin nearly works now. Only one problem is left: The data connection between the data type and the gui. The gui receives data with Bool iGlyphListGui::SetData( const TriState<GeData>& tristate ). I tried to understand in in the example above, I even did compile it, but in the MSA occures the same problem that I have....tristate does not contain data. Before I tried it I thought, SetData receives a GeData, so maybe within my datatype I have to wrap my data into a GeData within ConvertToGeData....but this function is never called.

          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

            THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

            On 06/04/2004 at 15:56, xxxxxxxx wrote:

            Sorry, I don't understand what the problem could be. The code was literaly pasted from the latest MSA version. What do you mean by "tristate does not contain data"? That tristate.GetValue().GetType()==DA_NIL? Or that tristate.GetValue().GetCustomDataType(YOUR_ID) returns NULL?
            For completeness, here's the left-out part of the code:

                
                
                struct SplinePos : public CustomDataType  
                {  
                  SplinePos() : m_value(0.0), m_unit(-1) {}  
                  SplinePos(Real value, LONG unit) : m_value(value), m_unit(unit) {}  
                  SplinePos(const SplinePos& s) { *this = s; }
                
                
                
                
                  Real m_value;  
                  LONG m_unit;
                
                
                
                
                    
                  const SplinePos& operator = (const SplinePos& s)  
                  {  
                    if (s.m_unit != -1) m_unit = s.m_unit;  
                    m_value = s.m_value;  
                    return *this;  
                  }
                
                
                
                
                  operator GeData() const { return GeData(MSA_SPLINEPOS_DATATYPE_ID, *this); }
                
                
                
                
                  String ToString() const  
                  {  
                    return   
                      "[" +   
                        RealToString(m_value * (m_unit == UNIT_PERCENT ? 100.0 : 1.0)) + " " +   
                        (m_unit == UNIT_METER ? "m" : "") +   
                        (m_unit == UNIT_PERCENT ? "pct" : "") +   
                        (m_unit == UNIT_POINT ? "p" : "") +   
                      "]";  
                  }
                
                
                
                
                  Bool operator<(const SplinePos& rhs) const  
                  {  
                    return m_unit != rhs.m_unit ? m_unit < rhs.m_unit :  
                    m_value != rhs.m_value ? m_value < rhs.m_value : FALSE;  
                  }
                
                
                
                
                  Bool operator==(const SplinePos& rhs) const  
                  {  
                    return m_value == rhs.m_value &&   
                           m_unit == rhs.m_unit;  
                  }          
                };
            
            1 Reply Last reply Reply Quote 0
            • H
              Helper
              last edited by

              THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

              On 06/04/2004 at 23:50, xxxxxxxx wrote:

              Yes, in the MSA example the type is DA_NIL, and GetCustomDataType returns a NULL pointer. I even compiled the above code with it, the result is the same. In fact I dont understand the mechanism how it should work, to receive data, I should first somewhere have to define, what data is put into GeData, but I have no idea where!

              1 Reply Last reply Reply Quote 0
              • H
                Helper
                last edited by

                THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                On 07/04/2004 at 00:07, xxxxxxxx wrote:

                One main problem - in my own data class - surely is, that AllocData is never called...haves no idea why

                1 Reply Last reply Reply Quote 0
                • H
                  Helper
                  last edited by

                  THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                  On 07/04/2004 at 01:09, xxxxxxxx wrote:

                  And even in the MSA example, AllocData is never called...this seems to be the reason why it doesn't work.
                  I call the MSA examply by
                   MSA_SPLINEPOS ID_TEST { }
                  in my container....thats ok, isn't it?

                  1 Reply Last reply Reply Quote 0
                  • H
                    Helper
                    last edited by

                    THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                    On 07/04/2004 at 02:22, xxxxxxxx wrote:

                    Aaaah.....
                    BaseContainer->InsData ! 😃
                    Now the AllocData is called....only my gui is now ignored 😞

                    1 Reply Last reply Reply Quote 0
                    • H
                      Helper
                      last edited by

                      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                      On 07/04/2004 at 02:33, xxxxxxxx wrote:

                      Ok....also my gui is there 🙂
                      And SetData seems to bew the better choice....
                      So now I hope I can pass data to my gui...wow what a fight 🙂 Surely the second customgui I will do will be much easier 😃

                      1 Reply Last reply Reply Quote 0
                      • H
                        Helper
                        last edited by

                        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

                        On 07/04/2004 at 04:06, xxxxxxxx wrote:

                        Yeeeha!
                        SetData
                        Fill in Compare and CopyTo....et voila, data reaches SetData 😃

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post