You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AppFlow/FITK_Interface/FITKInterfacePhysics/FITKInteractionLocation.cpp

129 lines
3.9 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "FITKInteractionLocation.h"
#include "FITKBoundaryLocation.h"
namespace Interface
{
FITKInteractionLocation::FITKInteractionLocation()
{
//初始化,默认两个位置
_locations.append(new FITKBoundaryLocation());
_locations.append(new FITKBoundaryLocation());
}
FITKInteractionLocation::~FITKInteractionLocation()
{
//释放
for (FITKBoundaryLocation* loc : _locations)
{
if(loc) delete loc;
}
_locations.clear();
}
FITKBoundaryLocation* FITKInteractionLocation::getFirstLocation()
{
//第一位置
return this->getLocationAt(0);
}
FITKBoundaryLocation* FITKInteractionLocation::getSecondLocation()
{
//第二位置
return this->getLocationAt(1);
}
void FITKInteractionLocation::swap()
{
//交换位置
FITKBoundaryLocation* t1 = this->getLocationAt(0);
FITKBoundaryLocation* t2 = this->getLocationAt(1);
_locations[0] = t2;
_locations[1] = t1;
}
FITKBoundaryLocation* FITKInteractionLocation::getLocationAt(const int index)
{
this->resize(index + 1);
if (index < 0 || index >= getLocationCount()) return nullptr;
return _locations[index];
}
int FITKInteractionLocation::getLocationCount() const
{
return _locations.size();
}
bool FITKInteractionLocation::copy(Core::FITKAbstractDataObject* obj)
{
FITKInteractionLocation* interactionLoc = dynamic_cast<FITKInteractionLocation*>(obj);
if (interactionLoc == nullptr) return false; // 动态转换失败返回false
const int nloc = interactionLoc->getLocationCount(); // 获取当前对象中的位置计数
for (int i = 0;i<nloc; ++i) // 遍历所有位置
{
FITKBoundaryLocation* oriLoc = interactionLoc->getLocationAt(i); // 获取源对象的位置
if (oriLoc == nullptr)continue; // 如果源位置为空,则跳过当前迭代
FITKBoundaryLocation* desloc = this-> getLocationAt(i); // 获取当前对象对应的位置
*desloc = *oriLoc; // 将源位置信息复制到当前对象位置
}
return true; // 成功复制所有位置信息返回true
}
void FITKInteractionLocation::removeLocationAt(int index)
{
if (index < 0 || index >= _locations.size()) return;
FITKBoundaryLocation* bloc = _locations.at(index);
this->removeLocation(bloc);
}
void FITKInteractionLocation::removeLocationAt(QList<int> indexs)
{
QList<FITKBoundaryLocation*> boundarys;
//记录要删除的对象避免index失效
for (int index : indexs)
{
if (index < 0 || index >= _locations.size()) continue;
FITKBoundaryLocation* bloc = _locations.at(index);
boundarys.append(bloc);
}
for (FITKBoundaryLocation* loc : boundarys)
this->removeLocation(loc);
}
void FITKInteractionLocation::removeLocationAt(int index1, int index2)
{
this->removeLocationAt(QList<int>{index1, index2});
}
void FITKInteractionLocation::removeLocation(FITKBoundaryLocation* loc)
{
if (!_locations.removeOne(loc)) return;
_locations.removeOne(loc);
if(loc) delete loc;
}
void FITKInteractionLocation::removeLastLocation()
{
FITKBoundaryLocation* bc = _locations.last();
this->removeLocation(bc);
}
void FITKInteractionLocation::setLocationInvalid(const int index)
{
FITKBoundaryLocation* loc = this->getLocationAt(index);
if (loc == nullptr) return;
loc->setModel(-1);
loc->setComponent(-1);
}
void FITKInteractionLocation::resize(const int nize)
{
while (_locations.size() < nize)
{
_locations.append(new FITKBoundaryLocation);
}
}
}