#pragma once #include #include #include #include #include #include "../Assist/XJOSGCommon.h" #include "XJObjectManager/XJObject.h" #include "ViewCommon.h" //模型的维度,二维或三维 enum ModelDimension {MODEL_2D, MODEL_3D}; class CXJOSGObject : public /*osg::Group*/osg::Geode { public: enum {OSG_BASE_KEY = 10000}; //构造函数 CXJOSGObject(); CXJOSGObject(CXJObject * pobj); //虚构函数 virtual ~CXJOSGObject(); /***************虚函数,在子类中需要重写********************/ //创建显示对象 virtual osg::Geode* CreateObject() = 0; //更新显示对象 virtual int Update(EOSGUpdateType updateType = UPDATE_ALL); virtual int SetValue(CXJObject *obj); //设置当前显示对象的颜色 void SetColor(const osg::Vec4& color){m_color = color;} osg::Vec4& GetColor(){return m_color;} //设置显示对象的前一个颜色 void SetPreColor(const osg::Vec4& color){m_preColor = color;} osg::Vec4& GetPreColor(){return m_preColor;} //设置视图对象的高亮颜色 void SetHilightColor(const osg::Vec4& color) {m_hilightColor = color;} osg::Vec4 GetHilightColor() {return m_hilightColor;} int GetKey(){return m_3dKey;} //设置显示对象的类型 void SetType(EXJObjectType type){m_type = type;} EXJObjectType GetType(){return m_type;} //设置对象的显示状态 void SetVisible(bool visible) { if(m_pObject) { m_pObject->SetVisibility(visible); m_visible = visible; } } bool GetVisible(){return m_visible;} //设置显示对象的透明度级别 void SetTransparencyLevel(float translevel); float GetTransparencyLevel() {return m_color[3];} //设置显示对象的透明度 void SetTransparency(bool transparent) { if(m_pObject) { m_pObject->SetTransparent(transparent); m_transparent = transparent; m_nTransparent = m_pObject->GetTransparentDegree(); } if (transparent) { m_color[3] = m_nTransparent; m_hilightColor[3] = m_nTransparent; } else { m_color[3] = 1.0; m_hilightColor[3] = 1.0; } } //获取显示对象的透明状态 bool GetTransparencyStatus(); //设置显示对象的线框显示状态 void SetWireframe(bool wireframe) { if(m_pObject) { m_pObject->SetWireframe(wireframe); m_wireframe = wireframe; } } bool GetWireframe(){return m_wireframe;} //设置视图对象的高亮状态,默认情况下是false bool GetHilightStatus() const {return m_bHiLightStatus;} void SetHilightStatus(bool _status) {m_bHiLightStatus = _status;} void SetSwitchParent(osg::Switch *parent){m_switch = parent;} osg::Switch* GetSwitchParent() {return m_switch;} void SetMatrixTransformParent(osg::MatrixTransform *parent){m_mt = parent;} osg::MatrixTransform* GetMatrixTransformParent() {return m_mt;} void SetRoot(osg::Group *root){m_root = root;} osg::Group* GetRoot() {return m_root;} //获得模型的维度 ModelDimension GetModelDimesion() {return m_2Dor3D;} //删除临时显示对象 virtual void DeleteTempOSGObject() {} //获取视图对象关联的基础对象 CXJObject* GetOmObject() const {return m_pObject;} void SetOmObject(CXJObject* pObj) {m_pObject = pObj;} /*******************鼠标操作************************/ virtual bool selectedAndMove(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa ) {return true;} //Hilight selected obj with color void HilightWithColor(osg::Vec4& color = osg::Vec4(0.7, 0.0, 0.0, 1.0)); //unlight selected color; void UnHilight(); virtual void HilightWithShowSize() {} virtual void UnHlightWithShowSize() {} void SetHilightIdx(unsigned idx) { m_hilightIdx = idx; } protected: virtual void UpdatePosition(); //更新颜色函数 virtual void UpdateColor(); //更新线框 virtual void UpdateWireframe(); //更新等值线 virtual void UpdateIsopleth(); //更新透明度 virtual void UpdateVisible(); //更新网格点 virtual void UpdateMeshPoint(); virtual void UpdateWell(); virtual void UpdateFault(); private: //创建每个对象的3dKey int Generate3DKey(); protected: //每个CXJOSGObj都需要关联一个CXJObject* CXJObject* m_pObject; osg::Group* m_root; osg::Switch* m_switch; osg::MatrixTransform* m_mt; int m_3dKey; //模型的维度,是2维还是3维,默认是3维 ModelDimension m_2Dor3D; EXJObjectType m_type; //m_color为当前颜色,m_preColor为上一个颜色 osg::Vec4 m_color; osg::Vec4 m_preColor; osg::Vec4 m_hilightColor; bool m_bHiLightStatus; //高亮状态,默认为false //bool m_bSelected; bool m_visible; bool m_wireframe; bool m_transparent; float m_nTransparent; EDisplayModel m_displayModel; unsigned int m_hilightIdx; };