431 lines
11 KiB
C++
431 lines
11 KiB
C++
/**
|
||
* @file BaseObject.h
|
||
* @brief 成图框架依赖的数据层的最小化接口定义
|
||
* @date 2014-5-29
|
||
* @author: liyonggang
|
||
*/
|
||
#ifndef PAI_FRAME_OSGOBJECT_H
|
||
#define PAI_FRAME_OSGOBJECT_H
|
||
#pragma warning( push ,0)
|
||
#include <vector>
|
||
#include <QUuid>
|
||
#include "ObjectGenralFactory.h"
|
||
// #include "ObjectArchive.h"
|
||
// #include "PaiObject.h"
|
||
#include "DataObject.h"
|
||
// using namespace pai::objectmodel;
|
||
|
||
#pragma warning( pop )
|
||
|
||
BEGIN_OSGDATAMODEL_NAMESPACE;
|
||
|
||
/**
|
||
* @class sObjectClassIDKey
|
||
* @brief 唯一标识Object class ID
|
||
*/
|
||
struct OSGDATAMODEL_EXPORT sObjectClassIDKey
|
||
{
|
||
public:
|
||
sObjectClassIDKey();
|
||
|
||
sObjectClassIDKey( QUuid ObjectClassID );
|
||
|
||
bool operator !=( const sObjectClassIDKey& s );
|
||
|
||
bool operator< ( const sObjectClassIDKey& s ) const;
|
||
|
||
public:
|
||
QUuid m_ObjectClassID;
|
||
};
|
||
|
||
/**
|
||
* @class 成图框架依赖的数据层的基类接口
|
||
*/
|
||
class OSGDATAMODEL_EXPORT CBaseObject
|
||
{
|
||
public:
|
||
CBaseObject()
|
||
{
|
||
// m_pPaiObject = NULL;
|
||
ghostName="";
|
||
// m_TemplateKey=QVariant();
|
||
};
|
||
|
||
virtual ~CBaseObject() {};
|
||
|
||
|
||
/**
|
||
* @brief 得到DB Object
|
||
*/
|
||
virtual pai::ios::welllog::DataObject *GetDbObject() { return NULL;};
|
||
virtual CBaseObject * GetVecWindowDocument(){return NULL;};
|
||
|
||
|
||
static CObjectGenralFactory< sObjectClassIDKey,CBaseObject >& GetFatory();
|
||
|
||
/**
|
||
* @brief 设置Object在数据树上的check状态
|
||
*/
|
||
void SetCheckState( Qt::CheckState state )
|
||
{
|
||
m_eCheckState = state;
|
||
// PaiObject::m_EventAgent.ObjectPropertyChanged( dynamic_cast<PaiObject*>(this),"checkstate",state);
|
||
}
|
||
Qt::CheckState GetCheckState()
|
||
{
|
||
return m_eCheckState ;
|
||
}
|
||
|
||
/**
|
||
* @brief 序列化此对象
|
||
*/
|
||
// virtual bool Serialize( CObjectArchive &ar ) = 0;
|
||
|
||
virtual void Delete() = 0;
|
||
|
||
/**
|
||
* @brief Add a child object in general way.
|
||
* @param pChild the child object handle
|
||
* @param mountNow 是否将其挂载到树上
|
||
*/
|
||
// virtual bool AddChild(PaiObject* pChild, bool mountNow = true) =0;
|
||
|
||
/**
|
||
* @brief 在iIndex之前插入一个孩子,插入后这个孩子指向了iIndex
|
||
* @param iIndex 插入的索引
|
||
* @param pChild 待插入的孩子
|
||
*/
|
||
// virtual bool InsertChild(int iIndex,PaiObject* pChild)=0;
|
||
|
||
/**
|
||
* @brief Remove a child object in general way.
|
||
* @param pChild the child object handle
|
||
*/
|
||
// virtual bool RemoveChild(PaiObject* pChild, bool bDelete = false)=0;
|
||
|
||
|
||
/**
|
||
* @brief 删除所有的孩子
|
||
*/
|
||
virtual void DeleteAllChild() = 0;
|
||
|
||
// PaiObject *GetPaiObject()
|
||
// {
|
||
// if( !m_pPaiObject )
|
||
// {
|
||
// m_pPaiObject = dynamic_cast<PaiObject *>( this );
|
||
// }
|
||
// return m_pPaiObject;
|
||
// }
|
||
/**
|
||
* @brief 克隆,深拷贝
|
||
*/
|
||
virtual CBaseObject *CloneObject();
|
||
//为了满足一条曲线测井图中多处显示的需求而来
|
||
//本质是复制一个对象并将其隐藏
|
||
virtual CBaseObject *GhostObject();
|
||
virtual void CopyFrom( CBaseObject *pOSGObjectOther );
|
||
|
||
/**
|
||
* @brief 判断子孙后代中是否有指定ID的孩子,包括自己
|
||
* @param id 孩子id
|
||
*/
|
||
// virtual bool Contains(const QUuid& id);
|
||
/************************************************************************/
|
||
/* @brief 得到该对象的模板关键字,例如井曲线对象的family名字 */
|
||
/************************************************************************/
|
||
// virtual void SetTemplateKey(QVariant TemplateKey);
|
||
// virtual QVariant GetTemplateKey();
|
||
//一个对象多处显示时,需要有gohostname来区分和查找
|
||
//规则ghostName=name+_+Ghost+timeStamp
|
||
virtual QString GetGhostName(){return ghostName; };
|
||
virtual void SetGhostName(QString aGhostname){
|
||
ghostName=aGhostname;
|
||
};
|
||
//得到对数据对象的描述性信息,由各个子类实现
|
||
virtual QString GetDescription(){return "";};
|
||
protected:
|
||
Qt::CheckState m_eCheckState;
|
||
// PaiObject *m_pPaiObject;
|
||
private:
|
||
QString ghostName;
|
||
// QVariant m_TemplateKey;
|
||
};
|
||
|
||
#define DECLARE_COSGOBJECT_H \
|
||
virtual void Delete();\
|
||
virtual bool Serialize( CObjectArchive &ar );\
|
||
virtual bool AddChild(PaiObject* pChild, bool mountNow = true);\
|
||
virtual bool InsertChild(int iIndex,PaiObject* pChild);\
|
||
virtual bool RemoveChild(PaiObject* pChild, bool bDelete = false);\
|
||
virtual void DeleteAllChild();\
|
||
|
||
#define IMP_SERIALIZE_CPP( ClassName,BaseClassName)\
|
||
bool ClassName::Serialize( CObjectArchive &ar )\
|
||
{\
|
||
pai::ios::welllog::DataObject* pDbObject = GetDbObject();\
|
||
QFile *pFile = dynamic_cast<QFile *>( ar.GetDevice() );\
|
||
bool bToDisk = pFile ? true :false;\
|
||
if(ar.IsStoring())\
|
||
{\
|
||
BEGIN_WRITE_OBJECT( ar,1 );\
|
||
BEGIN_WRITE_BLOCK( ar, 1);\
|
||
if( bToDisk)\
|
||
{\
|
||
CPaiObjectHelper::SerializeDB( ar,pDbObject,this );\
|
||
}\
|
||
/*保存自己的信息*/ \
|
||
ar << GetID();\
|
||
ar << GetName();\
|
||
/*save 所有的孩子*/\
|
||
if( bToDisk)\
|
||
{\
|
||
QList<PaiObject*> lstChildren;\
|
||
GetChildren(lstChildren);\
|
||
int nChildCout = lstChildren.size();\
|
||
ar << nChildCout;\
|
||
for( long i = 0 ; i< nChildCout;++i )\
|
||
{\
|
||
CBaseObject* pChild = dynamic_cast<CBaseObject*>( lstChildren[i] );\
|
||
assert( pChild );\
|
||
ar << lstChildren[i] ->GetTypeID().toString();\
|
||
pChild->Serialize( ar );\
|
||
}\
|
||
}\
|
||
END_WRITE_BLOCK( ar, 1 );\
|
||
\
|
||
END_WRITE_OBJECT( ar );\
|
||
}\
|
||
else\
|
||
{\
|
||
BEGIN_READ_OBJECT( ar,1 );\
|
||
\
|
||
BEGIN_READ_BLOCK( 1 ); \
|
||
if( bToDisk)\
|
||
{\
|
||
\
|
||
CPaiObjectHelper::SerializeDB( ar,pDbObject,this );\
|
||
}\
|
||
\
|
||
/*加载自己的信息*/\
|
||
QString strTmp;\
|
||
ar >> strTmp; \
|
||
SetID(strTmp );\
|
||
QString strName;\
|
||
ar >> strName;\
|
||
SetName( strName);\
|
||
if( bToDisk)\
|
||
{\
|
||
/*加载所有的孩子*/\
|
||
DeleteAllChild();\
|
||
int nChildCout(0);\
|
||
ar >> nChildCout;\
|
||
for( long i = 0 ; i< nChildCout;++i )\
|
||
{ \
|
||
QApplication::processEvents();\
|
||
ar >> strTmp;\
|
||
QUuid classID = QUuid(strTmp);\
|
||
CBaseObject *pChild = GetFatory().CreateObject( classID );\
|
||
PaiObject *pPaiObject = dynamic_cast<PaiObject *>( pChild );\
|
||
CBaseObjectImpl *pChildImp = dynamic_cast<CBaseObjectImpl *>( pChild );\
|
||
if( pChildImp )\
|
||
{\
|
||
pChildImp->Init( classID );\
|
||
}\
|
||
if( pChild )\
|
||
{\
|
||
pChild->Serialize( ar );\
|
||
AddChild( pPaiObject );\
|
||
}else\
|
||
{\
|
||
assert( false);\
|
||
ar.SkipObject();\
|
||
}\
|
||
}\
|
||
}\
|
||
\
|
||
END_READ_BLOCK( 1 );\
|
||
\
|
||
END_READ_OBJECT( ar );\
|
||
}\
|
||
return true;\
|
||
}\
|
||
|
||
#define IMP_COSGOBJECT_CPP( ClassName,BaseClassName)\
|
||
void ClassName::Delete()\
|
||
{ \
|
||
DeleteAllChild();\
|
||
delete this;\
|
||
}\
|
||
\
|
||
\
|
||
bool ClassName::AddChild(PaiObject* pChild, bool mountNow )\
|
||
{ \
|
||
CObjProject::AddIDMap( pChild->GetID(),dynamic_cast<CBaseObject *>( pChild) );\
|
||
if(mountNow) return BaseClassName::AddChild( pChild,MountOnTree );\
|
||
else return BaseClassName::AddChild( pChild,MountNoTree );\
|
||
}\
|
||
\
|
||
bool ClassName::InsertChild(int iIndex,PaiObject* pChild)\
|
||
{\
|
||
CObjProject::AddIDMap( pChild->GetID(), dynamic_cast<CBaseObject *>( pChild));\
|
||
return BaseClassName::InsertChild( iIndex, pChild );\
|
||
}\
|
||
\
|
||
bool ClassName::RemoveChild(PaiObject* pChild, bool bDelete )\
|
||
{ \
|
||
CObjProject::RemoveIDMap( dynamic_cast<CBaseObject*>(pChild ) );\
|
||
return BaseClassName::RemoveChild( pChild,bDelete );\
|
||
\
|
||
}\
|
||
\
|
||
void ClassName::DeleteAllChild()\
|
||
{\
|
||
QList<PaiObject*>::iterator it = m_children.begin();\
|
||
while ( it != m_children.end() )\
|
||
{\
|
||
PaiObject* pChild = (*it);\
|
||
CObjProject::RemoveIDMap( dynamic_cast<CBaseObject*>( pChild ) );\
|
||
pChild->Delete();\
|
||
++it;\
|
||
}\
|
||
m_children.clear();\
|
||
}\
|
||
|
||
|
||
// class OSGDATAMODEL_EXPORT CBaseObjectImpl : public CBaseObject
|
||
// {
|
||
// Q_OBJECT
|
||
// public:
|
||
// CBaseObjectImpl();
|
||
|
||
// virtual ~CBaseObjectImpl();
|
||
|
||
// virtual void Init(QUuid classID);
|
||
|
||
// virtual QUuid GetTypeID() const;
|
||
|
||
// /**
|
||
// * @brief 得到DB Object
|
||
// */
|
||
// virtual pai::ios::welllog::DataObject *GetDbObject();
|
||
|
||
// virtual void Delete();
|
||
|
||
// /**
|
||
// * @brief 序列化此对象
|
||
// */
|
||
// // virtual bool Serialize( CObjectArchive &ar );
|
||
|
||
|
||
// /**
|
||
// * @brief Add a child object in general way.
|
||
// * @param pChild the child object handle
|
||
// * @param mountNow 是否将其挂载到树上
|
||
// */
|
||
// // virtual bool AddChild(PaiObject* pChild, bool mountNow = true);
|
||
|
||
// /**
|
||
// * @brief 在iIndex之前插入一个孩子,插入后这个孩子指向了iIndex
|
||
// * @param iIndex 插入的索引
|
||
// * @param pChild 待插入的孩子
|
||
// */
|
||
// // virtual bool InsertChild(int iIndex,PaiObject* pChild);
|
||
|
||
// void MoveChild(int From,int To);
|
||
// // int GetChildPos(PaiObject* pChild);
|
||
|
||
// /**
|
||
// * @brief Remove a child object in general way.
|
||
// * @param pChild the child object handle
|
||
// */
|
||
// // virtual bool RemoveChild(PaiObject* pChild, bool bDelete = false);
|
||
|
||
// /**
|
||
// * @brief 把孩子移除出来,但不删除此对象
|
||
// * @param pChild the child object handle
|
||
// */
|
||
// // virtual bool TakeChild(PaiObject* pChild);
|
||
|
||
|
||
// /**
|
||
// * @brief 删除所有的孩子
|
||
// */
|
||
// virtual void DeleteAllChild();
|
||
|
||
// /**
|
||
// *@brief 查找是否存在指定的孩子
|
||
// */
|
||
// // virtual bool HasChildren(PaiObject* pChild);
|
||
|
||
// /**
|
||
// *@brief 是否存在孩子
|
||
// */
|
||
// virtual bool isExistsName(QString name);
|
||
|
||
// /**
|
||
// *@brief 是否可以在树上显示
|
||
// */
|
||
// void SetVisibleOnTree(bool visible);
|
||
|
||
// protected:
|
||
// QUuid m_classTypeID;
|
||
// signals:
|
||
// /**
|
||
// *@brief 错误信息
|
||
// */
|
||
// void signalErrorInfo(QString);
|
||
// };
|
||
|
||
// class OSGDATAMODEL_EXPORT CPaiObjectHelper
|
||
// {
|
||
// public:
|
||
// /**
|
||
// * @brief 把DB Object 序列化到数据库
|
||
// */
|
||
// // static bool SerializeDB( CObjectArchive &ar,pai::ios::welllog::DataObject *pDbObject,pai::objectmodel::PaiObject *pPaiObject );
|
||
|
||
|
||
// //递归得到所有的孩子(包括自己 ,自己在第一个)
|
||
// // static void RecursionGetAllChild( PaiObject* pThis,std::vector<PaiObject*> &vChild );
|
||
// // static void RecursionGetAllChildren( PaiObject* pThis,std::vector<CBaseObject*> &vChild );
|
||
|
||
// /**
|
||
// * @brief 得到唯一的不重复的孩子的name
|
||
// */
|
||
// // static QString GetUniqueChildName( PaiObject *pPaiObject,QString strPreFixName );
|
||
|
||
// /**
|
||
// * @brief 得到根对象,一般是Project
|
||
// */
|
||
// // static PaiObject *GetRoot(PaiObject *);
|
||
|
||
// //得到所选择的当前item对应viewObject下的所有的子孙
|
||
// static std::vector<CBaseObject*> GetAllSymbolObject(CBaseObject * pOSGObject);
|
||
|
||
// //得到某一棵子树
|
||
// static CBaseObject * GetSubtree(CBaseObject* pThis,QString strRelativeFolderPath);
|
||
|
||
// // static PaiObject * GetChildByName(PaiObject *pObject,QString name);
|
||
|
||
// };
|
||
|
||
|
||
//Object 插件机制和示例代码
|
||
#define BEGIN_REGISTER_OBJECT(className) BEGIN_REGISTER(sObjectClassIDKey,CBaseObject,className)
|
||
#define END_REGISTER_OBJECT(className) END_REGISTER( sObjectClassIDKey,CBaseObject,className )
|
||
//BEGIN_REGISTER_OBJECT(CObjWellLog)
|
||
//GetClassID_WellLog()
|
||
//END_REGISTER_OBJECT( CObjWellLog )
|
||
|
||
//Object 插件工厂
|
||
typedef CObjectGenralFactory< sObjectClassIDKey,CBaseObject > COSGObjectFactory;
|
||
|
||
|
||
|
||
|
||
END_OSGDATAMODEL_NAMESPACE
|
||
|
||
using namespace pai::datamodel;
|
||
#endif
|