自定义标绘之三 - 几何数据管理

本文介绍了一个用于管理自定义绘制数据的类,该类采用单例模式封装,实现全局调用。主要功能包括增删改查绘制要素,设置高亮显示,控制显示隐藏,以及查找几何数据等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几何数据如何管理,这就需要一个单独的类来管理这些数据,包括对数据的增删改查,作为数据的同一的管理接口,需要在任何需要的地方调用,这就需要把这个管理类封装成一个单例模式,采用懒汉模式,这样就也可以实现全局调用!

//用户自定义绘制数据管理
#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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值