几何数据如何管理,这就需要一个单独的类来管理这些数据,包括对数据的增删改查,作为数据的同一的管理接口,需要在任何需要的地方调用,这就需要把这个管理类封装成一个单例模式,采用懒汉模式,这样就也可以实现全局调用!
//用户自定义绘制数据管理
#define UserDefineDataMgr() (UserDefineDataManager::getInstance())
class USERDEFINEDRAW_EXPORT UserDefineDataManager {
private:
UserDefineDataManager();
static UserDefineDataManager* _instance;
public:
~UserDefineDataManager();
static UserDefineDataManager* getInstance();
//添加绘制要素
void addUseGeo(BaseGeo* geo);
//删除绘制要素
void removeUseGeo(BaseGeo* geo);
//更新绘制要素
void updateUserGeo(BaseGeo* geo);
//设置高亮显示
void setGeoHightLight(long long id);
void cancelGeoHightLight(long long id);
//取消所有的高亮显示
void cancelAllHightLight();
//显示显隐
void setGeoShow(USER_DRAW_TYPE t, bool b);
void setGeoShow(USER_DRAW_TYPE t, long long id, bool b);
//获取绘制要素列表
QVector<BaseGeo*>&getUseGeoList() {
return _geoList;
}
//根据类型和ID查找几何
BaseGeo* findGeo(USER_DRAW_TYPE t, long long id);
void registerTreeAdd(IUserDrawTreeOpt* treeAdd);//注册树形添加
void cleanData();
private:
QVector<BaseGeo*> _geoList;
IUserDrawTreeOpt* _treeAdd = nullptr;//添加到树形数据
QtHightLightAnimation* _geoHLAnimation = nullptr;//高亮显示动画
};
UserDefineDataManager* UserDefineDataManager::_instance = nullptr;
UserDefineDataManager::UserDefineDataManager() {
_geoHLAnimation = new QtHightLightAnimation(nullptr);
}
UserDefineDataManager::~UserDefineDataManager() {
}
UserDefineDataManager* UserDefineDataManager::getInstance() {
if (_instance == nullptr){
_instance = new UserDefineDataManager;
}
return _instance;
}
void UserDefineDataManager::addUseGeo(BaseGeo* geo) {
_geoList.push_back(geo);
_treeAdd->addGeoOnTree(geo);
}
void UserDefineDataManager::removeUseGeo(BaseGeo* geo) {
QVector<BaseGeo*>::iterator it;
for (it = _geoList.begin(); it != _geoList.end(); it++) {
if (*it == geo) {
_treeAdd->deleteGeoOnTree(geo);
_geoList.erase(it);
return;
}
}
}
void UserDefineDataManager::updateUserGeo(BaseGeo* geo) {
_treeAdd->updateTreeItem(geo);
}
void UserDefineDataManager::setGeoHightLight(long long id) {
QVector<BaseGeo*>::iterator it;
for (it = _geoList.begin(); it != _geoList.end(); it++) {
if ((*it)->getGeoID() == id) {
(*it)->setHightLight(true);
//高亮显示动画效果
_geoHLAnimation->setGeo(*it);
_geoHLAnimation->startAnimation();
} else {
(*it)->setHightLight(false);
}
}
}
void UserDefineDataManager::cancelGeoHightLight(long long id) {
QVector<BaseGeo*>::iterator it;
for (it = _geoList.begin(); it != _geoList.end(); it++) {
if ((*it)->getGeoID() == id) {
(*it)->setHightLight(false);
break;
}
}
}
void UserDefineDataManager::cancelAllHightLight() {
QVector<BaseGeo*>::iterator it;
for (it = _geoList.begin(); it != _geoList.end(); it++) {
(*it)->setHightLight(false);
}
}
void UserDefineDataManager::setGeoShow(USER_DRAW_TYPE t, bool b) {
QVector<BaseGeo*>::iterator it;
for (it = _geoList.begin(); it != _geoList.end(); it++) {
if ((*it)->getUserDrawDataType() == t) {
(*it)->setShow(b);
}
}
}
void UserDefineDataManager::setGeoShow(USER_DRAW_TYPE t, long long id, bool b) {
QVector<BaseGeo*>::iterator it;
for (it = _geoList.begin(); it != _geoList.end(); it++) {
if ((*it)->getUserDrawDataType() == t && (*it)->getGeoID() == id) {
(*it)->setShow(b);
break;
}
}
}
BaseGeo* UserDefineDataManager::findGeo(USER_DRAW_TYPE t, long long id) {
QVector<BaseGeo*>::iterator it;
for (it = _geoList.begin(); it != _geoList.end(); it++) {
if ((*it)->getUserDrawDataType() == t && (*it)->getGeoID() == id) {
return (*it);
}
}
return nullptr;
}
void UserDefineDataManager::registerTreeAdd(IUserDrawTreeOpt* treeAdd) {
_treeAdd = treeAdd;
}
/*
这个函数只是清除所有继承自IClearData接口的几何对象,
但是当前通过当前界面输入的或者编辑的几何体不需要删除数据InputGeoManager
*/
void UserDefineDataManager::cleanData() {
int num = _geoList.size();
for (int i = 0; i < num;i++){
BaseGeo* oneGeo = _geoList.at(i);
IClearData* cleanGeo = dynamic_cast<IClearData*>(oneGeo);
if (cleanGeo) {
cleanGeo->cleanData();
}
delete oneGeo;
}
_geoList.clear();
}