|
|
|
|
#include "FITKNodeList.h"
|
|
|
|
|
#include "FITK_Kernel/FITKCore/FITKVec3D.h"
|
|
|
|
|
#include <QMutexLocker>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Interface
|
|
|
|
|
{
|
|
|
|
|
FITKNodeList::~FITKNodeList()
|
|
|
|
|
{
|
|
|
|
|
this->removeAllNode();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int FITKNodeList::addNode(const double x, const double y, const double z)
|
|
|
|
|
{
|
|
|
|
|
QMutexLocker locker(&_mutex);
|
|
|
|
|
//创建节点
|
|
|
|
|
Core::FITKNode* node = new Core::FITKNode(x, y, z);
|
|
|
|
|
_nodeList.append(node);
|
|
|
|
|
//获取索引与ID,形成映射关系
|
|
|
|
|
const int index = _nodeList.size()-1;
|
|
|
|
|
const int id = ++_nodeMaxID;
|
|
|
|
|
node->setNodeID(id);
|
|
|
|
|
_idIndexMap.insert(id, index);
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FITKNodeList::addNode(const int id, const double x, const double y, const double z)
|
|
|
|
|
{
|
|
|
|
|
QMutexLocker locker(&_mutex);
|
|
|
|
|
//创建对象
|
|
|
|
|
Core::FITKNode* node = new Core::FITKNode(id, x, y, z);
|
|
|
|
|
_nodeList.append(node);
|
|
|
|
|
//获取索引与ID,形成映射关系
|
|
|
|
|
const int index = _nodeList.size() - 1;
|
|
|
|
|
_idIndexMap.insert(id, index);
|
|
|
|
|
//静态变量增大
|
|
|
|
|
_nodeMaxID = _nodeMaxID >= id ? _nodeMaxID : id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FITKNodeList::removeNodeAt(const int index)
|
|
|
|
|
{
|
|
|
|
|
QMutexLocker locker(&_mutex);
|
|
|
|
|
//越界判断
|
|
|
|
|
if (index < 0 || index >= _nodeList.size()) return;
|
|
|
|
|
Core::FITKNode* node = _nodeList[index];
|
|
|
|
|
//从链表与Map中移除
|
|
|
|
|
_nodeList.removeAt(index);
|
|
|
|
|
if (node == nullptr) return;
|
|
|
|
|
const int id = node->getNodeID();
|
|
|
|
|
_idIndexMap.remove(id);
|
|
|
|
|
//释放内存
|
|
|
|
|
delete node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FITKNodeList::removeNodeByID(const int id)
|
|
|
|
|
{
|
|
|
|
|
QMutexLocker locker(&_mutex);
|
|
|
|
|
//获取索引
|
|
|
|
|
const int index = _idIndexMap.value(id);
|
|
|
|
|
if (index < 0 || index >= _nodeList.size()) return;
|
|
|
|
|
Core::FITKNode* node = _nodeList[index];
|
|
|
|
|
//根据索引移除
|
|
|
|
|
_nodeList.removeAt(index);
|
|
|
|
|
_idIndexMap.remove(id);
|
|
|
|
|
if (node == nullptr) return;
|
|
|
|
|
delete node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int FITKNodeList::getNodeCount()
|
|
|
|
|
{
|
|
|
|
|
QMutexLocker locker(&_mutex);
|
|
|
|
|
|
|
|
|
|
return _nodeList.size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Core::FITKNode* FITKNodeList::getNodeAt(const int index)
|
|
|
|
|
{
|
|
|
|
|
QMutexLocker locker(&_mutex);
|
|
|
|
|
//越界判断
|
|
|
|
|
if (index < 0 || index >= _nodeList.size()) return nullptr;
|
|
|
|
|
return _nodeList[index];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Core::FITKNode* FITKNodeList::getNodeByID(const int id)
|
|
|
|
|
{
|
|
|
|
|
QMutexLocker locker(&_mutex);
|
|
|
|
|
const int index = _idIndexMap.value(id);
|
|
|
|
|
//越界判断
|
|
|
|
|
if (index < 0 || index >= _nodeList.size()) return nullptr;
|
|
|
|
|
return _nodeList[index];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int FITKNodeList::getNodeIDByIndex(const int index)
|
|
|
|
|
{
|
|
|
|
|
//查找辅助存储ID
|
|
|
|
|
QMutexLocker locker(&_mutex);
|
|
|
|
|
|
|
|
|
|
if (index < 0 || index >= _nodeList.size()) return -1;
|
|
|
|
|
Core::FITKNode* node = _nodeList[index];
|
|
|
|
|
if (node == nullptr) return -1;
|
|
|
|
|
|
|
|
|
|
return node->getNodeID();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int FITKNodeList::getNodeIndexByID(const int id)
|
|
|
|
|
{
|
|
|
|
|
//根据辅助存储查找索引
|
|
|
|
|
QMutexLocker locker(&_mutex);
|
|
|
|
|
return _idIndexMap.value(id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int FITKNodeList::getNodeMaxID()
|
|
|
|
|
{
|
|
|
|
|
return _nodeMaxID;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FITKNodeList::removeAllNode()
|
|
|
|
|
{
|
|
|
|
|
//释放全部内存
|
|
|
|
|
for (auto node : _nodeList)
|
|
|
|
|
delete node;
|
|
|
|
|
_nodeList.clear();
|
|
|
|
|
_idIndexMap.clear();
|
|
|
|
|
_nodeMaxID = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|