Народ, такие грабли:
Нужно создать плагин для МАКСА, имитирующий поведение стандартного 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 );
}