Plugin для 3DSMAX
От: WinterMute Россия http://yarrr.ru
Дата: 27.02.04 05:13
Оценка:
Народ, такие грабли:

Нужно создать плагин для МАКСА, имитирующий поведение стандартного Dummy (на вкладке Helpers), но, в добавок, у каждого объекта должен быть диалог параметров (достаточно одного поля для ввода строки).

С созданием объекта проблем не было -- просто пронаследовал свой от DummyObject. Вот с диалогом уже второй день мучаюсь.

Сделал экземпляр ParamBlockDesc2, определил функции maxProject1::BeginEditParams и maxProject1::EndEditParams, но, диалог появляется только при выборе кнопки-закладки “MyDummy”. Как показать диалог при выборе конкретного объекта “Стрелкой”?

На всякий случай, определение класса maxProject:

class maxProject1 : public DummyObject {
    public:
        static IObjParam *ip;
        static maxProject1 *editOb;
        // Parameter block
        IParamBlock2    *pblock;    //ref 0

        //From Animatable
        Class_ID ClassID() {return maxProject1_CLASS_ID;}        
        SClass_ID SuperClassID() { return HELPER_CLASS_ID; }
        void GetClassName(TSTR& s){s = GetString( IDS_CLASS_NAME );}

        int NumSubs() { return 1; }
        int    NumParamBlocks() { return 1; }        
IParamBlock2* GetParamBlock(int i)    { return pblock; }
        IParamArray*  GetParamBlock()    { return (IParamArray*)pblock; }
        IParamBlock2* GetParamBlockByID(BlockID id)
{ return (pblock->ID() == id) ? pblock : NULL; }
        int GetParamBlockIndex(int id)
        {
            if (pblock && id>=0 && id<pblock->NumParams() ) return id;
            else return -1;
        }
        void DeleteThis() { delete this; }        
        
        //Constructor/Destructor
        maxProject1();
        ~maxProject1() {}

        // Loading/Saving
        IOResult Load(ILoad *iload) { return DummyObject::Load(iload); }
        IOResult Save(ISave *isave) { return DummyObject::Save(isave); }

        void    SetReference(int i, RefTargetHandle rtarg)
{ pblock = static_cast<IParamBlock2*>(rtarg); }

        char* GetObjectName(){ return GetString( IDS_CLASS_NAME ); }
        void  InitNodeName(class CStr& str)
{ str = GetString( IDS_CLASS_NAME ); }
        RefResult NotifyRefChanged( Interval changeInt, RefTargetHandle hTarget, PartID& partID,  RefMessage message)
{ return REF_SUCCEED; }

        void InvalidateUI();

        void BeginEditParams( IObjParam *ip, ULONG flags, Animatable *prev);
        void EndEditParams( IObjParam *ip, ULONG flags, Animatable *next);

        Interval ObjectValidity(TimeValue t);
        void UpdateParamblockFromVars();

private:
        virtual ReferenceTarget* Clone( RemapDir& remap = NoRemap() );
};


Вот код для maxProject1::BeginEditParams:

void maxProject1::BeginEditParams( IObjParam *ip, ULONG flags, Animatable *prev )
{    
    //ip === static IObjParam *ip;
    this->ip = ip;
    
    //editOb === static maxProject1 *editOb;
    editOb   = this;
    
    maxProject1Desc.BeginEditParams( ip, this, flags, prev );
}