/** * @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 #include #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(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( 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( 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 lstChildren;\ GetChildren(lstChildren);\ int nChildCout = lstChildren.size();\ ar << nChildCout;\ for( long i = 0 ; i< nChildCout;++i )\ {\ CBaseObject* pChild = dynamic_cast( 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( pChild );\ CBaseObjectImpl *pChildImp = dynamic_cast( 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( 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( pChild));\ return BaseClassName::InsertChild( iIndex, pChild );\ }\ \ bool ClassName::RemoveChild(PaiObject* pChild, bool bDelete )\ { \ CObjProject::RemoveIDMap( dynamic_cast(pChild ) );\ return BaseClassName::RemoveChild( pChild,bDelete );\ \ }\ \ void ClassName::DeleteAllChild()\ {\ QList::iterator it = m_children.begin();\ while ( it != m_children.end() )\ {\ PaiObject* pChild = (*it);\ CObjProject::RemoveIDMap( dynamic_cast( 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 &vChild ); // // static void RecursionGetAllChildren( PaiObject* pThis,std::vector &vChild ); // /** // * @brief 得到唯一的不重复的孩子的name // */ // // static QString GetUniqueChildName( PaiObject *pPaiObject,QString strPreFixName ); // /** // * @brief 得到根对象,一般是Project // */ // // static PaiObject *GetRoot(PaiObject *); // //得到所选择的当前item对应viewObject下的所有的子孙 // static std::vector 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