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/FITKInterfaceModel/FITKComponentManager.cpp

303 lines
10 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 "FITKComponentManager.h"
#include "FITKModelSet.h"
#include "FITKMeshSurface.h"
#include "FITKAssElement.h"
namespace Interface
{
QList<FITKModelSet*> FITKComponentManager::getModelSet(FITKModelEnum::FITKModelSetType t)
{
QList<FITKModelSet*> sets;
//获取数据个数
const int n = this->getDataCount();
for (int i=0;i<n; ++i)
{
FITKModelSet* set = dynamic_cast<FITKModelSet*>(this->getDataByIndex(i));
//空指针不操作
if(set == nullptr) continue;
//类型一致则记录
if (set->getModelSetType() == t)
sets.append(set);
//复合集合展开
if( !set->isCombination()) continue;
const int nSub = set->getDataCount();
for (int j =0;j < nSub;++j)
{
FITKModelSet* subSet = set->getDataByIndex(j);
if (subSet == nullptr) continue;
//类型一致则记录
if (subSet->getModelSetType() == t)
sets.append(subSet);
}
}
return sets;
}
QList<FITKModelSet*> FITKComponentManager::getUnInternalModelSet(FITKModelEnum::FITKModelSetType t)
{
//获取类型符合要求的集合
QList<FITKModelSet*> sets = this->getModelSet(t);
QList<FITKModelSet*> unSets;
for (auto s : sets)
{
if(s == nullptr) continue;
//内部集合标记判断
bool isIn = s->isInternal();
if (isIn) continue;
unSets.append(s);
}
return unSets;
}
QList<FITKMeshSurface*> FITKComponentManager::getMeshSurface(MeshSurfaceType t)
{
QList<FITKMeshSurface*> surfs;
//获取数据个数
const int n = this->getDataCount();
for (int i = 0; i < n; ++i)
{
FITKMeshSurface* surf = dynamic_cast<FITKMeshSurface*>(this->getDataByIndex(i));
//空指针不操作
if (surf == nullptr) continue;
//类型一致则记录
if (surf->getMeshSurfaceType() == t)
surfs.append(surf);
}
return surfs;
}
QList<FITKMeshSurface*> FITKComponentManager::getUnInternalMeshSurface(MeshSurfaceType t)
{
//获取类型符合要求的集合
QList<FITKMeshSurface*> surfs = this->getMeshSurface(t);
QList<FITKMeshSurface*> unSurfs;
for (auto s : surfs)
{
if (s == nullptr) continue;
//内部集合标记判断
bool isIn = s->isInternal();
if (isIn) continue;
unSurfs.append(s);
}
return unSurfs;
}
bool FITKComponentManager::isModelSet(int index)
{
auto set = this->getAsModelSet(index);
return set != nullptr;
}
FITKModelSet* FITKComponentManager::getAsModelSet(int index)
{
return dynamic_cast<FITKModelSet*>(this->getDataByIndex(index));
}
FITKMeshSurface* FITKComponentManager::getAsMeshSurf(int index)
{
return dynamic_cast<FITKMeshSurface*>(this->getDataByIndex(index));
}
QList<Interface::FITKModelSet*> FITKComponentManager::getAllSet(bool rec)
{
QList<Interface::FITKModelSet*> sets;
const int n = getDataCount();
//不递归
if (!rec)
{
for (int i = 0; i < n; i++)
{
auto s = this->getAsModelSet(i);
if (s == nullptr) continue;
sets.append(s);
}
return sets;
}
for (int i = 0; i < n; i++)
{
auto s = this->getAsModelSet(i);
if(s == nullptr) continue;
//复合集合取出子集合
if (s->isCombination())
{
const int nsub = s->getDataCount();
for (int i = 0; i < nsub; ++i)
{
Interface::FITKModelSet* sub = s->getDataByIndex(i);
if (sub)
sets.append(sub);
}
}
//不是复合集合
else if (s)
sets.append(s);
}
return sets;
}
QList<FITKMeshSurface*> FITKComponentManager::getAllSurface()
{
QList<Interface::FITKMeshSurface*> surf;
const int n = getDataCount();
for (int i = 0; i < n; i++)
{
auto s = this->getAsMeshSurf(i);
if (s)
surf.append(s);
}
return surf;
}
void FITKComponentManager::appendDataObj(FITKAbstractDataObject* item)
{
//是表面,直接添加
FITKMeshSurface* surf = dynamic_cast<FITKMeshSurface*>(item);
if (surf)
{
Core::FITKAbstractDataManager<FITKAbstractModelComponent>::appendDataObj(item);
return;
}
//装配体单元集合直接添加
FITKAssemblyElementSet* ele = dynamic_cast<FITKAssemblyElementSet*>(item);
if (ele)
{
Core::FITKAbstractDataManager<FITKAbstractModelComponent>::appendDataObj(item);
return;
}
//强制类型判断
FITKModelSet* set = dynamic_cast<FITKModelSet*>(item);
if (set == nullptr) return;
const QString name = set->getDataObjectName();
//已经存在的set
FITKModelSet* existSet = dynamic_cast<FITKModelSet*> (this->getDataByName(name));
if (existSet == nullptr)
Core::FITKAbstractDataManager<FITKAbstractModelComponent>::appendDataObj(item);
else
//已经存在的则合并
mergeSameNameSet(existSet, set);
}
void FITKComponentManager::insertDataObj(int index, FITKAbstractDataObject* item)
{
//是表面,直接添加
FITKMeshSurface* surf = dynamic_cast<FITKMeshSurface*>(item);
if (surf)
{
Core::FITKAbstractDataManager<FITKAbstractModelComponent>::insertDataObj(index,item);
return;
}
//装配体单元集合直接添加
FITKAssemblyElementSet* ele = dynamic_cast<FITKAssemblyElementSet*>(item);
if (ele)
{
Core::FITKAbstractDataManager<FITKAbstractModelComponent>::appendDataObj(item);
return;
}
//强制类型判断
FITKModelSet* set = dynamic_cast<FITKModelSet*>(item);
if (set == nullptr) return;
const QString name = set->getDataObjectName();
//已经存在的set
FITKModelSet* existSet = dynamic_cast<FITKModelSet*> (this->getDataByName(name));
if (existSet == nullptr)
Core::FITKAbstractDataManager<FITKAbstractModelComponent>::insertDataObj(index, item);
else
//已经存在的则合并
mergeSameNameSet(existSet, set);
}
FITKAbstractModelComponent* FITKComponentManager::getDataByID(const int id)
{
//首先遍历最外层
FITKAbstractModelComponent* comp =
Core::FITKAbstractDataManager<FITKAbstractModelComponent>::getDataByID(id);
if (comp) return comp;
for ( FITKAbstractDataObject* data :_dataList)
{
FITKModelSet* set = dynamic_cast<FITKModelSet*>(data);
if(set == nullptr) continue;
//不是复合集合已经在最外层遍历过
if(!set->isCombination()) continue;
const int nsub = set->getDataCount();
//查找set的子集合
comp = set->getDataByID(id);
if (comp) return comp;
}
//没有找到
return nullptr;
}
FITKModelSet* FITKComponentManager::getModelSetByMember(FITKModelEnum::FITKModelSetType t,
const int modelID, const QList<int> &member)
{
if (member.isEmpty()) return nullptr;
QList<FITKModelSet*> sets = this->getModelSet(t);
//查找相同成员的集合
for (FITKModelSet* set : sets)
{
if(set == nullptr) continue;
if (set->getAbsModelID() != modelID) continue;
QList<int> absmem = set->getAbsoluteMember();
if (absmem == member) return set;
}
//没有找到,创建新的集合
FITKModelSet* set = new FITKModelSet(t);
set->setInternal(true);
set->setModel(modelID);
for (int i : member) set->appendMember(i);
set->setDataObjectName(this->checkName("Set-1"));
this->appendDataObj(set);
return set;
}
FITKModelSet* FITKComponentManager::getSingleNodeSet(const int modelID, const int memID)
{
//全部节点集合
QList<FITKModelSet*> sets = this->getModelSet(FITKModelEnum::FITKModelSetType::FMSNode);
for (auto set :sets)
{
//父对象判断
if(set->getAbsModelID() != modelID) continue;
QList<int> mem = set->getMember();
//只有一个成员
if (mem.size() == 1 && mem.at(0) == memID)
return set;
}
return nullptr;
}
void FITKComponentManager::mergeSameNameSet(FITKModelSet* existSet, FITKModelSet* newSet)
{
if (existSet == nullptr || newSet == nullptr) return;
//已经存在的是复合集合,直接追加
if (existSet->isCombination())
{
existSet->appendDataObj(newSet);
return;
}
//创建新的,并合并已有集合与新集合
FITKModelSet* comSet = new FITKModelSet;
comSet->setModelSetType(FITKModelEnum::FITKModelSetType::FMSComb);
comSet->setDataObjectName(existSet->getDataObjectName());
comSet->setModel(this->getMParentDataIDM());
//从原有管理器移除追加到set中
int index = this->getDataIndex(existSet);
this->removeDataObjWithoutRelease(existSet);
comSet->appendDataObj(existSet);
comSet->appendDataObj(newSet);
//新的复合集合追加到管理器
Core::FITKAbstractDataManager<FITKAbstractModelComponent>::insertDataObj(index,comSet);
}
}