logplus/OSGDataModel/include/BaseObject.h

431 lines
11 KiB
C
Raw Normal View History

2025-11-10 16:35:40 +08:00
/**
* @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