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
|