363 lines
9.8 KiB
C++
363 lines
9.8 KiB
C++
|
|
#pragma warning(push, 0)
|
|||
|
|
|
|||
|
|
#include <assert.h>
|
|||
|
|
|
|||
|
|
#include <QCoreApplication>
|
|||
|
|
#include <QColorDialog>
|
|||
|
|
|
|||
|
|
#include "VecViewCommand.h"
|
|||
|
|
// #include "VecSceneManager.h"
|
|||
|
|
#include "geometryutils.h"
|
|||
|
|
#include "ObjectID.h"
|
|||
|
|
// #include "PaiAction.h"
|
|||
|
|
#pragma warning(pop)
|
|||
|
|
|
|||
|
|
BEGIN_OSGGRAPHICS_NAMESPACE;
|
|||
|
|
|
|||
|
|
sAction::sAction()
|
|||
|
|
{
|
|||
|
|
bChecked = false;
|
|||
|
|
bCheckAble = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sAction::sAction( QString strIcon1,std::wstring strText1,bool bChecked1,bool bCheckAble1 ,
|
|||
|
|
QUuid DigitizerIDOrBuilderOjectID,QString slotFunctionName1,QKeySequence keyShortcut1 )
|
|||
|
|
{
|
|||
|
|
strIcon = strIcon1;
|
|||
|
|
strText = strText1;
|
|||
|
|
bChecked = bChecked1;
|
|||
|
|
bCheckAble = bCheckAble1;
|
|||
|
|
keyShortcut = keyShortcut1;
|
|||
|
|
m_DigitizerIDOrBuilderOjectID = DigitizerIDOrBuilderOjectID;
|
|||
|
|
slotFunctionName = slotFunctionName1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QMap<QUuid,sAction > *g_pMapAction = NULL;
|
|||
|
|
OSGFRAMEWORK_EXPORT QMap<QUuid,sAction >& _GetMapActionData()
|
|||
|
|
{
|
|||
|
|
if( !g_pMapAction )
|
|||
|
|
{
|
|||
|
|
g_pMapAction = new QMap<QUuid,sAction >();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return *g_pMapAction ;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QUuid CVecViewCommand::GetDigitizerIDByViewCommandID( QUuid viewCommandID )
|
|||
|
|
{
|
|||
|
|
QMap<QUuid,sAction >& map = _GetMapActionData();
|
|||
|
|
if( !map.contains( viewCommandID ) )
|
|||
|
|
{
|
|||
|
|
return QUuid();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//得到digitizer ID or Builder object ID
|
|||
|
|
QUuid DigitizerID = map[viewCommandID].m_DigitizerIDOrBuilderOjectID;
|
|||
|
|
if( DigitizerID.isNull( ) ) return DigitizerID;
|
|||
|
|
|
|||
|
|
// //是否是digitizer ID
|
|||
|
|
// if( !CVecDigitizer::GetFatory().IsSupport( DigitizerID ) )
|
|||
|
|
// {
|
|||
|
|
// DigitizerID = QUuid();
|
|||
|
|
// }
|
|||
|
|
return DigitizerID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool _SlotDigitizerOrBuilder( CVecViewCommand &viewCommand,QUuid viewCommandID,bool bShow )
|
|||
|
|
{
|
|||
|
|
//无viewCommandID
|
|||
|
|
QMap<QUuid,sAction >& map = _GetMapActionData();
|
|||
|
|
if( !map.contains( viewCommandID ) )
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//得到digitizer ID or Builder object ID
|
|||
|
|
QUuid id = map[viewCommandID].m_DigitizerIDOrBuilderOjectID;
|
|||
|
|
if( id.isNull( ) ) return false ;
|
|||
|
|
|
|||
|
|
bool bSucces(false);
|
|||
|
|
|
|||
|
|
// //处理digitizer ID
|
|||
|
|
// if( CVecDigitizer::GetFatory().IsSupport( id ) )
|
|||
|
|
// {
|
|||
|
|
// //特殊处理Well Section window pick ID
|
|||
|
|
// if( id == GetDigitizerID_Pick() )
|
|||
|
|
// {
|
|||
|
|
// if(viewCommand.GetSceneManager()->GetVecWindow()->GetWindowType() ==GetWindowTypeID_QtWellSection()) id = GetDigitizerID_QtWellWindowPick();
|
|||
|
|
// else if(viewCommand.GetSceneManager()->GetVecWindow()->GetWindowType() == GetWindowTypeID_QtMultiWellSection()) id = GetDigitizerID_MultiWell();
|
|||
|
|
// else if(viewCommand.GetSceneManager()->GetVecWindow()->GetWindowType() == GetWindowTypeID_QtGeoGuideSection() ) id = GetDigitizerID_QtWellWindowPick() ;
|
|||
|
|
// }
|
|||
|
|
// bSucces = true;
|
|||
|
|
// if( bShow)
|
|||
|
|
// {
|
|||
|
|
// viewCommand.GetSceneManager()->GetEventHander().SwitchDigitizer( id,QUuid() );
|
|||
|
|
// }else
|
|||
|
|
// {
|
|||
|
|
// ///此处特殊处理 单井窗口
|
|||
|
|
// if(viewCommand.GetSceneManager()->GetVecWindow()->GetWindowType() ==GetWindowTypeID_QtWellSection()) viewCommand.DoAction( GetDigitizerID_QtWellWindowPick(),true );
|
|||
|
|
// else if(viewCommand.GetSceneManager()->GetVecWindow()->GetWindowType() == GetWindowTypeID_QtMultiWellSection()) viewCommand.DoAction( GetDigitizerID_MultiWell(),true );
|
|||
|
|
// else if(viewCommand.GetSceneManager()->GetVecWindow()->GetWindowType() == GetWindowTypeID_QtGeoGuideSection() ) viewCommand.DoAction( GetDigitizerID_QtWellWindowPick(),true );
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// viewCommand.DoAction( GetDigitizerID_Pick(),true );
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }else
|
|||
|
|
// {
|
|||
|
|
// //处理Builder Object ID
|
|||
|
|
// CVecNodeBuilder *pBuilder = viewCommand.GetSceneManager()->GetBuilder( id );
|
|||
|
|
// if( pBuilder )
|
|||
|
|
// {
|
|||
|
|
// bSucces = true;
|
|||
|
|
// pBuilder->SetEnable( bShow );
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
return bSucces;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CVecViewCommand::BuildActionGeneral(CVecViewCommand &viewCommand,QUuid viewCommandID)
|
|||
|
|
{
|
|||
|
|
viewCommand.AddUIElementToMap( viewCommandID,viewCommand._CreateAction(viewCommandID) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CVecSceneManager* CVecViewCommand::GetSceneManager()
|
|||
|
|
{
|
|||
|
|
return m_pSceneMgr;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QMap< QUuid,sUIELEMENTFunction >* g_MapAction = NULL;
|
|||
|
|
|
|||
|
|
OSGFRAMEWORK_EXPORT QMap< QUuid,sUIELEMENTFunction >& GetmapUIElementFunc()
|
|||
|
|
{
|
|||
|
|
if( !g_MapAction )
|
|||
|
|
{
|
|||
|
|
g_MapAction = new QMap< QUuid,sUIELEMENTFunction >();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return *g_MapAction;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CVecViewCommand::CVecViewCommand()
|
|||
|
|
{
|
|||
|
|
m_pSceneMgr = NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CVecViewCommand::slotActionClicked(bool bChecked )
|
|||
|
|
{
|
|||
|
|
QAction *pAction = dynamic_cast<QAction *>( this->sender() );
|
|||
|
|
if( pAction )
|
|||
|
|
{
|
|||
|
|
DoAction( (QUuid)( pAction->data().toString() ),bChecked );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CVecViewCommand::DoAction(QUuid viewCommandID,bool bChecked)
|
|||
|
|
{
|
|||
|
|
QUuid currentid;
|
|||
|
|
// if(m_pSceneMgr&&m_pSceneMgr->GetCurrentDigitzer()) currentid=m_pSceneMgr->GetCurrentDigitzer()->GetDigitizerID();
|
|||
|
|
//CWaitCursor waitCursor;
|
|||
|
|
bool bSuccess(true);
|
|||
|
|
|
|||
|
|
// set action state
|
|||
|
|
QAction* pAction = GetAction( viewCommandID );
|
|||
|
|
if( pAction )
|
|||
|
|
{
|
|||
|
|
pAction->setChecked( bChecked );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//执行槽函数
|
|||
|
|
UIELEMENTACTION_FUNC pActionSlot = GetmapUIElementFunc().value(viewCommandID).ActionSlot;
|
|||
|
|
if( pActionSlot )
|
|||
|
|
{
|
|||
|
|
bSuccess = true;
|
|||
|
|
(*pActionSlot)(*this,viewCommandID,bChecked);
|
|||
|
|
}else
|
|||
|
|
{
|
|||
|
|
bSuccess = _SlotDigitizerOrBuilder( *this,viewCommandID,bChecked );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 收集Action互斥数据
|
|||
|
|
QList< QList< QUuid > > listMutexAll;
|
|||
|
|
if( listMutexAll.empty() )
|
|||
|
|
{
|
|||
|
|
QList<QUuid> listViewPostion;
|
|||
|
|
listViewPostion << GetViewCmdID_ViewAbove() << GetViewCmdID_ViewBelow() << GetViewCmdID_ViewEast()
|
|||
|
|
<< GetViewCmdID_ViewWest()<< GetViewCmdID_ViewSouth()<< GetViewCmdID_ViewNorth();
|
|||
|
|
listMutexAll << listViewPostion;
|
|||
|
|
|
|||
|
|
// digitizer Action互斥
|
|||
|
|
QList<QUuid> listDigitizerModel;
|
|||
|
|
{
|
|||
|
|
QMap<QUuid,sAction >&mapAction = _GetMapActionData();
|
|||
|
|
QMap<QUuid,sAction >::Iterator it = mapAction.begin();
|
|||
|
|
for( ; it!= mapAction.end() ; ++it )
|
|||
|
|
{
|
|||
|
|
// if( CVecDigitizer::GetFatory().IsSupport( it.value().m_DigitizerIDOrBuilderOjectID ) )
|
|||
|
|
// {
|
|||
|
|
// listDigitizerModel << it.key();
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
listMutexAll << listDigitizerModel;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//执行Action互斥
|
|||
|
|
if( bChecked )
|
|||
|
|
{
|
|||
|
|
foreach( QList< QUuid > listMutex,listMutexAll )
|
|||
|
|
{
|
|||
|
|
if( !listMutex.contains(viewCommandID) ) continue;
|
|||
|
|
|
|||
|
|
foreach( QUuid eOther,listMutex )
|
|||
|
|
{
|
|||
|
|
if( eOther != viewCommandID )
|
|||
|
|
{
|
|||
|
|
QAction *pActionOther = GetAction( eOther );
|
|||
|
|
if( pActionOther )
|
|||
|
|
{
|
|||
|
|
pActionOther->setChecked( false );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return bSuccess ;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QAction* CVecViewCommand::GetAction( QUuid viewCommandID,bool bCreateIfNotExist )
|
|||
|
|
{
|
|||
|
|
//创建Action
|
|||
|
|
if( !m_mapUIElement.contains( viewCommandID ) )
|
|||
|
|
{
|
|||
|
|
QList< QUuid > listTypes;
|
|||
|
|
listTypes << viewCommandID;
|
|||
|
|
if( bCreateIfNotExist )
|
|||
|
|
{
|
|||
|
|
CreatActions( listTypes );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(m_mapUIElement.contains( viewCommandID ) )
|
|||
|
|
{
|
|||
|
|
return dynamic_cast<QAction* >( m_mapUIElement.value( viewCommandID ) );
|
|||
|
|
}
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CVecViewCommand::CreatActions( QList<QUuid> listUIElementType )
|
|||
|
|
{
|
|||
|
|
QMap<QUuid,sAction >&mapAction = _GetMapActionData();
|
|||
|
|
foreach( QUuid viewCommandID,listUIElementType )
|
|||
|
|
{
|
|||
|
|
//已经有了
|
|||
|
|
if( m_mapUIElement.contains( viewCommandID ) )
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 如果是有ID,但Digitizer 或Builder都没有实现,那么就不创建此Action
|
|||
|
|
if( mapAction.contains( viewCommandID ) )
|
|||
|
|
{
|
|||
|
|
QUuid id = mapAction[viewCommandID].m_DigitizerIDOrBuilderOjectID;
|
|||
|
|
// if( !id.isNull() )
|
|||
|
|
// {
|
|||
|
|
// bool bDigitizerID = CVecDigitizer::GetFatory().IsSupport( id ) ;
|
|||
|
|
// bool bBuilderID = false;
|
|||
|
|
// if( m_pSceneMgr )
|
|||
|
|
// {
|
|||
|
|
// bBuilderID = m_pSceneMgr->GetBuilder( id ) ? true : false;
|
|||
|
|
// }
|
|||
|
|
// if( (!bDigitizerID) && (!bBuilderID) )
|
|||
|
|
// {
|
|||
|
|
// continue;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//创建此Action
|
|||
|
|
BUILDUIELEMENT_FUNC pCreateFunction = GetmapUIElementFunc().value( viewCommandID).buildFunc;
|
|||
|
|
if( pCreateFunction )
|
|||
|
|
{
|
|||
|
|
(*pCreateFunction)(*this,viewCommandID);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QAction* CVecViewCommand::_CreateAction( QUuid viewCommandID )
|
|||
|
|
{
|
|||
|
|
QMap<QUuid,sAction >&mapAction = _GetMapActionData();
|
|||
|
|
if( !mapAction.contains(viewCommandID) ) return NULL;
|
|||
|
|
|
|||
|
|
// 根据插件注册的元数据创建QAction
|
|||
|
|
QAction *pAction( NULL );
|
|||
|
|
{
|
|||
|
|
sAction &sAction = mapAction[viewCommandID];
|
|||
|
|
|
|||
|
|
// pAction = new gui::PaiAction( sAction.strIcon.isEmpty() ? QIcon() : QIcon( ::GetImagePath() + sAction.strIcon ),
|
|||
|
|
// QStringFromWCharArray(sAction.strText.c_str(),-1 ),m_pSceneMgr ? dynamic_cast<QObject*>(m_pSceneMgr->GetVecViwer()) : (QObject*)this );
|
|||
|
|
|
|||
|
|
pAction->setData( viewCommandID.toString() );
|
|||
|
|
pAction->setCheckable( sAction.bCheckAble );
|
|||
|
|
pAction->setChecked( sAction.bChecked );
|
|||
|
|
if( !sAction.keyShortcut.isEmpty() )
|
|||
|
|
{
|
|||
|
|
pAction->setShortcut( sAction.keyShortcut );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
connect( pAction,SIGNAL(triggered ( bool )),SLOT(slotActionClicked(bool)) );
|
|||
|
|
}
|
|||
|
|
return pAction ;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CVecViewCommand::AddUIElementToMap( QUuid viewCommandID,QObject *pUI )
|
|||
|
|
{
|
|||
|
|
m_mapUIElement[viewCommandID] = pUI;
|
|||
|
|
|
|||
|
|
//Do action
|
|||
|
|
QAction *pAction = dynamic_cast<QAction *>(pUI );
|
|||
|
|
if( pAction && pAction->isCheckable() )
|
|||
|
|
{
|
|||
|
|
DoAction( viewCommandID,pAction->isChecked() );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CVecViewCommand::GetActionVisble( QUuid viewCommandID )
|
|||
|
|
{
|
|||
|
|
bool bVisble(false);
|
|||
|
|
|
|||
|
|
QAction *pAction = GetAction( viewCommandID,false );
|
|||
|
|
if( pAction )
|
|||
|
|
{
|
|||
|
|
bVisble = pAction->isChecked() && pAction->isEnabled();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return bVisble ;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CVecViewCommand::InitSceneManager(CVecSceneManager *pSceneManager)
|
|||
|
|
{
|
|||
|
|
m_pSceneMgr = pSceneManager;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QMap<QUuid,QObject* >& CVecViewCommand::GetAllActions()
|
|||
|
|
{
|
|||
|
|
return m_mapUIElement;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
OSGFRAMEWORK_EXPORT void RegisterViewAction( QUuid viewCommandID,sAction s,UIELEMENTACTION_FUNC pSlotAction)
|
|||
|
|
{
|
|||
|
|
_GetMapActionData()[ viewCommandID ] = s;
|
|||
|
|
GetmapUIElementFunc()[ viewCommandID ] = sUIELEMENTFunction( CVecViewCommand::BuildActionGeneral,
|
|||
|
|
pSlotAction );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
OSGFRAMEWORK_EXPORT CVecViewCommand& GetGlobalCommand()
|
|||
|
|
{
|
|||
|
|
static CVecViewCommand s;
|
|||
|
|
return s;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
END_OSGGRAPHICS_NAMESPACE;
|