VTK QT vtkCallbackCommand封裝

CommandCallbackBase.h

///  @file CommandCallbackBase.h
///  @brief vtk widget消息監聽接口
///  @author [email protected]
///  @date 2018

#ifndef COMMANDCALLBACKBASE_H
#define COMMANDCALLBACKBASE_H

class vtkCallbackCommand;
class vtkObject;

/// 統一vtk widget消息的監聽及消息接收
///
/// 子類只需繼承這個類,並調用相應的接口,就可實現對widget消息的監聽
class CommandCallbackBase
{

public:
    CommandCallbackBase();
    ~CommandCallbackBase();

protected: //vtkWidget消息
    /// 對VtkObject對象增加監聽消息
    /// @param  pVtkObject 監聽的對象
    /// @param  vtkCommandEvent  監聽的消息
    /// @param  priority 消息的優先級
    /// @return 無
    virtual void AddVtkObjectObserver(vtkObject *pVtkObject, int vtkCommandEvent, double priority = 0.5);


    /// 移除VtkObject對象監聽消息
    /// @param  pVtkObject 監聽的對象
    /// @param  vtkCommandEvent  監聽的消息
    /// @return 無
    virtual void RemoveVtkObjectObserver(vtkObject *pVtkObject, int vtkCommandEvent);

    /// VtkObject監聽消息的處理
    /// @param  object 監聽的對象
    /// @param  event  監聽的消息
    /// @param calldata  調用InvokeEvent	(unsigned long event, void *callData)發出消息中的callData
    /// @return 無
    virtual void OnWidgetEvents(vtkObject* object, unsigned long event, void* calldata);

    ///設置是否截斷消息傳遞
    /// @param abort true:截斷消息傳遞 false:繼續消息傳遞
    virtual void SetAbortFlag(bool abort);

    /// VtkObject監聽消息的靜態處理入口
    /// @param  object 監聽的對象
    /// @param  event  監聽的消息
    /// @param clientdata 消息的持有者指針,參考vtkCallbackCommand的方法SetClientData
    /// @param calldata  調用InvokeEvent	(unsigned long event, void *callData)發出消息中的callData
    /// @return 無
    static void ProcessEvents(vtkObject* object, unsigned long event, void* clientdata, void* calldata);


protected:
    vtkCallbackCommand              *m_pCallbackCommand = nullptr;
};

#endif // COMMANDCALLBACKBASE_H

 

CommandCallbackBase.cpp

#include "commandcallbackbase.h"


//qt
#include <qglobal.h>

//vtk
#include "vtkCallbackCommand.h"
#include "vtkObject.h"


//vtkStandardNewMacro(CommandCallbackBase);

CommandCallbackBase::CommandCallbackBase()
{
    m_pCallbackCommand = vtkCallbackCommand::New();
    m_pCallbackCommand->SetClientData(this);
    m_pCallbackCommand->SetCallback(CommandCallbackBase::ProcessEvents);

}

CommandCallbackBase::~CommandCallbackBase()
{
    //VTK_DELETE(m_pCallbackCommand);
    if(nullptr != m_pCallbackCommand)
    {
        m_pCallbackCommand->Delete();
    }
}

void CommandCallbackBase::AddVtkObjectObserver(vtkObject *pVtkObject, int vtkCommandEvent, double priority)
{
    if(nullptr != pVtkObject)
    {
        if(0 == pVtkObject->HasObserver(vtkCommandEvent, m_pCallbackCommand))
        {
            pVtkObject->AddObserver(vtkCommandEvent, m_pCallbackCommand, priority);
        }
    }
}

void CommandCallbackBase::RemoveVtkObjectObserver(vtkObject *pVtkObject, int vtkCommandEvent)
{
    if(nullptr != pVtkObject)
    {
        if(1 == pVtkObject->HasObserver(vtkCommandEvent, m_pCallbackCommand))
        {
            pVtkObject->RemoveObserver(vtkCommandEvent);
        }
    }
}

void CommandCallbackBase::OnWidgetEvents(vtkObject *object, unsigned long event, void *calldata)
{
    Q_UNUSED(object);
    Q_UNUSED(event);
    Q_UNUSED(calldata);
}

void CommandCallbackBase::SetAbortFlag(bool abort)
{
    if(true == abort)
    {
        m_pCallbackCommand->SetAbortFlag(1);
    }
}

void CommandCallbackBase::ProcessEvents(vtkObject *object, unsigned long event, void *clientdata, void *calldata)
{
    CommandCallbackBase* pSelf = reinterpret_cast<CommandCallbackBase *>( clientdata );
    if(nullptr != pSelf )
    {
        pSelf->OnWidgetEvents(object, event, calldata);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章