logplus/OSGDataModel/include/BaseObject.h
2025-11-10 16:35:40 +08:00

431 lines
11 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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