From dbf79abc5f14432722067fb7739a0a1594e2ab6a Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Fri, 28 Nov 2025 14:46:13 +0100 Subject: [PATCH 01/18] Fix cleaning bug --- src/Core/Topo/TopoManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Core/Topo/TopoManager.cpp b/src/Core/Topo/TopoManager.cpp index 39965cfe..db5a1c4b 100644 --- a/src/Core/Topo/TopoManager.cpp +++ b/src/Core/Topo/TopoManager.cpp @@ -148,6 +148,7 @@ void TopoManager::clear() m_edges.deleteAndClear(); m_coedges.deleteAndClear(); m_vertices.deleteAndClear(); + m_geom_associations.clear(); m_defaultNbMeshingEdges = 10; } /*----------------------------------------------------------------------------*/ From 89325e1c19b841a4349cc109a6984c4e2bb10970 Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Wed, 15 Oct 2025 10:23:05 +0200 Subject: [PATCH 02/18] Templated methods in group manager --- src/Core/Group/GroupHelperForCommand.cpp | 32 +- src/Core/Group/GroupManager.cpp | 599 ++++-------------- src/Core/Mesh/CommandClearGroupName.cpp | 10 +- .../CommandCreateSubVolumeBetweenSheets.cpp | 2 +- src/Core/Mesh/CommandMeshExplorer.cpp | 26 +- src/Core/Mesh/CommandReadMLI.cpp | 8 +- src/Core/Mesh/Volume.cpp | 2 +- .../SysCoord/CommandDuplicateSysCoord.cpp | 2 +- src/Core/SysCoord/CommandNewSysCoord.cpp | 2 +- src/Core/Topo/CommandDuplicateTopo.cpp | 2 +- src/Core/Topo/CommandExtrudeFace.cpp | 4 +- src/Core/Topo/CommandNewTopo.cpp | 6 +- src/Core/Topo/CommandNewTopoOnGeometry.cpp | 4 +- src/Core/Topo/ImportBlocksImplementation.cpp | 6 +- src/Core/protected/Group/Group0D.h | 8 +- src/Core/protected/Group/Group1D.h | 6 +- src/Core/protected/Group/Group2D.h | 6 +- src/Core/protected/Group/Group3D.h | 6 +- src/Core/protected/Group/GroupEntity.h | 23 +- src/Core/protected/Group/GroupManager.h | 55 +- src/Core/protected/Topo/TopoManager.h | 3 +- .../QtGroupProjectionOnPlaneAction.cpp | 2 +- src/QtComponents/QtGroupsPanel.cpp | 15 +- src/QtComponents/QtMgx3DGroupNamePanel.cpp | 45 +- 24 files changed, 239 insertions(+), 635 deletions(-) diff --git a/src/Core/Group/GroupHelperForCommand.cpp b/src/Core/Group/GroupHelperForCommand.cpp index e836ca37..ac3a2dde 100644 --- a/src/Core/Group/GroupHelperForCommand.cpp +++ b/src/Core/Group/GroupHelperForCommand.cpp @@ -15,7 +15,7 @@ GroupHelperForCommand(Internal::InfoCommand& info_command, GroupManager& group_m Group3D* GroupHelperForCommand:: addToGroup(const std::string group_name, Geom::Volume* v) { - Group3D* grp = m_group_manager.getNewGroup3D(group_name, &m_info_command); + Group3D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); addEntityToGroup(grp, v); m_info_command.addGeomInfoEntity (v, Internal::InfoCommand::DISPMODIFIED); return grp; @@ -24,7 +24,7 @@ addToGroup(const std::string group_name, Geom::Volume* v) Group2D* GroupHelperForCommand:: addToGroup(const std::string group_name, Geom::Surface* s) { - Group2D* grp = m_group_manager.getNewGroup2D(group_name, &m_info_command); + Group2D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); addEntityToGroup(grp, s); m_info_command.addGeomInfoEntity (s, Internal::InfoCommand::DISPMODIFIED); return grp; @@ -33,7 +33,7 @@ addToGroup(const std::string group_name, Geom::Surface* s) Group1D* GroupHelperForCommand:: addToGroup(const std::string group_name, Geom::Curve* c) { - Group1D* grp = m_group_manager.getNewGroup1D(group_name, &m_info_command); + Group1D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); addEntityToGroup(grp, c); m_info_command.addGeomInfoEntity (c, Internal::InfoCommand::DISPMODIFIED); return grp; @@ -42,7 +42,7 @@ addToGroup(const std::string group_name, Geom::Curve* c) Group0D* GroupHelperForCommand:: addToGroup(const std::string group_name, Geom::Vertex* v) { - Group0D* grp = m_group_manager.getNewGroup0D(group_name, &m_info_command); + Group0D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); addEntityToGroup(grp, v); m_info_command.addGeomInfoEntity (v, Internal::InfoCommand::DISPMODIFIED); return grp; @@ -63,7 +63,7 @@ addToGroup(const std::string group_name, Geom::GeomEntity* e) Group3D* GroupHelperForCommand:: addToGroup(const std::string group_name, Topo::Block* b) { - Group3D* grp = m_group_manager.getNewGroup3D(group_name, &m_info_command); + Group3D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); addEntityToGroup(grp, b); return grp; } @@ -71,7 +71,7 @@ addToGroup(const std::string group_name, Topo::Block* b) Group2D* GroupHelperForCommand:: addToGroup(const std::string group_name, Topo::CoFace* f) { - Group2D* grp = m_group_manager.getNewGroup2D(group_name, &m_info_command); + Group2D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); addEntityToGroup(grp, f); return grp; } @@ -79,7 +79,7 @@ addToGroup(const std::string group_name, Topo::CoFace* f) Group1D* GroupHelperForCommand:: addToGroup(const std::string group_name, Topo::CoEdge* e) { - Group1D* grp = m_group_manager.getNewGroup1D(group_name, &m_info_command); + Group1D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); addEntityToGroup(grp, e); return grp; } @@ -87,7 +87,7 @@ addToGroup(const std::string group_name, Topo::CoEdge* e) Group0D* GroupHelperForCommand:: addToGroup(const std::string group_name, Topo::Vertex* v) { - Group0D* grp = m_group_manager.getNewGroup0D(group_name, &m_info_command); + Group0D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); addEntityToGroup(grp, v); return grp; } @@ -95,7 +95,7 @@ addToGroup(const std::string group_name, Topo::Vertex* v) Group3D* GroupHelperForCommand:: removeFromGroup(const std::string group_name, Geom::Volume* v) { - Group3D* grp = m_group_manager.getGroup3D(group_name, &m_info_command); + Group3D* grp = m_group_manager.getGroup(group_name, &m_info_command); removeEntityFromGroup(grp, v); return grp; } @@ -103,7 +103,7 @@ removeFromGroup(const std::string group_name, Geom::Volume* v) Group2D* GroupHelperForCommand:: removeFromGroup(const std::string group_name, Geom::Surface* s) { - Group2D* grp = m_group_manager.getGroup2D(group_name, &m_info_command); + Group2D* grp = m_group_manager.getGroup(group_name, &m_info_command); removeEntityFromGroup(grp, s); return grp; } @@ -111,7 +111,7 @@ removeFromGroup(const std::string group_name, Geom::Surface* s) Group1D* GroupHelperForCommand:: removeFromGroup(const std::string group_name, Geom::Curve* c) { - Group1D* grp = m_group_manager.getGroup1D(group_name, &m_info_command); + Group1D* grp = m_group_manager.getGroup(group_name, &m_info_command); removeEntityFromGroup(grp, c); return grp; } @@ -119,7 +119,7 @@ removeFromGroup(const std::string group_name, Geom::Curve* c) Group0D* GroupHelperForCommand:: removeFromGroup(const std::string group_name, Geom::Vertex* v) { - Group0D* grp = m_group_manager.getGroup0D(group_name, &m_info_command); + Group0D* grp = m_group_manager.getGroup(group_name, &m_info_command); removeEntityFromGroup(grp, v); return grp; } @@ -127,7 +127,7 @@ removeFromGroup(const std::string group_name, Geom::Vertex* v) Group3D* GroupHelperForCommand:: removeFromGroup(const std::string group_name, Topo::Block* b) { - Group3D* grp = m_group_manager.getGroup3D(group_name, &m_info_command); + Group3D* grp = m_group_manager.getGroup(group_name, &m_info_command); removeEntityFromGroup(grp, b); return grp; } @@ -135,7 +135,7 @@ removeFromGroup(const std::string group_name, Topo::Block* b) Group2D* GroupHelperForCommand:: removeFromGroup(const std::string group_name, Topo::CoFace* f) { - Group2D* grp = m_group_manager.getGroup2D(group_name, &m_info_command); + Group2D* grp = m_group_manager.getGroup(group_name, &m_info_command); removeEntityFromGroup(grp, f); return grp; } @@ -143,7 +143,7 @@ removeFromGroup(const std::string group_name, Topo::CoFace* f) Group1D* GroupHelperForCommand:: removeFromGroup(const std::string group_name, Topo::CoEdge* e) { - Group1D* grp = m_group_manager.getGroup1D(group_name, &m_info_command); + Group1D* grp = m_group_manager.getGroup(group_name, &m_info_command); removeEntityFromGroup(grp, e); return grp; } @@ -151,7 +151,7 @@ removeFromGroup(const std::string group_name, Topo::CoEdge* e) Group0D* GroupHelperForCommand:: removeFromGroup(const std::string group_name, Topo::Vertex* v) { - Group0D* grp = m_group_manager.getGroup0D(group_name, &m_info_command); + Group0D* grp = m_group_manager.getGroup(group_name, &m_info_command); removeEntityFromGroup(grp, v); return grp; } diff --git a/src/Core/Group/GroupManager.cpp b/src/Core/Group/GroupManager.cpp index a52ef115..7de4a3ef 100644 --- a/src/Core/Group/GroupManager.cpp +++ b/src/Core/Group/GroupManager.cpp @@ -73,25 +73,10 @@ GroupManager::~GroupManager() void GroupManager::clear() { // destruction des entités référencées par le manager - for (std::vector::const_iterator iter = m_group3D.begin(); - iter != m_group3D.end(); ++iter) + for (std::vector::const_iterator iter = m_groups.begin(); + iter != m_groups.end(); ++iter) delete *iter; - m_group3D.clear(); - - for (std::vector::const_iterator iter = m_group2D.begin(); - iter != m_group2D.end(); ++iter) - delete *iter; - m_group2D.clear(); - - for (std::vector::const_iterator iter = m_group1D.begin(); - iter != m_group1D.end(); ++iter) - delete *iter; - m_group1D.clear(); - - for (std::vector::const_iterator iter = m_group0D.begin(); - iter != m_group0D.end(); ++iter) - delete *iter; - m_group0D.clear(); + m_groups.clear(); } /*------------------------------------------------------------------------*/ /** Vide un groupe suivant son nom et une dimension */ @@ -169,126 +154,35 @@ GroupManager::changeGroupName(const std::string& oldName, const std::string& new return cmdResult; } /*----------------------------------------------------------------------------*/ -Group3D* GroupManager::getGroup3D(const std::string& gr_name, const bool exceptionIfNotFound) const -{ - std::string name(gr_name.empty()?getDefaultName(3):gr_name); - - Group3D* gr = 0; - for (std::vector::const_iterator iter = m_group3D.begin(); - iter != m_group3D.end(); ++iter) - if ((*iter)->getName() == name) - gr = (*iter); - - if (exceptionIfNotFound && gr == 0){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr <<"On ne trouve pas "<::const_iterator iter = m_group3D.begin(); - iter != m_group3D.end(); ++iter) - if ((*iter)->getName() == name) - gr = (*iter); - - if (gr == 0){ - gr = new Group3D(getContext(), name, gr_name.empty()); - m_group3D.push_back(gr); - if (icmd) - icmd->addGroupInfoEntity(gr,Internal::InfoCommand::CREATED); - } - else if (gr->isDestroyed()) { - gr->setDestroyed(false); - if (icmd) - icmd->addGroupInfoEntity(gr,Internal::InfoCommand::ENABLE); - } - - return gr; -} -/*----------------------------------------------------------------------------*/ -Group2D* GroupManager::getGroup2D(const std::string& gr_name, const bool exceptionIfNotFound) const -{ - std::string name(gr_name.empty()?getDefaultName(2):gr_name); - - Group2D* gr = 0; - for (std::vector::const_iterator iter = m_group2D.begin(); - iter != m_group2D.end(); ++iter) - if ((*iter)->getName() == name) - gr = (*iter); - - if (exceptionIfNotFound && gr == 0){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr <<"On ne trouve pas "<::const_iterator iter = m_group2D.begin(); - iter != m_group2D.end(); ++iter) - if ((*iter)->getName() == name) - gr = (*iter); - - if (gr == 0){ - gr = new Group2D(getContext(), name, gr_name.empty()); - m_group2D.push_back(gr); - if (icmd) - icmd->addGroupInfoEntity(gr,Internal::InfoCommand::CREATED); - } - else if (gr->isDestroyed()) { - gr->setDestroyed(false); - if (icmd) - icmd->addGroupInfoEntity(gr,Internal::InfoCommand::ENABLE); - } - - return gr; -} -/*----------------------------------------------------------------------------*/ -Group1D* GroupManager::getGroup1D(const std::string& gr_name, const bool exceptionIfNotFound) const +template ::value>> +T* GroupManager::getGroup(const std::string& gr_name, const bool exceptionIfNotFound) const { - std::string name(gr_name.empty()?getDefaultName(1):gr_name); + std::string name(gr_name.empty()?getDefaultName(T::DIM):gr_name); - Group1D* gr = 0; - for (std::vector::const_iterator iter = m_group1D.begin(); - iter != m_group1D.end(); ++iter) - if ((*iter)->getName() == name) - gr = (*iter); + T* gr = 0; + for (GroupEntity* g : m_groups) + if (g->getName() == name) + if (T* casted = dynamic_cast(g)) + return casted; - if (exceptionIfNotFound && gr == 0){ + if (exceptionIfNotFound){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr <<"On ne trouve pas "<::value>> +T* GroupManager::getNewGroup(const std::string& gr_name, Internal::InfoCommand* icmd) { - std::string name(gr_name.empty()?getDefaultName(1):gr_name); - - Group1D* gr = 0; - for (std::vector::const_iterator iter = m_group1D.begin(); - iter != m_group1D.end(); ++iter) - if ((*iter)->getName() == name) - gr = (*iter); + T* gr = getGroup(gr_name, false); if (gr == 0){ - gr = new Group1D(getContext(), name, gr_name.empty()); - m_group1D.push_back(gr); + std::string name(gr_name.empty()?getDefaultName(T::DIM):gr_name); + gr = new T(getContext(), name, gr_name.empty()); + m_groups.push_back(gr); if (icmd) icmd->addGroupInfoEntity(gr,Internal::InfoCommand::CREATED); } @@ -301,140 +195,45 @@ Group1D* GroupManager::getNewGroup1D(const std::string& gr_name, Internal::InfoC return gr; } /*----------------------------------------------------------------------------*/ -Group0D* GroupManager::getGroup0D(const std::string& gr_name, const bool exceptionIfNotFound) const +template ::value>> +std::vector GroupManager::getGroups(const bool onlyLive) const { - std::string name(gr_name.empty()?getDefaultName(0):gr_name); - - Group0D* gr = 0; - for (std::vector::const_iterator iter = m_group0D.begin(); - iter != m_group0D.end(); ++iter) - if ((*iter)->getName() == name) - gr = (*iter); - - if (exceptionIfNotFound && gr == 0){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr <<"On ne trouve pas "< groups; + for (GroupEntity* g : m_groups) + if (T* casted = dynamic_cast(g)) + if (!onlyLive || !casted->isDestroyed()) + groups.push_back(casted); + return groups; } /*----------------------------------------------------------------------------*/ -void GroupManager::getGroups(std::vector& grp, Internal::SelectionManager::DIM dimensions, const bool onlyLive) const +std::vector GroupManager::getGroups(Internal::SelectionManager::DIM dimensions, const bool onlyLive) const { + std::vector groups; for (int i = 0; i < 4; i++){ const Internal::SelectionManager::DIM dim = Internal::SelectionManager::dimensionToDimensions(i); if (0 == (dimensions&dim)) continue; switch (i) { - case 0 : { - std::vector groups; - getGroup0D (groups, onlyLive); - for (std::vector::iterator it=groups.begin( ); groups.end() != it; it++) - grp.push_back (*it); - } - break; - case 1 : { - std::vector groups; - getGroup1D (groups, onlyLive); - for (std::vector::iterator it=groups.begin( ); groups.end() != it; it++) - grp.push_back (*it); - } - break; - case 2 : { - std::vector groups; - getGroup2D (groups, onlyLive); - for (std::vector::iterator it=groups.begin( ); groups.end() != it; it++) - grp.push_back (*it); - } - break; - case 3 : { - std::vector groups; - getGroup3D (groups, onlyLive); - for (std::vector::iterator it=groups.begin( ); groups.end() != it; it++) - grp.push_back (*it); - } - break; + case 0 : + for (Group0D* g : getGroups(onlyLive)) + groups.push_back (g); + break; + case 1 : + for (Group1D* g : getGroups(onlyLive)) + groups.push_back (g); + break; + case 2 : + for (Group2D* g : getGroups(onlyLive)) + groups.push_back (g); + break; + case 3 : + for (Group3D* g : getGroups(onlyLive)) + groups.push_back (g); + break; } } -} -/*----------------------------------------------------------------------------*/ -Group0D* GroupManager::getNewGroup0D(const std::string& gr_name, Internal::InfoCommand* icmd) -{ - std::string name(gr_name.empty()?getDefaultName(0):gr_name); - - Group0D* gr = 0; - for (std::vector::const_iterator iter = m_group0D.begin(); - iter != m_group0D.end(); ++iter) - if ((*iter)->getName() == name) - gr = (*iter); - - if (gr == 0){ - gr = new Group0D(getContext(), name, gr_name.empty()); - m_group0D.push_back(gr); - if (icmd) - icmd->addGroupInfoEntity(gr,Internal::InfoCommand::CREATED); - } - else if (gr->isDestroyed()) { - gr->setDestroyed(false); - if (icmd) - icmd->addGroupInfoEntity(gr,Internal::InfoCommand::ENABLE); - } - - return gr; -} -/*----------------------------------------------------------------------------*/ -void GroupManager::getGroup3D(std::vector& grp, const bool onlyLive) const -{ - grp.clear(); - if (onlyLive){ - for (std::vector::const_iterator iter = m_group3D.begin(); - iter != m_group3D.end(); ++iter) - if (!(*iter)->isDestroyed()) - grp.push_back(*iter); - } - else - grp.insert(grp.end(), m_group3D.begin(), m_group3D.end()); -} -/*----------------------------------------------------------------------------*/ -void GroupManager::getGroup2D(std::vector& grp, const bool onlyLive) const -{ - grp.clear(); - if (onlyLive){ - for (std::vector::const_iterator iter = m_group2D.begin(); - iter != m_group2D.end(); ++iter) - if (!(*iter)->isDestroyed()) - grp.push_back(*iter); - } - else - grp.insert(grp.end(), m_group2D.begin(), m_group2D.end()); -} -/*----------------------------------------------------------------------------*/ -void GroupManager::getGroup1D(std::vector& grp, const bool onlyLive) const -{ - grp.clear(); - if (onlyLive){ - for (std::vector::const_iterator iter = m_group1D.begin(); - iter != m_group1D.end(); ++iter) - if (!(*iter)->isDestroyed()) - grp.push_back(*iter); - } - else - grp.insert(grp.end(), m_group1D.begin(), m_group1D.end()); -} -/*----------------------------------------------------------------------------*/ -void GroupManager::getGroup0D(std::vector& grp, const bool onlyLive) const -{ - grp.clear(); - if (onlyLive){ - for (std::vector::const_iterator iter = m_group0D.begin(); - iter != m_group0D.end(); ++iter) - if (!(*iter)->isDestroyed()) - grp.push_back(*iter); - } - else - grp.insert(grp.end(), m_group0D.begin(), m_group0D.end()); + return groups; } /*----------------------------------------------------------------------------*/ void GroupManager::getAddedShownAndHidden( @@ -945,67 +744,16 @@ void GroupManager::updateDeletedGroups(Internal::InfoCommand* icmd) std::cout<<"GroupManager::updateDeletedGroups ..."<::iterator iter = m_group0D.begin(); - iter != m_group0D.end(); ++iter) - if ((*iter)->empty() && !(*iter)->isDestroyed()){ -// if ((*iter)->isDefaultGroup()){ -// icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::DISABLE); -// } -// else { - (*iter)->setDestroyed(true); - icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::DELETED); -// } - } - else if (!(*iter)->empty() && (*iter)->isDestroyed()){ - (*iter)->setDestroyed(false); - icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::NONE); - } - for (std::vector::iterator iter = m_group1D.begin(); - iter != m_group1D.end(); ++iter) - if ((*iter)->empty() && !(*iter)->isDestroyed()){ -// if ((*iter)->isDefaultGroup()){ -// icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::DISABLE); -// } -// else { - (*iter)->setDestroyed(true); - icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::DELETED); -// } - } - else if (!(*iter)->empty() && (*iter)->isDestroyed()){ - (*iter)->setDestroyed(false); - icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::NONE); + for (GroupEntity* grp : m_groups) { + if (grp->empty() && !grp->isDestroyed()) { + grp->setDestroyed(true); + icmd->addGroupInfoEntity(grp,Internal::InfoCommand::DELETED); } - for (std::vector::iterator iter = m_group2D.begin(); - iter != m_group2D.end(); ++iter) - if ((*iter)->empty() && !(*iter)->isDestroyed()){ -// if ((*iter)->isDefaultGroup()){ -// icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::DISABLE); -// } -// else { - (*iter)->setDestroyed(true); - icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::DELETED); -// } - } - else if (!(*iter)->empty() && (*iter)->isDestroyed()){ - (*iter)->setDestroyed(false); - icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::NONE); - } - for (std::vector::iterator iter = m_group3D.begin(); - iter != m_group3D.end(); ++iter) - if ((*iter)->empty() && !(*iter)->isDestroyed()){ -// if ((*iter)->isDefaultGroup()){ -// icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::DISABLE); -// } -// else { - (*iter)->setDestroyed(true); - icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::DELETED); -// } - } - else if (!(*iter)->empty() && (*iter)->isDestroyed()){ - (*iter)->setDestroyed(false); - icmd->addGroupInfoEntity(*iter,Internal::InfoCommand::NONE); + else if (!grp->empty() && grp->isDestroyed()) { + grp->setDestroyed(false); + icmd->addGroupInfoEntity(grp,Internal::InfoCommand::NONE); } + } } /*----------------------------------------------------------------------------*/ void GroupManager::deleteEntity(GroupEntity* ge) @@ -1014,52 +762,19 @@ void GroupManager::deleteEntity(GroupEntity* ge) // on teste la présence dans l'une des listes // cela peut arriver pour le cas d'un groupe détruit en cours de route et réutilisé // cela pose problème avec le clearSession - bool found = false; - - if (!found && !m_group3D.empty()){ + bool found = false; + if (!m_groups.empty()) { // on le retire de la liste - std::vector::iterator it= m_group3D.begin(); - while(it!=m_group3D.end() && *it!=ge) + std::vector::iterator it = m_groups.begin(); + while (it != m_groups.end() && *it != ge) it++; - if(it!=m_group3D.end()){ + if (it != m_groups.end()) { found = true; - m_group3D.erase(it); + m_groups.erase(it); } } - if (!found && !m_group2D.empty()){ - // on le retire de la liste - std::vector::iterator it= m_group2D.begin(); - while(it!=m_group2D.end() && *it!=ge) - it++; - if(it!=m_group2D.end()){ - found = true; - m_group2D.erase(it); - } - } - if (!found && !m_group1D.empty()){ - // on le retire de la liste - std::vector::iterator it= m_group1D.begin(); - while(it!=m_group1D.end() && *it!=ge) - it++; - if(it!=m_group1D.end()){ - found = true; - m_group1D.erase(it); - } - } - if (!found && !m_group0D.empty()){ - // on le retire de la liste - std::vector::iterator it= m_group0D.begin(); - while(it!=m_group0D.end() && *it!=ge) - it++; - if(it!=m_group0D.end()){ - found = true; - m_group0D.erase(it); - } - } - - //std::cout<<"delete de "<getName()<<" (uid "<< ge->getUniqueId()<<") found = "<<(found?"true":"false")< filtre_vu; - for (std::vector::iterator iter = m_group3D.begin(); - iter != m_group3D.end(); ++iter) - if ((*iter)->isVisible()) - addMark(*iter, visibilityMask, filtre_vu, filtre_geom, filtre_topo, filtre_rep, mark); - - for (std::vector::iterator iter = m_group2D.begin(); - iter != m_group2D.end(); ++iter){ -//#ifdef _DEBUG_ADDED -// std::cout<<" groupe 2D "<<(*iter)->getName()<<", isVisible = "<<(*iter)->isVisible()<isVisible()) - addMark(*iter, visibilityMask, filtre_vu, filtre_geom, filtre_topo, mark); - } - - for (std::vector::iterator iter = m_group1D.begin(); - iter != m_group1D.end(); ++iter) - if ((*iter)->isVisible()) - addMark(*iter, visibilityMask, filtre_vu, filtre_geom, filtre_topo, mark); - - for (std::vector::iterator iter = m_group0D.begin(); - iter != m_group0D.end(); ++iter) - if ((*iter)->isVisible()) - addMark(*iter, visibilityMask, filtre_vu, filtre_geom, filtre_topo, mark); + for (GroupEntity* e : m_groups) { + if (e->isVisible()) { + switch (e->getDim()) { + case 3: { + Group3D* grp = dynamic_cast(e); + addMark(grp, visibilityMask, filtre_vu, filtre_geom, filtre_topo, filtre_rep, mark); + } + break; + case 2: { + Group2D* grp = dynamic_cast(e); + addMark(grp, visibilityMask, filtre_vu, filtre_geom, filtre_topo, mark); + } + break; + case 1: { + Group1D* grp = dynamic_cast(e); + addMark(grp, visibilityMask, filtre_vu, filtre_geom, filtre_topo, mark); + } + break; + case 0: { + Group0D* grp = dynamic_cast(e); + addMark(grp, visibilityMask, filtre_vu, filtre_geom, filtre_topo, mark); + } + break; + default: + MGX_NOT_YET_IMPLEMENTED("GroupManager::addMark pour cette dimension de groupe"); + } + } + } // end for iter = groups.begin() } /*----------------------------------------------------------------------------*/ void GroupManager::addMark(const std::vector& groups, @@ -1202,40 +922,35 @@ void GroupManager::addMeshGroups(const Utils::FilterEntity::objectType visibilit Mesh::MeshManager& mmng = getContext().getMeshManager(); if (visibilityMask & Utils::FilterEntity::MeshVolume) - for (std::vector::iterator iter = m_group3D.begin(); - iter != m_group3D.end(); ++iter){ - Mesh::MeshEntity* me = mmng.getVolume((*iter)->getName(), false); - if (me && (*iter)->isVisible()) + for (Group3D* g : getGroups()){ + Mesh::MeshEntity* me = mmng.getVolume(g->getName(), false); + if (me && g->isVisible()) meshAdded.push_back(me); } if (visibilityMask & Utils::FilterEntity::MeshSurface) - for (std::vector::iterator iter = m_group2D.begin(); - iter != m_group2D.end(); ++iter){ - Mesh::MeshEntity* me = mmng.getSurface((*iter)->getName(), false); - if (me && (*iter)->isVisible()) + for (Group2D* g : getGroups()){ + Mesh::MeshEntity* me = mmng.getSurface(g->getName(), false); + if (me && g->isVisible()) meshAdded.push_back(me); } if (visibilityMask & Utils::FilterEntity::MeshLine) - for (std::vector::iterator iter = m_group1D.begin(); - iter != m_group1D.end(); ++iter){ - Mesh::MeshEntity* me = mmng.getLine((*iter)->getName(), false); - if (me && (*iter)->isVisible()) + for (Group1D* g : getGroups()){ + Mesh::MeshEntity* me = mmng.getLine(g->getName(), false); + if (me && g->isVisible()) meshAdded.push_back(me); } if (visibilityMask & Utils::FilterEntity::MeshCloud){ - for (std::vector::iterator iter = m_group0D.begin(); - iter != m_group0D.end(); ++iter){ - Mesh::MeshEntity* me = mmng.getCloud((*iter)->getName(), false); - if (me && (*iter)->isVisible()) + for (Group0D* g : getGroups()){ + Mesh::MeshEntity* me = mmng.getCloud(g->getName(), false); + if (me && g->isVisible()) meshAdded.push_back(me); } - for (std::vector::iterator iter = m_group1D.begin(); - iter != m_group1D.end(); ++iter){ - Mesh::MeshEntity* me = mmng.getCloud((*iter)->getName(), false); - if (me && (*iter)->isVisible()) + for (Group1D* g : getGroups()){ + Mesh::MeshEntity* me = mmng.getCloud(g->getName(), false); + if (me && g->isVisible()) meshAdded.push_back(me); } } @@ -2006,34 +1721,16 @@ std::vector GroupManager::getTopoVertices(const std::string& g, con std::vector GroupManager::getVisibles() const { std::vector visibles; - - for (std::vector::const_iterator iter = m_group3D.begin(); - iter != m_group3D.end(); ++iter) - if ((*iter)->isVisible() && !(*iter)->isDestroyed()) - visibles.push_back((*iter)); - - for (std::vector::const_iterator iter = m_group2D.begin(); - iter != m_group2D.end(); ++iter) - if ((*iter)->isVisible() && !(*iter)->isDestroyed()) - visibles.push_back((*iter)); - - for (std::vector::const_iterator iter = m_group1D.begin(); - iter != m_group1D.end(); ++iter) - if ((*iter)->isVisible() && !(*iter)->isDestroyed()) - visibles.push_back((*iter)); - - for (std::vector::const_iterator iter = m_group0D.begin(); - iter != m_group0D.end(); ++iter) - if ((*iter)->isVisible() && !(*iter)->isDestroyed()) - visibles.push_back((*iter)); - + for (GroupEntity* g : m_groups) + if (g->isVisible() && !g->isDestroyed()) + visibles.push_back(g); return visibles; } /*----------------------------------------------------------------------------*/ void GroupManager::addProjectionOnPX0(const std::string& nom) { // recherche du groupe 2D - Group2D* gr2d = getGroup2D(nom, true); + Group2D* gr2d = getGroup(nom, true); // création de l'objet qui va modifier le maillage Mesh::MeshModificationItf* modif = new Mesh::MeshModificationByProjectionOnP0(Mesh::MeshModificationByProjectionOnP0::X); @@ -2055,7 +1752,7 @@ void GroupManager::addProjectionOnPX0(const std::string& nom) void GroupManager::addProjectionOnPY0(const std::string& nom) { // recherche du groupe 2D - Group2D* gr2d = getGroup2D(nom, true); + Group2D* gr2d = getGroup(nom, true); // création de l'objet qui va modifier le maillage Mesh::MeshModificationItf* modif = new Mesh::MeshModificationByProjectionOnP0(Mesh::MeshModificationByProjectionOnP0::Y); @@ -2077,7 +1774,7 @@ void GroupManager::addProjectionOnPY0(const std::string& nom) void GroupManager::addProjectionOnPZ0(const std::string& nom) { // recherche du groupe 2D - Group2D* gr2d = getGroup2D(nom, true); + Group2D* gr2d = getGroup(nom, true); // création de l'objet qui va modifier le maillage Mesh::MeshModificationItf* modif = new Mesh::MeshModificationByProjectionOnP0(Mesh::MeshModificationByProjectionOnP0::Z); @@ -2103,8 +1800,8 @@ void GroupManager::addCartesianPerturbation(const std::string& nom, PyObject* py std::cout<<"GroupManager::addCartesianPerturbation("<(nom, false); + Group3D* gr3d = getGroup(nom, false); if (gr2d==0 && gr3d==0){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -2137,8 +1834,8 @@ void GroupManager::addPolarPerturbation(const std::string& nom, PyObject* py_obj std::cout<<"GroupManager::addPolarPerturbation("<(nom, false); + Group3D* gr3d = getGroup(nom, false); if (gr2d==0 && gr3d==0){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -2170,7 +1867,7 @@ void GroupManager::addSmoothing(const std::string& nom, Mesh::SurfacicSmoothing& std::cout<<"GroupManager::addSmoothing("<(nom, true); CommandAddMeshModification* command = new CommandAddMeshModification(getContext(), gr2d, sm.clone()); @@ -2189,7 +1886,7 @@ void GroupManager::addSmoothing(const std::string& nom, Mesh::VolumicSmoothing& std::cout<<"GroupManager::addSmoothing("<(nom, true); CommandAddMeshModification* command = new CommandAddMeshModification(getContext(), gr3d, sm.clone()); @@ -2208,7 +1905,7 @@ void GroupManager::addSepa(const std::string& nom, Mesh::MeshModificationBySepa& std::cout<<"GroupManager::addSepa("<(nom, true); CommandAddMeshModification* command = new CommandAddMeshModification(getContext(), gr2d, ASepa.clone()); @@ -2223,54 +1920,36 @@ void GroupManager::addSepa(const std::string& nom, Mesh::MeshModificationBySepa& /*----------------------------------------------------------------------------*/ void GroupManager::setLevel(std::vector& vg, int dim, int level) { - switch(dim){ - case(3):{ - for (uint i=0; isetLevel(level); - } // end for i - } - break; - case(2):{ - for (uint i=0; isetLevel(level); - } // end for i - } - break; - case(1):{ - for (uint i=0; isetLevel(level); - } // end for i - } - break; - case(0):{ - for (uint i=0; isetLevel(level); - } // end for i - } - break; - default: - throw TkUtil::Exception (TkUtil::UTF8String ("dimension non prévue pour GroupManager::getInfos", TkUtil::Charset::UTF_8)); - } - + for (std::string n : vg) + getGroup(n, dim, true)->setLevel(level); } /*----------------------------------------------------------------------------*/ GroupEntity* GroupManager::getGroup(const std::string& name, const int dim, const bool exceptionIfNotFound) const { switch(dim){ - case(3): return getGroup3D(name, exceptionIfNotFound); - case(2): return getGroup2D(name, exceptionIfNotFound); - case(1): return getGroup1D(name, exceptionIfNotFound); - case(0): return getGroup0D(name, exceptionIfNotFound); - default: { - throw TkUtil::Exception (TkUtil::UTF8String ("dimension non prévue pour GroupManager::getGroup", TkUtil::Charset::UTF_8)); - } + case(3): return getGroup(name, exceptionIfNotFound); + case(2): return getGroup(name, exceptionIfNotFound); + case(1): return getGroup(name, exceptionIfNotFound); + case(0): return getGroup(name, exceptionIfNotFound); + default: throw TkUtil::Exception (TkUtil::UTF8String ("dimension non prévue pour GroupManager::getGroup", TkUtil::Charset::UTF_8)); } } /*----------------------------------------------------------------------------*/ +template Group0D* GroupManager::getGroup(const std::string&, const bool) const; +template Group1D* GroupManager::getGroup(const std::string&, const bool) const; +template Group2D* GroupManager::getGroup(const std::string&, const bool) const; +template Group3D* GroupManager::getGroup(const std::string&, const bool) const; +/*----------------------------------------------------------------------------*/ +template Group0D* GroupManager::getNewGroup(const std::string&, Internal::InfoCommand*); +template Group1D* GroupManager::getNewGroup(const std::string&, Internal::InfoCommand*); +template Group2D* GroupManager::getNewGroup(const std::string&, Internal::InfoCommand*); +template Group3D* GroupManager::getNewGroup(const std::string&, Internal::InfoCommand*); +/*----------------------------------------------------------------------------*/ +template std::vector GroupManager::getGroups(const bool) const; +template std::vector GroupManager::getGroups(const bool) const; +template std::vector GroupManager::getGroups(const bool) const; +template std::vector GroupManager::getGroups(const bool) const; +/*----------------------------------------------------------------------------*/ } // end namespace Group /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/Mesh/CommandClearGroupName.cpp b/src/Core/Mesh/CommandClearGroupName.cpp index a9731802..bc5ed07f 100644 --- a/src/Core/Mesh/CommandClearGroupName.cpp +++ b/src/Core/Mesh/CommandClearGroupName.cpp @@ -46,7 +46,7 @@ void CommandClearGroupName::internalExecute() switch(m_dim){ case(0):{ - Group::Group0D* grp = getContext().getGroupManager().getNewGroup0D(m_groupName, &getInfoCommand()); + Group::Group0D* grp = getContext().getGroupManager().getNewGroup(m_groupName, &getInfoCommand()); std::vector geoms = grp->getVertices(); for (std::vector::iterator iter = geoms.begin(); @@ -76,7 +76,7 @@ void CommandClearGroupName::internalExecute() } break; case(1):{ - Group::Group1D* grp = getContext().getGroupManager().getNewGroup1D(m_groupName, &getInfoCommand()); + Group::Group1D* grp = getContext().getGroupManager().getNewGroup(m_groupName, &getInfoCommand()); std::vector geoms = grp->getCurves(); for (std::vector::iterator iter = geoms.begin(); @@ -106,7 +106,7 @@ void CommandClearGroupName::internalExecute() } break; case(2):{ - Group::Group2D* grp = getContext().getGroupManager().getNewGroup2D(m_groupName, &getInfoCommand()); + Group::Group2D* grp = getContext().getGroupManager().getNewGroup(m_groupName, &getInfoCommand()); std::vector geoms = grp->getSurfaces(); for (std::vector::iterator iter = geoms.begin(); @@ -136,7 +136,7 @@ void CommandClearGroupName::internalExecute() } break; case(3):{ - Group::Group3D* grp = getContext().getGroupManager().getNewGroup3D(m_groupName, &getInfoCommand()); + Group::Group3D* grp = getContext().getGroupManager().getNewGroup(m_groupName, &getInfoCommand()); std::vector geoms = grp->getVolumes(); for (std::vector::iterator iter = geoms.begin(); @@ -252,7 +252,7 @@ void CommandClearGroupName::internalUndo() } break; case(3):{ - Group::Group3D* grp = gm.getNewGroup3D(m_groupName, &getInfoCommand()); + Group::Group3D* grp = gm.getNewGroup(m_groupName, &getInfoCommand()); for (std::vector::iterator iter = m_geom_entities.begin(); iter != m_geom_entities.end(); ++iter){ diff --git a/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp b/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp index 7d776cb5..41077c41 100644 --- a/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp +++ b/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp @@ -394,7 +394,7 @@ createSubVolume(std::vector& bloc_dirPos) Mesh::SubVolume* sv = getContext().getMeshManager().getNewSubVolume(m_group_name, &getInfoCommand()); // recherche le groupe 3D et le construit si nécessaire - Group::Group3D* gr = getContext().getGroupManager().getNewGroup3D(m_group_name, &getInfoCommand()); + Group::Group3D* gr = getContext().getGroupManager().getNewGroup(m_group_name, &getInfoCommand()); gr->setLevel(0); sv->getDisplayProperties().setDisplayed(gr->isVisible()); if (!gr->find(sv)) diff --git a/src/Core/Mesh/CommandMeshExplorer.cpp b/src/Core/Mesh/CommandMeshExplorer.cpp index cfe2e572..cf4765d1 100644 --- a/src/Core/Mesh/CommandMeshExplorer.cpp +++ b/src/Core/Mesh/CommandMeshExplorer.cpp @@ -149,16 +149,12 @@ void CommandMeshExplorer:: selectCoFaceAndBlocks(std::map& filtre_coface, std::map& filtre_block) { - // tous les groupes 3D - std::vector grp; - getContext().getGroupManager().getGroup3D(grp); - // le nombre de blocs maillés en structuré uint nb_blocks_marked = 0; Topo::TopoManager& tm = getContext().getTopoManager(); - for (uint ig=0; ig& volumes = grp[ig]->getVolumes(); + for (Group::Group3D* grp : getContext().getGroupManager().getGroups()){ + std::vector& volumes = grp->getVolumes(); for (uint i=0; i topos = tm.getFilteredRefTopos(volumes[i]); for (Topo::Block* blk : topos) { @@ -182,10 +178,7 @@ selectCoFaceAndBlocks(std::map& filtre_coface, } // end for blk : topos } // end for i - std::vector& blocks = grp[ig]->getBlocks(); - for (uint j=0; jgetBlocks()) { if (blk->isStructured()){ // && blk->isMeshed() filtre_block[blk] = 1; nb_blocks_marked += 1; @@ -197,15 +190,14 @@ selectCoFaceAndBlocks(std::map& filtre_coface, blk->getCoFaces(cofaces); - for (std::vector::iterator iter1 = cofaces.begin(); - iter1 != cofaces.end(); ++iter1){ - filtre_coface[*iter1] = 1; - //std::cout<<"filtre_coface à 1 pour "<<(*iter1)->getName()<getName()<isStructured() && blk->isMeshed()) - } // end for j - } // end for ig + } // end for blk + } // end for grp if (nb_blocks_marked == 0){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); @@ -479,7 +471,7 @@ createSubVolume(std::vector& bloc_dirPos) getContext().newGraphicalRepresentation (*sv); // recherche le groupe 3D de base pour connaitre sa visibilité - Group::Group3D* gr = getContext().getGroupManager().getGroup3D(*iter2, true); + Group::Group3D* gr = getContext().getGroupManager().getGroup(*iter2, true); sv->getDisplayProperties().setDisplayed(gr->isVisible()); corr_subVol[name] = sv; diff --git a/src/Core/Mesh/CommandReadMLI.cpp b/src/Core/Mesh/CommandReadMLI.cpp index 9d776d81..493997e6 100644 --- a/src/Core/Mesh/CommandReadMLI.cpp +++ b/src/Core/Mesh/CommandReadMLI.cpp @@ -41,14 +41,14 @@ CommandReadMLI::~CommandReadMLI() Mesh::SubVolume* sv = dynamic_cast(me); Mesh::SubSurface* ss = dynamic_cast(me); if (sv){ - Group::Group3D* gr = getContext().getGroupManager().getGroup3D(sv->getName(), true); + Group::Group3D* gr = getContext().getGroupManager().getGroup(sv->getName(), true); gr->remove(sv); getContext().getMeshManager().remove(sv); sv->clear(); delete sv; } else if (ss){ - Group::Group2D* gr = getContext().getGroupManager().getGroup2D(ss->getName(), true); + Group::Group2D* gr = getContext().getGroupManager().getGroup(ss->getName(), true); gr->remove(ss); getContext().getMeshManager().remove(ss); ss->clear(); @@ -102,7 +102,7 @@ void CommandReadMLI::internalExecute() getContext().newGraphicalRepresentation (*sv); - Group::Group3D* gr = getContext().getGroupManager().getNewGroup3D(nomGr, &getInfoCommand()); + Group::Group3D* gr = getContext().getGroupManager().getNewGroup(nomGr, &getInfoCommand()); if (!gr->empty()){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -143,7 +143,7 @@ void CommandReadMLI::internalExecute() getContext().newGraphicalRepresentation (*ss); - Group::Group2D* gr = getContext().getGroupManager().getNewGroup2D(nomGr, &getInfoCommand()); + Group::Group2D* gr = getContext().getGroupManager().getNewGroup(nomGr, &getInfoCommand()); if (!gr->empty()){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); diff --git a/src/Core/Mesh/Volume.cpp b/src/Core/Mesh/Volume.cpp index 7446c0a5..cfa2ed89 100644 --- a/src/Core/Mesh/Volume.cpp +++ b/src/Core/Mesh/Volume.cpp @@ -453,7 +453,7 @@ getDescription (bool alsoComputed) const Group::Group3D* gr = 0; MeshManager* mm = dynamic_cast(&getMeshManager()); if (mm) - gr = mm->getContext().getGroupManager().getGroup3D(getName(),false); + gr = mm->getContext().getGroupManager().getGroup(getName(),false); if (gr){ Utils::SerializedRepresentation groupeDescription ( "Groupe 3D associé", ""); diff --git a/src/Core/SysCoord/CommandDuplicateSysCoord.cpp b/src/Core/SysCoord/CommandDuplicateSysCoord.cpp index f23cee82..b1a347ea 100644 --- a/src/Core/SysCoord/CommandDuplicateSysCoord.cpp +++ b/src/Core/SysCoord/CommandDuplicateSysCoord.cpp @@ -64,7 +64,7 @@ void CommandDuplicateSysCoord::internalRedo() /*----------------------------------------------------------------------------*/ void CommandDuplicateSysCoord::addToGroup(SysCoord* rep, bool use_default_name) { - Group::Group3D* group = getContext().getGroupManager().getNewGroup3D(use_default_name?"":m_group_name, &getInfoCommand()); + Group::Group3D* group = getContext().getGroupManager().getNewGroup(use_default_name?"":m_group_name, &getInfoCommand()); //rep->add(group); group->add(rep); getInfoCommand().addGroupInfoEntity(group,Internal::InfoCommand::DISPMODIFIED); diff --git a/src/Core/SysCoord/CommandNewSysCoord.cpp b/src/Core/SysCoord/CommandNewSysCoord.cpp index 3fa22c45..fbdb3609 100644 --- a/src/Core/SysCoord/CommandNewSysCoord.cpp +++ b/src/Core/SysCoord/CommandNewSysCoord.cpp @@ -110,7 +110,7 @@ void CommandNewSysCoord::internalRedo() /*----------------------------------------------------------------------------*/ void CommandNewSysCoord::addToGroup(SysCoord* rep, bool use_default_name) { - Group::Group3D* group = getContext().getGroupManager().getNewGroup3D(use_default_name?"":m_group_name, &getInfoCommand()); + Group::Group3D* group = getContext().getGroupManager().getNewGroup(use_default_name?"":m_group_name, &getInfoCommand()); //rep->add(group); group->add(rep); getInfoCommand().addGroupInfoEntity(group,Internal::InfoCommand::DISPMODIFIED); diff --git a/src/Core/Topo/CommandDuplicateTopo.cpp b/src/Core/Topo/CommandDuplicateTopo.cpp index 04295895..7a4459bf 100644 --- a/src/Core/Topo/CommandDuplicateTopo.cpp +++ b/src/Core/Topo/CommandDuplicateTopo.cpp @@ -335,7 +335,7 @@ duplicate(Block* bl) getInfoCommand().addTopoInfoEntity(new_block, Internal::InfoCommand::CREATED); if (!m_groupName.empty()){ - Group::Group3D* grp = getContext().getGroupManager().getNewGroup3D(m_groupName, &getInfoCommand()); + Group::Group3D* grp = getContext().getGroupManager().getNewGroup(m_groupName, &getInfoCommand()); grp->add(new_block); new_block->add(grp); } diff --git a/src/Core/Topo/CommandExtrudeFace.cpp b/src/Core/Topo/CommandExtrudeFace.cpp index 4c06fdc3..0ca15623 100644 --- a/src/Core/Topo/CommandExtrudeFace.cpp +++ b/src/Core/Topo/CommandExtrudeFace.cpp @@ -508,8 +508,8 @@ namespace Mgx3D { Block* newBlock = new Topo::Block(getContext(), faces, vertices, true); - Group::Group3D *group = getContext().getGroupManager().getNewGroup3D(getContext().getGroupManager().getDefaultName(3), - &getInfoCommand()); + Group::GroupManager& gm = getContext().getGroupManager(); + Group::Group3D *group = gm.getNewGroup(gm.getDefaultName(3), &getInfoCommand()); group->add(newBlock); newBlock->add(group); getInfoCommand().addGroupInfoEntity(group,Internal::InfoCommand::DISPMODIFIED); diff --git a/src/Core/Topo/CommandNewTopo.cpp b/src/Core/Topo/CommandNewTopo.cpp index c006cde3..337866de 100644 --- a/src/Core/Topo/CommandNewTopo.cpp +++ b/src/Core/Topo/CommandNewTopo.cpp @@ -178,8 +178,7 @@ CommandNewTopo:: CoEdge* coedge = new CoEdge(getContext(), &emp, v0, v1); - Group::Group1D *group = getContext().getGroupManager().getNewGroup1D(groupName, - &getInfoCommand()); + Group::Group1D *group = getContext().getGroupManager().getNewGroup(groupName, &getInfoCommand()); group->add(coedge); coedge->add(group); getInfoCommand().addGroupInfoEntity(group,Internal::InfoCommand::DISPMODIFIED); @@ -339,8 +338,7 @@ CommandNewTopo:: Topo::CoFace* face = new CoFace(getContext(), edges, true); - Group::Group2D *group = getContext().getGroupManager().getNewGroup2D(groupName, - &getInfoCommand()); + Group::Group2D *group = getContext().getGroupManager().getNewGroup(groupName, &getInfoCommand()); group->add(face); face->add(group); getInfoCommand().addGroupInfoEntity(group,Internal::InfoCommand::DISPMODIFIED); diff --git a/src/Core/Topo/CommandNewTopoOnGeometry.cpp b/src/Core/Topo/CommandNewTopoOnGeometry.cpp index 93580689..6085daa7 100644 --- a/src/Core/Topo/CommandNewTopoOnGeometry.cpp +++ b/src/Core/Topo/CommandNewTopoOnGeometry.cpp @@ -202,7 +202,7 @@ internalExecute() CoFace* cf = new CoFace(getContext()); addCreatedCoFace(cf); if (!m_groupName.empty()){ - Group::Group2D* grp = getContext().getGroupManager().getNewGroup2D(m_groupName, &getInfoCommand()); + Group::Group2D* grp = getContext().getGroupManager().getNewGroup(m_groupName, &getInfoCommand()); grp->add(cf); cf->add(grp); } @@ -248,7 +248,7 @@ internalExecute() Block* bl = new Block(getContext(), 0,0,0); addCreatedBlock(bl); if (!m_groupName.empty()){ - Group::Group3D* grp = getContext().getGroupManager().getNewGroup3D(m_groupName, &getInfoCommand()); + Group::Group3D* grp = getContext().getGroupManager().getNewGroup(m_groupName, &getInfoCommand()); grp->add(bl); bl->add(grp); } diff --git a/src/Core/Topo/ImportBlocksImplementation.cpp b/src/Core/Topo/ImportBlocksImplementation.cpp index 5ade61eb..23e1b7dd 100644 --- a/src/Core/Topo/ImportBlocksImplementation.cpp +++ b/src/Core/Topo/ImportBlocksImplementation.cpp @@ -48,9 +48,9 @@ void ImportBlocksImplementation::internalExecute() { throw TkUtil::Exception(mess); } - Group::Group1D* group1 = getStdContext()->getGroupManager().getNewGroup1D("Hors_Groupe_1D", m_icmd); - Group::Group2D* group2 = getStdContext()->getGroupManager().getNewGroup2D("Hors_Groupe_2D", m_icmd); - Group::Group3D* group3 = getStdContext()->getGroupManager().getNewGroup3D("Hors_Groupe_3D", m_icmd); + Group::Group1D* group1 = getStdContext()->getGroupManager().getNewGroup("Hors_Groupe_1D", m_icmd); + Group::Group2D* group2 = getStdContext()->getGroupManager().getNewGroup("Hors_Groupe_2D", m_icmd); + Group::Group3D* group3 = getStdContext()->getGroupManager().getNewGroup("Hors_Groupe_3D", m_icmd); /*----------------------------------------------------------------------------*/ if (!moveStreamOntoFirst(s, "POINTS")) { diff --git a/src/Core/protected/Group/Group0D.h b/src/Core/protected/Group/Group0D.h index 210283fa..7fe9273c 100644 --- a/src/Core/protected/Group/Group0D.h +++ b/src/Core/protected/Group/Group0D.h @@ -37,6 +37,8 @@ class Group0D : public GroupEntity{ static const char* typeNameGroup0D; public: + static const uint DIM = 0; + /*------------------------------------------------------------------------*/ /** \brief Constructeur. */ @@ -51,7 +53,7 @@ class Group0D : public GroupEntity{ /*------------------------------------------------------------------------*/ /** \brief retourne la dimension du groupe */ - int getDim() const {return 0;} + int getDim() const {return DIM;} /*------------------------------------------------------------------------*/ /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) @@ -73,7 +75,7 @@ class Group0D : public GroupEntity{ /*------------------------------------------------------------------------*/ /// retourne les entités du groupe. - virtual std::vector getEntities() const; + virtual std::vector getEntities() const; /*------------------------------------------------------------------------*/ /// accesseur sur la liste des Vertices référencées @@ -84,7 +86,7 @@ class Group0D : public GroupEntity{ std::vector& getTopoVertices() {return m_topo_vertices;} const std::vector& getTopoVertices() const {return m_topo_vertices;} - bool empty() const {return m_vertices.empty() && m_topo_vertices.empty();} + virtual bool empty() const {return m_vertices.empty() && m_topo_vertices.empty();} /*------------------------------------------------------------------------*/ /// Enlève un Vertex du groupe diff --git a/src/Core/protected/Group/Group1D.h b/src/Core/protected/Group/Group1D.h index 890fcb72..01e45dd8 100644 --- a/src/Core/protected/Group/Group1D.h +++ b/src/Core/protected/Group/Group1D.h @@ -37,6 +37,8 @@ class Group1D : public GroupEntity{ static const char* typeNameGroup1D; public: + static const uint DIM = 1; + /*------------------------------------------------------------------------*/ /** \brief Constructeur. */ @@ -51,7 +53,7 @@ class Group1D : public GroupEntity{ /*------------------------------------------------------------------------*/ /** \brief retourne la dimension du groupe */ - int getDim() const {return 1;} + int getDim() const {return DIM;} /*------------------------------------------------------------------------*/ /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) @@ -84,7 +86,7 @@ class Group1D : public GroupEntity{ std::vector& getCoEdges() {return m_coedges;} const std::vector& getCoEdges() const {return m_coedges;} - bool empty() const {return m_curves.empty() && m_coedges.empty();} + virtual bool empty() const {return m_curves.empty() && m_coedges.empty();} /*------------------------------------------------------------------------*/ /// Enlève une Curve du groupe diff --git a/src/Core/protected/Group/Group2D.h b/src/Core/protected/Group/Group2D.h index 615b4537..113d4c80 100644 --- a/src/Core/protected/Group/Group2D.h +++ b/src/Core/protected/Group/Group2D.h @@ -40,6 +40,8 @@ class Group2D : public GroupEntity{ static const char* typeNameGroup2D; public: + static const uint DIM = 2; + /*------------------------------------------------------------------------*/ /** \brief Constructeur. */ @@ -54,7 +56,7 @@ class Group2D : public GroupEntity{ /*------------------------------------------------------------------------*/ /** \brief retourne la dimension du groupe */ - int getDim() const {return 2;} + int getDim() const {return DIM;} /*------------------------------------------------------------------------*/ /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) @@ -90,7 +92,7 @@ class Group2D : public GroupEntity{ std::vector& getMeshSurfaces() {return m_mesh_surfaces;} const std::vector& getMeshSurfaces() const {return m_mesh_surfaces;} - bool empty() const {return m_surfaces.empty() && m_cofaces.empty() && m_mesh_surfaces.empty();} + virtual bool empty() const {return m_surfaces.empty() && m_cofaces.empty() && m_mesh_surfaces.empty();} /*------------------------------------------------------------------------*/ /// Enlève une Surface du groupe diff --git a/src/Core/protected/Group/Group3D.h b/src/Core/protected/Group/Group3D.h index 9dbcf828..9f21bb52 100644 --- a/src/Core/protected/Group/Group3D.h +++ b/src/Core/protected/Group/Group3D.h @@ -43,6 +43,8 @@ class Group3D : public GroupEntity{ static const char* typeNameGroup3D; public: + static const uint DIM = 3; + /*------------------------------------------------------------------------*/ /** \brief Constructeur. */ @@ -57,7 +59,7 @@ class Group3D : public GroupEntity{ /*------------------------------------------------------------------------*/ /** \brief retourne la dimension du groupe */ - int getDim() const {return 3;} + int getDim() const {return DIM;} /*------------------------------------------------------------------------*/ /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) @@ -98,7 +100,7 @@ class Group3D : public GroupEntity{ std::vector& getSysCoord() {return m_sys_coord;} const std::vector& getSysCoord() const {return m_sys_coord;} - bool empty() const {return m_volumes.empty() && m_blocks.empty() && m_mesh_volumes.empty() && m_sys_coord.empty();} + virtual bool empty() const {return m_volumes.empty() && m_blocks.empty() && m_mesh_volumes.empty() && m_sys_coord.empty();} /*------------------------------------------------------------------------*/ /// Enlève un volume du groupe diff --git a/src/Core/protected/Group/GroupEntity.h b/src/Core/protected/Group/GroupEntity.h index 5fa366a1..49e12802 100644 --- a/src/Core/protected/Group/GroupEntity.h +++ b/src/Core/protected/Group/GroupEntity.h @@ -63,22 +63,25 @@ class GroupEntity : public Internal::InternalEntity{ /// retourne les infos sur l'entité virtual std::string getInfos() =0; - /*------------------------------------------------------------------------*/ + /*------------------------------------------------------------------------*/ virtual void getRepresentation( Mgx3D::Utils::DisplayRepresentation& dr, bool checkDestroyed) const; - /*------------------------------------------------------------------------*/ - /// Identification des groupes avec nom par défaut (type Hors_Groupe...) - bool isDefaultGroup() const {return m_isDefaultGroup;} + /*------------------------------------------------------------------------*/ + /// Identification des groupes avec nom par défaut (type Hors_Groupe...) + bool isDefaultGroup() const {return m_isDefaultGroup;} - /*------------------------------------------------------------------------*/ - /// changement de niveau d'un groupe - void setLevel (uint level) {m_level = level;} + /*------------------------------------------------------------------------*/ + /// changement de niveau d'un groupe + void setLevel (uint level) {m_level = level;} - /// accès au niveau d'un groupe - uint getLevel () const {return m_level;} + /// accès au niveau d'un groupe + uint getLevel () const {return m_level;} - /*------------------------------------------------------------------------*/ + /// Retourne vrai si le groupe est vide + virtual bool empty() const = 0; + + /*------------------------------------------------------------------------*/ #ifndef SWIG /** \brief Fournit une représentation textuelle de l'entité. * \param true si l'entité fourni la totalité de sa description, false si diff --git a/src/Core/protected/Group/GroupManager.h b/src/Core/protected/Group/GroupManager.h index 7bec938d..62d81843 100644 --- a/src/Core/protected/Group/GroupManager.h +++ b/src/Core/protected/Group/GroupManager.h @@ -110,47 +110,21 @@ class GroupManager final : public Internal::CommandCreator { #ifndef SWIG /*------------------------------------------------------------------------*/ /// retourne l'entité à partir du nom, une exception si elle n'existe pas - Group3D* getGroup3D(const std::string& name, const bool exceptionIfNotFound=true) const; + template ::value>> + T* getGroup(const std::string& name, const bool exceptionIfNotFound=true) const; /// retourne l'entité à partir du nom, et la créé si elle n'existe pas - Group3D* getNewGroup3D(const std::string& name, Internal::InfoCommand* icmd); + template ::value>> + T* getNewGroup(const std::string& name, Internal::InfoCommand* icmd); /*------------------------------------------------------------------------*/ - /// retourne l'entité à partir du nom, une exception si elle n'existe pas - Group2D* getGroup2D(const std::string& name, const bool exceptionIfNotFound=true) const; - - /// retourne l'entité à partir du nom, et la créé si elle n'existe pas - Group2D* getNewGroup2D(const std::string& name, Internal::InfoCommand* icmd); - - /*------------------------------------------------------------------------*/ - /// retourne l'entité à partir du nom, une exception si elle n'existe pas - Group1D* getGroup1D(const std::string& name, const bool exceptionIfNotFound=true) const; - - /// retourne l'entité à partir du nom, et la créé si elle n'existe pas - Group1D* getNewGroup1D(const std::string& name, Internal::InfoCommand* icmd); - - /*------------------------------------------------------------------------*/ - /// retourne l'entité à partir du nom, une exception si elle n'existe pas - Group0D* getGroup0D(const std::string& name, const bool exceptionIfNotFound=true) const; - - /// retourne l'entité à partir du nom, et la créé si elle n'existe pas - Group0D* getNewGroup0D(const std::string& name, Internal::InfoCommand* icmd); + /// retourne la liste des groupes, sans ou avec ceux détruits + template ::value>> + std::vector getGroups(const bool onlyLive=true) const; /*------------------------------------------------------------------------*/ - /// retourne la liste des groupes 3D, sans ou avec ceux détruits - void getGroup3D(std::vector& grp, const bool onlyLive=true) const; - - /// retourne la liste des groupes 2D, sans ou avec ceux détruits - void getGroup2D(std::vector& grp, const bool onlyLive=true) const; - - /// retourne la liste des groupes 1D, sans ou avec ceux détruits - void getGroup1D(std::vector& grp, const bool onlyLive=true) const; - - /// retourne la liste des groupes 0D, sans ou avec ceux détruits - void getGroup0D(std::vector& grp, const bool onlyLive=true) const; - /// retourne la liste des groupes de dimensions dims, sans ou avec ceux détruits - void getGroups (std::vector& grp, Mgx3D::Internal::SelectionManager::DIM dims, const bool onlyLive=true) const; + std::vector getGroups (Mgx3D::Internal::SelectionManager::DIM dims, const bool onlyLive=true) const; /*------------------------------------------------------------------------*/ /** Fonction qui à partir d'un filtre (stocké) et des ensembles des groupes qui @@ -530,17 +504,8 @@ class GroupManager final : public Internal::CommandCreator { private: - /// Conteneur pour les groupes 3D - std::vector m_group3D; - - /// Conteneur pour les groupes 2D - std::vector m_group2D; - - /// Conteneur pour les groupes 1D - std::vector m_group1D; - - /// Conteneur pour les groupes 0D - std::vector m_group0D; + /// Conteneur pour les groupes + std::vector m_groups; /// ancien masque Utils::FilterEntity::objectType m_visibilityMask; diff --git a/src/Core/protected/Topo/TopoManager.h b/src/Core/protected/Topo/TopoManager.h index 80833cd5..2264955e 100644 --- a/src/Core/protected/Topo/TopoManager.h +++ b/src/Core/protected/Topo/TopoManager.h @@ -1899,10 +1899,9 @@ class TopoManager final : public Internal::CommandCreator { /// Enlève une association Geom-->Topo void removeRefTopo(const Geom::GeomEntity* ge, TopoEntity* te); /// Retourne les entités topologiques filtrées, léve une exception si aucune - template + template ::value>> std::vector getFilteredRefTopos(const Geom::GeomEntity* ge) { - static_assert(std::is_base_of::value, "T doit hériter de TopoEntity"); std::vector result; for (Topo::TopoEntity* te : getRefTopos(ge)) { if (T* casted = dynamic_cast(te)) { diff --git a/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp b/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp index 87357e37..1bb3c3ca 100644 --- a/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp +++ b/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp @@ -180,7 +180,7 @@ vector QtGroupProjectionOnPlanePanel::getInvolvedEntities ( ) const string groupName = getGroupName ( ); if (false == groupName.empty ( )) { - Group2D* group = getContext ( ).getGroupManager ( ).getGroup2D (groupName, false); + Group2D* group = getContext ( ).getGroupManager ( ).getGroup (groupName, false); if (0 != group) entities.push_back (group); } // if (false == groupName.empty ( )) diff --git a/src/QtComponents/QtGroupsPanel.cpp b/src/QtComponents/QtGroupsPanel.cpp index 73a2e909..b08396e6 100644 --- a/src/QtComponents/QtGroupsPanel.cpp +++ b/src/QtComponents/QtGroupsPanel.cpp @@ -731,19 +731,19 @@ void QtGroupsPanel::displaySelectedGroupsNames (bool display) std::string nom = (*it)->getGroup ( )->getName(); - GroupEntity* gr0 = getStdContext()->getGroupManager().getGroup0D(nom, false); + GroupEntity* gr0 = getStdContext()->getGroupManager().getGroup(nom, false); if (gr0) groups.push_back (gr0); - GroupEntity* gr1 = getStdContext()->getGroupManager().getGroup1D(nom, false); + GroupEntity* gr1 = getStdContext()->getGroupManager().getGroup(nom, false); if (gr1) groups.push_back (gr1); - GroupEntity* gr2 = getStdContext()->getGroupManager().getGroup2D(nom, false); + GroupEntity* gr2 = getStdContext()->getGroupManager().getGroup(nom, false); if (gr2) groups.push_back (gr2); - GroupEntity* gr3 = getStdContext()->getGroupManager().getGroup3D(nom, false); + GroupEntity* gr3 = getStdContext()->getGroupManager().getGroup(nom, false); if (gr3) groups.push_back (gr3); @@ -1904,11 +1904,10 @@ void QtGroupsPanel::levelSelectionCallback ( ) _entitiesGroupsWidget->clearSelection ( ); // getContext ( ).getSelectionManager ( ).clearSelection(); - const SelectionManager::DIM dimensions = dialog.dimensions ( ); - const set levels = dialog.levels ( ); - vector groups; + const SelectionManager::DIM dimensions = dialog.dimensions ( ); + const set levels = dialog.levels ( ); + vector groups = getContext ( ).getGroupManager( ).getGroups (dimensions, true); // vector selection; - getContext ( ).getGroupManager( ).getGroups (groups, dimensions, true); for (vector::iterator itg = groups.begin ( ); groups.end ( ) != itg; itg++) { for (set::const_iterator itl = levels.begin ( ); levels.end ( ) != itl; itl++) diff --git a/src/QtComponents/QtMgx3DGroupNamePanel.cpp b/src/QtComponents/QtMgx3DGroupNamePanel.cpp index 52e0b60c..b5022225 100644 --- a/src/QtComponents/QtMgx3DGroupNamePanel.cpp +++ b/src/QtComponents/QtMgx3DGroupNamePanel.cpp @@ -227,48 +227,9 @@ void QtMgx3DGroupNamePanel::getGroupNames (vector< string >& names) names.clear ( ); GroupManager& groupManager = _mainWindow->getContext ( ).getGroupManager ( ); - - switch (getDimension ( )) - { - case 0 : - { - vector groups; - groupManager.getGroup0D (groups, true); - for (vector::const_iterator it = groups.begin ( ); groups.end ( ) != it; it++) - names.push_back ((*it)->getName ( )); - } - break; - case 1 : - { - vector groups; - groupManager.getGroup1D (groups, true); - for (vector::const_iterator it = groups.begin ( ); groups.end ( ) != it; it++) - names.push_back ((*it)->getName ( )); - } - break; - case 2 : - { - vector groups; - groupManager.getGroup2D (groups, true); - for (vector::const_iterator it = groups.begin ( ); groups.end ( ) != it; it++) - names.push_back ((*it)->getName ( )); - } - break; - case 3 : - { - vector groups; - groupManager.getGroup3D (groups, true); - for (vector::const_iterator it = groups.begin ( ); groups.end ( ) != it; it++) - names.push_back ((*it)->getName ( )); - } - break; - default : - { - UTF8String error (Charset::UTF_8); - error << "QtMgx3DGroupNamePanel::getGroupNames : " << "dimension invalide (" << (long)getDimension ( ) << ")."; - throw Exception (error); - } - } // switch (getDimension ( )) + const Internal::SelectionManager::DIM dim = Internal::SelectionManager::dimensionToDimensions(getDimension ( )); + for (GroupEntity* g : groupManager.getGroups (dim, true)) + names.push_back (g->getName ( )); } // QtMgx3DGroupNamePanel::getGroupNames From c09d6105714a623e36d6d3e865fb6e7550fe13b3 Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Fri, 17 Oct 2025 09:21:27 +0200 Subject: [PATCH 03/18] Template group entity --- src/Core/Group/Group0D.cpp | 145 ++---------- src/Core/Group/Group1D.cpp | 160 ++----------- src/Core/Group/Group2D.cpp | 225 ++---------------- src/Core/Group/Group3D.cpp | 294 ++---------------------- src/Core/Group/GroupEntity.cpp | 105 ++++++++- src/Core/Group/GroupManager.cpp | 273 ++++++++++------------ src/Core/Mesh/CommandClearGroupName.cpp | 104 +++------ src/Core/Mesh/CommandCreateMesh.cpp | 6 +- src/Core/Mesh/CommandMeshExplorer.cpp | 4 +- src/Core/protected/Group/Group0D.h | 63 +---- src/Core/protected/Group/Group1D.h | 61 ----- src/Core/protected/Group/Group2D.h | 74 ------ src/Core/protected/Group/Group3D.h | 96 -------- src/Core/protected/Group/GroupEntity.h | 45 +++- 14 files changed, 365 insertions(+), 1290 deletions(-) diff --git a/src/Core/Group/Group0D.cpp b/src/Core/Group/Group0D.cpp index 5838e78f..bf79c7e7 100644 --- a/src/Core/Group/Group0D.cpp +++ b/src/Core/Group/Group0D.cpp @@ -26,145 +26,28 @@ Group0D::~Group0D() { } /*----------------------------------------------------------------------------*/ -TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Group0D & g) -{ - o << g.getName() - << " (uniqueId "<& topos = topo_manager.getRefTopos(vtx); - if (topos.size() > 0) { - o<<" "<getName()<<" ->"; - for (Topo::TopoEntity* te : topos) - o<<" "<getName(); - o << "\n"; - } - } - - return o; -} -/*----------------------------------------------------------------------------*/ -std::ostream & operator << (std::ostream & o, const Group0D & g) -{ - TkUtil::UTF8String us (TkUtil::Charset::UTF_8); - us << g; - o << us; - return o; -} -/*----------------------------------------------------------------------------*/ -std::string Group0D::getInfos() -{ - TkUtil::UTF8String us (TkUtil::Charset::UTF_8); - us << *this; - return us.iso(); -} -/*----------------------------------------------------------------------------*/ -std::vector Group0D::getEntities() const -{ -// return Internal::entitiesFromTypedEntities (getVertices ( )); -return std::vector ( ); -} -/*----------------------------------------------------------------------------*/ -void Group0D::remove(Geom::Vertex* vtx, const bool exceptionIfNotFound) -{ - uint i = 0; - for (; igetName(); - throw TkUtil::Exception(messErr); - } -} -/*----------------------------------------------------------------------------*/ -void Group0D::remove(Topo::Vertex* vtx, const bool exceptionIfNotFound) -{ - uint i = 0; - for (; igetName(); - throw TkUtil::Exception(messErr); - } -} -/*----------------------------------------------------------------------------*/ -void Group0D::add(Geom::Vertex* vtx) -{ - if (find(vtx)){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName(); - throw TkUtil::Exception(messErr); - } - - m_vertices.push_back(vtx); -} -/*----------------------------------------------------------------------------*/ -void Group0D::add(Topo::Vertex* vtx) -{ - if (find(vtx)){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName(); - throw TkUtil::Exception(messErr); - } - - m_topo_vertices.push_back(vtx); -} -/*----------------------------------------------------------------------------*/ -bool Group0D::find(Geom::Vertex* vtx) -{ - uint i = 0; - for (; i description ( GroupEntity::getDescription (alsoComputed)); - if (!m_vertices.empty()){ - Utils::SerializedRepresentation vertices ("Sommets géométriques", - TkUtil::NumericConversions::toStr(m_vertices.size())); - for (std::vector::const_iterator its = m_vertices.begin( ); m_vertices.end( )!=its; its++) - vertices.addProperty ( - Utils::SerializedRepresentation::Property ( - (*its)->getName ( ), *(*its))); - description->addPropertiesSet (vertices); + std::vector vertices = getFilteredEntities(); + if (!vertices.empty()){ + Utils::SerializedRepresentation sr ("Sommets géométriques", + TkUtil::NumericConversions::toStr(vertices.size())); + for (Geom::Vertex* v : vertices) + sr.addProperty(Utils::SerializedRepresentation::Property(v->getName(), *v)); + description->addPropertiesSet (sr); } - if (!m_topo_vertices.empty()){ - Utils::SerializedRepresentation vertices ("Sommets topologiques", - TkUtil::NumericConversions::toStr(m_vertices.size())); - for (std::vector::const_iterator its = m_topo_vertices.begin( ); m_topo_vertices.end( )!=its; its++) - vertices.addProperty ( - Utils::SerializedRepresentation::Property ( - (*its)->getName ( ), *(*its))); - description->addPropertiesSet (vertices); + std::vector topo_vertices = getFilteredEntities(); + if (!topo_vertices.empty()){ + Utils::SerializedRepresentation sr ("Sommets topologiques", + TkUtil::NumericConversions::toStr(topo_vertices.size())); + for (Topo::Vertex* v : topo_vertices) + sr.addProperty(Utils::SerializedRepresentation::Property(v->getName(), *v)); + description->addPropertiesSet (sr); } return description.release ( ); diff --git a/src/Core/Group/Group1D.cpp b/src/Core/Group/Group1D.cpp index fc284736..a85df036 100644 --- a/src/Core/Group/Group1D.cpp +++ b/src/Core/Group/Group1D.cpp @@ -25,160 +25,28 @@ Group1D::~Group1D() { } /*----------------------------------------------------------------------------*/ -TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Group1D & g) -{ - o << g.getName() - << " (uniqueId "<& topos = topo_manager.getRefTopos(curv); - if (topos.size() > 0) { - o<<" "<getName()<<" ->"; - for (Topo::TopoEntity* te : topos) - o<<" "<getName(); - o << "\n"; - } - } - - return o; -} -/*----------------------------------------------------------------------------*/ -std::ostream & operator << (std::ostream & o, const Group1D & g) -{ - TkUtil::UTF8String us (TkUtil::Charset::UTF_8); - us << g; - o << us; - return o; -} -/*----------------------------------------------------------------------------*/ -std::string Group1D::getInfos() -{ - TkUtil::UTF8String us (TkUtil::Charset::UTF_8); - us << *this; - return us.iso(); -} -/*----------------------------------------------------------------------------*/ -std::vector Group1D::getEntities() const -{ -// return Internal::entitiesFromTypedEntities (getCurves ( )); -return std::vector ( ); -} -/*----------------------------------------------------------------------------*/ -void Group1D::remove(Geom::Curve* crv, const bool exceptionIfNotFound) -{ - uint i = 0; - for (; igetName(); - throw TkUtil::Exception(messErr); - } -} -/*----------------------------------------------------------------------------*/ -void Group1D::remove(Topo::CoEdge* coedge, const bool exceptionIfNotFound) -{ - uint i = 0; - for (; igetGeomAssociation()){ - Geom::Curve* crv = dynamic_cast(coedge->getGeomAssociation()); - if (crv && find(crv)) - isInCurve = true; - } - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName(); - if (isInCurve) - messErr << "\nC'est la courbe à laquelle est associée l'arête qui appartient à ce groupe"; - throw TkUtil::Exception(messErr); - } -} -/*----------------------------------------------------------------------------*/ -void Group1D::add(Geom::Curve* crv) -{ - if (find(crv)){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName(); - throw TkUtil::Exception(messErr); - } - - m_curves.push_back(crv); -} -/*----------------------------------------------------------------------------*/ -void Group1D::add(Topo::CoEdge* coedge) -{ - if (find(coedge)){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName(); - throw TkUtil::Exception(messErr); - } - if (coedge->getGeomAssociation()){ - Geom::Curve* crv = dynamic_cast(coedge->getGeomAssociation()); - if (crv && find(crv)){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName()<<" à laquelle est associée "<getName(); - throw TkUtil::Exception(messErr); - } - } - m_coedges.push_back(coedge); -} -/*----------------------------------------------------------------------------*/ -bool Group1D::find(Geom::Curve* crv) -{ - uint i = 0; - for (; i description ( GroupEntity::getDescription (alsoComputed)); - if (!m_curves.empty()){ - Utils::SerializedRepresentation curves ("Courbes géométriques", - TkUtil::NumericConversions::toStr(m_curves.size())); - for (std::vector::const_iterator its = m_curves.begin( ); m_curves.end( )!=its; its++) - curves.addProperty ( - Utils::SerializedRepresentation::Property ( - (*its)->getName ( ), *(*its))); - description->addPropertiesSet (curves); + std::vector curves = getFilteredEntities(); + if (!curves.empty()){ + Utils::SerializedRepresentation sr ("Courbes géométriques", + TkUtil::NumericConversions::toStr(curves.size())); + for (Geom::Curve* curve : curves) + sr.addProperty(Utils::SerializedRepresentation::Property(curve->getName(), *curve)); + description->addPropertiesSet(sr); } - if (!m_coedges.empty()){ - Utils::SerializedRepresentation coedges ("Arêtes topologiques", - TkUtil::NumericConversions::toStr(m_coedges.size())); - for (std::vector::const_iterator its = m_coedges.begin( ); m_coedges.end( )!=its; its++) - coedges.addProperty ( - Utils::SerializedRepresentation::Property ( - (*its)->getName ( ), *(*its))); - description->addPropertiesSet (coedges); + std::vector coedges = getFilteredEntities(); + if (!coedges.empty()){ + Utils::SerializedRepresentation sr ("Arêtes topologiques", + TkUtil::NumericConversions::toStr(coedges.size())); + for (Topo::CoEdge* coedge : coedges) + sr.addProperty(Utils::SerializedRepresentation::Property(coedge->getName(), *coedge)); + description->addPropertiesSet(sr); } return description.release ( ); diff --git a/src/Core/Group/Group2D.cpp b/src/Core/Group/Group2D.cpp index 1e01c28d..8ad858ef 100644 --- a/src/Core/Group/Group2D.cpp +++ b/src/Core/Group/Group2D.cpp @@ -27,227 +27,38 @@ Group2D::~Group2D() { } /*----------------------------------------------------------------------------*/ -TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Group2D & g) -{ - o << g.getName() - << " (uniqueId "<& topos = topo_manager.getRefTopos(surf); - if (topos.size() > 0) { - o<<" "<getName()<<" ->"; - for (Topo::TopoEntity* te : topos) - o<<" "<getName(); - o << "\n"; - } - } - - return o; -} -/*----------------------------------------------------------------------------*/ -std::ostream & operator << (std::ostream & o, const Group2D & g) -{ - TkUtil::UTF8String us (TkUtil::Charset::UTF_8); - us << g; - o << us; - return o; -} -/*----------------------------------------------------------------------------*/ -std::vector Group2D::getEntities() const -{ -// return Internal::entitiesFromTypedEntities (getSurfaces ( )); -return std::vector ( ); -} -/*----------------------------------------------------------------------------*/ -std::string Group2D::getInfos() -{ - TkUtil::UTF8String us (TkUtil::Charset::UTF_8); - us << *this; - return us.iso(); -} -/*----------------------------------------------------------------------------*/ -void Group2D::remove(Geom::Surface* surf, const bool exceptionIfNotFound) -{ - uint i = 0; - for (; igetName(); - throw TkUtil::Exception(messErr); - } -} -/*----------------------------------------------------------------------------*/ -void Group2D::remove(Topo::CoFace* coface, const bool exceptionIfNotFound) -{ - uint i = 0; - for (; igetGeomAssociation()){ - Geom::Surface* surf = dynamic_cast(coface->getGeomAssociation()); - if (surf && find(surf)) - isInSurface = true; - } - - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName(); - if (isInSurface) - messErr << "\nC'est la surface à laquelle est associée la face qui appartient à ce groupe"; - throw TkUtil::Exception(messErr); - } -} -/*----------------------------------------------------------------------------*/ -void Group2D::remove(Mesh::Surface* surf, const bool exceptionIfNotFound) -{ - uint i = 0; - for (; igetName(); - throw TkUtil::Exception(messErr); - } -} -/*----------------------------------------------------------------------------*/ -void Group2D::add(Geom::Surface* surf) -{ - if (find(surf)){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName(); - throw TkUtil::Exception(messErr); - } - - if (!m_mesh_surfaces.empty()){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName(); - throw TkUtil::Exception(messErr); - } - if (coface->getGeomAssociation()){ - Geom::Surface* surf = dynamic_cast(coface->getGeomAssociation()); - if (surf && find(surf)){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName()<<" à laquelle est associée "<getName(); - throw TkUtil::Exception(messErr); - } - } - if (!m_mesh_surfaces.empty()){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName(); - throw TkUtil::Exception(messErr); - } - - if (!m_surfaces.empty() || !m_cofaces.empty()){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "< description ( GroupEntity::getDescription (alsoComputed)); - if (!m_surfaces.empty()){ - Utils::SerializedRepresentation surfaces ("Surfaces géométriques", - TkUtil::NumericConversions::toStr(m_surfaces.size())); - for (std::vector::const_iterator its = m_surfaces.begin( ); m_surfaces.end( )!=its; its++) - surfaces.addProperty ( - Utils::SerializedRepresentation::Property ( - (*its)->getName ( ), *(*its))); - description->addPropertiesSet (surfaces); + std::vector surfaces = getFilteredEntities(); + if (!surfaces.empty()){ + Utils::SerializedRepresentation sr ("Surfaces géométriques", + TkUtil::NumericConversions::toStr(surfaces.size())); + for (Geom::Surface* surface : surfaces) + sr.addProperty(Utils::SerializedRepresentation::Property(surface->getName(), *surface)); + description->addPropertiesSet(sr); } - if (!m_cofaces.empty()){ - Utils::SerializedRepresentation cofaces ("Faces topologiques", - TkUtil::NumericConversions::toStr(m_cofaces.size())); - for (std::vector::const_iterator its = m_cofaces.begin( ); m_cofaces.end( )!=its; its++) - cofaces.addProperty ( - Utils::SerializedRepresentation::Property ( - (*its)->getName ( ), *(*its))); - description->addPropertiesSet (cofaces); + std::vector cofaces = getFilteredEntities(); + if (!cofaces.empty()){ + Utils::SerializedRepresentation sr ("Faces topologiques", + TkUtil::NumericConversions::toStr(cofaces.size())); + for (Topo::CoFace* coface : cofaces) + sr.addProperty(Utils::SerializedRepresentation::Property(coface->getName ( ), *coface)); + description->addPropertiesSet(sr); } // recherche du Mesh::Surface associé (suivant le nom) Mesh::Surface* msurf = getContext().getMeshManager().getSurface(getName(), false); if (msurf){ - Utils::SerializedRepresentation surfaces ("Surface maillage", std::string("1")); - surfaces.addProperty ( - Utils::SerializedRepresentation::Property (msurf->getName(), *msurf)); - - description->addPropertiesSet (surfaces); + Utils::SerializedRepresentation sr ("Surface maillage", std::string("1")); + sr.addProperty(Utils::SerializedRepresentation::Property (msurf->getName(), *msurf)); + description->addPropertiesSet(sr); } else { - description->addProperty ( - Utils::SerializedRepresentation::Property ( + description->addProperty (Utils::SerializedRepresentation::Property( "Surface maillage", std::string("Aucune"))); } diff --git a/src/Core/Group/Group3D.cpp b/src/Core/Group/Group3D.cpp index fe607651..f92df39d 100644 --- a/src/Core/Group/Group3D.cpp +++ b/src/Core/Group/Group3D.cpp @@ -28,292 +28,48 @@ Group3D::~Group3D() { } /*----------------------------------------------------------------------------*/ -TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Group3D & g) -{ - o << g.getName() - << " (uniqueId "<& topos = topo_manager.getRefTopos(vol); - if (topos.size() > 0) { - o<<" "<getName()<<" ->"; - for (Topo::TopoEntity* te : topos) - o<<" "<getName(); - o << "\n"; - } - } - - return o; -} -/*----------------------------------------------------------------------------*/ -std::ostream & operator << (std::ostream & o, const Group3D & g) -{ - TkUtil::UTF8String us (TkUtil::Charset::UTF_8); - us << g; - o << us; - return o; -} -/*----------------------------------------------------------------------------*/ -std::vector Group3D::getEntities() const -{ - std::vector result1 = Internal::entitiesFromTypedEntities (getVolumes ( )); - std::vector result2 = Internal::entitiesFromTypedEntities (getBlocks ( )); - result1.insert(result1.end(), result2.begin(), result2.end()); - return result1; -} -/*----------------------------------------------------------------------------*/ -std::string Group3D::getInfos() -{ - TkUtil::UTF8String us (TkUtil::Charset::UTF_8); - us << *this; - return us.iso(); -} -/*----------------------------------------------------------------------------*/ -void Group3D::remove(Geom::Volume* vol, const bool exceptionIfNotFound) -{ - //std::cout<<"Group3D::remove("<getName()<<") à "<getName(); - throw TkUtil::Exception(messErr); - } -} -/*----------------------------------------------------------------------------*/ -void Group3D::remove(Topo::Block* bloc, const bool exceptionIfNotFound) -{ - //std::cout<<"Group3D::remove("<getName()<<") à "<getGeomAssociation()){ - Geom::Volume* vol = dynamic_cast(bloc->getGeomAssociation()); - if (vol && find(vol)) - isInVolume = true; - } - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName(); - if (isInVolume) - messErr << "\nC'est le volume auquel est associé le bloc qui appartient à ce groupe"; - throw TkUtil::Exception(messErr); - } -} -/*----------------------------------------------------------------------------*/ -void Group3D::remove(Mesh::Volume* vol, const bool exceptionIfNotFound) -{ - //std::cout<<"Group3D::remove("<getName()<<") à "<getName(); - throw TkUtil::Exception(messErr); - } -} -/*----------------------------------------------------------------------------*/ -void Group3D::remove(CoordinateSystem::SysCoord* rep, const bool exceptionIfNotFound) -{ - uint i = 0; - for (; igetName(); - throw TkUtil::Exception(messErr); - } -} -/*----------------------------------------------------------------------------*/ -void Group3D::add(Geom::Volume* vol) -{ - if (find(vol)){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName(); - throw TkUtil::Exception(messErr); - } - - if (!m_mesh_volumes.empty()){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName()<<") à "<getName(); - throw TkUtil::Exception(messErr); - } - if (bloc->getGeomAssociation()){ - Geom::Volume* vol = dynamic_cast(bloc->getGeomAssociation()); - if (vol && find(vol)){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName()<<" auquel est associé "<getName(); - throw TkUtil::Exception(messErr); - } - } - if (!m_volumes.empty()){ - TkUtil::UTF8String warningText (TkUtil::Charset::UTF_8); - warningText<<"ATTENTION, vous ajoutez le bloc "<getName() - <<" au groupe "<getLogStream()->log(TkUtil::WarningLog (warningText)); - - } - if (!m_mesh_volumes.empty()){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName()<<") à "<getName(); - throw TkUtil::Exception(messErr); - } - - if (!m_volumes.empty() || !m_blocks.empty()){ - TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Le groupe "<getName()<<") à "<getName(); - throw TkUtil::Exception(messErr); - } - - //std::cout<<"Group3D::add("<getName()<<") à "< description ( GroupEntity::getDescription (alsoComputed)); - if (!m_volumes.empty()){ - Utils::SerializedRepresentation volumes ("Volumes géométriques", - TkUtil::NumericConversions::toStr(m_volumes.size())); - for (std::vector::const_iterator its = m_volumes.begin( ); m_volumes.end( )!=its; its++) - volumes.addProperty ( - Utils::SerializedRepresentation::Property ( - (*its)->getName ( ), *(*its))); - description->addPropertiesSet (volumes); + std::vector volumes = getFilteredEntities(); + if (!volumes.empty()){ + Utils::SerializedRepresentation sr ("Volumes géométriques", + TkUtil::NumericConversions::toStr(volumes.size())); + for (Geom::Volume* vol : volumes) + sr.addProperty(Utils::SerializedRepresentation::Property(vol->getName ( ), *vol)); + description->addPropertiesSet(sr); } - if (!m_blocks.empty()){ - Utils::SerializedRepresentation blocks ("Blocs topologiques", - TkUtil::NumericConversions::toStr(m_blocks.size())); - for (std::vector::const_iterator its = m_blocks.begin( ); m_blocks.end( )!=its; its++) - blocks.addProperty ( - Utils::SerializedRepresentation::Property ( - (*its)->getName ( ), *(*its))); - description->addPropertiesSet (blocks); + std::vector blocks = getFilteredEntities(); + if (!blocks.empty()){ + Utils::SerializedRepresentation sr ("Blocs topologiques", + TkUtil::NumericConversions::toStr(blocks.size())); + for (Topo::Block* b : blocks) + sr.addProperty(Utils::SerializedRepresentation::Property(b->getName ( ), *b)); + description->addPropertiesSet(sr); } // recherche du Mesh::Volume associé (suivant le nom) Mesh::Volume* mvol = getContext().getMeshManager().getVolume(getName(), false); if (mvol){ - Utils::SerializedRepresentation volumes ("Volume maillage", std::string("1")); - volumes.addProperty ( - Utils::SerializedRepresentation::Property (mvol->getName(), *mvol)); - - description->addPropertiesSet (volumes); + Utils::SerializedRepresentation sr ("Volume maillage", std::string("1")); + sr.addProperty(Utils::SerializedRepresentation::Property (mvol->getName(), *mvol)); + description->addPropertiesSet(sr); } else { - description->addProperty ( - Utils::SerializedRepresentation::Property ( + description->addProperty(Utils::SerializedRepresentation::Property( "Volume maillage", std::string("Aucun"))); } - if (!m_sys_coord.empty()){ - Utils::SerializedRepresentation reperes ("Repères", - TkUtil::NumericConversions::toStr(m_sys_coord.size())); - for (std::vector::const_iterator its = m_sys_coord.begin( ); m_sys_coord.end( )!=its; its++) - reperes.addProperty ( - Utils::SerializedRepresentation::Property ( - (*its)->getName ( ), *(*its))); - description->addPropertiesSet (reperes); + std::vector scs = getFilteredEntities(); + if (!scs.empty()){ + Utils::SerializedRepresentation sr ("Repères", + TkUtil::NumericConversions::toStr(scs.size())); + for (CoordinateSystem::SysCoord* sc : scs) + sr.addProperty(Utils::SerializedRepresentation::Property(sc->getName(), *sc)); + description->addPropertiesSet(sr); } return description.release ( ); diff --git a/src/Core/Group/GroupEntity.cpp b/src/Core/Group/GroupEntity.cpp index 120c561b..e37addef 100644 --- a/src/Core/Group/GroupEntity.cpp +++ b/src/Core/Group/GroupEntity.cpp @@ -71,9 +71,110 @@ getDescription (bool alsoComputed) const return description.release ( ); } /*----------------------------------------------------------------------------*/ -std::vector GroupEntity::getEntities() const +void GroupEntity::remove(Utils::Entity* e, const bool exceptionIfNotFound) { - return std::vector ( ); // A surcharger + if (!find(e)) { + TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); + messErr << "Le groupe "<getName(); + throw TkUtil::Exception(messErr); + } + + m_entities.erase(std::remove(m_entities.begin(), m_entities.end(), e), m_entities.end()); +} +/*----------------------------------------------------------------------------*/ +void GroupEntity::add(Utils::Entity* e) +{ + if (find(e)) { + TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); + messErr << "Le groupe "<getName(); + throw TkUtil::Exception(messErr); + } + + // Si e est une entité de maillage, m_entities ne doit + // comporter que des entités de maillages. A l'inverse + // aucune entité autre que MeshEntity ne peut être ajoutée + // au groupe s'il contient déjà des entités de maillage + bool eIsMeshEntity = (dynamic_cast(e) != nullptr); + if (eIsMeshEntity) { + if (m_entities.size() != getFilteredEntities().size()) { + TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); + messErr << "Le groupe "<().empty()) { + TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); + messErr << "Le groupe "<(e); + if (topo && topo->getGeomAssociation()) { + Geom::GeomEntity* ge = topo->getGeomAssociation(); + if (ge && find(ge)) { + TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); + messErr << "Le groupe "<getName()<<" à laquelle est associée "<getName(); + throw TkUtil::Exception(messErr); + } + } + + // Dans tous les autres cas on peut ajouter + m_entities.push_back(e); +} +/*----------------------------------------------------------------------------*/ +bool GroupEntity::find(Utils::Entity* e) +{ + return (std::find(m_entities.begin(), m_entities.end(), e) != m_entities.end()); +} +/*----------------------------------------------------------------------------*/ +TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const GroupEntity & g) +{ + o << g.getName() + << " (uniqueId "<getName(); + // si e est une GeomEntity, on montre l'association topologique + if (Geom::GeomEntity* ge = dynamic_cast(e)) { + const std::vector& topos = tm.getRefTopos(ge); + if (topos.size() > 0) { + o<<" ->"; + for (Topo::TopoEntity* te : topos) + o<<" "<getName(); + } + } + if (Topo::TopoEntity* te = dynamic_cast(e)) { + if (te->getGeomAssociation()) + o<<" ->"<getGeomAssociation()->getName(); + } + o << "\n"; + } + + return o; +} +/*----------------------------------------------------------------------------*/ +std::ostream & operator << (std::ostream & o, const GroupEntity & g) +{ + TkUtil::UTF8String us (TkUtil::Charset::UTF_8); + us << g; + o << us; + return o; +} +/*----------------------------------------------------------------------------*/ +std::string GroupEntity::getInfos() +{ + TkUtil::UTF8String us (TkUtil::Charset::UTF_8); + us << *this; + return us.iso(); } /*----------------------------------------------------------------------------*/ } // end namespace Group diff --git a/src/Core/Group/GroupManager.cpp b/src/Core/Group/GroupManager.cpp index 7de4a3ef..ac20b9b0 100644 --- a/src/Core/Group/GroupManager.cpp +++ b/src/Core/Group/GroupManager.cpp @@ -966,7 +966,7 @@ void GroupManager::addMark(Group3D* grp, { bool propagate = getPropagate(); - for (auto vol : grp->getVolumes()) { + for (Geom::Volume* vol : grp->getFilteredEntities()) { // on n'observe les entités qu'une fois if (filtre_vu[vol] == false){ filtre_vu[vol] = true; @@ -1006,19 +1006,13 @@ void GroupManager::addMark(Group3D* grp, } if (visibilityMask >= Utils::FilterEntity::TopoBlock){ - std::vector& blocs = grp->getBlocks(); - - for (std::vector::iterator iter1=blocs.begin(); - iter1!=blocs.end(); ++iter1) - addMark(*iter1, visibilityMask, filtre_vu, filtre_topo, mark); + for (Topo::Block* blk : grp->getFilteredEntities()) + addMark(blk, visibilityMask, filtre_vu, filtre_topo, mark); } if (visibilityMask >= Utils::FilterEntity::SysCoord){ - std::vector& rep = grp->getSysCoord(); - - for (std::vector::iterator iter1=rep.begin(); - iter1!=rep.end(); ++iter1) - addMark(*iter1, visibilityMask, filtre_vu, filtre_rep, mark); + for (CoordinateSystem::SysCoord* sc : grp->getFilteredEntities()) + addMark(sc, visibilityMask, filtre_vu, filtre_rep, mark); } } /*----------------------------------------------------------------------------*/ @@ -1031,7 +1025,7 @@ void GroupManager::addMark(Group2D* grp, { bool propagate = getPropagate(); - for (auto surf : grp->getSurfaces()) { + for (Geom::Surface* surf : grp->getFilteredEntities()) { // on n'observe les entités qu'une fois if (filtre_vu[surf] == false){ filtre_vu[surf] = true; @@ -1066,11 +1060,8 @@ void GroupManager::addMark(Group2D* grp, } if (visibilityMask >= Utils::FilterEntity::TopoCoFace){ - std::vector& cofaces = grp->getCoFaces(); - - for (std::vector::iterator iter1=cofaces.begin(); - iter1!=cofaces.end(); ++iter1) - addMark(*iter1, visibilityMask, filtre_vu, filtre_topo, mark); + for (Topo::CoFace* cf : grp->getFilteredEntities()) + addMark(cf, visibilityMask, filtre_vu, filtre_topo, mark); } } /*----------------------------------------------------------------------------*/ @@ -1083,7 +1074,7 @@ void GroupManager::addMark(Group1D* grp, { bool propagate = getPropagate(); - for (auto c : grp->getCurves()){ + for (Geom::Curve* c : grp->getFilteredEntities()) { // on n'observe les entités qu'une fois if (filtre_vu[c] == false){ filtre_vu[c] = true; @@ -1109,11 +1100,8 @@ void GroupManager::addMark(Group1D* grp, } if (visibilityMask >= Utils::FilterEntity::TopoCoEdge){ - std::vector& coedges = grp->getCoEdges(); - - for (std::vector::iterator iter1=coedges.begin(); - iter1!=coedges.end(); ++iter1) - addMark(*iter1, visibilityMask, filtre_vu, filtre_topo, mark); + for (Topo::CoEdge* ce : grp->getFilteredEntities()) + addMark(ce, visibilityMask, filtre_vu, filtre_topo, mark); } } /*----------------------------------------------------------------------------*/ @@ -1126,7 +1114,7 @@ void GroupManager::addMark(Group0D* grp, { // on tient compte du masque pour savoir si on s'interesse à la visibilité de ce type d'entité if (visibilityMask & Utils::FilterEntity::GeomVertex){ - for (auto vert : grp->getVertices()){ + for (Geom::Vertex* vert : grp->getFilteredEntities()){ // on n'observe les entités qu'une fois if (filtre_vu[vert] == false){ filtre_vu[vert] = true; @@ -1144,11 +1132,8 @@ void GroupManager::addMark(Group0D* grp, } } if (visibilityMask >= Utils::FilterEntity::TopoVertex){ - std::vector& vertices = grp->getTopoVertices(); - - for (std::vector::iterator iter1=vertices.begin(); - iter1!=vertices.end(); ++iter1) - addMark(*iter1, visibilityMask, filtre_vu, filtre_topo, mark); + for (Topo::Vertex* vert : grp->getFilteredEntities()) + addMark(vert, visibilityMask, filtre_vu, filtre_topo, mark); } } /*----------------------------------------------------------------------------*/ @@ -1317,85 +1302,78 @@ void GroupManager::addMark(CoordinateSystem::SysCoord* rep, void GroupManager::get(const std::vector& vg, std::vector& volumes) { std::set initGeomEntities; - for (auto vn : vg){ - Group3D* gr3d = dynamic_cast(vn); - if (gr3d){ - auto loc_volumes = gr3d->getVolumes(); - initGeomEntities.insert(loc_volumes.begin(), loc_volumes.end()); - } - } // end for i + for (GroupEntity* g : vg) { + std::vector loc_volumes = g->getFilteredEntities(); + initGeomEntities.insert(loc_volumes.begin(), loc_volumes.end()); + } - for (std::set::iterator iter = initGeomEntities.begin(); - iter != initGeomEntities.end(); ++iter) - volumes.push_back((*iter)); + for (Geom::Volume* v : initGeomEntities) + volumes.push_back(v); } /*----------------------------------------------------------------------------*/ void GroupManager::get(const std::vector& vg, std::vector& surfaces) { std::set initGeomEntities; - for (auto vn : vg){ - Group3D* gr3d = dynamic_cast(vn); - if (gr3d){ - for (auto volume : gr3d->getVolumes()){ + for (GroupEntity* g : vg) { + Group3D* gr3d = dynamic_cast(g); + if (gr3d) { + for (Geom::Volume* volume : gr3d->getFilteredEntities()){ auto loc_surfaces = volume->getSurfaces(); initGeomEntities.insert(loc_surfaces.begin(), loc_surfaces.end()); } } else { - Group2D* gr2d = dynamic_cast(vn); + Group2D* gr2d = dynamic_cast(g); if (gr2d){ - auto loc_surfaces = gr2d->getSurfaces(); + auto loc_surfaces = gr2d->getFilteredEntities(); initGeomEntities.insert(loc_surfaces.begin(), loc_surfaces.end()); } } } - for (std::set::iterator iter = initGeomEntities.begin(); - iter != initGeomEntities.end(); ++iter) - surfaces.push_back((*iter)); + for (Geom::Surface* s : initGeomEntities) + surfaces.push_back(s); } /*----------------------------------------------------------------------------*/ void GroupManager::get(const std::vector& vg, std::vector& curves) { std::set initGeomEntities; - for (auto vn : vg){ - Group3D* gr3d = dynamic_cast(vn); + for (GroupEntity* g : vg) { + Group3D* gr3d = dynamic_cast(g); if (gr3d){ - for (auto volume : gr3d->getVolumes()){ + for (auto volume : gr3d->getFilteredEntities()){ for (auto surface : volume->getSurfaces()){ auto loc_curves = surface->getCurves(); initGeomEntities.insert(loc_curves.begin(), loc_curves.end()); } } } else { - Group2D* gr2d = dynamic_cast(vn); + Group2D* gr2d = dynamic_cast(g); if (gr2d){ - for (auto surface : gr2d->getSurfaces()){ + for (auto surface : gr2d->getFilteredEntities()){ auto loc_curves = surface->getCurves(); initGeomEntities.insert(loc_curves.begin(), loc_curves.end()); } } else { - Group1D* gr1d = dynamic_cast(vn); + Group1D* gr1d = dynamic_cast(g); if (gr1d){ - auto loc_curves = gr1d->getCurves(); + auto loc_curves = gr1d->getFilteredEntities(); initGeomEntities.insert(loc_curves.begin(), loc_curves.end()); } } } } - for (std::set::iterator iter = initGeomEntities.begin(); - iter != initGeomEntities.end(); ++iter) - curves.push_back((*iter)); + for (Geom::Curve* c : initGeomEntities) + curves.push_back(c); } /*----------------------------------------------------------------------------*/ void GroupManager::get(const std::vector& vg, std::vector& vertices) { std::set initGeomEntities; - for (auto vn : vg){ - Group3D* gr3d = dynamic_cast(vn); + for (GroupEntity* g : vg) { + Group3D* gr3d = dynamic_cast(g); if (gr3d){ - std::vector volumes = gr3d->getVolumes(); - for (auto volume : volumes){ + for (auto volume : gr3d->getFilteredEntities()){ for (auto surface : volume->getSurfaces()) for (auto curve : surface->getCurves()) { auto loc_vertices = curve->getVertices(); @@ -1403,27 +1381,25 @@ void GroupManager::get(const std::vector& vg, std::vector(vn); + Group2D* gr2d = dynamic_cast(g); if (gr2d){ - std::vector surfaces = gr2d->getSurfaces(); - for (auto surface : surfaces){ + for (auto surface : gr2d->getFilteredEntities()){ for (auto curve : surface->getCurves()){ auto loc_vertices = curve->getVertices(); initGeomEntities.insert(loc_vertices.begin(), loc_vertices.end()); } } } else { - Group1D* gr1d = dynamic_cast(vn); + Group1D* gr1d = dynamic_cast(g); if (gr1d){ - std::vector curves = gr1d->getCurves(); - for (auto curve : curves){ + for (auto curve : gr1d->getFilteredEntities()){ auto loc_vertices = curve->getVertices(); initGeomEntities.insert(loc_vertices.begin(), loc_vertices.end()); } } else { - Group0D* gr0d = dynamic_cast(vn); + Group0D* gr0d = dynamic_cast(g); if (gr0d){ - auto loc_vertices = gr0d->getVertices(); + auto loc_vertices = gr0d->getFilteredEntities(); initGeomEntities.insert(loc_vertices.begin(), loc_vertices.end()); } } @@ -1431,120 +1407,126 @@ void GroupManager::get(const std::vector& vg, std::vector::iterator iter = initGeomEntities.begin(); - iter != initGeomEntities.end(); ++iter) - vertices.push_back((*iter)); + for (Geom::Vertex* v : initGeomEntities) + vertices.push_back(v); } /*----------------------------------------------------------------------------*/ void GroupManager::get(const std::vector& vg, std::vector& blocks) { std::set initTopoEntities; - for (auto vn : vg){ - Group3D* gr3d = dynamic_cast(vn); + for (GroupEntity* g : vg) { + Group3D* gr3d = dynamic_cast(g); if (gr3d){ - Topo::TopoHelper::get(gr3d->getVolumes(), initTopoEntities); - std::vector& te = gr3d->getBlocks(); + auto ge = gr3d->getFilteredEntities(); + Topo::TopoHelper::get(ge, initTopoEntities); + auto te = gr3d->getFilteredEntities(); initTopoEntities.insert(te.begin(), te.end()); } } - for (std::set::iterator iter = initTopoEntities.begin(); - iter != initTopoEntities.end(); ++iter) - blocks.push_back((*iter)); + for (Topo::Block* b : initTopoEntities) + blocks.push_back(b); } /*----------------------------------------------------------------------------*/ void GroupManager::get(const std::vector& vg, std::vector& cofaces) { bool propagate = getPropagate(); - std::set initTopoEntities; - - for (auto vn : vg){ - Group3D* gr3d = dynamic_cast(vn); + for (GroupEntity* g : vg) { + Group3D* gr3d = dynamic_cast(g); if (gr3d){ - Topo::TopoHelper::get(gr3d->getVolumes(), initTopoEntities, propagate); - Topo::TopoHelper::get(gr3d->getBlocks(), initTopoEntities); + auto ge = gr3d->getFilteredEntities(); + Topo::TopoHelper::get(ge, initTopoEntities, propagate); + auto te = gr3d->getFilteredEntities(); + Topo::TopoHelper::get(te, initTopoEntities); } else { - Group2D* gr2d = dynamic_cast(vn); + Group2D* gr2d = dynamic_cast(g); if (gr2d){ - Topo::TopoHelper::get(gr2d->getSurfaces(), initTopoEntities); - std::vector& te = gr2d->getCoFaces(); + auto ge = gr2d->getFilteredEntities(); + Topo::TopoHelper::get(ge, initTopoEntities); + auto te = gr2d->getFilteredEntities(); initTopoEntities.insert(te.begin(), te.end()); } } } - for (std::set::iterator iter = initTopoEntities.begin(); - iter != initTopoEntities.end(); ++iter) - cofaces.push_back((*iter)); + for (Topo::CoFace* cf : initTopoEntities) + cofaces.push_back(cf); } /*----------------------------------------------------------------------------*/ void GroupManager::get(const std::vector& vg, std::vector& coedges) { bool propagate = getPropagate(); - std::set initTopoEntities; - - for (auto vn : vg){ - Group3D* gr3d = dynamic_cast(vn); + for (GroupEntity* g : vg) { + Group3D* gr3d = dynamic_cast(g); if (gr3d){ - Topo::TopoHelper::get(gr3d->getVolumes(), initTopoEntities, propagate); - Topo::TopoHelper::get(gr3d->getBlocks(), initTopoEntities); + auto ge = gr3d->getFilteredEntities(); + Topo::TopoHelper::get(ge, initTopoEntities, propagate); + auto te = gr3d->getFilteredEntities(); + Topo::TopoHelper::get(te, initTopoEntities); } else { - Group2D* gr2d = dynamic_cast(vn); + Group2D* gr2d = dynamic_cast(g); if (gr2d){ - Topo::TopoHelper::get(gr2d->getSurfaces(), initTopoEntities, propagate); - Topo::TopoHelper::get(gr2d->getCoFaces(), initTopoEntities); + auto ge = gr2d->getFilteredEntities(); + Topo::TopoHelper::get(ge, initTopoEntities, propagate); + auto te = gr2d->getFilteredEntities(); + Topo::TopoHelper::get(te, initTopoEntities); } else { - Group1D* gr1d = dynamic_cast(vn); + Group1D* gr1d = dynamic_cast(g); if (gr1d){ - Topo::TopoHelper::get(gr1d->getCurves(), initTopoEntities); - std::vector& te = gr1d->getCoEdges(); + auto ge = gr1d->getFilteredEntities(); + Topo::TopoHelper::get(ge, initTopoEntities); + auto te = gr1d->getFilteredEntities(); initTopoEntities.insert(te.begin(), te.end()); } } } } - for (std::set::iterator iter = initTopoEntities.begin(); - iter != initTopoEntities.end(); ++iter) - coedges.push_back((*iter)); + for (Topo::CoEdge* ce : initTopoEntities) + coedges.push_back(ce); } /*----------------------------------------------------------------------------*/ void GroupManager::get(const std::vector& vg, std::vector& vertices) { bool propagate = getPropagate(); - std::set initTopoEntities; - - for (auto vn : vg){ - Group3D* gr3d = dynamic_cast(vn); + for (GroupEntity* g : vg) { + Group3D* gr3d = dynamic_cast(g); if (gr3d){ - Topo::TopoHelper::get(gr3d->getVolumes(), initTopoEntities, propagate); - Topo::TopoHelper::get(gr3d->getBlocks(), initTopoEntities); + auto ge = gr3d->getFilteredEntities(); + Topo::TopoHelper::get(ge, initTopoEntities, propagate); + auto te = gr3d->getFilteredEntities(); + Topo::TopoHelper::get(te, initTopoEntities); } else { - Group2D* gr2d = dynamic_cast(vn); + Group2D* gr2d = dynamic_cast(g); if (gr2d){ - Topo::TopoHelper::get(gr2d->getSurfaces(), initTopoEntities, propagate); - Topo::TopoHelper::get(gr2d->getCoFaces(), initTopoEntities); + auto ge = gr2d->getFilteredEntities(); + Topo::TopoHelper::get(ge, initTopoEntities, propagate); + auto te = gr2d->getFilteredEntities(); + Topo::TopoHelper::get(te, initTopoEntities); } else { - Group1D* gr1d = dynamic_cast(vn); + Group1D* gr1d = dynamic_cast(g); if (gr1d){ - Topo::TopoHelper::get(gr1d->getCurves(), initTopoEntities, propagate); - Topo::TopoHelper::get(gr1d->getCoEdges(), initTopoEntities); + auto ge = gr1d->getFilteredEntities(); + Topo::TopoHelper::get(ge, initTopoEntities, propagate); + auto te = gr1d->getFilteredEntities(); + Topo::TopoHelper::get(te, initTopoEntities); } else { - Group0D* gr0d = dynamic_cast(vn); + Group0D* gr0d = dynamic_cast(g); if (gr0d){ - Topo::TopoHelper::get(gr0d->getVertices(), initTopoEntities); - std::vector& te = gr0d->getTopoVertices(); - initTopoEntities.insert(te.begin(), te.end()); + auto ge = gr0d->getFilteredEntities(); + Topo::TopoHelper::get(ge, initTopoEntities); + auto tv = gr0d->getFilteredEntities(); + initTopoEntities.insert(tv.begin(), tv.end()); } } @@ -1552,9 +1534,8 @@ void GroupManager::get(const std::vector& vg, std::vector::iterator iter = initTopoEntities.begin(); - iter != initTopoEntities.end(); ++iter) - vertices.push_back((*iter)); + for (Topo::Vertex* v : initTopoEntities) + vertices.push_back(v); } /*------------------------------------------------------------------------*/ @@ -1613,9 +1594,8 @@ std::vector GroupManager::getGeomVolumes(const std::string& g, cons std::vector geom_entities; get(groups, geom_entities); - for (std::vector::iterator iter=geom_entities.begin(); - iter!=geom_entities.end(); ++iter) - result.push_back((*iter)->getName()); + for (auto e : geom_entities) + result.push_back(e->getName()); return result; } @@ -1627,9 +1607,8 @@ std::vector GroupManager::getGeomSurfaces(const std::string& g, con std::vector geom_entities; get(groups, geom_entities); - for (std::vector::iterator iter=geom_entities.begin(); - iter!=geom_entities.end(); ++iter) - result.push_back((*iter)->getName()); + for (auto e : geom_entities) + result.push_back(e->getName()); return result; } @@ -1641,9 +1620,8 @@ std::vector GroupManager::getGeomCurves(const std::string& g, const std::vector geom_entities; get(groups, geom_entities); - for (std::vector::iterator iter=geom_entities.begin(); - iter!=geom_entities.end(); ++iter) - result.push_back((*iter)->getName()); + for (auto e : geom_entities) + result.push_back(e->getName()); return result; } @@ -1655,9 +1633,8 @@ std::vector GroupManager::getGeomVertices(const std::string& g, con std::vector geom_entities; get(groups, geom_entities); - for (std::vector::iterator iter=geom_entities.begin(); - iter!=geom_entities.end(); ++iter) - result.push_back((*iter)->getName()); + for (auto e : geom_entities) + result.push_back(e->getName()); return result; } @@ -1669,9 +1646,8 @@ std::vector GroupManager::getTopoBlocks(const std::string& g, const std::vector topo_entities; get(groups, topo_entities); - for (std::vector::iterator iter=topo_entities.begin(); - iter!=topo_entities.end(); ++iter) - result.push_back((*iter)->getName()); + for (auto e : topo_entities) + result.push_back(e->getName()); return result; } @@ -1683,9 +1659,8 @@ std::vector GroupManager::getTopoFaces(const std::string& g, const std::vector topo_entities; get(groups, topo_entities); - for (std::vector::iterator iter=topo_entities.begin(); - iter!=topo_entities.end(); ++iter) - result.push_back((*iter)->getName()); + for (auto e : topo_entities) + result.push_back(e->getName()); return result; } @@ -1697,9 +1672,8 @@ std::vector GroupManager::getTopoEdges(const std::string& g, const std::vector topo_entities; get(groups, topo_entities); - for (std::vector::iterator iter=topo_entities.begin(); - iter!=topo_entities.end(); ++iter) - result.push_back((*iter)->getName()); + for (auto e : topo_entities) + result.push_back(e->getName()); return result; } @@ -1711,9 +1685,8 @@ std::vector GroupManager::getTopoVertices(const std::string& g, con std::vector topo_entities; get(groups, topo_entities); - for (std::vector::iterator iter=topo_entities.begin(); - iter!=topo_entities.end(); ++iter) - result.push_back((*iter)->getName()); + for (auto e : topo_entities) + result.push_back(e->getName()); return result; } diff --git a/src/Core/Mesh/CommandClearGroupName.cpp b/src/Core/Mesh/CommandClearGroupName.cpp index bc5ed07f..69bde471 100644 --- a/src/Core/Mesh/CommandClearGroupName.cpp +++ b/src/Core/Mesh/CommandClearGroupName.cpp @@ -48,120 +48,72 @@ void CommandClearGroupName::internalExecute() case(0):{ Group::Group0D* grp = getContext().getGroupManager().getNewGroup(m_groupName, &getInfoCommand()); - std::vector geoms = grp->getVertices(); - for (std::vector::iterator iter = geoms.begin(); - iter != geoms.end(); ++iter){ - - Geom::Vertex* vtx = *iter; - m_geom_entities.push_back(vtx); - + for (Geom::Vertex* ge : grp->getFilteredEntities()) { + m_geom_entities.push_back(ge); // on retire le groupe - m_group_helper.removeFromGroup(m_groupName, vtx); + m_group_helper.removeFromGroup(m_groupName, ge); } // end for iter - std::vector topos = grp->getTopoVertices(); - for (std::vector::iterator iter = topos.begin(); - iter != topos.end(); ++iter){ - - Topo::Vertex* topo = *iter; - m_topo_entities.push_back(topo); - + for (Topo::Vertex* te : grp->getFilteredEntities()){ + m_topo_entities.push_back(te); // on retire le groupe - m_group_helper.removeFromGroup(m_groupName, topo); - + m_group_helper.removeFromGroup(m_groupName, te); // le sommet n'est peut-être plus visible / groupe visibles - getInfoCommand().addTopoInfoEntity(topo, Internal::InfoCommand::VISIBILYCHANGED); - + getInfoCommand().addTopoInfoEntity(te, Internal::InfoCommand::VISIBILYCHANGED); } // end for iter } break; case(1):{ Group::Group1D* grp = getContext().getGroupManager().getNewGroup(m_groupName, &getInfoCommand()); - std::vector geoms = grp->getCurves(); - for (std::vector::iterator iter = geoms.begin(); - iter != geoms.end(); ++iter){ - - Geom::Curve* geom = *iter; - m_geom_entities.push_back(geom); - + for (Geom::Curve* ge : grp->getFilteredEntities()) { + m_geom_entities.push_back(ge); // on retire le groupe - m_group_helper.removeFromGroup(m_groupName, geom); + m_group_helper.removeFromGroup(m_groupName, ge); } // end for iter - std::vector topos = grp->getCoEdges(); - for (std::vector::iterator iter = topos.begin(); - iter != topos.end(); ++iter){ - - Topo::CoEdge* topo = *iter; - m_topo_entities.push_back(topo); - + for (Topo::CoEdge* te : grp->getFilteredEntities()){ + m_topo_entities.push_back(te); // on retire le groupe - m_group_helper.removeFromGroup(m_groupName, topo); - + m_group_helper.removeFromGroup(m_groupName, te); // l'arête n'est peut-être plus visible / groupe visibles - getInfoCommand().addTopoInfoEntity(topo, Internal::InfoCommand::VISIBILYCHANGED); - + getInfoCommand().addTopoInfoEntity(te, Internal::InfoCommand::VISIBILYCHANGED); } // end for iter } break; case(2):{ Group::Group2D* grp = getContext().getGroupManager().getNewGroup(m_groupName, &getInfoCommand()); - std::vector geoms = grp->getSurfaces(); - for (std::vector::iterator iter = geoms.begin(); - iter != geoms.end(); ++iter){ - - Geom::Surface* geom = *iter; - m_geom_entities.push_back(geom); - + for (Geom::Surface* ge : grp->getFilteredEntities()) { + m_geom_entities.push_back(ge); // on retire le groupe - m_group_helper.removeFromGroup(m_groupName, geom); + m_group_helper.removeFromGroup(m_groupName, ge); } // end for iter - std::vector topos = grp->getCoFaces(); - for (std::vector::iterator iter = topos.begin(); - iter != topos.end(); ++iter){ - - Topo::CoFace* topo = *iter; - m_topo_entities.push_back(topo); - + for (Topo::CoFace*te : grp->getFilteredEntities()) { + m_topo_entities.push_back(te); // on retire le groupe - m_group_helper.removeFromGroup(m_groupName, topo); - + m_group_helper.removeFromGroup(m_groupName, te); // la face n'est peut-être plus visible / groupe visibles - getInfoCommand().addTopoInfoEntity(topo, Internal::InfoCommand::VISIBILYCHANGED); - + getInfoCommand().addTopoInfoEntity(te, Internal::InfoCommand::VISIBILYCHANGED); } // end for iter } break; case(3):{ Group::Group3D* grp = getContext().getGroupManager().getNewGroup(m_groupName, &getInfoCommand()); - std::vector geoms = grp->getVolumes(); - for (std::vector::iterator iter = geoms.begin(); - iter != geoms.end(); ++iter){ - - Geom::Volume* geom = *iter; - m_geom_entities.push_back(geom); - + for (Geom::Volume* ge : grp->getFilteredEntities()) { + m_geom_entities.push_back(ge); // on retire le groupe - m_group_helper.removeFromGroup(m_groupName, geom); + m_group_helper.removeFromGroup(m_groupName, ge); } // end for iter - std::vector topos = grp->getBlocks(); - for (std::vector::iterator iter = topos.begin(); - iter != topos.end(); ++iter){ - - Topo::Block* topo = *iter; - m_topo_entities.push_back(topo); - + for (Topo::Block* te : grp->getFilteredEntities()) { + m_topo_entities.push_back(te); // on retire le groupe - m_group_helper.removeFromGroup(m_groupName, topo); - + m_group_helper.removeFromGroup(m_groupName, te); // le bloc n'est peut-être plus visible / groupe visibles - getInfoCommand().addTopoInfoEntity(topo, Internal::InfoCommand::VISIBILYCHANGED); - + getInfoCommand().addTopoInfoEntity(te, Internal::InfoCommand::VISIBILYCHANGED); } // end for iter } break; diff --git a/src/Core/Mesh/CommandCreateMesh.cpp b/src/Core/Mesh/CommandCreateMesh.cpp index 51679e26..032de3d3 100644 --- a/src/Core/Mesh/CommandCreateMesh.cpp +++ b/src/Core/Mesh/CommandCreateMesh.cpp @@ -1044,14 +1044,14 @@ meshAndModify(std::list& list_cofaces) Group::Group2D* grp = *iter1; // liste des cofaces associé au groupe - std::vector surfaces = grp->getSurfaces(); + std::vector surfaces = grp->getFilteredEntities(); std::list cofaces_grp; for (Geom::Surface* surf : surfaces) { std::vector cofaces = tm.getFilteredRefTopos(surf); cofaces_grp.insert(cofaces_grp.end(), cofaces.begin(), cofaces.end()); } // end for surf - std::vector& cofaces = grp->getCoFaces(); + std::vector cofaces = grp->getFilteredEntities(); cofaces_grp.insert(cofaces_grp.end(), cofaces.begin(), cofaces.end()); cofaces_grp.sort(Utils::Entity::compareEntity); @@ -1286,7 +1286,7 @@ modify(std::vector& list_blocks) // liste des blocs associés au groupe std::list blocks_grp; - std::vector volumes = grp->getVolumes(); + std::vector volumes = grp->getFilteredEntities(); for (Geom::Volume* vol : volumes){ std::vector blocks = tm.getFilteredRefTopos(vol); blocks_grp.insert(blocks_grp.end(), blocks.begin(), blocks.end()); diff --git a/src/Core/Mesh/CommandMeshExplorer.cpp b/src/Core/Mesh/CommandMeshExplorer.cpp index cf4765d1..2737d6c4 100644 --- a/src/Core/Mesh/CommandMeshExplorer.cpp +++ b/src/Core/Mesh/CommandMeshExplorer.cpp @@ -154,7 +154,7 @@ selectCoFaceAndBlocks(std::map& filtre_coface, Topo::TopoManager& tm = getContext().getTopoManager(); for (Group::Group3D* grp : getContext().getGroupManager().getGroups()){ - std::vector& volumes = grp->getVolumes(); + std::vector volumes = grp->getFilteredEntities(); for (uint i=0; i topos = tm.getFilteredRefTopos(volumes[i]); for (Topo::Block* blk : topos) { @@ -178,7 +178,7 @@ selectCoFaceAndBlocks(std::map& filtre_coface, } // end for blk : topos } // end for i - for (Topo::Block* blk : grp->getBlocks()) { + for (Topo::Block* blk : grp->getFilteredEntities()) { if (blk->isStructured()){ // && blk->isMeshed() filtre_block[blk] = 1; nb_blocks_marked += 1; diff --git a/src/Core/protected/Group/Group0D.h b/src/Core/protected/Group/Group0D.h index 7fe9273c..ab8cbbc2 100644 --- a/src/Core/protected/Group/Group0D.h +++ b/src/Core/protected/Group/Group0D.h @@ -1,11 +1,4 @@ /*----------------------------------------------------------------------------*/ -/** \file Group0D.h - * - * \author Eric Brière de l'Isle - * - * \date 24/10/2012 - */ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_GROUP_GROUP0D_H_ #define MGX3D_GROUP_GROUP0D_H_ /*----------------------------------------------------------------------------*/ @@ -14,13 +7,6 @@ /*----------------------------------------------------------------------------*/ namespace Mgx3D { -namespace Geom { -class Vertex; -} -namespace Topo { -class Vertex; -} - namespace Internal { class Context; } @@ -65,44 +51,6 @@ class Group0D : public GroupEntity{ */ virtual Utils::Entity::objectType getType() const {return Utils::Entity::Group0D;} - /*------------------------------------------------------------------------*/ - /// pour l'affichage d'informations - friend TkUtil::UTF8String & operator << (TkUtil::UTF8String & , const Group0D &); - friend std::ostream & operator << (std::ostream & , const Group0D &); - - /// retourne les infos sur l'entité - virtual std::string getInfos(); - - /*------------------------------------------------------------------------*/ - /// retourne les entités du groupe. - virtual std::vector getEntities() const; - - /*------------------------------------------------------------------------*/ - /// accesseur sur la liste des Vertices référencées - std::vector& getVertices() {return m_vertices;} - const std::vector& getVertices() const {return m_vertices;} - - /// accesseur sur la liste des sommets topologiques référencées - std::vector& getTopoVertices() {return m_topo_vertices;} - const std::vector& getTopoVertices() const {return m_topo_vertices;} - - virtual bool empty() const {return m_vertices.empty() && m_topo_vertices.empty();} - - /*------------------------------------------------------------------------*/ - /// Enlève un Vertex du groupe - void remove(Geom::Vertex* vtx, const bool exceptionIfNotFound=true); - void remove(Topo::Vertex* vtx, const bool exceptionIfNotFound=true); - - /*------------------------------------------------------------------------*/ - /// Ajoute un Vertex au groupe - void add(Geom::Vertex* vtx); - void add(Topo::Vertex* vtx); - - /*------------------------------------------------------------------------*/ - /// Recherche un Vertex dans le groupe - bool find(Geom::Vertex* vtx); - bool find(Topo::Vertex* vtx); - /*------------------------------------------------------------------------*/ /** \brief Fournit une représentation textuelle de l'entité. * \param true si l'entité fourni la totalité de sa description, false si @@ -111,17 +59,8 @@ class Group0D : public GroupEntity{ * \return Description, à détruire par l'appelant. */ #ifndef SWIG - virtual Mgx3D::Utils::SerializedRepresentation* getDescription ( - bool alsoComputed) const; + virtual Mgx3D::Utils::SerializedRepresentation* getDescription (bool alsoComputed) const; #endif - - -private: - /// les Vertices référencés par ce groupe - std::vector m_vertices; - - /// les Vertices topologiques référencés par ce groupe - std::vector m_topo_vertices; }; /*----------------------------------------------------------------------------*/ } // end namespace Group diff --git a/src/Core/protected/Group/Group1D.h b/src/Core/protected/Group/Group1D.h index 01e45dd8..d6bc1e87 100644 --- a/src/Core/protected/Group/Group1D.h +++ b/src/Core/protected/Group/Group1D.h @@ -1,11 +1,4 @@ /*----------------------------------------------------------------------------*/ -/** \file Group1D.h - * - * \author Eric Brière de l'Isle - * - * \date 24/10/2012 - */ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_GROUP_GROUP1D_H_ #define MGX3D_GROUP_GROUP1D_H_ /*----------------------------------------------------------------------------*/ @@ -14,13 +7,6 @@ /*----------------------------------------------------------------------------*/ namespace Mgx3D { -namespace Geom { -class Curve; -} -namespace Topo { -class CoEdge; -} - namespace Internal { class Context; } @@ -65,45 +51,6 @@ class Group1D : public GroupEntity{ */ virtual Utils::Entity::objectType getType() const {return Utils::Entity::Group1D;} - /*------------------------------------------------------------------------*/ - /// pour l'affichage d'informations - friend TkUtil::UTF8String & operator << (TkUtil::UTF8String & , const Group1D &); - friend std::ostream & operator << (std::ostream & , const Group1D &); - - /// retourne les infos sur l'entité - virtual std::string getInfos(); - - /*------------------------------------------------------------------------*/ - /// retourne les entités du groupe. - virtual std::vector getEntities() const; - - /*------------------------------------------------------------------------*/ - /// accesseur sur la liste des Curves référencées - std::vector& getCurves() {return m_curves;} - const std::vector& getCurves() const {return m_curves;} - - /// accesseur sur la liste des aêtes référencées - std::vector& getCoEdges() {return m_coedges;} - const std::vector& getCoEdges() const {return m_coedges;} - - virtual bool empty() const {return m_curves.empty() && m_coedges.empty();} - - /*------------------------------------------------------------------------*/ - /// Enlève une Curve du groupe - void remove(Geom::Curve* crv, const bool exceptionIfNotFound=true); - void remove(Topo::CoEdge* coedge, const bool exceptionIfNotFound=true); - - /*------------------------------------------------------------------------*/ - /// Ajoute une Curve au groupe - void add(Geom::Curve* crv); - void add(Topo::CoEdge* coedge); - - /*------------------------------------------------------------------------*/ - /// Recherche une Curve dans le groupe - bool find(Geom::Curve* crv); - /// Recherche une arête dans le groupe - bool find(Topo::CoEdge* coedge); - /*------------------------------------------------------------------------*/ /** \brief Fournit une représentation textuelle de l'entité. * \param true si l'entité fourni la totalité de sa description, false si @@ -115,14 +62,6 @@ class Group1D : public GroupEntity{ virtual Mgx3D::Utils::SerializedRepresentation* getDescription ( bool alsoComputed) const; #endif - - -private: - /// les Curves référencées par ce groupe - std::vector m_curves; - - /// les arêtes topologiques référencés par ce groupe - std::vector m_coedges; }; /*----------------------------------------------------------------------------*/ } // end namespace Group diff --git a/src/Core/protected/Group/Group2D.h b/src/Core/protected/Group/Group2D.h index 113d4c80..823ff630 100644 --- a/src/Core/protected/Group/Group2D.h +++ b/src/Core/protected/Group/Group2D.h @@ -1,11 +1,4 @@ /*----------------------------------------------------------------------------*/ -/** \file Group2D.h - * - * \author Eric Brière de l'Isle - * - * \date 24/10/2012 - */ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_GROUP_GROUP2D_H_ #define MGX3D_GROUP_GROUP2D_H_ /*----------------------------------------------------------------------------*/ @@ -14,16 +7,6 @@ /*----------------------------------------------------------------------------*/ namespace Mgx3D { -namespace Geom { -class Surface; -} -namespace Topo { -class CoFace; -} -namespace Mesh { -class Surface; -} - namespace Internal { class Context; } @@ -68,52 +51,6 @@ class Group2D : public GroupEntity{ */ virtual Utils::Entity::objectType getType() const {return Utils::Entity::Group2D;} - /*------------------------------------------------------------------------*/ - /// pour l'affichage d'informations - friend TkUtil::UTF8String & operator << (TkUtil::UTF8String & , const Group2D &); - friend std::ostream & operator << (std::ostream & , const Group2D &); - - /// retourne les infos sur l'entité - virtual std::string getInfos(); - - /*------------------------------------------------------------------------*/ - /// retourne les entités du groupe. - virtual std::vector getEntities() const; - - /*------------------------------------------------------------------------*/ - /// accesseur sur la liste des Surfaces référencées - std::vector& getSurfaces() {return m_surfaces;} - const std::vector& getSurfaces() const {return m_surfaces;} - - /// accesseur sur la liste des faces topologiques - std::vector& getCoFaces() {return m_cofaces;} - const std::vector& getCoFaces() const {return m_cofaces;} - - std::vector& getMeshSurfaces() {return m_mesh_surfaces;} - const std::vector& getMeshSurfaces() const {return m_mesh_surfaces;} - - virtual bool empty() const {return m_surfaces.empty() && m_cofaces.empty() && m_mesh_surfaces.empty();} - - /*------------------------------------------------------------------------*/ - /// Enlève une Surface du groupe - void remove(Geom::Surface* surf, const bool exceptionIfNotFound=true); - void remove(Topo::CoFace* coface, const bool exceptionIfNotFound=true); - void remove(Mesh::Surface* surf, const bool exceptionIfNotFound=true); - - /*------------------------------------------------------------------------*/ - /// Ajoute une Surface au groupe - void add(Geom::Surface* surf); - void add(Topo::CoFace* coface); - void add(Mesh::Surface* surf); - - /*------------------------------------------------------------------------*/ - /// Recherche une Surface dans le groupe - bool find(Geom::Surface* surf); - /// Recherche une face dans le groupe - bool find(Topo::CoFace* coface); - /// Recherche une Surface dans le groupe - bool find(Mesh::Surface* surf); - /*------------------------------------------------------------------------*/ /** \brief Fournit une représentation textuelle de l'entité. * \param true si l'entité fourni la totalité de sa description, false si @@ -125,17 +62,6 @@ class Group2D : public GroupEntity{ virtual Mgx3D::Utils::SerializedRepresentation* getDescription ( bool alsoComputed) const; #endif - - -private: - /// les Surfaces référencées par ce groupe - std::vector m_surfaces; - - /// les faces référencées par ce groupe - std::vector m_cofaces; - - /// les surfaces de maillage référencés par ce groupe - std::vector m_mesh_surfaces; }; /*----------------------------------------------------------------------------*/ } // end namespace Group diff --git a/src/Core/protected/Group/Group3D.h b/src/Core/protected/Group/Group3D.h index 9f21bb52..0add7900 100644 --- a/src/Core/protected/Group/Group3D.h +++ b/src/Core/protected/Group/Group3D.h @@ -1,11 +1,4 @@ /*----------------------------------------------------------------------------*/ -/** \file Group3D.h - * - * \author Eric Brière de l'Isle - * - * \date 18/10/2012 - */ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_GROUP_GROUP3D_H_ #define MGX3D_GROUP_GROUP3D_H_ /*----------------------------------------------------------------------------*/ @@ -13,20 +6,6 @@ #include /*----------------------------------------------------------------------------*/ namespace Mgx3D { - -namespace Geom { -class Volume; -} -namespace Topo { -class Block; -} -namespace Mesh { -class Volume; -} -namespace CoordinateSystem { -class SysCoord; -} - namespace Internal { class Context; } @@ -71,67 +50,6 @@ class Group3D : public GroupEntity{ */ virtual Utils::Entity::objectType getType() const {return Utils::Entity::Group3D;} - /*------------------------------------------------------------------------*/ - /// pour l'affichage d'informations - friend TkUtil::UTF8String & operator << (TkUtil::UTF8String & , const Group3D &); - friend std::ostream & operator << (std::ostream & , const Group3D &); - - /// retourne les infos sur l'entité - virtual std::string getInfos(); - - /*------------------------------------------------------------------------*/ - /// retourne les entités du groupe. - virtual std::vector getEntities() const; - - /*------------------------------------------------------------------------*/ - /// accesseur sur la liste de volumes référencés - std::vector& getVolumes() {return m_volumes;} - const std::vector& getVolumes() const {return m_volumes;} - - /// accesseur sur la liste de blocs référencés - std::vector& getBlocks() {return m_blocks;} - const std::vector& getBlocks() const {return m_blocks;} - - /// accesseur sur la liste de volumes de maillage référencés - std::vector& getMeshVolumes() {return m_mesh_volumes;} - const std::vector& getMeshVolumes() const {return m_mesh_volumes;} - - /// accesseur sur la liste de repères référencés - std::vector& getSysCoord() {return m_sys_coord;} - const std::vector& getSysCoord() const {return m_sys_coord;} - - virtual bool empty() const {return m_volumes.empty() && m_blocks.empty() && m_mesh_volumes.empty() && m_sys_coord.empty();} - - /*------------------------------------------------------------------------*/ - /// Enlève un volume du groupe - void remove(Geom::Volume* vol, const bool exceptionIfNotFound=true); - /// Enlève un bloc du groupe - void remove(Topo::Block* bloc, const bool exceptionIfNotFound=true); - /// Enlève un volume du groupe - void remove(Mesh::Volume* vol, const bool exceptionIfNotFound=true); - /// Enlève un repère du groupe - void remove(CoordinateSystem::SysCoord* rep, const bool exceptionIfNotFound=true); - - /*------------------------------------------------------------------------*/ - /// Ajoute un volume au groupe - void add(Geom::Volume* vol); - /// Ajoute un bloc au groupe - void add(Topo::Block* bloc); - /// Ajoute un volume au groupe - void add(Mesh::Volume* vol); - /// Ajoute un repère au groupe - void add(CoordinateSystem::SysCoord* rep); - - /*------------------------------------------------------------------------*/ - /// Recherche un volume dans le groupe - bool find(Geom::Volume* vol); - /// Recherche un bloc dans le groupe - bool find(Topo::Block* bloc); - /// Recherche un volume dans le groupe - bool find(Mesh::Volume* vol); - /// Recherche un repère dans le groupe - bool find(CoordinateSystem::SysCoord* rep); - /*------------------------------------------------------------------------*/ /** \brief Fournit une représentation textuelle de l'entité. * \param true si l'entité fourni la totalité de sa description, false si @@ -143,20 +61,6 @@ class Group3D : public GroupEntity{ virtual Mgx3D::Utils::SerializedRepresentation* getDescription ( bool alsoComputed) const; #endif - - -private: - /// les volumes référencés par ce groupe - std::vector m_volumes; - - /// les blocs référencés par ce groupe - std::vector m_blocks; - - /// les volumes de maillage référencés par ce groupe - std::vector m_mesh_volumes; - - /// les repères référencés par ce groupe - std::vector m_sys_coord; }; /*----------------------------------------------------------------------------*/ } // end namespace Group diff --git a/src/Core/protected/Group/GroupEntity.h b/src/Core/protected/Group/GroupEntity.h index 49e12802..84be081d 100644 --- a/src/Core/protected/Group/GroupEntity.h +++ b/src/Core/protected/Group/GroupEntity.h @@ -59,10 +59,6 @@ class GroupEntity : public Internal::InternalEntity{ */ virtual void setDestroyed(bool b); - /*------------------------------------------------------------------------*/ - /// retourne les infos sur l'entité - virtual std::string getInfos() =0; - /*------------------------------------------------------------------------*/ virtual void getRepresentation( Mgx3D::Utils::DisplayRepresentation& dr, bool checkDestroyed) const; @@ -78,8 +74,38 @@ class GroupEntity : public Internal::InternalEntity{ /// accès au niveau d'un groupe uint getLevel () const {return m_level;} + /*------------------------------------------------------------------------*/ + /// retourne les entités du groupe. + const std::vector& getEntities() const {return m_entities;} + + /// accesseur sur la liste des Vertices référencées + template ::value>> + const std::vector getFilteredEntities() const + { + std::vector entities; + for (Utils::Entity* e : m_entities) + if (T* casted = dynamic_cast(e)) + entities.push_back(casted); + return entities; + } + /// Retourne vrai si le groupe est vide - virtual bool empty() const = 0; + bool empty() const {return m_entities.empty();} + + /// Enlève une entité du groupe + void remove(Utils::Entity* e, const bool exceptionIfNotFound=true); + + /// Ajoute une entité au groupe + void add(Utils::Entity* e); + + /// Recherche une entité dans le groupe + bool find(Utils::Entity* e); + + /*------------------------------------------------------------------------*/ + /// pour l'affichage d'informations + friend TkUtil::UTF8String & operator << (TkUtil::UTF8String & , const GroupEntity &); + friend std::ostream & operator << (std::ostream & , const GroupEntity &); + std::string getInfos(); /*------------------------------------------------------------------------*/ #ifndef SWIG @@ -89,12 +115,7 @@ class GroupEntity : public Internal::InternalEntity{ * optimisation) * \return Description, à détruire par l'appelant. */ - virtual Mgx3D::Utils::SerializedRepresentation* getDescription ( - bool alsoComputed) const; - - /*------------------------------------------------------------------------*/ - /// retourne les entités du groupe. Méthode à surcharger. - virtual std::vector getEntities() const; + virtual Mgx3D::Utils::SerializedRepresentation* getDescription (bool alsoComputed) const; /*------------------------------------------------------------------------*/ /// Accesseur sur le id ème objet de modification du maillage pour un groupe @@ -110,6 +131,8 @@ class GroupEntity : public Internal::InternalEntity{ virtual size_t getNbMeshModif() {return m_meshModif.size();} #endif +protected: + std::vector m_entities; private: /// Les modifications du maillage associé au groupe From 175bdd40bc1b58c0e1f8abae38fc18d21b12bd4a Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Fri, 17 Oct 2025 15:47:28 +0200 Subject: [PATCH 04/18] Group0D to 3D cleaned --- .../Geom/CommandNewArcCircleWithAngles.cpp | 1 + src/Core/Geom/EntityFactory.cpp | 1 + src/Core/Geom/GeomEntity.cpp | 2 +- src/Core/Group/CommandAddMeshModification.cpp | 8 -- src/Core/Group/Group0D.cpp | 62 +++---------- src/Core/Group/Group1D.cpp | 61 +++---------- src/Core/Group/Group2D.cpp | 76 +++------------- src/Core/Group/Group3D.cpp | 86 +++--------------- src/Core/Group/GroupEntity.cpp | 25 +---- src/Core/Group/GroupHelperForCommand.cpp | 1 + src/Core/Internal/CommandInternal.cpp | 3 +- src/Core/Internal/Context.cpp | 2 + src/Core/Internal/M3DCommandResult.cpp | 1 + src/Core/Mesh/CommandCreateMesh.cpp | 15 ++- src/Core/Mesh/CommandReadMLI.cpp | 1 + src/Core/Mesh/CommandTransformMesh.cpp | 1 + .../Mesh/MeshImplementationStructured.cpp | 2 + src/Core/Mesh/Volume.cpp | 1 + src/Core/Services/DescriptionService.cpp | 91 +++++++++++++++++-- .../SysCoord/CommandDuplicateSysCoord.cpp | 2 + src/Core/SysCoord/CommandEditSysCoord.cpp | 1 + src/Core/SysCoord/CommandNewSysCoord.cpp | 2 + src/Core/SysCoord/CommandRotateSysCoord.cpp | 1 + .../SysCoord/CommandTranslateSysCoord.cpp | 1 + src/Core/Topo/CommandDuplicateTopo.cpp | 1 + src/Core/Topo/CommandExtrudeFace.cpp | 1 + src/Core/Topo/CommandNewTopo.cpp | 1 + src/Core/Topo/CommandNewTopoOnGeometry.cpp | 1 + src/Core/Topo/ImportBlocksImplementation.cpp | 1 + src/Core/Topo/TopoManager.cpp | 1 + src/Core/protected/Geom/GeomEntity.h | 5 +- src/Core/protected/Geom/GeomEntityVisitor.h | 10 +- src/Core/protected/Group/Group0D.h | 63 +++---------- src/Core/protected/Group/Group1D.h | 64 +++---------- src/Core/protected/Group/Group2D.h | 64 +++---------- src/Core/protected/Group/Group3D.h | 63 +++---------- src/Core/protected/Group/GroupEntity.h | 29 +++--- src/Core/protected/Group/GroupEntityVisitor.h | 33 +++++++ .../protected/Group/GroupHelperForCommand.h | 15 ++- src/Core/protected/Internal/Context.h | 5 +- .../Mesh/MeshModificationByPythonFunction.h | 1 + .../protected/Services/DescriptionService.h | 24 +++-- .../QtGroupProjectionOnPlaneAction.cpp | 1 + src/QtComponents/QtGroupsPanel.cpp | 10 +- src/QtComponents/QtMgx3DEntityNamePanel.cpp | 3 +- src/QtComponents/QtMgx3DGroupNamePanel.cpp | 4 +- src/QtComponents/QtMgx3DMainWindow.cpp | 2 +- src/QtComponents/RenderingManager.cpp | 1 + .../QtComponents/QtMgx3DEntityNamePanel.h | 1 - .../QtComponents/QtMgx3DGroupNamePanel.h | 1 - 50 files changed, 316 insertions(+), 536 deletions(-) create mode 100644 src/Core/protected/Group/GroupEntityVisitor.h diff --git a/src/Core/Geom/CommandNewArcCircleWithAngles.cpp b/src/Core/Geom/CommandNewArcCircleWithAngles.cpp index 06781b30..765500ef 100644 --- a/src/Core/Geom/CommandNewArcCircleWithAngles.cpp +++ b/src/Core/Geom/CommandNewArcCircleWithAngles.cpp @@ -1,6 +1,7 @@ /*----------------------------------------------------------------------------*/ #include "Geom/CommandNewArcCircleWithAngles.h" #include "Geom/EntityFactory.h" +#include "SysCoord/SysCoord.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Geom/EntityFactory.cpp b/src/Core/Geom/EntityFactory.cpp index d45fc3b3..28f112f3 100644 --- a/src/Core/Geom/EntityFactory.cpp +++ b/src/Core/Geom/EntityFactory.cpp @@ -15,6 +15,7 @@ #include "Utils/Vector.h" #include "Utils/MgxException.h" #include "Utils/MgxNumeric.h" +#include "SysCoord/SysCoord.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Geom/GeomEntity.cpp b/src/Core/Geom/GeomEntity.cpp index 20df6aed..7349d1fe 100644 --- a/src/Core/Geom/GeomEntity.cpp +++ b/src/Core/Geom/GeomEntity.cpp @@ -92,7 +92,7 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const pts[i] = (barycentre + (pts[i] - barycentre) * shrink); } /*----------------------------------------------------------------------------*/ -Mgx3D::Utils::SerializedRepresentation* GeomEntity::getDescription (bool alsoComputed) const +Utils::SerializedRepresentation* GeomEntity::getDescription (bool alsoComputed) const { return Services::DescriptionService::getDescription(this, alsoComputed); } diff --git a/src/Core/Group/CommandAddMeshModification.cpp b/src/Core/Group/CommandAddMeshModification.cpp index d5eadb12..2cbec5c7 100644 --- a/src/Core/Group/CommandAddMeshModification.cpp +++ b/src/Core/Group/CommandAddMeshModification.cpp @@ -1,12 +1,4 @@ /*----------------------------------------------------------------------------*/ -/* - * \file CommandAddMeshModification.cpp - * - * \author Eric Brière de l'Isle - * - * \date 5 déc. 2013 - */ -/*----------------------------------------------------------------------------*/ #include "Group/CommandAddMeshModification.h" #include "Group/GroupEntity.h" #include "Utils/Command.h" diff --git a/src/Core/Group/Group0D.cpp b/src/Core/Group/Group0D.cpp index bf79c7e7..39c20f8a 100644 --- a/src/Core/Group/Group0D.cpp +++ b/src/Core/Group/Group0D.cpp @@ -1,59 +1,23 @@ -/*----------------------------------------------------------------------------*/ #include "Group/Group0D.h" #include "Internal/Context.h" -#include "Internal/EntitiesHelper.h" -#include "Geom/Vertex.h" -#include "Utils/SerializedRepresentation.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { +namespace Mgx3D::Group { /*----------------------------------------------------------------------------*/ const char* Group0D::typeNameGroup0D = "Group0D"; /*----------------------------------------------------------------------------*/ -Group0D::Group0D(Internal::Context& ctx, - const std::string & nom, - bool isDefaultGroup, - uint level) -: GroupEntity (ctx, - ctx.newProperty(Utils::Entity::Group0D, nom), - ctx.newDisplayProperties(Utils::Entity::Group0D), - isDefaultGroup, level) -{ -} -/*----------------------------------------------------------------------------*/ -Group0D::~Group0D() +Group0D::Group0D( + Internal::Context& ctx, + const std::string & nom, + bool isDefaultGroup, + uint level) +: GroupEntity( + ctx, + ctx.newProperty(Utils::Entity::Group0D, nom), + ctx.newDisplayProperties(Utils::Entity::Group0D), + isDefaultGroup, + level) { } /*----------------------------------------------------------------------------*/ -Utils::SerializedRepresentation* Group0D:: -getDescription (bool alsoComputed) const -{ - std::unique_ptr description ( - GroupEntity::getDescription (alsoComputed)); - - std::vector vertices = getFilteredEntities(); - if (!vertices.empty()){ - Utils::SerializedRepresentation sr ("Sommets géométriques", - TkUtil::NumericConversions::toStr(vertices.size())); - for (Geom::Vertex* v : vertices) - sr.addProperty(Utils::SerializedRepresentation::Property(v->getName(), *v)); - description->addPropertiesSet (sr); - } - - std::vector topo_vertices = getFilteredEntities(); - if (!topo_vertices.empty()){ - Utils::SerializedRepresentation sr ("Sommets topologiques", - TkUtil::NumericConversions::toStr(topo_vertices.size())); - for (Topo::Vertex* v : topo_vertices) - sr.addProperty(Utils::SerializedRepresentation::Property(v->getName(), *v)); - description->addPropertiesSet (sr); - } - - return description.release ( ); -} -/*----------------------------------------------------------------------------*/ -} // end namespace Group -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D +} // end namespace Mgx3D::Group /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Group/Group1D.cpp b/src/Core/Group/Group1D.cpp index a85df036..ee2af6a6 100644 --- a/src/Core/Group/Group1D.cpp +++ b/src/Core/Group/Group1D.cpp @@ -1,58 +1,23 @@ -/*----------------------------------------------------------------------------*/ #include "Group/Group1D.h" #include "Internal/Context.h" -#include "Internal/EntitiesHelper.h" -#include "Geom/Curve.h" -#include "Utils/SerializedRepresentation.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { +namespace Mgx3D::Group { /*----------------------------------------------------------------------------*/ const char* Group1D::typeNameGroup1D = "Group1D"; /*----------------------------------------------------------------------------*/ -Group1D::Group1D(Internal::Context& ctx, - const std::string & nom, - bool isDefaultGroup, uint level) -: GroupEntity (ctx, - ctx.newProperty(Utils::Entity::Group1D, nom), - ctx.newDisplayProperties(Utils::Entity::Group1D), - isDefaultGroup, level) -{ -} -/*----------------------------------------------------------------------------*/ -Group1D::~Group1D() +Group1D::Group1D( + Internal::Context& ctx, + const std::string & nom, + bool isDefaultGroup, + uint level) +: GroupEntity ( + ctx, + ctx.newProperty(Utils::Entity::Group1D, nom), + ctx.newDisplayProperties(Utils::Entity::Group1D), + isDefaultGroup, + level) { } /*----------------------------------------------------------------------------*/ -Utils::SerializedRepresentation* Group1D:: -getDescription (bool alsoComputed) const -{ - std::unique_ptr description ( - GroupEntity::getDescription (alsoComputed)); - - std::vector curves = getFilteredEntities(); - if (!curves.empty()){ - Utils::SerializedRepresentation sr ("Courbes géométriques", - TkUtil::NumericConversions::toStr(curves.size())); - for (Geom::Curve* curve : curves) - sr.addProperty(Utils::SerializedRepresentation::Property(curve->getName(), *curve)); - description->addPropertiesSet(sr); - } - - std::vector coedges = getFilteredEntities(); - if (!coedges.empty()){ - Utils::SerializedRepresentation sr ("Arêtes topologiques", - TkUtil::NumericConversions::toStr(coedges.size())); - for (Topo::CoEdge* coedge : coedges) - sr.addProperty(Utils::SerializedRepresentation::Property(coedge->getName(), *coedge)); - description->addPropertiesSet(sr); - } - - return description.release ( ); -} -/*----------------------------------------------------------------------------*/ -} // end namespace Group -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D +} // end namespace Mgx3D::Group /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Group/Group2D.cpp b/src/Core/Group/Group2D.cpp index 8ad858ef..385050b0 100644 --- a/src/Core/Group/Group2D.cpp +++ b/src/Core/Group/Group2D.cpp @@ -1,71 +1,23 @@ -/*----------------------------------------------------------------------------*/ -#include "Group/Group2D.h" +#include "Group/Group0D.h" #include "Internal/Context.h" -#include "Internal/EntitiesHelper.h" -#include "Geom/Surface.h" -#include "Utils/SerializedRepresentation.h" -#include "Mesh/Surface.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { +namespace Mgx3D::Group { /*----------------------------------------------------------------------------*/ const char* Group2D::typeNameGroup2D = "Group2D"; /*----------------------------------------------------------------------------*/ -Group2D::Group2D(Internal::Context& ctx, - const std::string & nom, - bool isDefaultGroup, - uint level) -: GroupEntity (ctx, - ctx.newProperty(Utils::Entity::Group2D, nom), - ctx.newDisplayProperties(Utils::Entity::Group2D), - isDefaultGroup, level) -{ -} -/*----------------------------------------------------------------------------*/ -Group2D::~Group2D() +Group2D::Group2D( + Internal::Context& ctx, + const std::string & nom, + bool isDefaultGroup, + uint level) +: GroupEntity( + ctx, + ctx.newProperty(Utils::Entity::Group2D, nom), + ctx.newDisplayProperties(Utils::Entity::Group2D), + isDefaultGroup, + level) { } /*----------------------------------------------------------------------------*/ -Utils::SerializedRepresentation* Group2D:: -getDescription (bool alsoComputed) const -{ - std::unique_ptr description ( - GroupEntity::getDescription (alsoComputed)); - - std::vector surfaces = getFilteredEntities(); - if (!surfaces.empty()){ - Utils::SerializedRepresentation sr ("Surfaces géométriques", - TkUtil::NumericConversions::toStr(surfaces.size())); - for (Geom::Surface* surface : surfaces) - sr.addProperty(Utils::SerializedRepresentation::Property(surface->getName(), *surface)); - description->addPropertiesSet(sr); - } - - std::vector cofaces = getFilteredEntities(); - if (!cofaces.empty()){ - Utils::SerializedRepresentation sr ("Faces topologiques", - TkUtil::NumericConversions::toStr(cofaces.size())); - for (Topo::CoFace* coface : cofaces) - sr.addProperty(Utils::SerializedRepresentation::Property(coface->getName ( ), *coface)); - description->addPropertiesSet(sr); - } - - // recherche du Mesh::Surface associé (suivant le nom) - Mesh::Surface* msurf = getContext().getMeshManager().getSurface(getName(), false); - if (msurf){ - Utils::SerializedRepresentation sr ("Surface maillage", std::string("1")); - sr.addProperty(Utils::SerializedRepresentation::Property (msurf->getName(), *msurf)); - description->addPropertiesSet(sr); - } else { - description->addProperty (Utils::SerializedRepresentation::Property( - "Surface maillage", std::string("Aucune"))); - } - - return description.release ( ); -} -/*----------------------------------------------------------------------------*/ -} // end namespace Group -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D +} // end namespace Mgx3D::Group /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Group/Group3D.cpp b/src/Core/Group/Group3D.cpp index f92df39d..0ad9bd7c 100644 --- a/src/Core/Group/Group3D.cpp +++ b/src/Core/Group/Group3D.cpp @@ -1,81 +1,23 @@ -/*----------------------------------------------------------------------------*/ -#include "Group/Group3D.h" +#include "Group/Group0D.h" #include "Internal/Context.h" -#include "Internal/EntitiesHelper.h" -#include "Geom/Volume.h" -#include "Mesh/Volume.h" -#include "Utils/SerializedRepresentation.h" -/*----------------------------------------------------------------------------*/ -#include -/*----------------------------------------------------------------------------*/ -namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { +namespace Mgx3D::Group { /*----------------------------------------------------------------------------*/ const char* Group3D::typeNameGroup3D = "Group3D"; /*----------------------------------------------------------------------------*/ -Group3D::Group3D(Internal::Context& ctx, - const std::string & nom, - bool isDefaultGroup, uint level) -: GroupEntity (ctx, - ctx.newProperty(Utils::Entity::Group3D, nom), - ctx.newDisplayProperties(Utils::Entity::Group3D), - isDefaultGroup, level) -{ -} -/*----------------------------------------------------------------------------*/ -Group3D::~Group3D() +Group3D::Group3D( + Internal::Context& ctx, + const std::string & nom, + bool isDefaultGroup, + uint level) +: GroupEntity( + ctx, + ctx.newProperty(Utils::Entity::Group3D, nom), + ctx.newDisplayProperties(Utils::Entity::Group3D), + isDefaultGroup, + level) { } /*----------------------------------------------------------------------------*/ -Utils::SerializedRepresentation* Group3D:: -getDescription (bool alsoComputed) const -{ - std::unique_ptr description ( - GroupEntity::getDescription (alsoComputed)); - - std::vector volumes = getFilteredEntities(); - if (!volumes.empty()){ - Utils::SerializedRepresentation sr ("Volumes géométriques", - TkUtil::NumericConversions::toStr(volumes.size())); - for (Geom::Volume* vol : volumes) - sr.addProperty(Utils::SerializedRepresentation::Property(vol->getName ( ), *vol)); - description->addPropertiesSet(sr); - } - - std::vector blocks = getFilteredEntities(); - if (!blocks.empty()){ - Utils::SerializedRepresentation sr ("Blocs topologiques", - TkUtil::NumericConversions::toStr(blocks.size())); - for (Topo::Block* b : blocks) - sr.addProperty(Utils::SerializedRepresentation::Property(b->getName ( ), *b)); - description->addPropertiesSet(sr); - } - - // recherche du Mesh::Volume associé (suivant le nom) - Mesh::Volume* mvol = getContext().getMeshManager().getVolume(getName(), false); - if (mvol){ - Utils::SerializedRepresentation sr ("Volume maillage", std::string("1")); - sr.addProperty(Utils::SerializedRepresentation::Property (mvol->getName(), *mvol)); - description->addPropertiesSet(sr); - } else { - description->addProperty(Utils::SerializedRepresentation::Property( - "Volume maillage", std::string("Aucun"))); - } - - std::vector scs = getFilteredEntities(); - if (!scs.empty()){ - Utils::SerializedRepresentation sr ("Repères", - TkUtil::NumericConversions::toStr(scs.size())); - for (CoordinateSystem::SysCoord* sc : scs) - sr.addProperty(Utils::SerializedRepresentation::Property(sc->getName(), *sc)); - description->addPropertiesSet(sr); - } - - return description.release ( ); -} -/*----------------------------------------------------------------------------*/ -} // end namespace Group -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D +} // end namespace Mgx3D::Group /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Group/GroupEntity.cpp b/src/Core/Group/GroupEntity.cpp index e37addef..7365daa8 100644 --- a/src/Core/Group/GroupEntity.cpp +++ b/src/Core/Group/GroupEntity.cpp @@ -23,13 +23,6 @@ GroupEntity::GroupEntity(Internal::Context& ctx, #endif } /*----------------------------------------------------------------------------*/ -GroupEntity::~GroupEntity() -{ -#ifdef _DEBUG2 - std::cout<<"GroupEntity::~GroupEntity() de "< description ( - InternalEntity::getDescription (alsoComputed)); - - description->addProperty(Utils::SerializedRepresentation::Property ("Niveau", (long)getLevel())); - - if (!m_meshModif.empty()){ - Utils::SerializedRepresentation modification ( - "Modification du maillage", ""); - for (std::vector::const_iterator iter = m_meshModif.begin(); - iter != m_meshModif.end(); ++iter) - - (*iter)->addToDescription(&modification); - - description->addPropertiesSet(modification); - } - - return description.release ( ); + return Services::DescriptionService::getDescription(this, alsoComputed); } /*----------------------------------------------------------------------------*/ void GroupEntity::remove(Utils::Entity* e, const bool exceptionIfNotFound) diff --git a/src/Core/Group/GroupHelperForCommand.cpp b/src/Core/Group/GroupHelperForCommand.cpp index ac3a2dde..3978a194 100644 --- a/src/Core/Group/GroupHelperForCommand.cpp +++ b/src/Core/Group/GroupHelperForCommand.cpp @@ -1,5 +1,6 @@ /*----------------------------------------------------------------------------*/ #include "Group/GroupHelperForCommand.h" +#include "Group/GroupManager.h" /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Internal/CommandInternal.cpp b/src/Core/Internal/CommandInternal.cpp index 1971cf2c..29349e72 100644 --- a/src/Core/Internal/CommandInternal.cpp +++ b/src/Core/Internal/CommandInternal.cpp @@ -1,7 +1,8 @@ /*----------------------------------------------------------------------------*/ #include "Internal/Context.h" -#include "Utils/Common.h" #include "Internal/CommandInternal.h" +#include "Utils/Common.h" +#include "Group/GroupManager.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Internal/Context.cpp b/src/Core/Internal/Context.cpp index b7c338a7..50bebbe6 100644 --- a/src/Core/Internal/Context.cpp +++ b/src/Core/Internal/Context.cpp @@ -34,6 +34,8 @@ #include "Mesh/CommandDestroyMesh.h" #include "Mesh/CommandChangeMeshDim.h" +#include "Group/GroupManager.h" + #include "SysCoord/SysCoordManager.h" extern TkUtil::PythonSession* createMgx3DPythonSession ( ); diff --git a/src/Core/Internal/M3DCommandResult.cpp b/src/Core/Internal/M3DCommandResult.cpp index 8b79321e..5c44cb13 100644 --- a/src/Core/Internal/M3DCommandResult.cpp +++ b/src/Core/Internal/M3DCommandResult.cpp @@ -6,6 +6,7 @@ #include "Geom/CommandEditGeom.h" #include "Geom/GeomEntity.h" #include "Mesh/MeshEntity.h" +#include "SysCoord/SysCoord.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Mesh/CommandCreateMesh.cpp b/src/Core/Mesh/CommandCreateMesh.cpp index 032de3d3..907c170d 100644 --- a/src/Core/Mesh/CommandCreateMesh.cpp +++ b/src/Core/Mesh/CommandCreateMesh.cpp @@ -1006,7 +1006,7 @@ meshAndModify(std::list& list_cofaces) CHECK_NULL_PTR_ERROR(surface); const std::vector& grps = surface->getGroups(); for (Group::Group2D* grp : grps){ - if (grp->getNbMeshModif() != 0) + if (!grp->getMeshModifications().empty()) list_grp.push_back(grp); } } // end if getGeomAssociation @@ -1014,7 +1014,7 @@ meshAndModify(std::list& list_cofaces) // les groupes depuis les faces std::vector grps = coface->getGroups(); for (Group::Group2D* grp : grps){ - if (grp->getNbMeshModif() != 0) + if (!grp->getMeshModifications().empty()) list_grp.push_back(grp); } @@ -1096,8 +1096,7 @@ meshAndModify(std::list& list_cofaces) std::cout<getName()<<" avec "<getNbMeshModif(); i++){ - Mesh::MeshModificationItf* modif = grp->getMeshModif(i); + for (Mesh::MeshModificationItf* modif : grp->getMeshModifications()){ MeshModificationBySepa* sepa = dynamic_cast(modif); MeshModificationByProjectionOnP0* proj = dynamic_cast(modif); @@ -1252,7 +1251,7 @@ modify(std::vector& list_blocks) const std::vector& grps = volume->getGroups(); for (Group::Group3D* grp : grps) { - if (grp->getNbMeshModif() != 0) + if (!grp->getMeshModifications().empty()) list_grp.push_back(grp); } // end for iter2 } // end if getGeomAssociation @@ -1264,7 +1263,7 @@ modify(std::vector& list_blocks) // les groupes depuis les blocs for (Group::Group3D* grp : block->getGroups()){ - if (grp->getNbMeshModif() != 0) + if (!grp->getMeshModifications().empty()) list_grp.push_back(grp); } } // end for iter1 @@ -1308,9 +1307,7 @@ modify(std::vector& list_blocks) std::cout<getName()<<" avec "<getNbMeshModif(); i++){ - Mesh::MeshModificationItf* modif = grp->getMeshModif(i); - + for (Mesh::MeshModificationItf* modif : grp->getMeshModifications()){ VolumicSmoothing* lissageVol = dynamic_cast(modif); MeshModificationByPythonFunction* pert = dynamic_cast(modif); diff --git a/src/Core/Mesh/CommandReadMLI.cpp b/src/Core/Mesh/CommandReadMLI.cpp index 493997e6..f52cab07 100644 --- a/src/Core/Mesh/CommandReadMLI.cpp +++ b/src/Core/Mesh/CommandReadMLI.cpp @@ -7,6 +7,7 @@ #include "Mesh/MeshImplementation.h" #include "Mesh/SubVolume.h" #include "Mesh/SubSurface.h" +#include "Group/GroupManager.h" #include "Group/Group3D.h" #include "Group/Group2D.h" /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Mesh/CommandTransformMesh.cpp b/src/Core/Mesh/CommandTransformMesh.cpp index 7ee2e309..759e5c21 100644 --- a/src/Core/Mesh/CommandTransformMesh.cpp +++ b/src/Core/Mesh/CommandTransformMesh.cpp @@ -6,6 +6,7 @@ #include "Mesh/Volume.h" #include "Mesh/Surface.h" #include "Mesh/Cloud.h" +#include "Group/GroupManager.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Mesh/MeshImplementationStructured.cpp b/src/Core/Mesh/MeshImplementationStructured.cpp index b4570512..7514a946 100644 --- a/src/Core/Mesh/MeshImplementationStructured.cpp +++ b/src/Core/Mesh/MeshImplementationStructured.cpp @@ -21,6 +21,8 @@ #include "Geom/Vertex.h" #include "Geom/Surface.h" #include "Geom/GeomProjectImplementation.h" + +#include "Group/GroupManager.h" /*----------------------------------------------------------------------------*/ /// TkUtil #include diff --git a/src/Core/Mesh/Volume.cpp b/src/Core/Mesh/Volume.cpp index cfa2ed89..38222cf7 100644 --- a/src/Core/Mesh/Volume.cpp +++ b/src/Core/Mesh/Volume.cpp @@ -11,6 +11,7 @@ #include "Topo/CoFace.h" #include "Topo/Face.h" #include "Topo/Block.h" +#include "Group/GroupManager.h" #include "Group/Group3D.h" /*----------------------------------------------------------------------------*/ #include diff --git a/src/Core/Services/DescriptionService.cpp b/src/Core/Services/DescriptionService.cpp index b780065d..493bb47a 100644 --- a/src/Core/Services/DescriptionService.cpp +++ b/src/Core/Services/DescriptionService.cpp @@ -11,6 +11,8 @@ #include "Group/Group1D.h" #include "Group/Group2D.h" #include "Group/Group3D.h" +#include "SysCoord/SysCoord.h" +#include "Mesh/MeshModificationItf.h" #include #include #include @@ -19,13 +21,6 @@ using Property = Mgx3D::Utils::SerializedRepresentation::Property; namespace Mgx3D::Services { - Utils::SerializedRepresentation *DescriptionService::getDescription(const Geom::GeomEntity *e, const bool alsoComputed) - { - DescriptionService ds(alsoComputed); - e->accept(ds); - return ds.m_representation; - } - DescriptionService::DescriptionService(const bool alsoComputed) : m_also_computed(alsoComputed), m_representation(nullptr) { @@ -190,6 +185,73 @@ namespace Mgx3D::Services m_representation->addPropertiesSet(propertyGeomDescription); } + void DescriptionService::visit(const Group::Group0D *e) + { + visitGroupEntity(e); + + auto vertices = e->getFilteredEntities(); + buildSerializedRepresentation(*m_representation, "Sommets géométriques", vertices); + + auto topo_vertices = e->getFilteredEntities(); + buildSerializedRepresentation(*m_representation, "Sommets topologiques", topo_vertices); + } + + void DescriptionService::visit(const Group::Group1D *e) + { + visitGroupEntity(e); + + auto curves = e->getFilteredEntities(); + buildSerializedRepresentation(*m_representation, "Courbes géométriques", curves); + + auto coedges = e->getFilteredEntities(); + buildSerializedRepresentation(*m_representation, "Arêtes topologiques", coedges); + } + + void DescriptionService::visit(const Group::Group2D *e) + { + visitGroupEntity(e); + + auto surfaces = e->getFilteredEntities(); + buildSerializedRepresentation(*m_representation, "Surfaces géométriques", surfaces); + + auto cofaces = e->getFilteredEntities(); + buildSerializedRepresentation(*m_representation, "Faces topologiques", cofaces); + + Mesh::Surface* msurf = e->getContext().getMeshManager().getSurface(e->getName(), false); + if (msurf){ + Utils::SerializedRepresentation sr ("Surface maillage", std::string("1")); + sr.addProperty(Utils::SerializedRepresentation::Property (msurf->getName(), *msurf)); + m_representation->addPropertiesSet(sr); + } else { + m_representation->addProperty (Utils::SerializedRepresentation::Property( + "Surface maillage", std::string("Aucune"))); + } + } + + void DescriptionService::visit(const Group::Group3D *e) + { + visitGroupEntity(e); + + auto volumes = e->getFilteredEntities(); + buildSerializedRepresentation(*m_representation, "Volumes géométriques", volumes); + + auto blocks = e->getFilteredEntities(); + buildSerializedRepresentation(*m_representation, "Blocs topologiques", blocks); + + Mesh::Volume* mvol = e->getContext().getMeshManager().getVolume(e->getName(), false); + if (mvol){ + Utils::SerializedRepresentation sr ("Volume maillage", std::string("1")); + sr.addProperty(Utils::SerializedRepresentation::Property (mvol->getName(), *mvol)); + m_representation->addPropertiesSet(sr); + } else { + m_representation->addProperty(Utils::SerializedRepresentation::Property( + "Volume maillage", std::string("Aucun"))); + } + + auto scs = e->getFilteredEntities(); + buildSerializedRepresentation(*m_representation, "Repères", scs); + } + void DescriptionService::visitEntity(const Utils::Entity *e) { m_representation = e->Utils::Entity::getDescription(m_also_computed); @@ -317,6 +379,21 @@ namespace Mgx3D::Services #endif } + void DescriptionService::visitGroupEntity(const Group::GroupEntity *e) + { + visitEntity(e); + m_representation->addProperty(Utils::SerializedRepresentation::Property ("Niveau", (long)e->getLevel())); + + auto mesh_modifs = e->getMeshModifications(); + if (!mesh_modifs.empty()) { + Utils::SerializedRepresentation modification("Modification du maillage", ""); + for (Mesh::MeshModificationItf* mesh_modif : mesh_modifs) + mesh_modif->addToDescription(&modification); + + m_representation->addPropertiesSet(modification); + } + } + template void DescriptionService:: buildSerializedRepresentation(Utils::SerializedRepresentation &description, const std::string &title, const Utils::EntitySet elements) const diff --git a/src/Core/SysCoord/CommandDuplicateSysCoord.cpp b/src/Core/SysCoord/CommandDuplicateSysCoord.cpp index b1a347ea..0d7c58f4 100644 --- a/src/Core/SysCoord/CommandDuplicateSysCoord.cpp +++ b/src/Core/SysCoord/CommandDuplicateSysCoord.cpp @@ -1,7 +1,9 @@ /*----------------------------------------------------------------------------*/ #include "Internal/Context.h" #include "Internal/InfoCommand.h" +#include "Group/GroupManager.h" #include "Group/Group3D.h" +#include "SysCoord/SysCoord.h" #include "SysCoord/CommandDuplicateSysCoord.h" /*----------------------------------------------------------------------------*/ #include diff --git a/src/Core/SysCoord/CommandEditSysCoord.cpp b/src/Core/SysCoord/CommandEditSysCoord.cpp index b16be3db..e1b39099 100644 --- a/src/Core/SysCoord/CommandEditSysCoord.cpp +++ b/src/Core/SysCoord/CommandEditSysCoord.cpp @@ -1,5 +1,6 @@ /*----------------------------------------------------------------------------*/ #include "Internal/Context.h" +#include "SysCoord/SysCoord.h" #include "SysCoord/CommandEditSysCoord.h" /*----------------------------------------------------------------------------*/ #include diff --git a/src/Core/SysCoord/CommandNewSysCoord.cpp b/src/Core/SysCoord/CommandNewSysCoord.cpp index fbdb3609..8d0ad5b8 100644 --- a/src/Core/SysCoord/CommandNewSysCoord.cpp +++ b/src/Core/SysCoord/CommandNewSysCoord.cpp @@ -1,7 +1,9 @@ /*----------------------------------------------------------------------------*/ #include "Internal/Context.h" #include "Internal/InfoCommand.h" +#include "Group/GroupManager.h" #include "Group/Group3D.h" +#include "SysCoord/SysCoord.h" #include "SysCoord/CommandNewSysCoord.h" #include "SysCoord/SysCoordManager.h" #include "SysCoord/SysCoordDisplayRepresentation.h" diff --git a/src/Core/SysCoord/CommandRotateSysCoord.cpp b/src/Core/SysCoord/CommandRotateSysCoord.cpp index f8991caf..0987e6d2 100644 --- a/src/Core/SysCoord/CommandRotateSysCoord.cpp +++ b/src/Core/SysCoord/CommandRotateSysCoord.cpp @@ -1,6 +1,7 @@ /*----------------------------------------------------------------------------*/ #include "Internal/Context.h" #include "Internal/InfoCommand.h" +#include "SysCoord/SysCoord.h" #include "SysCoord/CommandRotateSysCoord.h" #include "SysCoord/CommandDuplicateSysCoord.h" /*----------------------------------------------------------------------------*/ diff --git a/src/Core/SysCoord/CommandTranslateSysCoord.cpp b/src/Core/SysCoord/CommandTranslateSysCoord.cpp index 3d233831..4e439fbc 100644 --- a/src/Core/SysCoord/CommandTranslateSysCoord.cpp +++ b/src/Core/SysCoord/CommandTranslateSysCoord.cpp @@ -2,6 +2,7 @@ #include "Internal/Context.h" #include "Internal/InfoCommand.h" #include "Utils/Vector.h" +#include "SysCoord/SysCoord.h" #include "SysCoord/CommandTranslateSysCoord.h" #include "SysCoord/CommandDuplicateSysCoord.h" #include "SysCoord/SysCoordManager.h" diff --git a/src/Core/Topo/CommandDuplicateTopo.cpp b/src/Core/Topo/CommandDuplicateTopo.cpp index 7a4459bf..09283867 100644 --- a/src/Core/Topo/CommandDuplicateTopo.cpp +++ b/src/Core/Topo/CommandDuplicateTopo.cpp @@ -12,6 +12,7 @@ #include "Topo/EdgeMeshingPropertyInterpolate.h" #include "Group/Group3D.h" #include "Group/Group2D.h" +#include "Group/GroupManager.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Topo/CommandExtrudeFace.cpp b/src/Core/Topo/CommandExtrudeFace.cpp index 0ca15623..f92c4baa 100644 --- a/src/Core/Topo/CommandExtrudeFace.cpp +++ b/src/Core/Topo/CommandExtrudeFace.cpp @@ -20,6 +20,7 @@ #include "Group/Group2D.h" #include "Group/Group3D.h" +#include "Group/GroupManager.h" //#define _DEBUG_MESH_LAW /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Topo/CommandNewTopo.cpp b/src/Core/Topo/CommandNewTopo.cpp index 337866de..9fd29f7b 100644 --- a/src/Core/Topo/CommandNewTopo.cpp +++ b/src/Core/Topo/CommandNewTopo.cpp @@ -19,6 +19,7 @@ #include "Group/Group2D.h" #include "Group/Group1D.h" #include "Group/Group0D.h" +#include "Group/GroupManager.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Topo/CommandNewTopoOnGeometry.cpp b/src/Core/Topo/CommandNewTopoOnGeometry.cpp index 6085daa7..c22cf622 100644 --- a/src/Core/Topo/CommandNewTopoOnGeometry.cpp +++ b/src/Core/Topo/CommandNewTopoOnGeometry.cpp @@ -19,6 +19,7 @@ #include "Internal/EntitiesHelper.h" #include "Group/Group3D.h" #include "Group/Group2D.h" +#include "Group/GroupManager.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Topo/ImportBlocksImplementation.cpp b/src/Core/Topo/ImportBlocksImplementation.cpp index 23e1b7dd..e90e3dde 100644 --- a/src/Core/Topo/ImportBlocksImplementation.cpp +++ b/src/Core/Topo/ImportBlocksImplementation.cpp @@ -12,6 +12,7 @@ #include "Group/Group1D.h" #include "Group/Group2D.h" #include "Group/Group3D.h" +#include "Group/GroupManager.h" #include "Topo/EdgeMeshingPropertyGlobalInterpolate.h" /*----------------------------------------------------------------------------*/ #include diff --git a/src/Core/Topo/TopoManager.cpp b/src/Core/Topo/TopoManager.cpp index db5a1c4b..472e2f4f 100644 --- a/src/Core/Topo/TopoManager.cpp +++ b/src/Core/Topo/TopoManager.cpp @@ -89,6 +89,7 @@ #include "Geom/CommandScaling.h" #include "Geom/CommandMirroring.h" #include "Mesh/CommandAddRemoveGroupName.h" +#include "SysCoord/SysCoord.h" #ifdef USE_MDLPARSER #include "Internal/CommandChangeLengthUnit.h" #include "Topo/CommandImportBlocks.h" diff --git a/src/Core/protected/Geom/GeomEntity.h b/src/Core/protected/Geom/GeomEntity.h index fea60fa0..b3467d20 100644 --- a/src/Core/protected/Geom/GeomEntity.h +++ b/src/Core/protected/Geom/GeomEntity.h @@ -152,8 +152,7 @@ class GeomEntity : public Internal::InternalEntity{ * \param dr la représentation que l'on demande à afficher * \param Lève une exception si checkDestroyed vaut true */ - virtual void getRepresentation( - Mgx3D::Utils::DisplayRepresentation& dr, bool checkDestroyed) const; + virtual void getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const; /*------------------------------------------------------------------------*/ /** \brief Fournit une représentation textuelle de l'entité. @@ -162,7 +161,7 @@ class GeomEntity : public Internal::InternalEntity{ * optimisation) * \return Description, à détruire par l'appelant. */ - virtual Mgx3D::Utils::SerializedRepresentation* getDescription (bool alsoComputed) const; + virtual Utils::SerializedRepresentation* getDescription (bool alsoComputed) const; /*------------------------------------------------------------------------*/ /// Retourne les noms des groupes auxquels appartient cette entité diff --git a/src/Core/protected/Geom/GeomEntityVisitor.h b/src/Core/protected/Geom/GeomEntityVisitor.h index 8e36c0b1..ea0095ca 100644 --- a/src/Core/protected/Geom/GeomEntityVisitor.h +++ b/src/Core/protected/Geom/GeomEntityVisitor.h @@ -1,9 +1,8 @@ #ifndef GEOMENTITYVISITOR_H_ #define GEOMENTITYVISITOR_H_ /*----------------------------------------------------------------------------*/ -namespace Mgx3D { -/*----------------------------------------------------------------------------*/ -namespace Geom { +namespace Mgx3D::Geom +{ /*----------------------------------------------------------------------------*/ class Vertex; class Curve; @@ -18,6 +17,7 @@ struct ConstGeomEntityVisitor virtual void visit(const Volume*) = 0; virtual ~ConstGeomEntityVisitor() = default; }; +/*----------------------------------------------------------------------------*/ struct GeomEntityVisitor { virtual void visit(Vertex*) = 0; @@ -27,9 +27,7 @@ struct GeomEntityVisitor virtual ~GeomEntityVisitor() = default; }; /*----------------------------------------------------------------------------*/ -} // end namespace Geom -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D +} // end namespace Mgx3D::Geom /*----------------------------------------------------------------------------*/ #endif /* GEOMENTITYVISITOR_H_ */ /*----------------------------------------------------------------------------*/ \ No newline at end of file diff --git a/src/Core/protected/Group/Group0D.h b/src/Core/protected/Group/Group0D.h index ab8cbbc2..03151805 100644 --- a/src/Core/protected/Group/Group0D.h +++ b/src/Core/protected/Group/Group0D.h @@ -1,71 +1,32 @@ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_GROUP_GROUP0D_H_ #define MGX3D_GROUP_GROUP0D_H_ /*----------------------------------------------------------------------------*/ #include "Group/GroupEntity.h" -#include /*----------------------------------------------------------------------------*/ -namespace Mgx3D { - -namespace Internal { -class Context; -} +namespace Mgx3D::Internal { class Context; } /*----------------------------------------------------------------------------*/ -namespace Group { +namespace Mgx3D::Group { /*----------------------------------------------------------------------------*/ /** * \brief Groupe 0D. * Permet l'accès aux entités 0D appartenant à un même groupe, ainsi qu'aux entités * de niveaux inférieurs */ -class Group0D : public GroupEntity{ - +struct Group0D : public GroupEntity +{ static const char* typeNameGroup0D; - -public: static const uint DIM = 0; - /*------------------------------------------------------------------------*/ - /** \brief Constructeur. - */ - Group0D(Internal::Context& ctx, const std::string & nom, - bool isDefaultGroup, uint level=1); - - /*------------------------------------------------------------------------*/ - /** \brief Destructeur - */ - virtual ~Group0D(); - - /*------------------------------------------------------------------------*/ - /** \brief retourne la dimension du groupe - */ - int getDim() const {return DIM;} - - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) - */ - virtual std::string getTypeName() const {return typeNameGroup0D;} - - /*------------------------------------------------------------------------*/ - /** \brief Donne le type de l'objet - */ - virtual Utils::Entity::objectType getType() const {return Utils::Entity::Group0D;} - - /*------------------------------------------------------------------------*/ - /** \brief Fournit une représentation textuelle de l'entité. - * \param true si l'entité fourni la totalité de sa description, false si - * elle ne fournit que les informations non calculées (objectif : - * optimisation) - * \return Description, à détruire par l'appelant. - */ -#ifndef SWIG - virtual Mgx3D::Utils::SerializedRepresentation* getDescription (bool alsoComputed) const; -#endif + void accept(ConstGroupEntityVisitor& v) const override {v.visit(this);} + void accept(GroupEntityVisitor& v) override {v.visit(this);} + Group0D(Internal::Context& ctx, const std::string & nom, bool isDefaultGroup, uint level=1); + virtual ~Group0D() = default; + int getDim() const override {return DIM;} + std::string getTypeName() const override {return typeNameGroup0D;} + Utils::Entity::objectType getType() const override {return Utils::Entity::Group0D;} }; /*----------------------------------------------------------------------------*/ -} // end namespace Group -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D +} // end namespace Mgx3D::Group /*----------------------------------------------------------------------------*/ #endif /* MGX3D_GROUP_GROUP0D_H_ */ /*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Group/Group1D.h b/src/Core/protected/Group/Group1D.h index d6bc1e87..8e9990c3 100644 --- a/src/Core/protected/Group/Group1D.h +++ b/src/Core/protected/Group/Group1D.h @@ -1,72 +1,32 @@ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_GROUP_GROUP1D_H_ #define MGX3D_GROUP_GROUP1D_H_ /*----------------------------------------------------------------------------*/ #include "Group/GroupEntity.h" -#include /*----------------------------------------------------------------------------*/ -namespace Mgx3D { - -namespace Internal { -class Context; -} +namespace Mgx3D::Internal { class Context; } /*----------------------------------------------------------------------------*/ -namespace Group { +namespace Mgx3D::Group { /*----------------------------------------------------------------------------*/ /** * \brief Groupe 1D. * Permet l'accès aux entités 1D appartenant à un même groupe, ainsi qu'aux entités * de niveaux inférieurs */ -class Group1D : public GroupEntity{ - +struct Group1D : public GroupEntity +{ static const char* typeNameGroup1D; - -public: static const uint DIM = 1; - /*------------------------------------------------------------------------*/ - /** \brief Constructeur. - */ - Group1D(Internal::Context& ctx, const std::string & nom, - bool isDefaultGroup, uint level=1); - - /*------------------------------------------------------------------------*/ - /** \brief Destructeur - */ - virtual ~Group1D(); - - /*------------------------------------------------------------------------*/ - /** \brief retourne la dimension du groupe - */ - int getDim() const {return DIM;} - - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) - */ - virtual std::string getTypeName() const {return typeNameGroup1D;} - - /*------------------------------------------------------------------------*/ - /** \brief Donne le type de l'objet - */ - virtual Utils::Entity::objectType getType() const {return Utils::Entity::Group1D;} - - /*------------------------------------------------------------------------*/ - /** \brief Fournit une représentation textuelle de l'entité. - * \param true si l'entité fourni la totalité de sa description, false si - * elle ne fournit que les informations non calculées (objectif : - * optimisation) - * \return Description, à détruire par l'appelant. - */ -#ifndef SWIG - virtual Mgx3D::Utils::SerializedRepresentation* getDescription ( - bool alsoComputed) const; -#endif + void accept(ConstGroupEntityVisitor& v) const override {v.visit(this);} + void accept(GroupEntityVisitor& v) override {v.visit(this);} + Group1D(Internal::Context& ctx, const std::string & nom, bool isDefaultGroup, uint level=1); + virtual ~Group1D() = default; + int getDim() const override {return DIM;} + std::string getTypeName() const override {return typeNameGroup1D;} + Utils::Entity::objectType getType() const override {return Utils::Entity::Group1D;} }; /*----------------------------------------------------------------------------*/ -} // end namespace Group -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D +} // end namespace Mgx3D::Group /*----------------------------------------------------------------------------*/ #endif /* MGX3D_GROUP_GROUP1D_H_ */ /*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Group/Group2D.h b/src/Core/protected/Group/Group2D.h index 823ff630..5a4993bf 100644 --- a/src/Core/protected/Group/Group2D.h +++ b/src/Core/protected/Group/Group2D.h @@ -1,72 +1,32 @@ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_GROUP_GROUP2D_H_ #define MGX3D_GROUP_GROUP2D_H_ /*----------------------------------------------------------------------------*/ #include "Group/GroupEntity.h" -#include /*----------------------------------------------------------------------------*/ -namespace Mgx3D { - -namespace Internal { -class Context; -} +namespace Mgx3D::Internal { class Context; } /*----------------------------------------------------------------------------*/ -namespace Group { +namespace Mgx3D::Group { /*----------------------------------------------------------------------------*/ /** * \brief Groupe 2D. * Permet l'accès aux entités 2D appartenant à un même groupe, ainsi qu'aux entités * de niveaux inférieurs */ -class Group2D : public GroupEntity{ - +struct Group2D : public GroupEntity +{ static const char* typeNameGroup2D; - -public: static const uint DIM = 2; - /*------------------------------------------------------------------------*/ - /** \brief Constructeur. - */ - Group2D(Internal::Context& ctx, const std::string & nom, - bool isDefaultGroup, uint level=1); - - /*------------------------------------------------------------------------*/ - /** \brief Destructeur - */ - virtual ~Group2D(); - - /*------------------------------------------------------------------------*/ - /** \brief retourne la dimension du groupe - */ - int getDim() const {return DIM;} - - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) - */ - virtual std::string getTypeName() const {return typeNameGroup2D;} - - /*------------------------------------------------------------------------*/ - /** \brief Donne le type de l'objet - */ - virtual Utils::Entity::objectType getType() const {return Utils::Entity::Group2D;} - - /*------------------------------------------------------------------------*/ - /** \brief Fournit une représentation textuelle de l'entité. - * \param true si l'entité fourni la totalité de sa description, false si - * elle ne fournit que les informations non calculées (objectif : - * optimisation) - * \return Description, à détruire par l'appelant. - */ -#ifndef SWIG - virtual Mgx3D::Utils::SerializedRepresentation* getDescription ( - bool alsoComputed) const; -#endif + void accept(ConstGroupEntityVisitor& v) const override {v.visit(this);} + void accept(GroupEntityVisitor& v) override {v.visit(this);} + Group2D(Internal::Context& ctx, const std::string & nom, bool isDefaultGroup, uint level=1); + virtual ~Group2D() = default; + int getDim() const override {return DIM;} + std::string getTypeName() const override {return typeNameGroup2D;} + Utils::Entity::objectType getType() const override {return Utils::Entity::Group2D;} }; /*----------------------------------------------------------------------------*/ -} // end namespace Group -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D +} // end namespace Mgx3D::Group /*----------------------------------------------------------------------------*/ #endif /* MGX3D_GROUP_GROUP2D_H_ */ /*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Group/Group3D.h b/src/Core/protected/Group/Group3D.h index 0add7900..ca7173d9 100644 --- a/src/Core/protected/Group/Group3D.h +++ b/src/Core/protected/Group/Group3D.h @@ -1,71 +1,32 @@ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_GROUP_GROUP3D_H_ #define MGX3D_GROUP_GROUP3D_H_ /*----------------------------------------------------------------------------*/ #include "Group/GroupEntity.h" -#include /*----------------------------------------------------------------------------*/ -namespace Mgx3D { -namespace Internal { -class Context; -} +namespace Mgx3D::Internal { class Context; } /*----------------------------------------------------------------------------*/ -namespace Group { +namespace Mgx3D::Group { /*----------------------------------------------------------------------------*/ /** * \brief Groupe 3D. * Permet l'accès aux entités 3D appartenant à un même groupe, ainsi qu'aux entités * de niveaux inférieurs */ -class Group3D : public GroupEntity{ - +struct Group3D : public GroupEntity +{ static const char* typeNameGroup3D; - -public: static const uint DIM = 3; - /*------------------------------------------------------------------------*/ - /** \brief Constructeur. - */ - Group3D(Internal::Context& ctx, const std::string & nom, - bool isDefaultGroup, uint level=1); - - /*------------------------------------------------------------------------*/ - /** \brief Destructeur - */ - virtual ~Group3D(); - - /*------------------------------------------------------------------------*/ - /** \brief retourne la dimension du groupe - */ - int getDim() const {return DIM;} - - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) - */ - virtual std::string getTypeName() const {return typeNameGroup3D;} - - /*------------------------------------------------------------------------*/ - /** \brief Donne le type de l'objet - */ - virtual Utils::Entity::objectType getType() const {return Utils::Entity::Group3D;} - - /*------------------------------------------------------------------------*/ - /** \brief Fournit une représentation textuelle de l'entité. - * \param true si l'entité fourni la totalité de sa description, false si - * elle ne fournit que les informations non calculées (objectif : - * optimisation) - * \return Description, à détruire par l'appelant. - */ -#ifndef SWIG - virtual Mgx3D::Utils::SerializedRepresentation* getDescription ( - bool alsoComputed) const; -#endif + void accept(ConstGroupEntityVisitor& v) const override {v.visit(this);} + void accept(GroupEntityVisitor& v) override {v.visit(this);} + Group3D(Internal::Context& ctx, const std::string & nom, bool isDefaultGroup, uint level=1); + virtual ~Group3D() = default; + int getDim() const override {return DIM;} + std::string getTypeName() const override {return typeNameGroup3D;} + Utils::Entity::objectType getType() const override {return Utils::Entity::Group3D;} }; /*----------------------------------------------------------------------------*/ -} // end namespace Group -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D +} // end namespace Mgx3D::Group /*----------------------------------------------------------------------------*/ #endif /* MGX3D_GROUP_GROUP3D_H_ */ /*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Group/GroupEntity.h b/src/Core/protected/Group/GroupEntity.h index 84be081d..902de58e 100644 --- a/src/Core/protected/Group/GroupEntity.h +++ b/src/Core/protected/Group/GroupEntity.h @@ -1,15 +1,9 @@ /*----------------------------------------------------------------------------*/ -/** \file GroupEntity.h - * - * \author Eric Brière de l'Isle - * - * \date 18/10/2012 - */ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_GROUP_GROUPENTITY_H_ #define MGX3D_GROUP_GROUPENTITY_H_ /*----------------------------------------------------------------------------*/ #include "Internal/InternalEntity.h" +#include "Group/GroupEntityVisitor.h" /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -49,10 +43,13 @@ class GroupEntity : public Internal::InternalEntity{ uint level); public: + virtual void accept(ConstGroupEntityVisitor& visitor) const = 0 ; + virtual void accept(GroupEntityVisitor& visitor) = 0 ; + /*------------------------------------------------------------------------*/ /** \brief Destructeur */ - virtual ~GroupEntity(); + virtual ~GroupEntity() = default; /*------------------------------------------------------------------------*/ /** \brief détruit l'objet (mais pas ses dépendances !) @@ -60,8 +57,7 @@ class GroupEntity : public Internal::InternalEntity{ virtual void setDestroyed(bool b); /*------------------------------------------------------------------------*/ - virtual void getRepresentation( - Mgx3D::Utils::DisplayRepresentation& dr, bool checkDestroyed) const; + virtual void getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const; /*------------------------------------------------------------------------*/ /// Identification des groupes avec nom par défaut (type Hors_Groupe...) @@ -115,20 +111,17 @@ class GroupEntity : public Internal::InternalEntity{ * optimisation) * \return Description, à détruire par l'appelant. */ - virtual Mgx3D::Utils::SerializedRepresentation* getDescription (bool alsoComputed) const; + virtual Utils::SerializedRepresentation* getDescription (bool alsoComputed) const; /*------------------------------------------------------------------------*/ - /// Accesseur sur le id ème objet de modification du maillage pour un groupe - virtual Mesh::MeshModificationItf* getMeshModif(size_t id) {return m_meshModif[id];} - /// Ajout d'un objet de modification du maillage pour un groupe - virtual void addMeshModif(Mesh::MeshModificationItf* modif) {m_meshModif.push_back(modif);} + void addMeshModif(Mesh::MeshModificationItf* modif) {m_meshModif.push_back(modif);} /// Suppression du dernier objet de modification - virtual void popBackMeshModif() {m_meshModif.pop_back();} + void popBackMeshModif() {m_meshModif.pop_back();} - /// Retourne le nombre de modifications pour ce groupe - virtual size_t getNbMeshModif() {return m_meshModif.size();} + /// Accesseurs sur les modifications pour ce groupe + const std::vector& getMeshModifications() const {return m_meshModif;} #endif protected: diff --git a/src/Core/protected/Group/GroupEntityVisitor.h b/src/Core/protected/Group/GroupEntityVisitor.h new file mode 100644 index 00000000..da286aff --- /dev/null +++ b/src/Core/protected/Group/GroupEntityVisitor.h @@ -0,0 +1,33 @@ +#ifndef GROUPENTITYVISITOR_H_ +#define GROUPENTITYVISITOR_H_ +/*----------------------------------------------------------------------------*/ +namespace Mgx3D::Group +{ +/*----------------------------------------------------------------------------*/ +class Group0D; +class Group1D; +class Group2D; +class Group3D; +/*----------------------------------------------------------------------------*/ +struct ConstGroupEntityVisitor +{ + virtual void visit(const Group0D*) = 0; + virtual void visit(const Group1D*) = 0; + virtual void visit(const Group2D*) = 0; + virtual void visit(const Group3D*) = 0; + virtual ~ConstGroupEntityVisitor() = default; +}; +/*----------------------------------------------------------------------------*/ +struct GroupEntityVisitor +{ + virtual void visit(Group0D*) = 0; + virtual void visit(Group1D*) = 0; + virtual void visit(Group2D*) = 0; + virtual void visit(Group3D*) = 0; + virtual ~GroupEntityVisitor() = default; +}; +/*----------------------------------------------------------------------------*/ +} // end namespace Mgx3D::Group +/*----------------------------------------------------------------------------*/ +#endif /* GROUPENTITYVISITOR_H_ */ +/*----------------------------------------------------------------------------*/ \ No newline at end of file diff --git a/src/Core/protected/Group/GroupHelperForCommand.h b/src/Core/protected/Group/GroupHelperForCommand.h index c2e4a7db..9563b18a 100644 --- a/src/Core/protected/Group/GroupHelperForCommand.h +++ b/src/Core/protected/Group/GroupHelperForCommand.h @@ -3,12 +3,25 @@ #define GROUP_HELPER_FOR_COMMAND_H_ /*----------------------------------------------------------------------------*/ #include "Internal/InfoCommand.h" -#include "Group/GroupManager.h" +#include "Group/Group0D.h" +#include "Group/Group1D.h" +#include "Group/Group2D.h" +#include "Group/Group3D.h" +#include "Topo/Block.h" +#include "Topo/CoFace.h" +#include "Topo/CoEdge.h" +#include "Topo/Vertex.h" +#include "Geom/Volume.h" +#include "Geom/Surface.h" +#include "Geom/Curve.h" +#include "Geom/Vertex.h" /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ namespace Group { /*----------------------------------------------------------------------------*/ +class GroupManager; +/*----------------------------------------------------------------------------*/ class GroupHelperForCommand { public: diff --git a/src/Core/protected/Internal/Context.h b/src/Core/protected/Internal/Context.h index 943f9de2..c5b6ad50 100644 --- a/src/Core/protected/Internal/Context.h +++ b/src/Core/protected/Internal/Context.h @@ -14,7 +14,6 @@ #include "Geom/GeomManager.h" #include "Topo/TopoManager.h" #include "Mesh/MeshManager.h" -#include "Group/GroupManager.h" #include "SysCoord/SysCoordManager.h" #include "Structured/StructuredMeshManager.h" /*----------------------------------------------------------------------------*/ @@ -41,7 +40,9 @@ namespace Mesh { class CommandChangeMeshDim; class MeshImplementation; } - +namespace Group { + class GroupManager; +} typedef void (*fSignalFunc)(int); /*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Mesh/MeshModificationByPythonFunction.h b/src/Core/protected/Mesh/MeshModificationByPythonFunction.h index fdab7f87..9c894d2c 100644 --- a/src/Core/protected/Mesh/MeshModificationByPythonFunction.h +++ b/src/Core/protected/Mesh/MeshModificationByPythonFunction.h @@ -12,6 +12,7 @@ /*----------------------------------------------------------------------------*/ #include "Mesh/MeshModificationItf.h" #include +#include /*----------------------------------------------------------------------------*/ namespace gmds{ class Node; diff --git a/src/Core/protected/Services/DescriptionService.h b/src/Core/protected/Services/DescriptionService.h index e620a1ad..b87c4ae5 100644 --- a/src/Core/protected/Services/DescriptionService.h +++ b/src/Core/protected/Services/DescriptionService.h @@ -4,11 +4,10 @@ #include "Utils/Entity.h" #include "Utils/SerializedRepresentation.h" #include "Geom/GeomEntityVisitor.h" +#include "Group/GroupEntityVisitor.h" -namespace Mgx3D::Geom -{ - class GeomEntity; -} +namespace Mgx3D::Geom { class GeomEntity; } +namespace Mgx3D::Group { class GroupEntity; } /** * - voir si alsoComputed est vraiment utile, pas réussi à comprendre comment Qt le passe à vrai @@ -16,21 +15,34 @@ namespace Mgx3D::Geom */ namespace Mgx3D::Services { - class DescriptionService : public Geom::ConstGeomEntityVisitor + class DescriptionService : public Geom::ConstGeomEntityVisitor, public Group::ConstGroupEntityVisitor { public: - static Utils::SerializedRepresentation* getDescription(const Geom::GeomEntity* e, const bool alsoComputed); + template ::value>> + static Utils::SerializedRepresentation* getDescription(const T* e, const bool alsoComputed) + { + DescriptionService ds(alsoComputed); + e->accept(ds); + return ds.m_representation; + } DescriptionService(const bool alsoComputed); ~DescriptionService() override = default; + void visit(const Geom::Vertex*) override; void visit(const Geom::Curve*) override; void visit(const Geom::Surface*) override; void visit(const Geom::Volume*) override; + void visit(const Group::Group0D*) override; + void visit(const Group::Group1D*) override; + void visit(const Group::Group2D*) override; + void visit(const Group::Group3D*) override; + private: void visitEntity(const Utils::Entity*); void visitGeomEntity(const Geom::GeomEntity*); + void visitGroupEntity(const Group::GroupEntity*); template void buildSerializedRepresentation(Utils::SerializedRepresentation &description, const std::string &title, const Utils::EntitySet elements) const; diff --git a/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp b/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp index 1bb3c3ca..885b8a5f 100644 --- a/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp +++ b/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp @@ -9,6 +9,7 @@ #include "Utils/Common.h" #include "Utils/ValidatedField.h" #include "Group/Group2D.h" +#include "Group/GroupManager.h" #include #include "QtComponents/QtGroupProjectionOnPlaneAction.h" #include "QtComponents/QtMgx3DApplication.h" diff --git a/src/QtComponents/QtGroupsPanel.cpp b/src/QtComponents/QtGroupsPanel.cpp index b08396e6..fa36a1dd 100644 --- a/src/QtComponents/QtGroupsPanel.cpp +++ b/src/QtComponents/QtGroupsPanel.cpp @@ -8,6 +8,11 @@ #include "Utils/Common.h" #include "Internal/SelectionManagerDimFilter.h" +#include "Group/GroupManager.h" +#include "Group/Group0D.h" +#include "Group/Group1D.h" +#include "Group/Group2D.h" +#include "Group/Group3D.h" #include "Geom/Volume.h" #include "Geom/Surface.h" #include "Geom/Curve.h" @@ -26,11 +31,6 @@ #include "QtComponents/QtMgx3DApplication.h" #include #include "QtComponents/QtExpansionTreeRestorer.h" -#include "Group/GroupManager.h" -#include "Group/Group0D.h" -#include "Group/Group1D.h" -#include "Group/Group2D.h" -#include "Group/Group3D.h" #include #include diff --git a/src/QtComponents/QtMgx3DEntityNamePanel.cpp b/src/QtComponents/QtMgx3DEntityNamePanel.cpp index 4e337324..ea427fea 100644 --- a/src/QtComponents/QtMgx3DEntityNamePanel.cpp +++ b/src/QtComponents/QtMgx3DEntityNamePanel.cpp @@ -7,13 +7,12 @@ #include "Internal/Context.h" #include "Utils/Common.h" -#include "QtComponents/QtMgx3DEntityNamePanel.h" - #include "Group/Group0D.h" #include "Group/Group1D.h" #include "Group/Group2D.h" #include "Group/Group3D.h" #include "Group/GroupManager.h" +#include "QtComponents/QtMgx3DEntityNamePanel.h" #include #include diff --git a/src/QtComponents/QtMgx3DGroupNamePanel.cpp b/src/QtComponents/QtMgx3DGroupNamePanel.cpp index b5022225..ea5a697f 100644 --- a/src/QtComponents/QtMgx3DGroupNamePanel.cpp +++ b/src/QtComponents/QtMgx3DGroupNamePanel.cpp @@ -5,15 +5,13 @@ */ #include "Internal/Context.h" - #include "Utils/Common.h" -#include "QtComponents/QtMgx3DGroupNamePanel.h" - #include "Group/Group0D.h" #include "Group/Group1D.h" #include "Group/Group2D.h" #include "Group/Group3D.h" #include "Group/GroupManager.h" +#include "QtComponents/QtMgx3DGroupNamePanel.h" #include #include diff --git a/src/QtComponents/QtMgx3DMainWindow.cpp b/src/QtComponents/QtMgx3DMainWindow.cpp index 519ea90e..eb6b64a4 100644 --- a/src/QtComponents/QtMgx3DMainWindow.cpp +++ b/src/QtComponents/QtMgx3DMainWindow.cpp @@ -5,7 +5,7 @@ */ #include "Internal/Context.h" - +#include "Group/GroupManager.h" #include "Utils/Command.h" #include "Utils/Magix3DEvents.h" #include "Utils/Point.h" diff --git a/src/QtComponents/RenderingManager.cpp b/src/QtComponents/RenderingManager.cpp index 82bc14e7..cacedbfa 100644 --- a/src/QtComponents/RenderingManager.cpp +++ b/src/QtComponents/RenderingManager.cpp @@ -6,6 +6,7 @@ #include "Internal/Context.h" #include "Internal/Resources.h" +#include "Group/GroupManager.h" #include "QtComponents/RenderingManager.h" #include "QtComponents/QtMgx3DApplication.h" #include "Geom/GeomDisplayRepresentation.h" diff --git a/src/QtComponents/protected/QtComponents/QtMgx3DEntityNamePanel.h b/src/QtComponents/protected/QtComponents/QtMgx3DEntityNamePanel.h index 7116f883..88043f03 100644 --- a/src/QtComponents/protected/QtComponents/QtMgx3DEntityNamePanel.h +++ b/src/QtComponents/protected/QtComponents/QtMgx3DEntityNamePanel.h @@ -11,7 +11,6 @@ #include "Internal/Context.h" #include "Utils/ValidatedField.h" -#include "Group/GroupManager.h" #include "QtComponents/QtMgx3DMainWindow.h" #include "QtComponents/QtEntityIDTextField.h" diff --git a/src/QtComponents/protected/QtComponents/QtMgx3DGroupNamePanel.h b/src/QtComponents/protected/QtComponents/QtMgx3DGroupNamePanel.h index 81e9966b..a19893b3 100644 --- a/src/QtComponents/protected/QtComponents/QtMgx3DGroupNamePanel.h +++ b/src/QtComponents/protected/QtComponents/QtMgx3DGroupNamePanel.h @@ -8,7 +8,6 @@ #include "Utils/ValidatedField.h" -#include "Group/GroupManager.h" #include "QtComponents/QtMgx3DMainWindow.h" #include From defc53207b09f407e3816e305fed6bdc0dddbd0a Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Tue, 21 Oct 2025 11:01:45 +0200 Subject: [PATCH 05/18] Group0D to 3D templated --- src/Core/Geom/CommandCreateGeom.cpp | 4 --- src/Core/Geom/CommandEditGeom.cpp | 5 +-- src/Core/Geom/CommandExtrudeDirection.cpp | 1 - src/Core/Geom/CommandExtrudeRevolution.cpp | 2 -- src/Core/Geom/CommandExtrusion.cpp | 5 +-- src/Core/Geom/CommandJoinCurves.cpp | 2 +- src/Core/Geom/CommandJoinSurfaces.cpp | 2 +- src/Core/Geom/CommandSectionByPlane.cpp | 5 +-- src/Core/Geom/Curve.cpp | 1 - src/Core/Geom/GeomEntity.cpp | 5 +-- src/Core/Geom/GeomImport.cpp | 5 +-- src/Core/Geom/ImportCATIAImplementation.cpp | 1 - src/Core/Geom/ImportSTLImplementation.cpp | 1 - src/Core/Geom/Surface_Geom.cpp | 1 - src/Core/Geom/Vertex_Geom.cpp | 1 - src/Core/Geom/Volume_Geom.cpp | 1 - src/Core/Group/Group0D.cpp | 23 ------------- src/Core/Group/Group1D.cpp | 23 ------------- src/Core/Group/Group2D.cpp | 23 ------------- src/Core/Group/Group3D.cpp | 23 ------------- src/Core/Group/GroupEntity.cpp | 23 +++++++++++++ src/Core/Group/GroupManager.cpp | 4 --- src/Core/Internal/ImportMDL2Commandes.cpp | 4 +-- src/Core/Internal/ImportMDLImplementation.cpp | 4 +-- src/Core/Internal/ImportMDLItf.cpp | 4 +-- src/Core/Mesh/CommandAddRemoveGroupName.cpp | 5 +-- src/Core/Mesh/CommandClearGroupName.cpp | 5 +-- src/Core/Mesh/CommandCreateMesh.cpp | 3 +- .../CommandCreateSubVolumeBetweenSheets.cpp | 2 +- src/Core/Mesh/CommandMeshExplorer.cpp | 2 +- src/Core/Mesh/CommandReadMLI.cpp | 3 +- src/Core/Mesh/Volume.cpp | 1 - src/Core/Services/DescriptionService.cpp | 5 +-- .../SysCoord/CommandDuplicateSysCoord.cpp | 2 +- src/Core/SysCoord/CommandNewSysCoord.cpp | 2 +- src/Core/Topo/Block.cpp | 1 - src/Core/Topo/CoEdge.cpp | 1 - src/Core/Topo/CoFace.cpp | 2 -- src/Core/Topo/CommandDuplicateTopo.cpp | 3 +- src/Core/Topo/CommandExtrudeFace.cpp | 4 +-- src/Core/Topo/CommandNewTopo.cpp | 5 +-- src/Core/Topo/CommandNewTopoOnGeometry.cpp | 3 +- src/Core/Topo/CommandSplitBlocksWithOgrid.cpp | 3 +- src/Core/Topo/CommandSplitFacesWithOgrid.cpp | 2 +- src/Core/Topo/ImportBlocksImplementation.cpp | 8 ++--- src/Core/Topo/Vertex.cpp | 1 - src/Core/protected/Geom/Curve.h | 5 +-- src/Core/protected/Geom/Surface.h | 6 +--- src/Core/protected/Geom/Vertex.h | 5 +-- src/Core/protected/Geom/Volume.h | 5 +-- src/Core/protected/Group/Group0D.h | 32 ------------------- src/Core/protected/Group/Group1D.h | 32 ------------------- src/Core/protected/Group/Group2D.h | 32 ------------------- src/Core/protected/Group/Group3D.h | 32 ------------------- src/Core/protected/Group/GroupEntity.h | 28 ++++++++++++++-- src/Core/protected/Group/GroupEntityVisitor.h | 7 ++-- .../protected/Group/GroupHelperForCommand.h | 5 +-- src/Core/protected/Group/GroupManager.h | 5 +-- .../protected/Internal/M3DCommandResult.h | 5 +-- .../CommandCreateSubVolumeBetweenSheets.h | 3 -- src/Core/protected/Mesh/CommandMeshExplorer.h | 3 -- src/Core/protected/Services/MementoService.h | 10 +----- src/Core/protected/Topo/BlockTopoProperty.h | 4 +-- src/Core/protected/Topo/CoEdgeTopoProperty.h | 4 +-- src/Core/protected/Topo/CoFaceTopoProperty.h | 4 +-- src/Core/protected/Topo/VertexTopoProperty.h | 4 +-- .../QtGroupProjectionOnPlaneAction.cpp | 2 +- src/QtComponents/QtGroupsPanel.cpp | 5 +-- src/QtComponents/QtMgx3DEntityNamePanel.cpp | 5 +-- src/QtComponents/QtMgx3DGroupNamePanel.cpp | 5 +-- 70 files changed, 94 insertions(+), 390 deletions(-) delete mode 100644 src/Core/Group/Group0D.cpp delete mode 100644 src/Core/Group/Group1D.cpp delete mode 100644 src/Core/Group/Group2D.cpp delete mode 100644 src/Core/Group/Group3D.cpp delete mode 100644 src/Core/protected/Group/Group0D.h delete mode 100644 src/Core/protected/Group/Group1D.h delete mode 100644 src/Core/protected/Group/Group2D.h delete mode 100644 src/Core/protected/Group/Group3D.h diff --git a/src/Core/Geom/CommandCreateGeom.cpp b/src/Core/Geom/CommandCreateGeom.cpp index 32c46c35..2cb9cb85 100644 --- a/src/Core/Geom/CommandCreateGeom.cpp +++ b/src/Core/Geom/CommandCreateGeom.cpp @@ -10,10 +10,6 @@ #include "Geom/Vertex.h" #include "Geom/GeomSplitImplementation.h" #include "Group/GroupManager.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Geom/CommandEditGeom.cpp b/src/Core/Geom/CommandEditGeom.cpp index b508bb93..f6d4119d 100644 --- a/src/Core/Geom/CommandEditGeom.cpp +++ b/src/Core/Geom/CommandEditGeom.cpp @@ -10,10 +10,7 @@ #include "Geom/Curve.h" #include "Geom/Vertex.h" #include "Group/GroupManager.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Geom/CommandExtrudeDirection.cpp b/src/Core/Geom/CommandExtrudeDirection.cpp index e53a0986..6922d8a8 100644 --- a/src/Core/Geom/CommandExtrudeDirection.cpp +++ b/src/Core/Geom/CommandExtrudeDirection.cpp @@ -6,7 +6,6 @@ #include "Geom/Surface.h" #include "Geom/Curve.h" #include "Geom/Vertex.h" -#include "Group/Group3D.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Geom/CommandExtrudeRevolution.cpp b/src/Core/Geom/CommandExtrudeRevolution.cpp index 45047bc4..a29f623d 100644 --- a/src/Core/Geom/CommandExtrudeRevolution.cpp +++ b/src/Core/Geom/CommandExtrudeRevolution.cpp @@ -4,8 +4,6 @@ #include "Geom/GeomRevolImplementation.h" #include "Geom/Curve.h" #include "Geom/Vertex.h" -#include "Group/Group3D.h" -#include "Group/Group1D.h" #include "Group/GroupManager.h" #include "Utils/Rotation.h" /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Geom/CommandExtrusion.cpp b/src/Core/Geom/CommandExtrusion.cpp index 7757f813..361567fe 100644 --- a/src/Core/Geom/CommandExtrusion.cpp +++ b/src/Core/Geom/CommandExtrusion.cpp @@ -5,10 +5,7 @@ #include "Geom/Surface.h" #include "Geom/Curve.h" #include "Geom/Vertex.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" +#include "Group/GroupEntity.h" #include "Group/GroupManager.h" /*----------------------------------------------------------------------------*/ #include diff --git a/src/Core/Geom/CommandJoinCurves.cpp b/src/Core/Geom/CommandJoinCurves.cpp index bcb45426..b2a4a237 100644 --- a/src/Core/Geom/CommandJoinCurves.cpp +++ b/src/Core/Geom/CommandJoinCurves.cpp @@ -4,7 +4,7 @@ #include "Geom/Curve.h" #include "Geom/Surface.h" #include "Geom/CommandJoinCurves.h" -#include "Group/Group1D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Geom/CommandJoinSurfaces.cpp b/src/Core/Geom/CommandJoinSurfaces.cpp index 50d38790..a7570e8b 100644 --- a/src/Core/Geom/CommandJoinSurfaces.cpp +++ b/src/Core/Geom/CommandJoinSurfaces.cpp @@ -4,7 +4,7 @@ #include "Geom/Surface.h" #include "Geom/Volume.h" #include "Geom/CommandJoinSurfaces.h" -#include "Group/Group2D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Geom/CommandSectionByPlane.cpp b/src/Core/Geom/CommandSectionByPlane.cpp index 1122ff8e..460687e3 100644 --- a/src/Core/Geom/CommandSectionByPlane.cpp +++ b/src/Core/Geom/CommandSectionByPlane.cpp @@ -6,10 +6,7 @@ #include "Geom/Curve.h" #include "Geom/Vertex.h" #include "Group/GroupManager.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Geom/Curve.cpp b/src/Core/Geom/Curve.cpp index 2c1dbc43..41c4504f 100644 --- a/src/Core/Geom/Curve.cpp +++ b/src/Core/Geom/Curve.cpp @@ -8,7 +8,6 @@ #include "Geom/EntityFactory.h" #include "Geom/OCCHelper.h" #include "Geom/GeomProjectImplementation.h" -#include "Group/Group1D.h" #include "Internal/EntitiesHelper.h" /*----------------------------------------------------------------------------*/ #include diff --git a/src/Core/Geom/GeomEntity.cpp b/src/Core/Geom/GeomEntity.cpp index 7349d1fe..02fde0f5 100644 --- a/src/Core/Geom/GeomEntity.cpp +++ b/src/Core/Geom/GeomEntity.cpp @@ -12,10 +12,7 @@ /*----------------------------------------------------------------------------*/ #include "Services/DescriptionService.h" /*----------------------------------------------------------------------------*/ -#include "Group/Group0D.h" -#include "Group/Group1D.h" -#include "Group/Group2D.h" -#include "Group/Group3D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Geom/GeomImport.cpp b/src/Core/Geom/GeomImport.cpp index 4911da02..f33f0b21 100644 --- a/src/Core/Geom/GeomImport.cpp +++ b/src/Core/Geom/GeomImport.cpp @@ -8,10 +8,7 @@ #include "Geom/OCCHelper.h" #include "Geom/GeomSplitImplementation.h" #include "Group/GroupManager.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" +#include "Group/GroupEntity.h" #include "Internal/InfoCommand.h" /*----------------------------------------------------------------------------*/ #include diff --git a/src/Core/Geom/ImportCATIAImplementation.cpp b/src/Core/Geom/ImportCATIAImplementation.cpp index 98da3a93..a6d6c859 100644 --- a/src/Core/Geom/ImportCATIAImplementation.cpp +++ b/src/Core/Geom/ImportCATIAImplementation.cpp @@ -1,7 +1,6 @@ /*----------------------------------------------------------------------------*/ #include "Geom/ImportCATIAImplementation.h" #include "Geom/EntityFactory.h" -#include "Group/Group0D.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Geom/ImportSTLImplementation.cpp b/src/Core/Geom/ImportSTLImplementation.cpp index e4c794cf..3471db98 100644 --- a/src/Core/Geom/ImportSTLImplementation.cpp +++ b/src/Core/Geom/ImportSTLImplementation.cpp @@ -1,7 +1,6 @@ /*----------------------------------------------------------------------------*/ #include "Geom/ImportSTLImplementation.h" #include "Geom/Vertex.h" -#include "Group/Group0D.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Geom/Surface_Geom.cpp b/src/Core/Geom/Surface_Geom.cpp index d849234f..cbea21ab 100644 --- a/src/Core/Geom/Surface_Geom.cpp +++ b/src/Core/Geom/Surface_Geom.cpp @@ -6,7 +6,6 @@ #include "Geom/OCCHelper.h" #include "Geom/EntityFactory.h" #include "Geom/GeomProjectImplementation.h" -#include "Group/Group2D.h" #include "Internal/EntitiesHelper.h" /*----------------------------------------------------------------------------*/ #include diff --git a/src/Core/Geom/Vertex_Geom.cpp b/src/Core/Geom/Vertex_Geom.cpp index e38c4ded..a64a6ac8 100644 --- a/src/Core/Geom/Vertex_Geom.cpp +++ b/src/Core/Geom/Vertex_Geom.cpp @@ -3,7 +3,6 @@ #include "Geom/Curve.h" #include "Geom/Surface.h" #include "Geom/OCCHelper.h" -#include "Group/Group0D.h" #include "Internal/Context.h" #include "Internal/EntitiesHelper.h" /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Geom/Volume_Geom.cpp b/src/Core/Geom/Volume_Geom.cpp index 84d6bfd4..46b60969 100644 --- a/src/Core/Geom/Volume_Geom.cpp +++ b/src/Core/Geom/Volume_Geom.cpp @@ -4,7 +4,6 @@ #include "Geom/Surface.h" #include "Geom/Volume.h" #include "Geom/OCCHelper.h" -#include "Group/Group3D.h" #include "Internal/Context.h" #include "Internal/EntitiesHelper.h" /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Group/Group0D.cpp b/src/Core/Group/Group0D.cpp deleted file mode 100644 index 39c20f8a..00000000 --- a/src/Core/Group/Group0D.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "Group/Group0D.h" -#include "Internal/Context.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Group { -/*----------------------------------------------------------------------------*/ -const char* Group0D::typeNameGroup0D = "Group0D"; -/*----------------------------------------------------------------------------*/ -Group0D::Group0D( - Internal::Context& ctx, - const std::string & nom, - bool isDefaultGroup, - uint level) -: GroupEntity( - ctx, - ctx.newProperty(Utils::Entity::Group0D, nom), - ctx.newDisplayProperties(Utils::Entity::Group0D), - isDefaultGroup, - level) -{ -} -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D::Group -/*----------------------------------------------------------------------------*/ diff --git a/src/Core/Group/Group1D.cpp b/src/Core/Group/Group1D.cpp deleted file mode 100644 index ee2af6a6..00000000 --- a/src/Core/Group/Group1D.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "Group/Group1D.h" -#include "Internal/Context.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Group { -/*----------------------------------------------------------------------------*/ -const char* Group1D::typeNameGroup1D = "Group1D"; -/*----------------------------------------------------------------------------*/ -Group1D::Group1D( - Internal::Context& ctx, - const std::string & nom, - bool isDefaultGroup, - uint level) -: GroupEntity ( - ctx, - ctx.newProperty(Utils::Entity::Group1D, nom), - ctx.newDisplayProperties(Utils::Entity::Group1D), - isDefaultGroup, - level) -{ -} -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D::Group -/*----------------------------------------------------------------------------*/ diff --git a/src/Core/Group/Group2D.cpp b/src/Core/Group/Group2D.cpp deleted file mode 100644 index 385050b0..00000000 --- a/src/Core/Group/Group2D.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "Group/Group0D.h" -#include "Internal/Context.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Group { -/*----------------------------------------------------------------------------*/ -const char* Group2D::typeNameGroup2D = "Group2D"; -/*----------------------------------------------------------------------------*/ -Group2D::Group2D( - Internal::Context& ctx, - const std::string & nom, - bool isDefaultGroup, - uint level) -: GroupEntity( - ctx, - ctx.newProperty(Utils::Entity::Group2D, nom), - ctx.newDisplayProperties(Utils::Entity::Group2D), - isDefaultGroup, - level) -{ -} -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D::Group -/*----------------------------------------------------------------------------*/ diff --git a/src/Core/Group/Group3D.cpp b/src/Core/Group/Group3D.cpp deleted file mode 100644 index 0ad9bd7c..00000000 --- a/src/Core/Group/Group3D.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "Group/Group0D.h" -#include "Internal/Context.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Group { -/*----------------------------------------------------------------------------*/ -const char* Group3D::typeNameGroup3D = "Group3D"; -/*----------------------------------------------------------------------------*/ -Group3D::Group3D( - Internal::Context& ctx, - const std::string & nom, - bool isDefaultGroup, - uint level) -: GroupEntity( - ctx, - ctx.newProperty(Utils::Entity::Group3D, nom), - ctx.newDisplayProperties(Utils::Entity::Group3D), - isDefaultGroup, - level) -{ -} -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D::Group -/*----------------------------------------------------------------------------*/ diff --git a/src/Core/Group/GroupEntity.cpp b/src/Core/Group/GroupEntity.cpp index 7365daa8..44e84159 100644 --- a/src/Core/Group/GroupEntity.cpp +++ b/src/Core/Group/GroupEntity.cpp @@ -1,5 +1,6 @@ /*----------------------------------------------------------------------------*/ #include "Group/GroupEntity.h" +#include "Group/GroupEntityVisitor.h" #include "Internal/Context.h" #include "Mesh/MeshModificationItf.h" /*----------------------------------------------------------------------------*/ @@ -154,6 +155,28 @@ std::string GroupEntity::getInfos() return us.iso(); } /*----------------------------------------------------------------------------*/ +template +GroupEntityT::GroupEntityT(Internal::Context& ctx, const std::string& nom, bool isDefaultGroup, uint level) +: GroupEntity(ctx, ctx.newProperty(TTYPE, nom), ctx.newDisplayProperties(TTYPE), isDefaultGroup, level) +{} +/*----------------------------------------------------------------------------*/ +template void +GroupEntityT::accept(ConstGroupEntityVisitor& v) const +{ + v.visit(this); +} +/*----------------------------------------------------------------------------*/ +template void +GroupEntityT::accept(GroupEntityVisitor& v) +{ + v.visit(this); +} +/*----------------------------------------------------------------------------*/ +template class GroupEntityT<0, Utils::Entity::Group0D>; +template class GroupEntityT<1, Utils::Entity::Group1D>; +template class GroupEntityT<2, Utils::Entity::Group2D>; +template class GroupEntityT<3, Utils::Entity::Group3D>; +/*----------------------------------------------------------------------------*/ } // end namespace Group /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/Group/GroupManager.cpp b/src/Core/Group/GroupManager.cpp index ac20b9b0..df898ad4 100644 --- a/src/Core/Group/GroupManager.cpp +++ b/src/Core/Group/GroupManager.cpp @@ -4,10 +4,6 @@ /*----------------------------------------------------------------------------*/ #include "Group/GroupManager.h" #include "Group/GroupEntity.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" #include "Group/CommandAddMeshModification.h" #include "Internal/Context.h" diff --git a/src/Core/Internal/ImportMDL2Commandes.cpp b/src/Core/Internal/ImportMDL2Commandes.cpp index ff54165b..22d9f849 100644 --- a/src/Core/Internal/ImportMDL2Commandes.cpp +++ b/src/Core/Internal/ImportMDL2Commandes.cpp @@ -16,9 +16,7 @@ #include "Topo/CoFace.h" #include "Topo/TopoHelper.h" #include "Group/GroupManager.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Internal/ImportMDLImplementation.cpp b/src/Core/Internal/ImportMDLImplementation.cpp index 7c82c361..a94c9dc8 100644 --- a/src/Core/Internal/ImportMDLImplementation.cpp +++ b/src/Core/Internal/ImportMDLImplementation.cpp @@ -16,9 +16,7 @@ #include "Topo/CoFace.h" #include "Topo/TopoHelper.h" #include "Group/GroupManager.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Internal/ImportMDLItf.cpp b/src/Core/Internal/ImportMDLItf.cpp index fb6aa1b9..aee87f9a 100644 --- a/src/Core/Internal/ImportMDLItf.cpp +++ b/src/Core/Internal/ImportMDLItf.cpp @@ -15,9 +15,7 @@ #include "Topo/CoFace.h" #include "Topo/TopoHelper.h" #include "Group/GroupManager.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Mesh/CommandAddRemoveGroupName.cpp b/src/Core/Mesh/CommandAddRemoveGroupName.cpp index ccb4e60f..0ffcf9ee 100644 --- a/src/Core/Mesh/CommandAddRemoveGroupName.cpp +++ b/src/Core/Mesh/CommandAddRemoveGroupName.cpp @@ -1,10 +1,7 @@ /*----------------------------------------------------------------------------*/ #include "Internal/Context.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" #include "Group/GroupManager.h" +#include "Group/GroupEntity.h" #include "Mesh/CommandAddRemoveGroupName.h" #include "Geom/Volume.h" #include "Geom/Surface.h" diff --git a/src/Core/Mesh/CommandClearGroupName.cpp b/src/Core/Mesh/CommandClearGroupName.cpp index 69bde471..eec9cf6a 100644 --- a/src/Core/Mesh/CommandClearGroupName.cpp +++ b/src/Core/Mesh/CommandClearGroupName.cpp @@ -1,10 +1,7 @@ /*----------------------------------------------------------------------------*/ #include "Internal/Context.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" #include "Group/GroupManager.h" +#include "Group/GroupEntity.h" #include "Geom/Volume.h" #include "Geom/Surface.h" #include "Geom/Curve.h" diff --git a/src/Core/Mesh/CommandCreateMesh.cpp b/src/Core/Mesh/CommandCreateMesh.cpp index 907c170d..eb1aae0a 100644 --- a/src/Core/Mesh/CommandCreateMesh.cpp +++ b/src/Core/Mesh/CommandCreateMesh.cpp @@ -12,8 +12,7 @@ #include "Smoothing/SurfacicSmoothing.h" #include "Smoothing/VolumicSmoothing.h" #include "Utils/Command.h" -#include "Group/Group2D.h" -#include "Group/Group3D.h" +#include "Group/GroupEntity.h" #include "Topo/TopoHelper.h" #include "Topo/CoEdge.h" #include "Topo/CoFace.h" diff --git a/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp b/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp index 41077c41..e8a1f099 100644 --- a/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp +++ b/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp @@ -2,7 +2,7 @@ #include "Internal/InfoCommand.h" #include "Internal/Context.h" #include "Group/GroupManager.h" -#include "Group/Group3D.h" +#include "Group/GroupEntity.h" #include "Geom/Volume.h" #include "Topo/TopoEntity.h" #include "Topo/Block.h" diff --git a/src/Core/Mesh/CommandMeshExplorer.cpp b/src/Core/Mesh/CommandMeshExplorer.cpp index 2737d6c4..551a1abb 100644 --- a/src/Core/Mesh/CommandMeshExplorer.cpp +++ b/src/Core/Mesh/CommandMeshExplorer.cpp @@ -2,7 +2,7 @@ #include "Internal/Context.h" #include "Internal/InfoCommand.h" #include "Group/GroupManager.h" -#include "Group/Group3D.h" +#include "Group/GroupEntity.h" #include "Geom/Volume.h" #include "Topo/TopoEntity.h" #include "Topo/Block.h" diff --git a/src/Core/Mesh/CommandReadMLI.cpp b/src/Core/Mesh/CommandReadMLI.cpp index f52cab07..4967abd1 100644 --- a/src/Core/Mesh/CommandReadMLI.cpp +++ b/src/Core/Mesh/CommandReadMLI.cpp @@ -8,8 +8,7 @@ #include "Mesh/SubVolume.h" #include "Mesh/SubSurface.h" #include "Group/GroupManager.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Mesh/Volume.cpp b/src/Core/Mesh/Volume.cpp index 38222cf7..851e6b1b 100644 --- a/src/Core/Mesh/Volume.cpp +++ b/src/Core/Mesh/Volume.cpp @@ -12,7 +12,6 @@ #include "Topo/Face.h" #include "Topo/Block.h" #include "Group/GroupManager.h" -#include "Group/Group3D.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Services/DescriptionService.cpp b/src/Core/Services/DescriptionService.cpp index 493bb47a..169c26c4 100644 --- a/src/Core/Services/DescriptionService.cpp +++ b/src/Core/Services/DescriptionService.cpp @@ -7,10 +7,7 @@ #include "Topo/CoEdge.h" #include "Topo/CoFace.h" #include "Topo/Block.h" -#include "Group/Group0D.h" -#include "Group/Group1D.h" -#include "Group/Group2D.h" -#include "Group/Group3D.h" +#include "Group/GroupEntity.h" #include "SysCoord/SysCoord.h" #include "Mesh/MeshModificationItf.h" #include diff --git a/src/Core/SysCoord/CommandDuplicateSysCoord.cpp b/src/Core/SysCoord/CommandDuplicateSysCoord.cpp index 0d7c58f4..821fc517 100644 --- a/src/Core/SysCoord/CommandDuplicateSysCoord.cpp +++ b/src/Core/SysCoord/CommandDuplicateSysCoord.cpp @@ -2,7 +2,7 @@ #include "Internal/Context.h" #include "Internal/InfoCommand.h" #include "Group/GroupManager.h" -#include "Group/Group3D.h" +#include "Group/GroupEntity.h" #include "SysCoord/SysCoord.h" #include "SysCoord/CommandDuplicateSysCoord.h" /*----------------------------------------------------------------------------*/ diff --git a/src/Core/SysCoord/CommandNewSysCoord.cpp b/src/Core/SysCoord/CommandNewSysCoord.cpp index 8d0ad5b8..768368ab 100644 --- a/src/Core/SysCoord/CommandNewSysCoord.cpp +++ b/src/Core/SysCoord/CommandNewSysCoord.cpp @@ -2,7 +2,7 @@ #include "Internal/Context.h" #include "Internal/InfoCommand.h" #include "Group/GroupManager.h" -#include "Group/Group3D.h" +#include "Group/GroupEntity.h" #include "SysCoord/SysCoord.h" #include "SysCoord/CommandNewSysCoord.h" #include "SysCoord/SysCoordManager.h" diff --git a/src/Core/Topo/Block.cpp b/src/Core/Topo/Block.cpp index d5572ecf..f637574d 100644 --- a/src/Core/Topo/Block.cpp +++ b/src/Core/Topo/Block.cpp @@ -28,7 +28,6 @@ #include "Utils/Common.h" #include "Utils/SerializedRepresentation.h" #include "Geom/GeomEntity.h" -#include "Group/Group3D.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Topo/CoEdge.cpp b/src/Core/Topo/CoEdge.cpp index 58de7282..e44637f9 100644 --- a/src/Core/Topo/CoEdge.cpp +++ b/src/Core/Topo/CoEdge.cpp @@ -32,7 +32,6 @@ #include "Geom/EntityFactory.h" #include "Geom/Vertex.h" #include "Geom/GeomProjectImplementation.h" -#include "Group/Group1D.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Topo/CoFace.cpp b/src/Core/Topo/CoFace.cpp index f6e28109..5af16a06 100644 --- a/src/Core/Topo/CoFace.cpp +++ b/src/Core/Topo/CoFace.cpp @@ -34,8 +34,6 @@ #include "Geom/GeomEntity.h" #include "Geom/GeomProjectImplementation.h" - -#include "Group/Group2D.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Topo/CommandDuplicateTopo.cpp b/src/Core/Topo/CommandDuplicateTopo.cpp index 09283867..6c4709ff 100644 --- a/src/Core/Topo/CommandDuplicateTopo.cpp +++ b/src/Core/Topo/CommandDuplicateTopo.cpp @@ -10,9 +10,8 @@ #include "Topo/CoFace.h" #include "Topo/Block.h" #include "Topo/EdgeMeshingPropertyInterpolate.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" #include "Group/GroupManager.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Topo/CommandExtrudeFace.cpp b/src/Core/Topo/CommandExtrudeFace.cpp index f92c4baa..d9e10e35 100644 --- a/src/Core/Topo/CommandExtrudeFace.cpp +++ b/src/Core/Topo/CommandExtrudeFace.cpp @@ -17,10 +17,8 @@ #include "Geom/Curve.h" #include "Geom/Surface.h" - -#include "Group/Group2D.h" -#include "Group/Group3D.h" #include "Group/GroupManager.h" +#include "Group/GroupEntity.h" //#define _DEBUG_MESH_LAW /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Topo/CommandNewTopo.cpp b/src/Core/Topo/CommandNewTopo.cpp index 9fd29f7b..5d629801 100644 --- a/src/Core/Topo/CommandNewTopo.cpp +++ b/src/Core/Topo/CommandNewTopo.cpp @@ -15,11 +15,8 @@ #include "Utils/Common.h" #include "Internal/ServiceGeomToTopo.h" #include "Internal/Context.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" -#include "Group/Group1D.h" -#include "Group/Group0D.h" #include "Group/GroupManager.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Topo/CommandNewTopoOnGeometry.cpp b/src/Core/Topo/CommandNewTopoOnGeometry.cpp index c22cf622..3f4f0a66 100644 --- a/src/Core/Topo/CommandNewTopoOnGeometry.cpp +++ b/src/Core/Topo/CommandNewTopoOnGeometry.cpp @@ -17,9 +17,8 @@ #include "Internal/ServiceGeomToTopo.h" #include "Internal/Context.h" #include "Internal/EntitiesHelper.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" #include "Group/GroupManager.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp b/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp index f746beaa..46774417 100644 --- a/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp +++ b/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp @@ -16,8 +16,7 @@ #include "Topo/EdgeMeshingPropertyUniform.h" #include "Topo/EdgeMeshingPropertyInterpolate.h" #include "Topo/SetNbMeshingEdgesImplementation.h" -#include "Group/Group3D.h" -#include "Group/Group2D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Topo/CommandSplitFacesWithOgrid.cpp b/src/Core/Topo/CommandSplitFacesWithOgrid.cpp index 4f7bd623..8dcb0a72 100644 --- a/src/Core/Topo/CommandSplitFacesWithOgrid.cpp +++ b/src/Core/Topo/CommandSplitFacesWithOgrid.cpp @@ -15,7 +15,7 @@ #include "Topo/Edge.h" #include "Topo/EdgeMeshingPropertyUniform.h" #include "Topo/EdgeMeshingPropertyInterpolate.h" -#include "Group/Group2D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/Topo/ImportBlocksImplementation.cpp b/src/Core/Topo/ImportBlocksImplementation.cpp index e90e3dde..57ae7005 100644 --- a/src/Core/Topo/ImportBlocksImplementation.cpp +++ b/src/Core/Topo/ImportBlocksImplementation.cpp @@ -6,14 +6,10 @@ #include "Topo/ImportBlocksImplementation.h" #include "Topo/EdgeMeshingPropertyUniform.h" #include "Topo/EdgeMeshingPropertyGeometric.h" +#include "Topo/EdgeMeshingPropertyGlobalInterpolate.h" #include "Internal/InfoCommand.h" - -#include "Group/Group0D.h" -#include "Group/Group1D.h" -#include "Group/Group2D.h" -#include "Group/Group3D.h" #include "Group/GroupManager.h" -#include "Topo/EdgeMeshingPropertyGlobalInterpolate.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Topo/Vertex.cpp b/src/Core/Topo/Vertex.cpp index 41407b9d..f239ae8f 100644 --- a/src/Core/Topo/Vertex.cpp +++ b/src/Core/Topo/Vertex.cpp @@ -20,7 +20,6 @@ #include "Utils/SerializedRepresentation.h" #include "Geom/GeomEntity.h" #include "Geom/GeomProjectImplementation.h" -#include "Group/Group0D.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/protected/Geom/Curve.h b/src/Core/protected/Geom/Curve.h index 2ba26388..32a9fa05 100644 --- a/src/Core/protected/Geom/Curve.h +++ b/src/Core/protected/Geom/Curve.h @@ -10,15 +10,12 @@ #include "Services/MementoService.h" #include "Utils/Point.h" #include "Utils/Vector.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { -class Group1D; -} -/*----------------------------------------------------------------------------*/ namespace Geom { class GeomProperty; diff --git a/src/Core/protected/Geom/Surface.h b/src/Core/protected/Geom/Surface.h index 8e1ae5e5..a531ccd8 100644 --- a/src/Core/protected/Geom/Surface.h +++ b/src/Core/protected/Geom/Surface.h @@ -5,17 +5,13 @@ #include "Services/MementoService.h" #include "Utils/Vector.h" #include "Utils/Point.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ namespace Mgx3D { -/*----------------------------------------------------------------------------*/ -namespace Group { -class Group2D; -} - /*----------------------------------------------------------------------------*/ namespace Geom { /*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Geom/Vertex.h b/src/Core/protected/Geom/Vertex.h index 4ccce8e8..cc60ecdb 100644 --- a/src/Core/protected/Geom/Vertex.h +++ b/src/Core/protected/Geom/Vertex.h @@ -8,13 +8,10 @@ #include "Geom/GeomEntity.h" #include "Services/MementoService.h" #include "Utils/Point.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { -class Group0D; -} -/*----------------------------------------------------------------------------*/ namespace Geom { class Curve; class Surface; diff --git a/src/Core/protected/Geom/Volume.h b/src/Core/protected/Geom/Volume.h index 5c73d69c..82835e94 100644 --- a/src/Core/protected/Geom/Volume.h +++ b/src/Core/protected/Geom/Volume.h @@ -3,6 +3,7 @@ /*----------------------------------------------------------------------------*/ #include "Geom/GeomEntity.h" #include "Services/MementoService.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ @@ -10,10 +11,6 @@ /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { -class Group3D; -} -/*----------------------------------------------------------------------------*/ namespace Geom { class GeomProperty; diff --git a/src/Core/protected/Group/Group0D.h b/src/Core/protected/Group/Group0D.h deleted file mode 100644 index 03151805..00000000 --- a/src/Core/protected/Group/Group0D.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef MGX3D_GROUP_GROUP0D_H_ -#define MGX3D_GROUP_GROUP0D_H_ -/*----------------------------------------------------------------------------*/ -#include "Group/GroupEntity.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Internal { class Context; } -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Group { -/*----------------------------------------------------------------------------*/ -/** - * \brief Groupe 0D. - * Permet l'accès aux entités 0D appartenant à un même groupe, ainsi qu'aux entités - * de niveaux inférieurs - */ -struct Group0D : public GroupEntity -{ - static const char* typeNameGroup0D; - static const uint DIM = 0; - - void accept(ConstGroupEntityVisitor& v) const override {v.visit(this);} - void accept(GroupEntityVisitor& v) override {v.visit(this);} - Group0D(Internal::Context& ctx, const std::string & nom, bool isDefaultGroup, uint level=1); - virtual ~Group0D() = default; - int getDim() const override {return DIM;} - std::string getTypeName() const override {return typeNameGroup0D;} - Utils::Entity::objectType getType() const override {return Utils::Entity::Group0D;} -}; -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D::Group -/*----------------------------------------------------------------------------*/ -#endif /* MGX3D_GROUP_GROUP0D_H_ */ -/*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Group/Group1D.h b/src/Core/protected/Group/Group1D.h deleted file mode 100644 index 8e9990c3..00000000 --- a/src/Core/protected/Group/Group1D.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef MGX3D_GROUP_GROUP1D_H_ -#define MGX3D_GROUP_GROUP1D_H_ -/*----------------------------------------------------------------------------*/ -#include "Group/GroupEntity.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Internal { class Context; } -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Group { -/*----------------------------------------------------------------------------*/ -/** - * \brief Groupe 1D. - * Permet l'accès aux entités 1D appartenant à un même groupe, ainsi qu'aux entités - * de niveaux inférieurs - */ -struct Group1D : public GroupEntity -{ - static const char* typeNameGroup1D; - static const uint DIM = 1; - - void accept(ConstGroupEntityVisitor& v) const override {v.visit(this);} - void accept(GroupEntityVisitor& v) override {v.visit(this);} - Group1D(Internal::Context& ctx, const std::string & nom, bool isDefaultGroup, uint level=1); - virtual ~Group1D() = default; - int getDim() const override {return DIM;} - std::string getTypeName() const override {return typeNameGroup1D;} - Utils::Entity::objectType getType() const override {return Utils::Entity::Group1D;} -}; -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D::Group -/*----------------------------------------------------------------------------*/ -#endif /* MGX3D_GROUP_GROUP1D_H_ */ -/*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Group/Group2D.h b/src/Core/protected/Group/Group2D.h deleted file mode 100644 index 5a4993bf..00000000 --- a/src/Core/protected/Group/Group2D.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef MGX3D_GROUP_GROUP2D_H_ -#define MGX3D_GROUP_GROUP2D_H_ -/*----------------------------------------------------------------------------*/ -#include "Group/GroupEntity.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Internal { class Context; } -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Group { -/*----------------------------------------------------------------------------*/ -/** - * \brief Groupe 2D. - * Permet l'accès aux entités 2D appartenant à un même groupe, ainsi qu'aux entités - * de niveaux inférieurs - */ -struct Group2D : public GroupEntity -{ - static const char* typeNameGroup2D; - static const uint DIM = 2; - - void accept(ConstGroupEntityVisitor& v) const override {v.visit(this);} - void accept(GroupEntityVisitor& v) override {v.visit(this);} - Group2D(Internal::Context& ctx, const std::string & nom, bool isDefaultGroup, uint level=1); - virtual ~Group2D() = default; - int getDim() const override {return DIM;} - std::string getTypeName() const override {return typeNameGroup2D;} - Utils::Entity::objectType getType() const override {return Utils::Entity::Group2D;} -}; -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D::Group -/*----------------------------------------------------------------------------*/ -#endif /* MGX3D_GROUP_GROUP2D_H_ */ -/*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Group/Group3D.h b/src/Core/protected/Group/Group3D.h deleted file mode 100644 index ca7173d9..00000000 --- a/src/Core/protected/Group/Group3D.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef MGX3D_GROUP_GROUP3D_H_ -#define MGX3D_GROUP_GROUP3D_H_ -/*----------------------------------------------------------------------------*/ -#include "Group/GroupEntity.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Internal { class Context; } -/*----------------------------------------------------------------------------*/ -namespace Mgx3D::Group { -/*----------------------------------------------------------------------------*/ -/** - * \brief Groupe 3D. - * Permet l'accès aux entités 3D appartenant à un même groupe, ainsi qu'aux entités - * de niveaux inférieurs - */ -struct Group3D : public GroupEntity -{ - static const char* typeNameGroup3D; - static const uint DIM = 3; - - void accept(ConstGroupEntityVisitor& v) const override {v.visit(this);} - void accept(GroupEntityVisitor& v) override {v.visit(this);} - Group3D(Internal::Context& ctx, const std::string & nom, bool isDefaultGroup, uint level=1); - virtual ~Group3D() = default; - int getDim() const override {return DIM;} - std::string getTypeName() const override {return typeNameGroup3D;} - Utils::Entity::objectType getType() const override {return Utils::Entity::Group3D;} -}; -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D::Group -/*----------------------------------------------------------------------------*/ -#endif /* MGX3D_GROUP_GROUP3D_H_ */ -/*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Group/GroupEntity.h b/src/Core/protected/Group/GroupEntity.h index 902de58e..1c15d1d6 100644 --- a/src/Core/protected/Group/GroupEntity.h +++ b/src/Core/protected/Group/GroupEntity.h @@ -1,9 +1,7 @@ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_GROUP_GROUPENTITY_H_ #define MGX3D_GROUP_GROUPENTITY_H_ /*----------------------------------------------------------------------------*/ #include "Internal/InternalEntity.h" -#include "Group/GroupEntityVisitor.h" /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -24,6 +22,9 @@ class Context; */ namespace Group { /*----------------------------------------------------------------------------*/ +class GroupEntityVisitor; +class ConstGroupEntityVisitor; +/*----------------------------------------------------------------------------*/ /** * \class GroupEntity * \brief Interface définissant les services que doit fournir toute entité @@ -138,6 +139,29 @@ class GroupEntity : public Internal::InternalEntity{ uint m_level; }; /*----------------------------------------------------------------------------*/ +template +class GroupEntityT : public GroupEntity +{ +public: + static const uint DIM = TDIM; + + void accept(ConstGroupEntityVisitor& v) const override; + void accept(GroupEntityVisitor& v) override; + + GroupEntityT(Internal::Context& ctx, const std::string& nom, bool isDefaultGroup, uint level=1); + virtual ~GroupEntityT() = default; + + int getDim() const override { return TDIM; } + Utils::Entity::objectType getType() const override { return TTYPE; } + std::string getTypeName() const override + { return Utils::Entity::objectTypeToObjectTypeName(TTYPE); } +}; +/*----------------------------------------------------------------------------*/ +using Group0D = GroupEntityT<0, Utils::Entity::Group0D>; +using Group1D = GroupEntityT<1, Utils::Entity::Group1D>; +using Group2D = GroupEntityT<2, Utils::Entity::Group2D>; +using Group3D = GroupEntityT<3, Utils::Entity::Group3D>; +/*----------------------------------------------------------------------------*/ } // end namespace Group /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/protected/Group/GroupEntityVisitor.h b/src/Core/protected/Group/GroupEntityVisitor.h index da286aff..bf4a9803 100644 --- a/src/Core/protected/Group/GroupEntityVisitor.h +++ b/src/Core/protected/Group/GroupEntityVisitor.h @@ -1,14 +1,11 @@ #ifndef GROUPENTITYVISITOR_H_ #define GROUPENTITYVISITOR_H_ /*----------------------------------------------------------------------------*/ +#include "Group/GroupEntity.h" +/*----------------------------------------------------------------------------*/ namespace Mgx3D::Group { /*----------------------------------------------------------------------------*/ -class Group0D; -class Group1D; -class Group2D; -class Group3D; -/*----------------------------------------------------------------------------*/ struct ConstGroupEntityVisitor { virtual void visit(const Group0D*) = 0; diff --git a/src/Core/protected/Group/GroupHelperForCommand.h b/src/Core/protected/Group/GroupHelperForCommand.h index 9563b18a..3c0f2fa9 100644 --- a/src/Core/protected/Group/GroupHelperForCommand.h +++ b/src/Core/protected/Group/GroupHelperForCommand.h @@ -3,10 +3,7 @@ #define GROUP_HELPER_FOR_COMMAND_H_ /*----------------------------------------------------------------------------*/ #include "Internal/InfoCommand.h" -#include "Group/Group0D.h" -#include "Group/Group1D.h" -#include "Group/Group2D.h" -#include "Group/Group3D.h" +#include "Group/GroupEntity.h" #include "Topo/Block.h" #include "Topo/CoFace.h" #include "Topo/CoEdge.h" diff --git a/src/Core/protected/Group/GroupManager.h b/src/Core/protected/Group/GroupManager.h index 62d81843..fce2e2cc 100644 --- a/src/Core/protected/Group/GroupManager.h +++ b/src/Core/protected/Group/GroupManager.h @@ -9,6 +9,7 @@ #include "Mesh/MeshEntity.h" #include "Topo/TopoEntity.h" #include "SysCoord/SysCoord.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include @@ -49,10 +50,6 @@ class SysCoord; /*----------------------------------------------------------------------------*/ namespace Group { -class Group3D; -class Group2D; -class Group1D; -class Group0D; class GroupEntity; /*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Internal/M3DCommandResult.h b/src/Core/protected/Internal/M3DCommandResult.h index aba181ed..e61d5fbe 100644 --- a/src/Core/protected/Internal/M3DCommandResult.h +++ b/src/Core/protected/Internal/M3DCommandResult.h @@ -16,10 +16,7 @@ #include "Mesh/Surface.h" #include "Mesh/Line.h" #include "Mesh/Cloud.h" -#include "Group/Group0D.h" -#include "Group/Group1D.h" -#include "Group/Group2D.h" -#include "Group/Group3D.h" +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include #include diff --git a/src/Core/protected/Mesh/CommandCreateSubVolumeBetweenSheets.h b/src/Core/protected/Mesh/CommandCreateSubVolumeBetweenSheets.h index 9025e080..60405e98 100644 --- a/src/Core/protected/Mesh/CommandCreateSubVolumeBetweenSheets.h +++ b/src/Core/protected/Mesh/CommandCreateSubVolumeBetweenSheets.h @@ -15,9 +15,6 @@ /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { -class Group3D; -} namespace Topo{ class CoEdge; } diff --git a/src/Core/protected/Mesh/CommandMeshExplorer.h b/src/Core/protected/Mesh/CommandMeshExplorer.h index ccd567fc..a03216b3 100644 --- a/src/Core/protected/Mesh/CommandMeshExplorer.h +++ b/src/Core/protected/Mesh/CommandMeshExplorer.h @@ -15,9 +15,6 @@ /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { -class Group3D; -} namespace Topo{ class CoEdge; } diff --git a/src/Core/protected/Services/MementoService.h b/src/Core/protected/Services/MementoService.h index 788afddb..cf3a31cc 100644 --- a/src/Core/protected/Services/MementoService.h +++ b/src/Core/protected/Services/MementoService.h @@ -4,7 +4,7 @@ #include #include #include - +#include "Group/GroupEntity.h" namespace Mgx3D { namespace Geom @@ -21,14 +21,6 @@ namespace Mgx3D { class TopoEntity; } - - namespace Group - { - class Group0D; - class Group1D; - class Group2D; - class Group3D; - } } namespace Mgx3D::Services diff --git a/src/Core/protected/Topo/BlockTopoProperty.h b/src/Core/protected/Topo/BlockTopoProperty.h index d980eb74..54972fb2 100644 --- a/src/Core/protected/Topo/BlockTopoProperty.h +++ b/src/Core/protected/Topo/BlockTopoProperty.h @@ -10,6 +10,7 @@ #define BLOCK_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ #include "Utils/Container.h" +#include "Group/GroupEntity.h" #include #include #include @@ -18,9 +19,6 @@ /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { -class Group3D; -} namespace Topo { class Vertex; class Face; diff --git a/src/Core/protected/Topo/CoEdgeTopoProperty.h b/src/Core/protected/Topo/CoEdgeTopoProperty.h index d7dde2ee..920281c9 100644 --- a/src/Core/protected/Topo/CoEdgeTopoProperty.h +++ b/src/Core/protected/Topo/CoEdgeTopoProperty.h @@ -10,6 +10,7 @@ #define COEDGE_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ #include "Utils/Container.h" +#include "Group/GroupEntity.h" #include #include #include @@ -17,9 +18,6 @@ /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { -class Group1D; -} namespace Topo { class Vertex; class Edge; diff --git a/src/Core/protected/Topo/CoFaceTopoProperty.h b/src/Core/protected/Topo/CoFaceTopoProperty.h index a32b7dca..52b29741 100644 --- a/src/Core/protected/Topo/CoFaceTopoProperty.h +++ b/src/Core/protected/Topo/CoFaceTopoProperty.h @@ -10,6 +10,7 @@ #define COFACE_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ #include "Utils/Container.h" +#include "Group/GroupEntity.h" #include #include #include @@ -17,9 +18,6 @@ /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { -class Group2D; -} namespace Topo { class Vertex; class Edge; diff --git a/src/Core/protected/Topo/VertexTopoProperty.h b/src/Core/protected/Topo/VertexTopoProperty.h index 8f259f17..c6bee9fd 100644 --- a/src/Core/protected/Topo/VertexTopoProperty.h +++ b/src/Core/protected/Topo/VertexTopoProperty.h @@ -10,15 +10,13 @@ #define VERTEX_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ #include "Utils/Container.h" +#include "Group/GroupEntity.h" #include #include #include /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { -class Group0D; -} namespace Topo { class CoEdge; /*----------------------------------------------------------------------------*/ diff --git a/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp b/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp index 885b8a5f..762ee41b 100644 --- a/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp +++ b/src/QtComponents/QtGroupProjectionOnPlaneAction.cpp @@ -8,8 +8,8 @@ #include "Utils/Common.h" #include "Utils/ValidatedField.h" -#include "Group/Group2D.h" #include "Group/GroupManager.h" +#include "Group/GroupEntity.h" #include #include "QtComponents/QtGroupProjectionOnPlaneAction.h" #include "QtComponents/QtMgx3DApplication.h" diff --git a/src/QtComponents/QtGroupsPanel.cpp b/src/QtComponents/QtGroupsPanel.cpp index fa36a1dd..5b0239e2 100644 --- a/src/QtComponents/QtGroupsPanel.cpp +++ b/src/QtComponents/QtGroupsPanel.cpp @@ -9,10 +9,7 @@ #include "Utils/Common.h" #include "Internal/SelectionManagerDimFilter.h" #include "Group/GroupManager.h" -#include "Group/Group0D.h" -#include "Group/Group1D.h" -#include "Group/Group2D.h" -#include "Group/Group3D.h" +#include "Group/GroupEntity.h" #include "Geom/Volume.h" #include "Geom/Surface.h" #include "Geom/Curve.h" diff --git a/src/QtComponents/QtMgx3DEntityNamePanel.cpp b/src/QtComponents/QtMgx3DEntityNamePanel.cpp index ea427fea..276efad5 100644 --- a/src/QtComponents/QtMgx3DEntityNamePanel.cpp +++ b/src/QtComponents/QtMgx3DEntityNamePanel.cpp @@ -7,11 +7,8 @@ #include "Internal/Context.h" #include "Utils/Common.h" -#include "Group/Group0D.h" -#include "Group/Group1D.h" -#include "Group/Group2D.h" -#include "Group/Group3D.h" #include "Group/GroupManager.h" +#include "Group/GroupEntity.h" #include "QtComponents/QtMgx3DEntityNamePanel.h" #include diff --git a/src/QtComponents/QtMgx3DGroupNamePanel.cpp b/src/QtComponents/QtMgx3DGroupNamePanel.cpp index ea5a697f..acd697af 100644 --- a/src/QtComponents/QtMgx3DGroupNamePanel.cpp +++ b/src/QtComponents/QtMgx3DGroupNamePanel.cpp @@ -6,11 +6,8 @@ #include "Internal/Context.h" #include "Utils/Common.h" -#include "Group/Group0D.h" -#include "Group/Group1D.h" -#include "Group/Group2D.h" -#include "Group/Group3D.h" #include "Group/GroupManager.h" +#include "Group/GroupEntity.h" #include "QtComponents/QtMgx3DGroupNamePanel.h" #include From 4e07826dabec7b408e1189645c79176e3bbb64fe Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Wed, 22 Oct 2025 09:11:22 +0200 Subject: [PATCH 06/18] Reduce GroupHelperForCommand code --- src/Core/Geom/CommandExtrusion.cpp | 6 +- src/Core/Group/GroupHelperForCommand.cpp | 160 ++++-------------- src/Core/Mesh/CommandAddRemoveGroupName.cpp | 52 +++--- .../protected/Group/GroupHelperForCommand.h | 36 ++-- src/QtComponents/QtBoxOperationAction.cpp | 4 +- src/QtComponents/QtConeOperationAction.cpp | 4 +- .../QtCylinderOperationAction.cpp | 6 +- src/QtComponents/QtSphereOperationAction.cpp | 6 +- .../QtSpherePartOperationAction.cpp | 6 +- .../QtTopoEntitiesAssociationsAction.cpp | 8 +- src/QtComponents/QtTopologyEdgeCutAction.cpp | 4 +- .../QtTopologyExtendSplitBlockAction.cpp | 4 +- .../QtTopologyExtendSplitFaceAction.cpp | 4 +- .../QtTopologySplitBlockAction.cpp | 4 +- .../QtTopologySplitBlockWithOGridAction.cpp | 4 +- .../QtTopologySplitFaceWithOGridAction.cpp | 4 +- .../QtTopologySplitFacesAction.cpp | 4 +- .../QtTopologyUnrefineBlockAction.cpp | 4 +- src/QtComponents/QtVertexOperationAction.cpp | 8 +- 19 files changed, 117 insertions(+), 211 deletions(-) diff --git a/src/Core/Geom/CommandExtrusion.cpp b/src/Core/Geom/CommandExtrusion.cpp index 361567fe..b99fcf3c 100644 --- a/src/Core/Geom/CommandExtrusion.cpp +++ b/src/Core/Geom/CommandExtrusion.cpp @@ -163,7 +163,7 @@ groups2DTo3D() for (uint i=0; igetName(); if (nom != getContext().getGroupManager().getDefaultName(2)) { - Group::Group3D* new_grp = m_group_helper.addToGroup(nom, vol); + Group::Group3D* new_grp = m_group_helper.addToGroup(nom, vol); new_grp->setLevel(grp[i]->getLevel()); } } @@ -180,7 +180,7 @@ groups2DTo3D() for (uint i=0; igetName(); if (nom != getContext().getGroupManager().getDefaultName(1)) { - Group::Group2D* new_grp = m_group_helper.addToGroup(nom, surf); + Group::Group2D* new_grp = m_group_helper.addToGroup(nom, surf); new_grp->setLevel(grp[i]->getLevel()); } } @@ -197,7 +197,7 @@ groups2DTo3D() for (uint i=0; igetName(); if (nom != getContext().getGroupManager().getDefaultName(0)) { - Group::Group1D* new_grp = m_group_helper.addToGroup(nom, curve); + Group::Group1D* new_grp = m_group_helper.addToGroup(nom, curve); new_grp->setLevel(grp[i]->getLevel()); } } diff --git a/src/Core/Group/GroupHelperForCommand.cpp b/src/Core/Group/GroupHelperForCommand.cpp index 3978a194..4f96a860 100644 --- a/src/Core/Group/GroupHelperForCommand.cpp +++ b/src/Core/Group/GroupHelperForCommand.cpp @@ -13,148 +13,52 @@ GroupHelperForCommand(Internal::InfoCommand& info_command, GroupManager& group_m { } /*----------------------------------------------------------------------------*/ -Group3D* GroupHelperForCommand:: -addToGroup(const std::string group_name, Geom::Volume* v) -{ - Group3D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); - addEntityToGroup(grp, v); - m_info_command.addGeomInfoEntity (v, Internal::InfoCommand::DISPMODIFIED); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group2D* GroupHelperForCommand:: -addToGroup(const std::string group_name, Geom::Surface* s) -{ - Group2D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); - addEntityToGroup(grp, s); - m_info_command.addGeomInfoEntity (s, Internal::InfoCommand::DISPMODIFIED); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group1D* GroupHelperForCommand:: -addToGroup(const std::string group_name, Geom::Curve* c) -{ - Group1D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); - addEntityToGroup(grp, c); - m_info_command.addGeomInfoEntity (c, Internal::InfoCommand::DISPMODIFIED); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group0D* GroupHelperForCommand:: -addToGroup(const std::string group_name, Geom::Vertex* v) -{ - Group0D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); - addEntityToGroup(grp, v); - m_info_command.addGeomInfoEntity (v, Internal::InfoCommand::DISPMODIFIED); - return grp; -} -/*----------------------------------------------------------------------------*/ GroupEntity* GroupHelperForCommand:: -addToGroup(const std::string group_name, Geom::GeomEntity* e) +addToGroup(const std::string& group_name, Geom::GeomEntity* e) { switch (e->getDim()) { - case 0: return addToGroup(group_name, dynamic_cast(e)); - case 1: return addToGroup(group_name, dynamic_cast(e)); - case 2: return addToGroup(group_name, dynamic_cast(e)); - default: return addToGroup(group_name, dynamic_cast(e)); + case 0: return addToGroup(group_name, dynamic_cast(e)); + case 1: return addToGroup(group_name, dynamic_cast(e)); + case 2: return addToGroup(group_name, dynamic_cast(e)); + default: return addToGroup(group_name, dynamic_cast(e)); } } /*----------------------------------------------------------------------------*/ -Group3D* GroupHelperForCommand:: -addToGroup(const std::string group_name, Topo::Block* b) -{ - Group3D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); - addEntityToGroup(grp, b); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group2D* GroupHelperForCommand:: -addToGroup(const std::string group_name, Topo::CoFace* f) -{ - Group2D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); - addEntityToGroup(grp, f); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group1D* GroupHelperForCommand:: -addToGroup(const std::string group_name, Topo::CoEdge* e) -{ - Group1D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); - addEntityToGroup(grp, e); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group0D* GroupHelperForCommand:: -addToGroup(const std::string group_name, Topo::Vertex* v) -{ - Group0D* grp = m_group_manager.getNewGroup(group_name, &m_info_command); - addEntityToGroup(grp, v); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group3D* GroupHelperForCommand:: -removeFromGroup(const std::string group_name, Geom::Volume* v) -{ - Group3D* grp = m_group_manager.getGroup(group_name, &m_info_command); - removeEntityFromGroup(grp, v); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group2D* GroupHelperForCommand:: -removeFromGroup(const std::string group_name, Geom::Surface* s) -{ - Group2D* grp = m_group_manager.getGroup(group_name, &m_info_command); - removeEntityFromGroup(grp, s); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group1D* GroupHelperForCommand:: -removeFromGroup(const std::string group_name, Geom::Curve* c) -{ - Group1D* grp = m_group_manager.getGroup(group_name, &m_info_command); - removeEntityFromGroup(grp, c); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group0D* GroupHelperForCommand:: -removeFromGroup(const std::string group_name, Geom::Vertex* v) -{ - Group0D* grp = m_group_manager.getGroup(group_name, &m_info_command); - removeEntityFromGroup(grp, v); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group3D* GroupHelperForCommand:: -removeFromGroup(const std::string group_name, Topo::Block* b) -{ - Group3D* grp = m_group_manager.getGroup(group_name, &m_info_command); - removeEntityFromGroup(grp, b); - return grp; -} -/*----------------------------------------------------------------------------*/ -Group2D* GroupHelperForCommand:: -removeFromGroup(const std::string group_name, Topo::CoFace* f) +GroupEntity* GroupHelperForCommand:: +removeFromGroup(const std::string& group_name, Geom::GeomEntity* e) { - Group2D* grp = m_group_manager.getGroup(group_name, &m_info_command); - removeEntityFromGroup(grp, f); - return grp; + switch (e->getDim()) + { + case 0: return removeFromGroup(group_name, dynamic_cast(e)); + case 1: return removeFromGroup(group_name, dynamic_cast(e)); + case 2: return removeFromGroup(group_name, dynamic_cast(e)); + default: return removeFromGroup(group_name, dynamic_cast(e)); + } } /*----------------------------------------------------------------------------*/ -Group1D* GroupHelperForCommand:: -removeFromGroup(const std::string group_name, Topo::CoEdge* e) +GroupEntity* GroupHelperForCommand:: +addToGroup(const std::string& group_name, Topo::TopoEntity* e) { - Group1D* grp = m_group_manager.getGroup(group_name, &m_info_command); - removeEntityFromGroup(grp, e); - return grp; + switch (e->getDim()) + { + case 0: return addToGroup(group_name, dynamic_cast(e)); + case 1: return addToGroup(group_name, dynamic_cast(e)); + case 2: return addToGroup(group_name, dynamic_cast(e)); + default: return addToGroup(group_name, dynamic_cast(e)); + } } /*----------------------------------------------------------------------------*/ -Group0D* GroupHelperForCommand:: -removeFromGroup(const std::string group_name, Topo::Vertex* v) +GroupEntity* GroupHelperForCommand:: +removeFromGroup(const std::string& group_name, Topo::TopoEntity* e) { - Group0D* grp = m_group_manager.getGroup(group_name, &m_info_command); - removeEntityFromGroup(grp, v); - return grp; + switch (e->getDim()) + { + case 0: return removeFromGroup(group_name, dynamic_cast(e)); + case 1: return removeFromGroup(group_name, dynamic_cast(e)); + case 2: return removeFromGroup(group_name, dynamic_cast(e)); + default: return removeFromGroup(group_name, dynamic_cast(e)); + } } /*----------------------------------------------------------------------------*/ } // end namespace Group diff --git a/src/Core/Mesh/CommandAddRemoveGroupName.cpp b/src/Core/Mesh/CommandAddRemoveGroupName.cpp index 0ffcf9ee..0a574f22 100644 --- a/src/Core/Mesh/CommandAddRemoveGroupName.cpp +++ b/src/Core/Mesh/CommandAddRemoveGroupName.cpp @@ -207,12 +207,12 @@ void CommandAddRemoveGroupName::internalExecute() CHECK_NULL_PTR_ERROR(crv); if (m_ope == add){ // on ajoute le groupe - Group::Group1D* grp = m_group_helper.addToGroup(m_groupName, crv); + Group::Group1D* grp = m_group_helper.addToGroup(m_groupName, crv); updateMesh(crv, grp->getName(), true); } else if (m_ope == remove) { // on retire le groupe - Group::Group1D* grp = m_group_helper.removeFromGroup(m_groupName, crv); + Group::Group1D* grp = m_group_helper.removeFromGroup(m_groupName, crv); updateMesh(crv, grp->getName(), false); } else if (m_ope == set){ // on retire tous les groupes @@ -235,12 +235,12 @@ void CommandAddRemoveGroupName::internalExecute() std::vector coedges = {coedge}; if (m_ope == add){ // on ajoute le groupe - Group::Group1D* grp = m_group_helper.addToGroup(m_groupName, coedge); + Group::Group1D* grp = m_group_helper.addToGroup(m_groupName, coedge); updateMesh(coedges, grp->getName(), true); } else if (m_ope == remove) { // on retire le groupe - Group::Group1D* grp = m_group_helper.removeFromGroup(m_groupName, coedge); + Group::Group1D* grp = m_group_helper.removeFromGroup(m_groupName, coedge); updateMesh(coedges, grp->getName(), false); } else if (m_ope == set){ // on retire tous les groupes @@ -268,12 +268,12 @@ void CommandAddRemoveGroupName::internalExecute() CHECK_NULL_PTR_ERROR(surf); if (m_ope == add){ // on ajoute le groupe - Group::Group2D* grp = m_group_helper.addToGroup(m_groupName, surf); + Group::Group2D* grp = m_group_helper.addToGroup(m_groupName, surf); updateMesh(surf, grp->getName(), true); } else if (m_ope == remove) { // on retire le groupe - Group::Group2D* grp = m_group_helper.removeFromGroup(m_groupName, surf); + Group::Group2D* grp = m_group_helper.removeFromGroup(m_groupName, surf); updateMesh(surf, grp->getName(), false); } else if (m_ope == set){ // on retire tous les groupes @@ -296,12 +296,12 @@ void CommandAddRemoveGroupName::internalExecute() std::vector cofaces = {coface}; if (m_ope == add){ // on ajoute le groupe - Group::Group2D* grp = m_group_helper.addToGroup(m_groupName, coface); + Group::Group2D* grp = m_group_helper.addToGroup(m_groupName, coface); updateMesh(cofaces, grp->getName(), true); } else if (m_ope == remove) { // on retire le groupe - Group::Group2D* grp = m_group_helper.removeFromGroup(m_groupName, coface); + Group::Group2D* grp = m_group_helper.removeFromGroup(m_groupName, coface); updateMesh(cofaces, grp->getName(), false); } else if (m_ope == set){ // on retire tous les groupes @@ -329,12 +329,12 @@ void CommandAddRemoveGroupName::internalExecute() CHECK_NULL_PTR_ERROR(vol); if (m_ope == add){ // on ajoute le groupe - Group::Group3D* grp = m_group_helper.addToGroup(m_groupName, vol); + Group::Group3D* grp = m_group_helper.addToGroup(m_groupName, vol); updateMesh(vol, grp->getName(), true); } else if (m_ope == remove) { // on retire le groupe - Group::Group3D* grp = m_group_helper.removeFromGroup(m_groupName, vol); + Group::Group3D* grp = m_group_helper.removeFromGroup(m_groupName, vol); updateMesh(vol, grp->getName(), false); } else if (m_ope == set){ // on retire tous les groupes @@ -344,7 +344,7 @@ void CommandAddRemoveGroupName::internalExecute() m_group_helper.removeFromGroup(gn[i], vol); // on ajoute le groupe - Group::Group3D* grp = m_group_helper.addToGroup(m_groupName, vol); + Group::Group3D* grp = m_group_helper.addToGroup(m_groupName, vol); updateMesh(vol, grp->getName(), true); } else { TkUtil::Exception ("[Erreur interne] Opération non prévue"); @@ -358,12 +358,12 @@ void CommandAddRemoveGroupName::internalExecute() std::vector blocs = {bloc}; if (m_ope == add){ // on ajoute le groupe - Group::Group3D* grp = m_group_helper.addToGroup(m_groupName, bloc); + Group::Group3D* grp = m_group_helper.addToGroup(m_groupName, bloc); updateMesh(blocs, grp->getName(), true); } else if (m_ope == remove) { // on retire le groupe - Group::Group3D* grp = m_group_helper.removeFromGroup(m_groupName, bloc); + Group::Group3D* grp = m_group_helper.removeFromGroup(m_groupName, bloc); updateMesh(blocs, grp->getName(), false); } else if (m_ope == set){ // on retire tous les groupes @@ -373,7 +373,7 @@ void CommandAddRemoveGroupName::internalExecute() m_group_helper.removeFromGroup(gn[i], bloc); // on ajoute le groupe - Group::Group3D* grp = m_group_helper.addToGroup(m_groupName, bloc); + Group::Group3D* grp = m_group_helper.addToGroup(m_groupName, bloc); updateMesh(blocs, grp->getName(), true); } else { TkUtil::Exception ("[Erreur interne] Opération non prévue"); @@ -463,14 +463,14 @@ void CommandAddRemoveGroupName::internalUndo() crv->getGroupsName(gnOld); // on retire tous les groupes actuellement présents for (uint i=0; i(gnOld[i], crv); updateMesh(crv, grp->getName(), false); } std::vector& gnNew = m_geom_groups[crv]; // on ajoute tous les groupes archivés for (uint i=0; i(gnNew[i], crv); updateMesh(crv, grp->getName(), true); } } // end for iter @@ -485,14 +485,14 @@ void CommandAddRemoveGroupName::internalUndo() coedge->getGroupsName(gnOld, false, true); // on retire tous les groupes actuellement présents for (uint i=0; i(gnOld[i], coedge); updateMesh(coedges, grp->getName(), false); } std::vector& gnNew = m_topo_groups[coedge]; // on ajoute tous les groupes archivés for (uint i=0; i(gnNew[i], coedge); updateMesh(coedges, grp->getName(), true); } } // end for iter @@ -508,14 +508,14 @@ void CommandAddRemoveGroupName::internalUndo() srf->getGroupsName(gnOld); // on retire tous les groupes actuellement présents for (uint i=0; i(gnOld[i], srf); updateMesh(srf, grp->getName(), false); } std::vector& gnNew = m_geom_groups[srf]; // on ajoute tous les groupes archivés for (uint i=0; i(gnNew[i], srf); updateMesh(srf, grp->getName(), true); } } // end for iter @@ -530,14 +530,14 @@ void CommandAddRemoveGroupName::internalUndo() coface->getGroupsName(gnOld, false, true); // on retire tous les groupes actuellement présents for (uint i=0; i(gnOld[i], coface); updateMesh(cofaces, grp->getName(), false); } std::vector& gnNew = m_topo_groups[coface]; // on ajoute tous les groupes archivés for (uint i=0; i(gnNew[i], coface); updateMesh(cofaces, grp->getName(), true); } } // end for iter @@ -553,14 +553,14 @@ void CommandAddRemoveGroupName::internalUndo() vol->getGroupsName(gnOld); // on retire tous les groupes actuellement présents for (uint i=0; i(gnOld[i], vol); updateMesh(vol, grp->getName(), false); } std::vector& gnNew = m_geom_groups[vol]; // on ajoute tous les groupes archivés for (uint i=0; i(gnNew[i], vol); updateMesh(vol, grp->getName(), true); } } // end for iter @@ -575,14 +575,14 @@ void CommandAddRemoveGroupName::internalUndo() bloc->getGroupsName(gnOld, false, true); // on retire tous les groupes actuellement présents for (uint i=0; i(gnOld[i], bloc); updateMesh(blocs, grp->getName(), false); } std::vector& gnNew = m_topo_groups[bloc]; // on ajoute tous les groupes archivés for (uint i=0; i(gnNew[i], bloc); updateMesh(blocs, grp->getName(), true); } } // end for iter diff --git a/src/Core/protected/Group/GroupHelperForCommand.h b/src/Core/protected/Group/GroupHelperForCommand.h index 3c0f2fa9..170bad58 100644 --- a/src/Core/protected/Group/GroupHelperForCommand.h +++ b/src/Core/protected/Group/GroupHelperForCommand.h @@ -3,6 +3,7 @@ #define GROUP_HELPER_FOR_COMMAND_H_ /*----------------------------------------------------------------------------*/ #include "Internal/InfoCommand.h" +#include "Group/GroupManager.h" #include "Group/GroupEntity.h" #include "Topo/Block.h" #include "Topo/CoFace.h" @@ -25,26 +26,27 @@ class GroupHelperForCommand { GroupHelperForCommand(Internal::InfoCommand& info_command, GroupManager& group_manager); virtual ~GroupHelperForCommand() = default; - Group3D* addToGroup(const std::string group_name, Geom::Volume* v); - Group2D* addToGroup(const std::string group_name, Geom::Surface* s); - Group1D* addToGroup(const std::string group_name, Geom::Curve* c); - Group0D* addToGroup(const std::string group_name, Geom::Vertex* v); - GroupEntity* addToGroup(const std::string group_name, Geom::GeomEntity* e); + template + TGroup* addToGroup(const std::string& group_name, TEntity* e) + { + TGroup* grp = m_group_manager.getNewGroup(group_name, &m_info_command); + addEntityToGroup(grp, e); + return grp; + } - Group3D* addToGroup(const std::string group_name, Topo::Block* b); - Group2D* addToGroup(const std::string group_name, Topo::CoFace* f); - Group1D* addToGroup(const std::string group_name, Topo::CoEdge* e); - Group0D* addToGroup(const std::string group_name, Topo::Vertex* v); + GroupEntity* addToGroup(const std::string& group_name, Geom::GeomEntity* e); + GroupEntity* addToGroup(const std::string& group_name, Topo::TopoEntity* e); - Group3D* removeFromGroup(const std::string group_name, Geom::Volume* v); - Group2D* removeFromGroup(const std::string group_name, Geom::Surface* s); - Group1D* removeFromGroup(const std::string group_name, Geom::Curve* c); - Group0D* removeFromGroup(const std::string group_name, Geom::Vertex* v); + template + TGroup* removeFromGroup(const std::string& group_name, TEntity* e) + { + TGroup* grp = m_group_manager.getGroup(group_name, &m_info_command); + removeEntityFromGroup(grp, e); + return grp; + } - Group3D* removeFromGroup(const std::string group_name, Topo::Block* b); - Group2D* removeFromGroup(const std::string group_name, Topo::CoFace* f); - Group1D* removeFromGroup(const std::string group_name, Topo::CoEdge* e); - Group0D* removeFromGroup(const std::string group_name, Topo::Vertex* v); + GroupEntity* removeFromGroup(const std::string& group_name, Geom::GeomEntity* e); + GroupEntity* removeFromGroup(const std::string& group_name, Topo::TopoEntity* e); private: template diff --git a/src/QtComponents/QtBoxOperationAction.cpp b/src/QtComponents/QtBoxOperationAction.cpp index 5696b212..9f8c68be 100644 --- a/src/QtComponents/QtBoxOperationAction.cpp +++ b/src/QtComponents/QtBoxOperationAction.cpp @@ -9,14 +9,14 @@ #include "Utils/Common.h" #include "Utils/ValidatedField.h" +#include "Geom/CommandNewBox.h" +#include "Geom/GeomDisplayRepresentation.h" #include "Geom/GeomManager.h" #include "Geom/Vertex.h" #include "Utils/Vector.h" #include "QtComponents/QtBoxOperationAction.h" #include #include "QtComponents/QtMgx3DApplication.h" -#include "Geom/CommandNewBox.h" -#include "Geom/GeomDisplayRepresentation.h" #include #include diff --git a/src/QtComponents/QtConeOperationAction.cpp b/src/QtComponents/QtConeOperationAction.cpp index 7dee1ed0..75791a9f 100644 --- a/src/QtComponents/QtConeOperationAction.cpp +++ b/src/QtComponents/QtConeOperationAction.cpp @@ -9,12 +9,12 @@ #include "Utils/Common.h" #include "Utils/ValidatedField.h" #include "Geom/GeomManager.h" +#include "Geom/GeomDisplayRepresentation.h" +#include "Geom/CommandNewCone.h" #include "QtComponents/QtConeOperationAction.h" #include #include "QtComponents/QtMgx3DApplication.h" #include "QtComponents/QtNumericFieldsFactory.h" -#include "Geom/GeomDisplayRepresentation.h" -#include "Geom/CommandNewCone.h" #include #include diff --git a/src/QtComponents/QtCylinderOperationAction.cpp b/src/QtComponents/QtCylinderOperationAction.cpp index 9c092d3f..313a9efc 100644 --- a/src/QtComponents/QtCylinderOperationAction.cpp +++ b/src/QtComponents/QtCylinderOperationAction.cpp @@ -10,15 +10,15 @@ #include "Utils/ValidatedField.h" #include "Geom/GeomManager.h" #include "Geom/Vertex.h" +#include "Geom/GeomDisplayRepresentation.h" +#include "Geom/CommandNewCylinder.h" +#include "Geom/CommandNewHollowCylinder.h" #include "Utils/MgxNumeric.h" #include "Utils/Vector.h" #include "QtComponents/QtCylinderOperationAction.h" #include #include "QtComponents/QtMgx3DApplication.h" #include "QtComponents/QtNumericFieldsFactory.h" -#include "Geom/GeomDisplayRepresentation.h" -#include "Geom/CommandNewCylinder.h" -#include "Geom/CommandNewHollowCylinder.h" #include #include diff --git a/src/QtComponents/QtSphereOperationAction.cpp b/src/QtComponents/QtSphereOperationAction.cpp index ec8e5799..ad51491b 100644 --- a/src/QtComponents/QtSphereOperationAction.cpp +++ b/src/QtComponents/QtSphereOperationAction.cpp @@ -9,14 +9,14 @@ #include "Utils/Common.h" #include "Utils/ValidatedField.h" #include "Geom/Vertex.h" +#include "Geom/GeomDisplayRepresentation.h" +#include "Geom/CommandNewSphere.h" +#include "Geom/CommandNewHollowSphere.h" #include "Utils/Vector.h" #include "QtComponents/QtSphereOperationAction.h" #include #include "QtComponents/QtMgx3DApplication.h" #include "QtComponents/QtNumericFieldsFactory.h" -#include "Geom/GeomDisplayRepresentation.h" -#include "Geom/CommandNewSphere.h" -#include "Geom/CommandNewHollowSphere.h" #include #include diff --git a/src/QtComponents/QtSpherePartOperationAction.cpp b/src/QtComponents/QtSpherePartOperationAction.cpp index 052e90cf..a3d22af6 100644 --- a/src/QtComponents/QtSpherePartOperationAction.cpp +++ b/src/QtComponents/QtSpherePartOperationAction.cpp @@ -11,14 +11,14 @@ #include "Utils/Common.h" #include "Utils/ValidatedField.h" #include "Geom/Vertex.h" +#include "Geom/GeomDisplayRepresentation.h" +#include "Geom/CommandNewSpherePart.h" +#include "Geom/CommandNewHollowSpherePart.h" #include "Utils/Vector.h" #include "QtComponents/QtSpherePartOperationAction.h" #include #include "QtComponents/QtMgx3DApplication.h" #include "QtComponents/QtNumericFieldsFactory.h" -#include "Geom/GeomDisplayRepresentation.h" -#include "Geom/CommandNewSpherePart.h" -#include "Geom/CommandNewHollowSpherePart.h" #include #include diff --git a/src/QtComponents/QtTopoEntitiesAssociationsAction.cpp b/src/QtComponents/QtTopoEntitiesAssociationsAction.cpp index 118815fe..923254be 100644 --- a/src/QtComponents/QtTopoEntitiesAssociationsAction.cpp +++ b/src/QtComponents/QtTopoEntitiesAssociationsAction.cpp @@ -8,15 +8,15 @@ #include "Utils/Common.h" #include "Utils/ValidatedField.h" -#include -#include "QtComponents/QtTopoEntitiesAssociationsAction.h" -#include "QtComponents/QtMgx3DApplication.h" -#include "QtComponents/QtMgx3DMainWindow.h" #include "Topo/CommandSetGeomAssociation.h" #include "Topo/CommandProjectVerticesOnNearestGeomEntities.h" #include "Topo/CommandProjectEdgesOnCurves.h" #include "Topo/CommandProjectFacesOnSurfaces.h" #include "Topo/TopoDisplayRepresentation.h" +#include +#include "QtComponents/QtTopoEntitiesAssociationsAction.h" +#include "QtComponents/QtMgx3DApplication.h" +#include "QtComponents/QtMgx3DMainWindow.h" #include #include diff --git a/src/QtComponents/QtTopologyEdgeCutAction.cpp b/src/QtComponents/QtTopologyEdgeCutAction.cpp index 31a76244..de2022b7 100644 --- a/src/QtComponents/QtTopologyEdgeCutAction.cpp +++ b/src/QtComponents/QtTopologyEdgeCutAction.cpp @@ -7,12 +7,12 @@ #include "Internal/Context.h" #include "Utils/Common.h" #include "Geom/GeomEntity.h" +#include "Topo/CommandSplitEdge.h" +#include "Topo/TopoDisplayRepresentation.h" #include "QtComponents/QtMgx3DApplication.h" #include #include "QtComponents/QtMgx3DMainWindow.h" #include "QtComponents/QtTopologyEdgeCutAction.h" -#include "Topo/CommandSplitEdge.h" -#include "Topo/TopoDisplayRepresentation.h" #include #include diff --git a/src/QtComponents/QtTopologyExtendSplitBlockAction.cpp b/src/QtComponents/QtTopologyExtendSplitBlockAction.cpp index 9876e248..9b02c932 100644 --- a/src/QtComponents/QtTopologyExtendSplitBlockAction.cpp +++ b/src/QtComponents/QtTopologyExtendSplitBlockAction.cpp @@ -8,11 +8,11 @@ #include "Internal/Resources.h" #include "Utils/Common.h" +#include "Topo/CommandExtendSplitBlock.h" +#include "Topo/TopoDisplayRepresentation.h" #include #include "QtComponents/QtMgx3DMainWindow.h" #include "QtComponents/QtTopologyExtendSplitBlockAction.h" -#include "Topo/CommandExtendSplitBlock.h" -#include "Topo/TopoDisplayRepresentation.h" #include #include diff --git a/src/QtComponents/QtTopologyExtendSplitFaceAction.cpp b/src/QtComponents/QtTopologyExtendSplitFaceAction.cpp index 3a42c9a4..6b773dcb 100644 --- a/src/QtComponents/QtTopologyExtendSplitFaceAction.cpp +++ b/src/QtComponents/QtTopologyExtendSplitFaceAction.cpp @@ -8,11 +8,11 @@ #include "Internal/Resources.h" #include "Utils/Common.h" +#include "Topo/CommandExtendSplitFace.h" +#include "Topo/TopoDisplayRepresentation.h" #include #include "QtComponents/QtMgx3DMainWindow.h" #include "QtComponents/QtTopologyExtendSplitFaceAction.h" -#include "Topo/CommandExtendSplitFace.h" -#include "Topo/TopoDisplayRepresentation.h" #include #include diff --git a/src/QtComponents/QtTopologySplitBlockAction.cpp b/src/QtComponents/QtTopologySplitBlockAction.cpp index 85762d17..dd3dd8b8 100644 --- a/src/QtComponents/QtTopologySplitBlockAction.cpp +++ b/src/QtComponents/QtTopologySplitBlockAction.cpp @@ -7,12 +7,12 @@ #include "Internal/Context.h" #include "Utils/Common.h" +#include "Topo/CommandSplitBlocks.h" +#include "Topo/TopoDisplayRepresentation.h" #include #include "QtComponents/QtMgx3DMainWindow.h" #include "QtComponents/QtNumericFieldsFactory.h" #include "QtComponents/QtTopologySplitBlockAction.h" -#include "Topo/CommandSplitBlocks.h" -#include "Topo/TopoDisplayRepresentation.h" #include #include diff --git a/src/QtComponents/QtTopologySplitBlockWithOGridAction.cpp b/src/QtComponents/QtTopologySplitBlockWithOGridAction.cpp index 3e83e3dc..9a28cc70 100644 --- a/src/QtComponents/QtTopologySplitBlockWithOGridAction.cpp +++ b/src/QtComponents/QtTopologySplitBlockWithOGridAction.cpp @@ -8,12 +8,12 @@ #include "Utils/Common.h" #include "Internal/Resources.h" +#include "Topo/CommandSplitBlocksWithOgrid.h" +#include "Topo/TopoDisplayRepresentation.h" #include #include "QtComponents/QtMgx3DMainWindow.h" #include "QtComponents/QtNumericFieldsFactory.h" #include "QtComponents/QtTopologySplitBlockWithOGridAction.h" -#include "Topo/CommandSplitBlocksWithOgrid.h" -#include "Topo/TopoDisplayRepresentation.h" #include #include diff --git a/src/QtComponents/QtTopologySplitFaceWithOGridAction.cpp b/src/QtComponents/QtTopologySplitFaceWithOGridAction.cpp index d376175f..2882f1fd 100644 --- a/src/QtComponents/QtTopologySplitFaceWithOGridAction.cpp +++ b/src/QtComponents/QtTopologySplitFaceWithOGridAction.cpp @@ -7,12 +7,12 @@ #include "Internal/Context.h" #include "Utils/Common.h" +#include "Topo/CommandSplitFacesWithOgrid.h" +#include "Topo/TopoDisplayRepresentation.h" #include #include "QtComponents/QtMgx3DMainWindow.h" #include "QtComponents/QtNumericFieldsFactory.h" #include "QtComponents/QtTopologySplitFaceWithOGridAction.h" -#include "Topo/CommandSplitFacesWithOgrid.h" -#include "Topo/TopoDisplayRepresentation.h" #include #include diff --git a/src/QtComponents/QtTopologySplitFacesAction.cpp b/src/QtComponents/QtTopologySplitFacesAction.cpp index 69cc4db3..865ca562 100644 --- a/src/QtComponents/QtTopologySplitFacesAction.cpp +++ b/src/QtComponents/QtTopologySplitFacesAction.cpp @@ -7,13 +7,13 @@ #include "Internal/Context.h" #include "Utils/Common.h" +#include "Topo/CommandSplitFaces.h" +#include "Topo/TopoDisplayRepresentation.h" #include #include "QtComponents/QtMgx3DMainWindow.h" #include "QtComponents/QtNumericFieldsFactory.h" #include "QtComponents/QtTopologySplitFacesAction.h" #include "Geom/GeomEntity.h" -#include "Topo/CommandSplitFaces.h" -#include "Topo/TopoDisplayRepresentation.h" #include #include diff --git a/src/QtComponents/QtTopologyUnrefineBlockAction.cpp b/src/QtComponents/QtTopologyUnrefineBlockAction.cpp index 4c1980c0..7b92ed85 100644 --- a/src/QtComponents/QtTopologyUnrefineBlockAction.cpp +++ b/src/QtComponents/QtTopologyUnrefineBlockAction.cpp @@ -7,11 +7,11 @@ #include "Internal/Context.h" #include "Utils/Common.h" +#include "Topo/CommandUnrefineBlock.h" +#include "Topo/TopoDisplayRepresentation.h" #include #include "QtComponents/QtMgx3DMainWindow.h" #include "QtComponents/QtTopologyUnrefineBlockAction.h" -#include "Topo/CommandUnrefineBlock.h" -#include "Topo/TopoDisplayRepresentation.h" #include #include diff --git a/src/QtComponents/QtVertexOperationAction.cpp b/src/QtComponents/QtVertexOperationAction.cpp index 34b1d9d5..15680041 100644 --- a/src/QtComponents/QtVertexOperationAction.cpp +++ b/src/QtComponents/QtVertexOperationAction.cpp @@ -12,14 +12,14 @@ #include "Geom/Surface.h" #include "Geom/Curve.h" #include "Geom/Vertex.h" -#include -#include "QtComponents/QtVertexOperationAction.h" -#include "QtComponents/QtMgx3DApplication.h" -#include "QtComponents/QtNumericFieldsFactory.h" #include "Geom/CommandNewVertexByCurveParameterization.h" #include "Geom/CommandNewVertexByProjection.h" #include "Geom/CommandNewVertex.h" #include "Geom/GeomDisplayRepresentation.h" +#include +#include "QtComponents/QtVertexOperationAction.h" +#include "QtComponents/QtMgx3DApplication.h" +#include "QtComponents/QtNumericFieldsFactory.h" #include #include From a1abc035d9f2bb79148d3b744536ac531a7c7613 Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Fri, 24 Oct 2025 16:20:33 +0200 Subject: [PATCH 07/18] Reduce dependencencies Geom --> Group --- src/Core/Geom/CommandEditGeom.cpp | 50 +- src/Core/Geom/CommandExtrusion.cpp | 64 +- src/Core/Geom/CommandJoinCurves.cpp | 7 +- src/Core/Geom/CommandJoinSurfaces.cpp | 7 +- src/Core/Geom/Curve.cpp | 3 + src/Core/Geom/GeomEntity.cpp | 41 +- src/Core/Geom/Surface_Geom.cpp | 71 --- src/Core/Geom/Vertex_Geom.cpp | 72 --- src/Core/Geom/Volume_Geom.cpp | 71 --- src/Core/Group/GroupEntity.cpp | 9 +- src/Core/Group/GroupHelperForCommand.cpp | 79 ++- src/Core/Group/GroupManager.cpp | 70 ++- src/Core/Mesh/CommandAddRemoveGroupName.cpp | 546 ++++-------------- src/Core/Mesh/CommandCreateMesh.cpp | 20 +- src/Core/Mesh/CommandMeshExplorer.cpp | 2 +- src/Core/Services/DescriptionService.cpp | 5 +- src/Core/Services/InfoService.cpp | 6 +- src/Core/Services/MementoService.cpp | 13 +- src/Core/Topo/Block.cpp | 29 +- src/Core/Topo/CoEdge.cpp | 18 +- src/Core/Topo/CoFace.cpp | 18 +- src/Core/Topo/CommandSetGeomAssociation.cpp | 9 +- src/Core/Topo/TopoEntity.cpp | 9 +- src/Core/Topo/TopoManager.cpp | 12 +- src/Core/Topo/Vertex.cpp | 24 +- src/Core/protected/Geom/Curve.h | 31 - src/Core/protected/Geom/GeomEntity.h | 15 +- src/Core/protected/Geom/Surface.h | 33 +- src/Core/protected/Geom/Vertex.h | 32 - src/Core/protected/Geom/Volume.h | 31 - .../protected/Group/GroupHelperForCommand.h | 71 ++- src/Core/protected/Group/GroupManager.h | 35 +- .../Mesh/CommandAddRemoveGroupName.h | 15 +- src/Core/protected/Services/MementoService.h | 7 +- src/Core/protected/Topo/Block.h | 3 +- src/Core/protected/Topo/CoEdge.h | 4 +- src/Core/protected/Topo/CoFace.h | 3 +- src/Core/protected/Topo/Edge.h | 3 - src/Core/protected/Topo/Face.h | 9 - src/Core/protected/Topo/TopoEntity.h | 9 +- src/Core/protected/Topo/TopoManager.h | 4 +- src/Core/protected/Topo/Vertex.h | 10 +- src/Utils/protected/Utils/Entity.h | 7 + test_link/test_groups.py | 15 +- 44 files changed, 487 insertions(+), 1105 deletions(-) diff --git a/src/Core/Geom/CommandEditGeom.cpp b/src/Core/Geom/CommandEditGeom.cpp index f6d4119d..f9600c8b 100644 --- a/src/Core/Geom/CommandEditGeom.cpp +++ b/src/Core/Geom/CommandEditGeom.cpp @@ -208,52 +208,10 @@ saveMementos(std::map & candidates) /*----------------------------------------------------------------------------*/ void CommandEditGeom::copyGroups(GeomEntity* ge1, GeomEntity* ge2) { - if (ge1->getDim() == 3 && ge2->getDim() == 3){ - std::vector grp; - ge1->getGroups(grp); - Volume* res = dynamic_cast(ge2); - for (std::vector::iterator iter = grp.begin(); - iter != grp.end(); ++iter){ - Group::Group3D* grp = dynamic_cast(*iter); - if (res && grp && !res->find(grp)){ - m_group_helper.addToGroup(grp->getName(), res); - } - } - } - else if (ge1->getDim() == 2 && ge2->getDim() == 2){ - std::vector grp; - ge1->getGroups(grp); - Surface* res = dynamic_cast(ge2); - for (std::vector::iterator iter = grp.begin(); - iter != grp.end(); ++iter){ - Group::Group2D* grp = dynamic_cast(*iter); - if (res && grp && !res->find(grp)){ - m_group_helper.addToGroup(grp->getName(), res); - } - } - } - else if (ge1->getDim() == 1 && ge2->getDim() == 1){ - std::vector grp; - ge1->getGroups(grp); - Curve* res = dynamic_cast(ge2); - for (std::vector::iterator iter = grp.begin(); - iter != grp.end(); ++iter){ - Group::Group1D* grp = dynamic_cast(*iter); - if (res && grp && !res->find(grp)){ - m_group_helper.addToGroup(grp->getName(), res); - } - } - } - else if (ge1->getDim() == 0 && ge2->getDim() == 0){ - Vertex* res = dynamic_cast(ge2); - for (Group::Group0D* grp : res->getGroups()) { - if (res && grp && !res->find(grp)){ - m_group_helper.addToGroup(grp->getName(), res); - } - } - } - else { - throw TkUtil::Exception(TkUtil::UTF8String ("Copie des groupes pour une dimension non prévue", TkUtil::Charset::UTF_8)); + Group::GroupManager& gm = getContext().getGroupManager(); + for (Group::GroupEntity* grp : gm.getGroupsFor(ge1)) { + if (!gm.hasGroupFor(ge2, grp)) + m_group_helper.addToGroup(grp->getName(), ge2); } } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Geom/CommandExtrusion.cpp b/src/Core/Geom/CommandExtrusion.cpp index b99fcf3c..032031bf 100644 --- a/src/Core/Geom/CommandExtrusion.cpp +++ b/src/Core/Geom/CommandExtrusion.cpp @@ -151,54 +151,48 @@ groups2DTo3D() // Les nouveaux objets ont été mis "hors groupe" à la création // On se sert de la correspondance entre les entités initiales et finales // pour transmetre les groupes de la dimension N à la dimension N+1 + Group::GroupManager& gm = getContext().getGroupManager(); - for (std::map::iterator iter = m_s2v.begin(); + for (std::map::iterator iter = m_s2v.begin(); iter != m_s2v.end(); ++iter){ Geom::Surface* surf = iter->first; Geom::Volume* vol = iter->second; if (vol){ - std::vector grp; - surf->getGroups(grp); - - for (uint i=0; igetName(); - if (nom != getContext().getGroupManager().getDefaultName(2)) { - Group::Group3D* new_grp = m_group_helper.addToGroup(nom, vol); - new_grp->setLevel(grp[i]->getLevel()); + for (Group::GroupEntity* grp : gm.getGroupsFor(surf)) { + std::string nom = grp->getName(); + if (nom != gm.getDefaultName(2)) { + Group::GroupEntity* new_grp = m_group_helper.addToGroup(nom, vol); + new_grp->setLevel(grp->getLevel()); } } } } - for (std::map::iterator iter = m_c2s.begin(); + for (std::map::iterator iter = m_c2s.begin(); iter != m_c2s.end(); ++iter){ Geom::Curve* curve = iter->first; Geom::Surface* surf = iter->second; if (surf){ - std::vector grp; - curve->getGroups(grp); - for (uint i=0; igetName(); - if (nom != getContext().getGroupManager().getDefaultName(1)) { - Group::Group2D* new_grp = m_group_helper.addToGroup(nom, surf); - new_grp->setLevel(grp[i]->getLevel()); + for (Group::GroupEntity* grp : gm.getGroupsFor(curve)) { + std::string nom = grp->getName(); + if (nom != gm.getDefaultName(1)) { + Group::GroupEntity* new_grp = m_group_helper.addToGroup(nom, surf); + new_grp->setLevel(grp->getLevel()); } } } } - for (std::map::iterator iter = m_v2c.begin(); + for (std::map::iterator iter = m_v2c.begin(); iter != m_v2c.end(); ++iter){ Geom::Vertex* vtx = iter->first; Geom::Curve* curve = iter->second; if (curve){ - std::vector grp; - vtx->getGroups(grp); - for (uint i=0; igetName(); - if (nom != getContext().getGroupManager().getDefaultName(0)) { - Group::Group1D* new_grp = m_group_helper.addToGroup(nom, curve); - new_grp->setLevel(grp[i]->getLevel()); + for (Group::GroupEntity* grp : gm.getGroupsFor(vtx)) { + std::string nom = grp->getName(); + if (nom != gm.getDefaultName(0)) { + Group::GroupEntity* new_grp = m_group_helper.addToGroup(nom, curve); + new_grp->setLevel(grp->getLevel()); } } } @@ -210,6 +204,8 @@ void CommandExtrusion::prefixGroupsName(const std::string& pre, std::map& c2c, std::map& s2s) { + Group::GroupManager& gm = getContext().getGroupManager(); + // le groupe commun pour toutes les surfaces for (std::map::iterator iter = s2s.begin(); iter != s2s.end(); ++iter){ @@ -217,10 +213,8 @@ void CommandExtrusion::prefixGroupsName(const std::string& pre, Geom::Surface* surf2 = iter->second; if (surf2){ - std::vector gn; - surf1->getGroupsName(gn); - for (uint i=0; igetName(); m_group_helper.addToGroup(pre + "_" + nom, surf2); } @@ -235,10 +229,8 @@ void CommandExtrusion::prefixGroupsName(const std::string& pre, Geom::Curve* crv2 = iter->second; if (crv2){ - std::vector gn; - crv1->getGroupsName(gn); - for (uint i=0; igetName(); m_group_helper.addToGroup(pre + "_" + nom, crv2); } } @@ -250,10 +242,8 @@ void CommandExtrusion::prefixGroupsName(const std::string& pre, Geom::Vertex* vtx2 = iter->second; if (vtx2){ - std::vector gn; - vtx1->getGroupsName(gn); - for (uint i=0; igetName(); m_group_helper.addToGroup(pre + "_" + nom, vtx2); } } diff --git a/src/Core/Geom/CommandJoinCurves.cpp b/src/Core/Geom/CommandJoinCurves.cpp index b2a4a237..8e4f8ae0 100644 --- a/src/Core/Geom/CommandJoinCurves.cpp +++ b/src/Core/Geom/CommandJoinCurves.cpp @@ -142,10 +142,9 @@ internalSpecificExecute() m_newEntities.push_back(newCurve); // reprise des groupes de la première courbe - std::vector grp; - m_entities[0]->getGroups(grp); - for (uint i=0; igetName(), newCurve); + Group::GroupManager& gm = getContext().getGroupManager(); + for (Group::GroupEntity* grp : gm.getGroupsFor(m_entities[0])) { + m_group_helper.addToGroup(grp->getName(), newCurve); } // destruction des anciennes courbes diff --git a/src/Core/Geom/CommandJoinSurfaces.cpp b/src/Core/Geom/CommandJoinSurfaces.cpp index a7570e8b..679c4ebf 100644 --- a/src/Core/Geom/CommandJoinSurfaces.cpp +++ b/src/Core/Geom/CommandJoinSurfaces.cpp @@ -107,10 +107,9 @@ void CommandJoinSurfaces::internalSpecificExecute() m_newEntities.push_back(newSurface); // reprise des groupes de la première surface - std::vector grp; - m_entities[0]->getGroups(grp); - for (uint i=0; igetName(), newSurface); + Group::GroupManager& gm = getContext().getGroupManager(); + for (Group::GroupEntity* grp : gm.getGroupsFor(m_entities[0])) { + m_group_helper.addToGroup(grp->getName(), newSurface); } // destruction des anciennes surfaces diff --git a/src/Core/Geom/Curve.cpp b/src/Core/Geom/Curve.cpp index 41c4504f..9a1952e7 100644 --- a/src/Core/Geom/Curve.cpp +++ b/src/Core/Geom/Curve.cpp @@ -636,6 +636,7 @@ bool Curve::isA(const std::string& name) return (name.compare(0,getTinyName().size(),getTinyName()) == 0); } /*----------------------------------------------------------------------------*/ +<<<<<<< HEAD void Curve::add(Group::Group1D* grp) { //std::cout<<"Curve::add("<getName()<<") à "<>>>>>> 3e32643 (Reduce dependencencies Geom --> Group) bool Curve::isLinear() const { if (m_occ_edges.size() == 1) diff --git a/src/Core/Geom/GeomEntity.cpp b/src/Core/Geom/GeomEntity.cpp index 02fde0f5..fc501419 100644 --- a/src/Core/Geom/GeomEntity.cpp +++ b/src/Core/Geom/GeomEntity.cpp @@ -1,4 +1,5 @@ /*----------------------------------------------------------------------------*/ +#include "Internal/Context.h" #include "Geom/GeomEntity.h" #include "Geom/Volume.h" #include "Geom/Curve.h" @@ -9,11 +10,10 @@ #include "Geom/OCCDisplayRepresentationBuilder.h" #include "Geom/OCCFacetedRepresentationBuilder.h" #include "Geom/IncidentGeomEntitiesVisitor.h" +#include "Group/GroupManager.h" /*----------------------------------------------------------------------------*/ #include "Services/DescriptionService.h" /*----------------------------------------------------------------------------*/ -#include "Group/GroupEntity.h" -/*----------------------------------------------------------------------------*/ #include #include #include @@ -33,6 +33,9 @@ GeomEntity::GeomEntity(Internal::Context& ctx, Utils::Property* prop, Utils::Dis /*----------------------------------------------------------------------------*/ GeomEntity::~GeomEntity() { + Group::GroupManager& gm = getContext().getGroupManager(); + gm.removeAllGroupsFor(this); + if(m_geomProp!=0) delete m_geomProp; } @@ -100,22 +103,6 @@ GeomProperty::type GeomEntity::getGeomType ( ) const return getGeomProperty ( )->getType ( ); } // GeomEntity::getGeomType /*----------------------------------------------------------------------------*/ -void GeomEntity::getGroupsName (std::vector& gn) const -{ - MGX_FORBIDDEN("getGroupsName est à redéfinir dans les classes dérivées"); -} -/*----------------------------------------------------------------------------*/ -void GeomEntity::getGroups(std::vector& grp) const -{ - MGX_FORBIDDEN("getGroups est à redéfinir dans les classes dérivées"); -} -/*----------------------------------------------------------------------------*/ -int GeomEntity::getNbGroups() const -{ - MGX_FORBIDDEN("getNbGroups est à redéfinir dans les classes dérivées"); - return 0; -} -/*----------------------------------------------------------------------------*/ double GeomEntity::getArea() const { //std::cout<<"GeomEntity::getArea() pour "<remove(this); + else + // et inversement en cas de ressurection + for (Group::GroupEntity* g : gm.getGroupsFor(this)) + g->add(this); + + Entity::setDestroyed(b); +} +/*----------------------------------------------------------------------------*/ } // end namespace Geom /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/Geom/Surface_Geom.cpp b/src/Core/Geom/Surface_Geom.cpp index cbea21ab..ba8c5f3f 100644 --- a/src/Core/Geom/Surface_Geom.cpp +++ b/src/Core/Geom/Surface_Geom.cpp @@ -6,7 +6,6 @@ #include "Geom/OCCHelper.h" #include "Geom/EntityFactory.h" #include "Geom/GeomProjectImplementation.h" -#include "Internal/EntitiesHelper.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ @@ -223,76 +222,6 @@ bool Surface::isA(const std::string& name) return (name.compare(0,getTinyName().size(),getTinyName()) == 0); } /*----------------------------------------------------------------------------*/ -void Surface::add(Group::Group2D* grp) -{ - m_groups.push_back(grp); - - TkUtil::Color color (0, 0, 0); - std::vector groups = Internal::groupsFromTypedGroups (m_groups); - if (true == getContext ( ).getGroupColor (groups, color)) - { - getDisplayProperties ( ).setCloudColor (color); - getDisplayProperties ( ).setWireColor (color); - getDisplayProperties ( ).setSurfacicColor (color); - getDisplayProperties ( ).setFontColor (color); - } // if (true == getContext ( ).getGroupColor (groups, color)) -} -/*----------------------------------------------------------------------------*/ -void Surface::remove(Group::Group2D* grp) -{ - uint i = 0; - for (; i& gn) const -{ - gn.clear(); - for (uint i = 0; igetName()); -} -/*----------------------------------------------------------------------------*/ -void Surface::getGroups(std::vector& grp) const -{ - grp.insert(grp.end(), m_groups.begin(), m_groups.end()); -} -/*----------------------------------------------------------------------------*/ -int Surface::getNbGroups() const -{ - return m_groups.size(); -} -/*----------------------------------------------------------------------------*/ -void Surface::setDestroyed(bool b) -{ - if (isDestroyed() == b) - return; - - // supprime la relation du groupe vers le Surface en cas de destruction - if (b) - for (uint i = 0; iremove(this); - else - // et inversement en cas de ressurection - for (uint i = 0; iadd(this); - - Entity::setDestroyed(b); -} -/*----------------------------------------------------------------------------*/ bool Surface::isPlanar() const { if (m_occ_faces.size() == 1) diff --git a/src/Core/Geom/Vertex_Geom.cpp b/src/Core/Geom/Vertex_Geom.cpp index a64a6ac8..c1c501f1 100644 --- a/src/Core/Geom/Vertex_Geom.cpp +++ b/src/Core/Geom/Vertex_Geom.cpp @@ -4,7 +4,6 @@ #include "Geom/Surface.h" #include "Geom/OCCHelper.h" #include "Internal/Context.h" -#include "Internal/EntitiesHelper.h" /*----------------------------------------------------------------------------*/ #include #include @@ -134,77 +133,6 @@ TkUtil::UTF8String& operator<<(TkUtil::UTF8String& str, const Vertex& v) str<<"("< groups = Internal::groupsFromTypedGroups (m_groups); - if (true == getContext ( ).getGroupColor (groups, color)) - { - getDisplayProperties ( ).setCloudColor (color); - getDisplayProperties ( ).setWireColor (color); - getDisplayProperties ( ).setSurfacicColor (color); - getDisplayProperties ( ).setFontColor (color); - } // if (true == getContext ( ).getGroupColor (groups, color)) -} -/*----------------------------------------------------------------------------*/ -void Vertex::remove(Group::Group0D* grp) -{ - uint i = 0; - for (; i& gn) const -{ - gn.clear(); - for (uint i = 0; igetName()); -} -/*----------------------------------------------------------------------------*/ -void Vertex::getGroups(std::vector& grp) const -{ - grp.insert(grp.end(), m_groups.begin(), m_groups.end()); -} -/*----------------------------------------------------------------------------*/ -int Vertex::getNbGroups() const -{ - return m_groups.size(); -} -/*----------------------------------------------------------------------------*/ -void Vertex::setDestroyed(bool b) -{ - if (isDestroyed() == b) - return; - - // supprime la relation du groupe vers le sommet en cas de destruction - if (b) - for (uint i = 0; iremove(this); - else - // et inversement en cas de ressurection - for (uint i = 0; iadd(this); - - Entity::setDestroyed(b); -} /*----------------------------------------------------------------------------*/ } // end namespace Geom /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Geom/Volume_Geom.cpp b/src/Core/Geom/Volume_Geom.cpp index 46b60969..66b8e1ba 100644 --- a/src/Core/Geom/Volume_Geom.cpp +++ b/src/Core/Geom/Volume_Geom.cpp @@ -5,7 +5,6 @@ #include "Geom/Volume.h" #include "Geom/OCCHelper.h" #include "Internal/Context.h" -#include "Internal/EntitiesHelper.h" /*----------------------------------------------------------------------------*/ #include #include @@ -112,76 +111,6 @@ bool Volume::isA(const std::string& name) return (name.compare(0,getTinyName().size(),getTinyName()) == 0); } /*----------------------------------------------------------------------------*/ -void Volume::add(Group::Group3D* grp) -{ - m_groups.push_back(grp); - - TkUtil::Color color (0, 0, 0); - std::vector groups = Internal::groupsFromTypedGroups (m_groups); - if (true == getContext ( ).getGroupColor (groups, color)) - { - getDisplayProperties ( ).setCloudColor (color); - getDisplayProperties ( ).setWireColor (color); - getDisplayProperties ( ).setSurfacicColor (color); - getDisplayProperties ( ).setFontColor (color); - } // if (true == getContext ( ).getGroupColor (groups, color)) -} -/*----------------------------------------------------------------------------*/ -void Volume::remove(Group::Group3D* grp) -{ - uint i = 0; - for (; i& gn) const -{ - gn.clear(); - for (uint i = 0; igetName()); -} -/*----------------------------------------------------------------------------*/ -void Volume::getGroups(std::vector& grp) const -{ - grp.insert(grp.end(), m_groups.begin(), m_groups.end()); -} -/*----------------------------------------------------------------------------*/ -int Volume::getNbGroups() const -{ - return m_groups.size(); -} -/*----------------------------------------------------------------------------*/ -void Volume::setDestroyed(bool b) -{ - if (isDestroyed() == b) - return; - - // supprime la relation du groupe vers le volume en cas de destruction - if (b) - for (uint i = 0; iremove(this); - else - // et inversement en cas de ressurection - for (uint i = 0; iadd(this); - - Entity::setDestroyed(b); -} -/*----------------------------------------------------------------------------*/ } // end namespace Geom /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/Group/GroupEntity.cpp b/src/Core/Group/GroupEntity.cpp index 44e84159..2160f75c 100644 --- a/src/Core/Group/GroupEntity.cpp +++ b/src/Core/Group/GroupEntity.cpp @@ -51,18 +51,19 @@ getDescription (bool alsoComputed) const /*----------------------------------------------------------------------------*/ void GroupEntity::remove(Utils::Entity* e, const bool exceptionIfNotFound) { - if (!find(e)) { + if (find(e)) { + m_entities.erase(std::remove(m_entities.begin(), m_entities.end(), e), m_entities.end()); + } else if (exceptionIfNotFound) { TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Le groupe "<getName(); throw TkUtil::Exception(messErr); } - - m_entities.erase(std::remove(m_entities.begin(), m_entities.end(), e), m_entities.end()); } + /*----------------------------------------------------------------------------*/ void GroupEntity::add(Utils::Entity* e) { - if (find(e)) { + if (find(e)) { TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Le groupe "<getName(); throw TkUtil::Exception(messErr); diff --git a/src/Core/Group/GroupHelperForCommand.cpp b/src/Core/Group/GroupHelperForCommand.cpp index 4f96a860..fcc6173c 100644 --- a/src/Core/Group/GroupHelperForCommand.cpp +++ b/src/Core/Group/GroupHelperForCommand.cpp @@ -16,25 +16,50 @@ GroupHelperForCommand(Internal::InfoCommand& info_command, GroupManager& group_m GroupEntity* GroupHelperForCommand:: addToGroup(const std::string& group_name, Geom::GeomEntity* e) { - switch (e->getDim()) - { - case 0: return addToGroup(group_name, dynamic_cast(e)); - case 1: return addToGroup(group_name, dynamic_cast(e)); - case 2: return addToGroup(group_name, dynamic_cast(e)); - default: return addToGroup(group_name, dynamic_cast(e)); + GroupEntity* group = m_group_manager.getNewGroup(group_name, e->getDim(), &m_info_command); + + // il faut peut-être enlever le groupe par défaut + std::vector groups = m_group_manager.getGroupsFor(e); + if (groups.size() == 1) { + if (groups[0]->isDefaultGroup()) { + groups[0]->remove(e); + m_group_manager.removeGroupFor(e, groups[0]); + if (groups[0]->empty()) + m_info_command.addGroupInfoEntity(groups[0], Internal::InfoCommand::DISABLE); + else + m_info_command.addGroupInfoEntity(groups[0], Internal::InfoCommand::DISPMODIFIED); + } + } + + // on ajoute sauf si l'entité est déjà dans un groupe + // et que le groupe correspond au groupe par defaut + if (! (m_group_manager.getGroupsFor(e).size() > 0 && group->isDefaultGroup())) { + group->add(e); + m_group_manager.addGroupFor(e, group); + m_info_command.addGroupInfoEntity(group, Internal::InfoCommand::DISPMODIFIED); } + + return group; } /*----------------------------------------------------------------------------*/ GroupEntity* GroupHelperForCommand:: removeFromGroup(const std::string& group_name, Geom::GeomEntity* e) { - switch (e->getDim()) - { - case 0: return removeFromGroup(group_name, dynamic_cast(e)); - case 1: return removeFromGroup(group_name, dynamic_cast(e)); - case 2: return removeFromGroup(group_name, dynamic_cast(e)); - default: return removeFromGroup(group_name, dynamic_cast(e)); + GroupEntity* group = m_group_manager.getGroup(group_name, e->getDim(), &m_info_command); + group->remove(e); + m_group_manager.removeGroupFor(e, group); + + // il faut peut-être ajouter le groupe par défaut + if (m_group_manager.getGroupsFor(e).empty()) { + addToGroup("", e); } + + if (group->empty()) + m_info_command.addGroupInfoEntity(group, Internal::InfoCommand::DISABLE); + else + m_info_command.addGroupInfoEntity(group, Internal::InfoCommand::DISPMODIFIED); + + return group; } /*----------------------------------------------------------------------------*/ GroupEntity* GroupHelperForCommand:: @@ -61,6 +86,36 @@ removeFromGroup(const std::string& group_name, Topo::TopoEntity* e) } } /*----------------------------------------------------------------------------*/ +std::vector GroupHelperForCommand:: +getGroupsFor(const Topo::TopoEntity* e) +{ + std::vector groups; + switch (e->getDim()) + { + case 0: { + auto v = dynamic_cast(e)->getGroups(); + for (Group0D* g : v) groups.push_back(g); + break; + } + case 1: { + auto v = dynamic_cast(e)->getGroups(); + for (Group1D* g : v) groups.push_back(g); + break; + } + case 2: { + auto v = dynamic_cast(e)->getGroups(); + for (Group2D* g : v) groups.push_back(g); + break; + } + default: { + auto v = dynamic_cast(e)->getGroups(); + for (Group3D* g : v) groups.push_back(g); + break; + } + } + return groups; +} +/*----------------------------------------------------------------------------*/ } // end namespace Group /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/Group/GroupManager.cpp b/src/Core/Group/GroupManager.cpp index df898ad4..d8d577ce 100644 --- a/src/Core/Group/GroupManager.cpp +++ b/src/Core/Group/GroupManager.cpp @@ -69,10 +69,10 @@ GroupManager::~GroupManager() void GroupManager::clear() { // destruction des entités référencées par le manager - for (std::vector::const_iterator iter = m_groups.begin(); - iter != m_groups.end(); ++iter) + for (auto iter = m_groups.begin(); iter != m_groups.end(); ++iter) delete *iter; m_groups.clear(); + m_entities_groups.clear(); } /*------------------------------------------------------------------------*/ /** Vide un groupe suivant son nom et une dimension */ @@ -170,6 +170,17 @@ T* GroupManager::getGroup(const std::string& gr_name, const bool exceptionIfNotF return gr; } /*----------------------------------------------------------------------------*/ +GroupEntity* GroupManager::getGroup(const std::string& name, const int dim, const bool exceptionIfNotFound) const +{ + switch(dim){ + case(3): return getGroup(name, exceptionIfNotFound); + case(2): return getGroup(name, exceptionIfNotFound); + case(1): return getGroup(name, exceptionIfNotFound); + case(0): return getGroup(name, exceptionIfNotFound); + default: throw TkUtil::Exception (TkUtil::UTF8String ("dimension non prévue pour GroupManager::getGroup", TkUtil::Charset::UTF_8)); + } +} +/*----------------------------------------------------------------------------*/ template ::value>> T* GroupManager::getNewGroup(const std::string& gr_name, Internal::InfoCommand* icmd) { @@ -191,6 +202,17 @@ T* GroupManager::getNewGroup(const std::string& gr_name, Internal::InfoCommand* return gr; } /*----------------------------------------------------------------------------*/ +GroupEntity* GroupManager::getNewGroup(const std::string& name, const int dim, Internal::InfoCommand* icmd) +{ + switch(dim){ + case(3): return getNewGroup(name, icmd); + case(2): return getNewGroup(name, icmd); + case(1): return getNewGroup(name, icmd); + case(0): return getNewGroup(name, icmd); + default: throw TkUtil::Exception (TkUtil::UTF8String ("dimension non prévue pour GroupManager::getNewGroup", TkUtil::Charset::UTF_8)); + } +} +/*----------------------------------------------------------------------------*/ template ::value>> std::vector GroupManager::getGroups(const bool onlyLive) const { @@ -1893,15 +1915,45 @@ void GroupManager::setLevel(std::vector& vg, int dim, int level) getGroup(n, dim, true)->setLevel(level); } /*----------------------------------------------------------------------------*/ -GroupEntity* GroupManager::getGroup(const std::string& name, const int dim, const bool exceptionIfNotFound) const +const std::vector& GroupManager::getGroupsFor(const Geom::GeomEntity* e) { - switch(dim){ - case(3): return getGroup(name, exceptionIfNotFound); - case(2): return getGroup(name, exceptionIfNotFound); - case(1): return getGroup(name, exceptionIfNotFound); - case(0): return getGroup(name, exceptionIfNotFound); - default: throw TkUtil::Exception (TkUtil::UTF8String ("dimension non prévue pour GroupManager::getGroup", TkUtil::Charset::UTF_8)); + return m_entities_groups[e]; +} +/*----------------------------------------------------------------------------*/ +void GroupManager::addGroupFor(const Geom::GeomEntity* e, GroupEntity* g) +{ + if (e->getDim() != g->getDim()) { + TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); + messErr << e->getName() << " doit être de même dimension que " << g->getName(); + throw TkUtil::Exception(messErr); } + if (!hasGroupFor(e, g)) + m_entities_groups[e].push_back(g); +} +/*----------------------------------------------------------------------------*/ +void GroupManager::setGroupsFor(const Geom::GeomEntity* e, const std::vector& gs) +{ + m_entities_groups[e].clear(); + for (GroupEntity* g : gs) addGroupFor(e, g); +} +/*----------------------------------------------------------------------------*/ +void GroupManager::removeGroupFor(const Geom::GeomEntity* e, GroupEntity* g) +{ + std::vector& v = m_entities_groups[e]; + // on supprime toutes les occurrences de g dans le vecteur + // (même si en principe il ne devrait y en avoir qu'une seule) + v.erase(std::remove(v.begin(), v.end(), g), v.end()); +} +/*----------------------------------------------------------------------------*/ +void GroupManager::removeAllGroupsFor(const Geom::GeomEntity* e) +{ + m_entities_groups.erase(e); +} +/*----------------------------------------------------------------------------*/ +bool GroupManager::hasGroupFor(const Geom::GeomEntity* e, GroupEntity* g) +{ + const std::vector& groups = m_entities_groups[e]; + return (std::find(groups.begin(), groups.end(), g) != groups.end()); } /*----------------------------------------------------------------------------*/ template Group0D* GroupManager::getGroup(const std::string&, const bool) const; diff --git a/src/Core/Mesh/CommandAddRemoveGroupName.cpp b/src/Core/Mesh/CommandAddRemoveGroupName.cpp index 0a574f22..57db047a 100644 --- a/src/Core/Mesh/CommandAddRemoveGroupName.cpp +++ b/src/Core/Mesh/CommandAddRemoveGroupName.cpp @@ -132,265 +132,63 @@ CommandAddRemoveGroupName::~CommandAddRemoveGroupName() /*----------------------------------------------------------------------------*/ void CommandAddRemoveGroupName::internalExecute() { - // archivage des groupes initiaux - for (std::vector::iterator iter = m_geom_entities.begin(); - iter != m_geom_entities.end(); ++iter){ - (*iter)->getGroupsName(m_geom_groups[*iter]); - } // iter - // pour la topologie, on n'utilise pas le mécanisme de sauvegarde - for (std::vector::iterator iter = m_topo_entities.begin(); - iter != m_topo_entities.end(); ++iter){ - (*iter)->getGroupsName(m_topo_groups[*iter], false, true); - } // iter - - switch(m_dim){ - case(0):{ - for (std::vector::iterator iter = m_geom_entities.begin(); - iter != m_geom_entities.end(); ++iter){ - Geom::Vertex* vtx = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(vtx); - if (m_ope == add){ - // on ajoute le groupe - m_group_helper.addToGroup(m_groupName, vtx); - } - else if (m_ope == remove) { - // on retire le groupe - m_group_helper.removeFromGroup(m_groupName, vtx); - } else if (m_ope == set){ - // on retire tous les groupes - std::vector gn; - vtx->getGroupsName(gn); - for (uint i=0; i::iterator iter = m_topo_entities.begin(); - iter != m_topo_entities.end(); ++iter){ - Topo::Vertex* vtx = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(vtx); - if (m_ope == add){ - // on ajoute le groupe - m_group_helper.addToGroup(m_groupName, vtx); - } - else if (m_ope == remove) { - // on retire le groupe - m_group_helper.removeFromGroup(m_groupName, vtx); - } else if (m_ope == set){ - // on retire tous les groupes - std::vector gn; - vtx->getGroupsName(gn, false, true); - for (uint i=0; i::iterator iter = m_geom_entities.begin(); - iter != m_geom_entities.end(); ++iter){ - Geom::Curve* crv = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(crv); - if (m_ope == add){ - // on ajoute le groupe - Group::Group1D* grp = m_group_helper.addToGroup(m_groupName, crv); - updateMesh(crv, grp->getName(), true); - } - else if (m_ope == remove) { - // on retire le groupe - Group::Group1D* grp = m_group_helper.removeFromGroup(m_groupName, crv); - updateMesh(crv, grp->getName(), false); - } else if (m_ope == set){ - // on retire tous les groupes - std::vector gn; - crv->getGroupsName(gn); - for (uint i=0; i::iterator iter = m_topo_entities.begin(); - iter != m_topo_entities.end(); ++iter){ - Topo::CoEdge* coedge = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(coedge); - std::vector coedges = {coedge}; - if (m_ope == add){ - // on ajoute le groupe - Group::Group1D* grp = m_group_helper.addToGroup(m_groupName, coedge); - updateMesh(coedges, grp->getName(), true); - } - else if (m_ope == remove) { - // on retire le groupe - Group::Group1D* grp = m_group_helper.removeFromGroup(m_groupName, coedge); - updateMesh(coedges, grp->getName(), false); - } else if (m_ope == set){ - // on retire tous les groupes - std::vector gn; - coedge->getGroupsName(gn); - for (uint i=0; i::iterator iter = m_geom_entities.begin(); - iter != m_geom_entities.end(); ++iter){ - Geom::Surface* surf = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(surf); - if (m_ope == add){ - // on ajoute le groupe - Group::Group2D* grp = m_group_helper.addToGroup(m_groupName, surf); - updateMesh(surf, grp->getName(), true); - } - else if (m_ope == remove) { - // on retire le groupe - Group::Group2D* grp = m_group_helper.removeFromGroup(m_groupName, surf); - updateMesh(surf, grp->getName(), false); - } else if (m_ope == set){ - // on retire tous les groupes - std::vector gn; - surf->getGroupsName(gn); - for (uint i=0; i::iterator iter = m_topo_entities.begin(); - iter != m_topo_entities.end(); ++iter){ - Topo::CoFace* coface = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(coface); - std::vector cofaces = {coface}; - if (m_ope == add){ - // on ajoute le groupe - Group::Group2D* grp = m_group_helper.addToGroup(m_groupName, coface); - updateMesh(cofaces, grp->getName(), true); - } - else if (m_ope == remove) { - // on retire le groupe - Group::Group2D* grp = m_group_helper.removeFromGroup(m_groupName, coface); - updateMesh(cofaces, grp->getName(), false); - } else if (m_ope == set){ - // on retire tous les groupes - std::vector gn; - coface->getGroupsName(gn); - for (uint i=0; i::iterator iter = m_geom_entities.begin(); - iter != m_geom_entities.end(); ++iter){ - Geom::Volume* vol = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(vol); - if (m_ope == add){ - // on ajoute le groupe - Group::Group3D* grp = m_group_helper.addToGroup(m_groupName, vol); - updateMesh(vol, grp->getName(), true); - } - else if (m_ope == remove) { - // on retire le groupe - Group::Group3D* grp = m_group_helper.removeFromGroup(m_groupName, vol); - updateMesh(vol, grp->getName(), false); - } else if (m_ope == set){ - // on retire tous les groupes - std::vector gn; - vol->getGroupsName(gn); - for (uint i=0; i(m_groupName, vol); - updateMesh(vol, grp->getName(), true); - } else { - TkUtil::Exception ("[Erreur interne] Opération non prévue"); - } - } // end for iter - - for (std::vector::iterator iter = m_topo_entities.begin(); - iter != m_topo_entities.end(); ++iter){ - Topo::Block* bloc = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(bloc); - std::vector blocs = {bloc}; - if (m_ope == add){ - // on ajoute le groupe - Group::Group3D* grp = m_group_helper.addToGroup(m_groupName, bloc); - updateMesh(blocs, grp->getName(), true); - } - else if (m_ope == remove) { - // on retire le groupe - Group::Group3D* grp = m_group_helper.removeFromGroup(m_groupName, bloc); - updateMesh(blocs, grp->getName(), false); - } else if (m_ope == set){ - // on retire tous les groupes - std::vector gn; - bloc->getGroupsName(gn); - for (uint i=0; i(m_groupName, bloc); - updateMesh(blocs, grp->getName(), true); - } else { - TkUtil::Exception ("[Erreur interne] Opération non prévue"); - } - - // le bloc n'est peut-être plus visible / groupe visibles - getInfoCommand().addTopoInfoEntity(bloc,Internal::InfoCommand::VISIBILYCHANGED); - - } // end for iter - } - break; + Group::GroupManager& gm = getContext().getGroupManager(); + + for (Geom::GeomEntity* ge : m_geom_entities) { + // archivage des groupes initiaux + std::vector groups = gm.getGroupsFor(ge); + m_geom_groups[ge] = Utils::toNames(groups); + + if (m_ope == add){ + // on ajoute le groupe + Group::GroupEntity* grp = m_group_helper.addToGroup(m_groupName, ge); + updateMesh(ge, grp->getName(), true); + } + else if (m_ope == remove) { + // on retire le groupe + Group::GroupEntity* grp = m_group_helper.removeFromGroup(m_groupName, ge); + updateMesh(ge, grp->getName(), false); + } else if (m_ope == set){ + // on retire tous les groupes + for (Group::GroupEntity* grp : groups) + m_group_helper.removeFromGroup(grp->getName(), ge); + + // on ajoute le groupe + Group::GroupEntity* grp = m_group_helper.addToGroup(m_groupName, ge); + updateMesh(ge, grp->getName(), true); + } else { + TkUtil::Exception ("[Erreur interne] Opération non prévue"); + } + } - default:{ - TkUtil::Exception ("[Erreur interne] Dimension erronée"); - } - break; - } + for (Topo::TopoEntity* te : m_topo_entities) { + // pour la topologie, on n'utilise pas le mécanisme de sauvegarde + std::vector groups = m_group_helper.getGroupsFor(te); + m_topo_groups[te] = Utils::toNames(groups); + + if (m_ope == add){ + // on ajoute le groupe + Group::GroupEntity* grp = m_group_helper.addToGroup(m_groupName, te); + updateMesh(te, grp->getName(), true); + } + else if (m_ope == remove) { + // on retire le groupe + Group::GroupEntity* grp = m_group_helper.removeFromGroup(m_groupName, te); + updateMesh(te, grp->getName(), false); + } else if (m_ope == set){ + // on retire tous les groupes + for (Group::GroupEntity* grp : groups) + m_group_helper.removeFromGroup(grp->getName(), te); + + // on ajoute le groupe + Group::GroupEntity* grp = m_group_helper.addToGroup(m_groupName, te); + updateMesh(te, grp->getName(), true); + } else { + TkUtil::Exception ("[Erreur interne] Opération non prévue"); + } + + getInfoCommand().addTopoInfoEntity(te, Internal::InfoCommand::VISIBILYCHANGED); + } #ifdef _DEBUG2 std::cout<<"Après : CommandAddRemoveGroupName::internalExecute"<::iterator iter = m_geom_entities.begin(); - iter != m_geom_entities.end(); ++iter){ - Geom::Vertex* vtx = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(vtx); - - std::vector gnOld; - vtx->getGroupsName(gnOld); - // on retire tous les groupes actuellement présents - for (uint i=0; i& gnNew = m_geom_groups[vtx]; - // on ajoute tous les groupes archivés - for (uint i=0; i::iterator iter = m_topo_entities.begin(); - iter != m_topo_entities.end(); ++iter){ - Topo::Vertex* te = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(te); + Group::GroupManager& gm = getContext().getGroupManager(); - std::vector gnOld; - te->getGroupsName(gnOld, false, true); - // on retire tous les groupes actuellement présents - for (uint i=0; igetName(), ge); + updateMesh(ge, grp->getName(), false); + } - std::vector& gnNew = m_topo_groups[te]; - // on ajoute tous les groupes archivés - for (uint i=0; i::iterator iter = m_geom_entities.begin(); - iter != m_geom_entities.end(); ++iter){ - Geom::Curve* crv = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(crv); - std::vector gnOld; - crv->getGroupsName(gnOld); - // on retire tous les groupes actuellement présents - for (uint i=0; i(gnOld[i], crv); - updateMesh(crv, grp->getName(), false); - } - - std::vector& gnNew = m_geom_groups[crv]; - // on ajoute tous les groupes archivés - for (uint i=0; i(gnNew[i], crv); - updateMesh(crv, grp->getName(), true); - } - } // end for iter - - for (std::vector::iterator iter = m_topo_entities.begin(); - iter != m_topo_entities.end(); ++iter){ - Topo::CoEdge* coedge = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(coedge); - std::vector coedges = {coedge}; - - std::vector gnOld; - coedge->getGroupsName(gnOld, false, true); - // on retire tous les groupes actuellement présents - for (uint i=0; i(gnOld[i], coedge); - updateMesh(coedges, grp->getName(), false); - } - - std::vector& gnNew = m_topo_groups[coedge]; - // on ajoute tous les groupes archivés - for (uint i=0; i(gnNew[i], coedge); - updateMesh(coedges, grp->getName(), true); - } - } // end for iter - } - break; - case(2):{ - for (std::vector::iterator iter = m_geom_entities.begin(); - iter != m_geom_entities.end(); ++iter){ - Geom::Surface* srf = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(srf); - - std::vector gnOld; - srf->getGroupsName(gnOld); - // on retire tous les groupes actuellement présents - for (uint i=0; i(gnOld[i], srf); - updateMesh(srf, grp->getName(), false); - } - - std::vector& gnNew = m_geom_groups[srf]; - // on ajoute tous les groupes archivés - for (uint i=0; i(gnNew[i], srf); - updateMesh(srf, grp->getName(), true); - } - } // end for iter - - for (std::vector::iterator iter = m_topo_entities.begin(); - iter != m_topo_entities.end(); ++iter){ - Topo::CoFace* coface = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(coface); - std::vector cofaces = {coface}; - - std::vector gnOld; - coface->getGroupsName(gnOld, false, true); - // on retire tous les groupes actuellement présents - for (uint i=0; i(gnOld[i], coface); - updateMesh(cofaces, grp->getName(), false); - } - - std::vector& gnNew = m_topo_groups[coface]; - // on ajoute tous les groupes archivés - for (uint i=0; i(gnNew[i], coface); - updateMesh(cofaces, grp->getName(), true); - } - } // end for iter - } - break; - case(3):{ - for (std::vector::iterator iter = m_geom_entities.begin(); - iter != m_geom_entities.end(); ++iter){ - Geom::Volume* vol = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(vol); - - std::vector gnOld; - vol->getGroupsName(gnOld); - // on retire tous les groupes actuellement présents - for (uint i=0; i(gnOld[i], vol); - updateMesh(vol, grp->getName(), false); - } - - std::vector& gnNew = m_geom_groups[vol]; - // on ajoute tous les groupes archivés - for (uint i=0; i(gnNew[i], vol); - updateMesh(vol, grp->getName(), true); - } - } // end for iter - - for (std::vector::iterator iter = m_topo_entities.begin(); - iter != m_topo_entities.end(); ++iter){ - Topo::Block* bloc = dynamic_cast(*iter); - CHECK_NULL_PTR_ERROR(bloc); - std::vector blocs = {bloc}; - - std::vector gnOld; - bloc->getGroupsName(gnOld, false, true); - // on retire tous les groupes actuellement présents - for (uint i=0; i(gnOld[i], bloc); - updateMesh(blocs, grp->getName(), false); - } - - std::vector& gnNew = m_topo_groups[bloc]; - // on ajoute tous les groupes archivés - for (uint i=0; i(gnNew[i], bloc); - updateMesh(blocs, grp->getName(), true); - } - } // end for iter - } - break; - - default:{ - TkUtil::Exception ("[Erreur interne] Dimension erronée"); - } - break; + for (Topo::TopoEntity* te : m_topo_entities){ + for (Group::GroupEntity* grp : m_group_helper.getGroupsFor(te)) { + m_group_helper.removeFromGroup(grp->getName(), te); + updateMesh(te, grp->getName(), false); + } + + // on ajoute tous les groupes archivés + for (std::string grp_name : m_topo_groups[te]) { + m_group_helper.addToGroup(grp_name, te); + updateMesh(te, grp_name, true); + } } } /*----------------------------------------------------------------------------*/ @@ -608,6 +251,39 @@ void CommandAddRemoveGroupName::internalRedo() } /*----------------------------------------------------------------------------*/ void CommandAddRemoveGroupName:: +updateMesh(Geom::GeomEntity* e, std::string grpName, bool add) +{ + switch (e->getDim()) + { + case 1: return updateMesh(dynamic_cast(e), grpName, add); + case 2: return updateMesh(dynamic_cast(e), grpName, add); + case 3: return updateMesh(dynamic_cast(e), grpName, add); + default: return; // rien à faire en 0D + } +} +/*----------------------------------------------------------------------------*/ +void CommandAddRemoveGroupName:: +updateMesh(Topo::TopoEntity* e, std::string grpName, bool add) +{ + switch (e->getDim()) + { + case 1: { + std::vector v = { dynamic_cast(e) }; + return updateMesh(v, grpName, add); + } + case 2: { + std::vector v = { dynamic_cast(e) }; + return updateMesh(v, grpName, add); + } + case 3: { + std::vector v = { dynamic_cast(e) }; + return updateMesh(v, grpName, add); + } + default: return; // rien à faire en 0D + } +} +/*----------------------------------------------------------------------------*/ +void CommandAddRemoveGroupName:: updateMesh(Geom::Volume* vol, std::string grpName, bool add) { // récupération de la liste des blocs diff --git a/src/Core/Mesh/CommandCreateMesh.cpp b/src/Core/Mesh/CommandCreateMesh.cpp index eb1aae0a..487cf2ce 100644 --- a/src/Core/Mesh/CommandCreateMesh.cpp +++ b/src/Core/Mesh/CommandCreateMesh.cpp @@ -13,6 +13,7 @@ #include "Smoothing/VolumicSmoothing.h" #include "Utils/Command.h" #include "Group/GroupEntity.h" +#include "Group/GroupManager.h" #include "Topo/TopoHelper.h" #include "Topo/CoEdge.h" #include "Topo/CoFace.h" @@ -995,29 +996,26 @@ meshAndModify(std::list& list_cofaces) // 1 pour les anciens (ceux créés avant cette commande) std::map filtre_nodes_pert; - for (std::list::iterator iter1 = list_cofaces.begin(); - iter1 != list_cofaces.end(); ++iter1){ - Topo::CoFace* coface = *iter1; + Group::GroupManager& gm = getContext().getGroupManager(); + for (Topo::CoFace* coface : list_cofaces) { filtre_cofaces[coface] = 1; if (coface->getGeomAssociation() && coface->getGeomAssociation()->getDim() == 2){ Geom::Surface* surface = dynamic_cast(coface->getGeomAssociation()); CHECK_NULL_PTR_ERROR(surface); - const std::vector& grps = surface->getGroups(); - for (Group::Group2D* grp : grps){ + for (Group::Group2D* grp : gm.getFilteredGroupsFor(surface)){ if (!grp->getMeshModifications().empty()) list_grp.push_back(grp); } } // end if getGeomAssociation // les groupes depuis les faces - std::vector grps = coface->getGroups(); - for (Group::Group2D* grp : grps){ + for (Group::Group2D* grp : coface->getGroups()){ if (!grp->getMeshModifications().empty()) list_grp.push_back(grp); } - } // end for iter1 + } list_grp.sort(); list_grp.unique(); @@ -1242,17 +1240,15 @@ modify(std::vector& list_blocks) { // recherche des groupes 3D, parmis les blocs en entrée, qui ont une modification std::list list_grp; + Group::GroupManager& gm = getContext().getGroupManager(); for (Topo::Block* block : list_blocks){ if (block->getGeomAssociation() && block->getGeomAssociation()->getDim() == 3){ Geom::Volume* volume = dynamic_cast(block->getGeomAssociation()); CHECK_NULL_PTR_ERROR(volume); - const std::vector& grps = volume->getGroups(); - - for (Group::Group3D* grp : grps) { + for (Group::Group3D* grp : gm.getFilteredGroupsFor(volume)) if (!grp->getMeshModifications().empty()) list_grp.push_back(grp); - } // end for iter2 } // end if getGeomAssociation else { TkUtil::UTF8String message (TkUtil::Charset::UTF_8); diff --git a/src/Core/Mesh/CommandMeshExplorer.cpp b/src/Core/Mesh/CommandMeshExplorer.cpp index 551a1abb..144a91bb 100644 --- a/src/Core/Mesh/CommandMeshExplorer.cpp +++ b/src/Core/Mesh/CommandMeshExplorer.cpp @@ -451,7 +451,7 @@ createSubVolume(std::vector& bloc_dirPos) continue; std::vector groupsName; - blk->getGroupsName(groupsName, true, true); + blk->getGroupsName(groupsName); for (std::vector::iterator iter2 = groupsName.begin(); iter2 != groupsName.end(); ++iter2){ diff --git a/src/Core/Services/DescriptionService.cpp b/src/Core/Services/DescriptionService.cpp index 169c26c4..8bc34b2d 100644 --- a/src/Core/Services/DescriptionService.cpp +++ b/src/Core/Services/DescriptionService.cpp @@ -8,6 +8,7 @@ #include "Topo/CoFace.h" #include "Topo/Block.h" #include "Group/GroupEntity.h" +#include "Group/GroupManager.h" #include "SysCoord/SysCoord.h" #include "Mesh/MeshModificationItf.h" #include @@ -327,8 +328,8 @@ namespace Mgx3D::Services } // Les groupes s'il y en a - std::vector groups; - e->getGroups(groups); + Group::GroupManager& gm = e->getContext().getGroupManager(); + std::vector groups = gm.getGroupsFor(e); if (!groups.empty()) { Utils::SerializedRepresentation groupeDescription("Relations vers des groupes", ""); diff --git a/src/Core/Services/InfoService.cpp b/src/Core/Services/InfoService.cpp index e6fd4647..748ee098 100644 --- a/src/Core/Services/InfoService.cpp +++ b/src/Core/Services/InfoService.cpp @@ -3,6 +3,7 @@ #include "Geom/GeomEntity.h" #include "Geom/IncidentGeomEntitiesVisitor.h" #include "Topo/TopoEntity.h" +#include "Group/GroupManager.h" namespace Mgx3D::Services { @@ -47,8 +48,9 @@ namespace Mgx3D::Services Topo::TopoManager& tm = e->getContext().getTopoManager(); for (Topo::TopoEntity* te : tm.getRefTopos(e)) info._topo_entities.push_back(e->getName()); - - e->getGroupsName(info._groups); + + Group::GroupManager& gm = e->getContext().getGroupManager(); + info._groups = Utils::toNames(gm.getGroupsFor(e)); return info; } diff --git a/src/Core/Services/MementoService.cpp b/src/Core/Services/MementoService.cpp index ca98663d..f205637d 100644 --- a/src/Core/Services/MementoService.cpp +++ b/src/Core/Services/MementoService.cpp @@ -7,6 +7,7 @@ #include "Geom/Volume.h" #include "Topo/TopoManager.h" #include "Internal/Context.h" +#include "Group/GroupManager.h" #include namespace Mgx3D::Services @@ -20,7 +21,6 @@ namespace Mgx3D::Services { fillCommonFields(v); mem.curves = const_cast &>(v->getCurves()); - mem.groups0D = const_cast &>(v->getGroups()); mem.occ_shapes = {v->getOCCVertex()}; } @@ -29,7 +29,6 @@ namespace Mgx3D::Services fillCommonFields(c); mem.surfaces = const_cast &>(c->getSurfaces()); mem.vertices = const_cast &>(c->getVertices()); - mem.groups1D = const_cast &>(c->getGroups()); std::vector shapes; for (auto e : c->getOCCEdges()) shapes.push_back(e); @@ -41,7 +40,6 @@ namespace Mgx3D::Services fillCommonFields(s); mem.curves = const_cast &>(s->getCurves()); mem.volumes = const_cast &>(s->getVolumes()); - mem.groups2D = const_cast &>(s->getGroups()); std::vector shapes; for (auto f : s->getOCCFaces()) shapes.push_back(f); @@ -52,7 +50,6 @@ namespace Mgx3D::Services { fillCommonFields(v); mem.surfaces = const_cast &>(v->m_surfaces); - mem.groups3D = const_cast &>(v->m_groups); mem.occ_shapes = {v->getOCCShape()}; } @@ -60,6 +57,8 @@ namespace Mgx3D::Services { Topo::TopoManager& tm = e->getContext().getTopoManager(); mem.topo_entities = tm.getRefTopos(e); + Group::GroupManager& gm = e->getContext().getGroupManager(); + mem.groups = gm.getGroupsFor(e); mem.property = e->getGeomProperty(); } @@ -93,7 +92,6 @@ namespace Mgx3D::Services void visit(Geom::Vertex *v) override { v->m_curves = m_mem.curves; - v->m_groups = m_mem.groups0D; v->m_occ_vertex = TopoDS::Vertex(m_mem.occ_shapes[0]); setCommonFields(v); } @@ -102,7 +100,6 @@ namespace Mgx3D::Services { c->m_surfaces = m_mem.surfaces; c->m_vertices = m_mem.vertices; - c->m_groups = m_mem.groups1D; c->m_occ_edges.clear(); for (auto sh : m_mem.occ_shapes) c->m_occ_edges.push_back(TopoDS::Edge(sh)); @@ -113,7 +110,6 @@ namespace Mgx3D::Services { s->m_curves = m_mem.curves; s->m_volumes = m_mem.volumes; - s->m_groups = m_mem.groups2D; s->m_occ_faces.clear(); for (auto sh : m_mem.occ_shapes) s->m_occ_faces.push_back(TopoDS::Face(sh)); @@ -123,7 +119,6 @@ namespace Mgx3D::Services void visit(Geom::Volume *v) override { v->m_surfaces = m_mem.surfaces; - v->m_groups = m_mem.groups3D; v->m_occ_shape = m_mem.occ_shapes[0]; setCommonFields(v); } @@ -132,6 +127,8 @@ namespace Mgx3D::Services { Topo::TopoManager& tm = e->getContext().getTopoManager(); tm.setRefTopos(e, m_mem.topo_entities); + Group::GroupManager& gm = e->getContext().getGroupManager(); + gm.setGroupsFor(e, m_mem.groups); e->setGeomProperty(m_mem.property); e->forceComputeArea(); } diff --git a/src/Core/Topo/Block.cpp b/src/Core/Topo/Block.cpp index f637574d..905e7810 100644 --- a/src/Core/Topo/Block.cpp +++ b/src/Core/Topo/Block.cpp @@ -1,4 +1,3 @@ -/*----------------------------------------------------------------------------*/ #include #include #include @@ -1457,12 +1456,12 @@ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Block & b) o << ", projetée sur " << b.getGeomAssociation()->getName() <<(b.getGeomAssociation()->isDestroyed()?" (DETRUIT)":""); - std::vector gn; - b.getGeomAssociation()->getGroupsName(gn); + Group::GroupManager& gm = b.getContext().getGroupManager(); + std::vector gn = gm.getGroupsFor(b.getGeomAssociation()); if (!gn.empty()) { o << " (groupes:"; for (size_t i=0; igetName(); o << ")"; } else { @@ -1501,25 +1500,23 @@ Topo::TopoInfo Block::getInfos() const Topo::TopoInfo infos; infos.name = getName(); infos.dimension = getDim(); + infos._groups = Utils::toNames(getGroups()); if (getGeomAssociation() != 0) infos.geom_entity = getGeomAssociation()->getName(); std::vector vertices; getVertices(vertices); - for (Vertex* v : vertices) - infos._vertices.push_back(v->getName()); + infos._vertices = Utils::toNames(vertices); std::vector coedges; getCoEdges(coedges); - for (CoEdge* e : coedges) - infos._coedges.push_back(e->getName()); + infos._coedges = Utils::toNames(coedges); std::vector cofaces; getCoFaces(cofaces); - for (CoFace* f : cofaces) - infos._cofaces.push_back(f->getName()); + infos._cofaces = Utils::toNames(cofaces); - return infos; + return infos; } /*----------------------------------------------------------------------------*/ //void Block:: @@ -3458,14 +3455,12 @@ Utils::Math::Point Block::getBarycentre() const return barycentre; } /*----------------------------------------------------------------------------*/ -void Block::getGroupsName (std::vector& gn, bool byGeom, bool byTopo) const +void Block::getGroupsName (std::vector& gn) const { - if (byGeom) - TopoEntity::getGroupsName(gn, byGeom, byTopo); + TopoEntity::getGroupsName(gn); - if (byTopo) - for (uint i = 0; igetGroupsContainer().get(i)->getName()); + for (uint i = 0; igetGroupsContainer().get(i)->getName()); } /*----------------------------------------------------------------------------*/ void Block::add(Group::Group3D* grp) diff --git a/src/Core/Topo/CoEdge.cpp b/src/Core/Topo/CoEdge.cpp index e44637f9..9207b8e0 100644 --- a/src/Core/Topo/CoEdge.cpp +++ b/src/Core/Topo/CoEdge.cpp @@ -1,4 +1,3 @@ -/*----------------------------------------------------------------------------*/ #include #include #include @@ -2459,12 +2458,12 @@ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const CoEdge & e) o << ", projetée sur " << e.getGeomAssociation()->getName() <<(e.getGeomAssociation()->isDestroyed()?" (DETRUITE)":""); - std::vector gn; - e.getGeomAssociation()->getGroupsName(gn); + Group::GroupManager& gm = e.getContext().getGroupManager(); + std::vector gn = gm.getGroupsFor(e.getGeomAssociation()); if (!gn.empty()) { o << " (groupes:"; for (size_t i=0; igetName(); o << ")"; } else { @@ -2509,6 +2508,7 @@ Topo::TopoInfo CoEdge::getInfos() const Topo::TopoInfo infos; infos.name = getName(); infos.dimension = getDim(); + infos._groups = Utils::toNames(getGroups()); if (getGeomAssociation() != 0) infos.geom_entity = getGeomAssociation()->getName(); @@ -2784,14 +2784,12 @@ computeRatio(const Utils::Math::Point& pt) // return scale/norme; } /*----------------------------------------------------------------------------*/ -void CoEdge::getGroupsName (std::vector& gn, bool byGeom, bool byTopo) const +void CoEdge::getGroupsName (std::vector& gn) const { - if (byGeom) - TopoEntity::getGroupsName(gn, byGeom, byTopo); + TopoEntity::getGroupsName(gn); - if (byTopo) - for (uint i = 0; igetGroupsContainer().size(); ++i) - gn.push_back(m_topo_property->getGroupsContainer().get(i)->getName()); + for (uint i = 0; igetGroupsContainer().size(); ++i) + gn.push_back(m_topo_property->getGroupsContainer().get(i)->getName()); } /*----------------------------------------------------------------------------*/ void CoEdge::add(Group::Group1D* grp) diff --git a/src/Core/Topo/CoFace.cpp b/src/Core/Topo/CoFace.cpp index 5af16a06..9e6ebcd5 100644 --- a/src/Core/Topo/CoFace.cpp +++ b/src/Core/Topo/CoFace.cpp @@ -1,4 +1,3 @@ -/*----------------------------------------------------------------------------*/ #include #include #include @@ -2591,12 +2590,12 @@ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const CoFace & f) o << ", projetée sur " << f.getGeomAssociation()->getName() <<(f.getGeomAssociation()->isDestroyed()?" (DETRUITE)":""); - std::vector gn; - f.getGeomAssociation()->getGroupsName(gn); + Group::GroupManager& gm = f.getContext().getGroupManager(); + std::vector gn = gm.getGroupsFor(f.getGeomAssociation()); if (!gn.empty()) { o << " (groupes:"; for (size_t i=0; igetName(); o << ")"; } else { @@ -2659,6 +2658,7 @@ Topo::TopoInfo CoFace::getInfos() const Topo::TopoInfo infos; infos.name = getName(); infos.dimension = getDim(); + infos._groups = Utils::toNames(getGroups()); if (getGeomAssociation() != 0) infos.geom_entity = getGeomAssociation()->getName(); @@ -3720,14 +3720,12 @@ Utils::Math::Point CoFace::getBarycentre() const return barycentre; } /*----------------------------------------------------------------------------*/ -void CoFace::getGroupsName (std::vector& gn, bool byGeom, bool byTopo) const +void CoFace::getGroupsName (std::vector& gn) const { - if (byGeom) - TopoEntity::getGroupsName(gn, byGeom, byTopo); + TopoEntity::getGroupsName(gn); - if (byTopo) - for (uint i = 0; igetGroupsContainer().size(); ++i) - gn.push_back(m_topo_property->getGroupsContainer().get(i)->getName()); + for (uint i = 0; igetGroupsContainer().size(); ++i) + gn.push_back(m_topo_property->getGroupsContainer().get(i)->getName()); } /*----------------------------------------------------------------------------*/ void CoFace::add(Group::Group2D* grp) diff --git a/src/Core/Topo/CommandSetGeomAssociation.cpp b/src/Core/Topo/CommandSetGeomAssociation.cpp index c158182f..a7b04a07 100644 --- a/src/Core/Topo/CommandSetGeomAssociation.cpp +++ b/src/Core/Topo/CommandSetGeomAssociation.cpp @@ -154,11 +154,10 @@ void CommandSetGeomAssociation::validGroupsName(TopoEntity* te) if (te == 0 || m_geom_entity == 0) return; - std::vector te_gn; - te->getGroupsName(te_gn, false, true); - - std::vector ge_gn; - m_geom_entity->getGroupsName(ge_gn); + Group::GroupManager& gm = getContext().getGroupManager(); + Group::GroupHelperForCommand ghfc(getInfoCommand(), gm); + std::vector te_gn = Utils::toNames(ghfc.getGroupsFor(te)); + std::vector ge_gn = Utils::toNames(gm.getGroupsFor(m_geom_entity)); #ifdef _DEBUG2 std::cout<<"validGroupsName("<getName()<<")"<& gn, bool byGeom, bool byTopo) const +getGroupsName (std::vector& gn) const { // on filtre les groupes suivant la dimension - if (getGeomAssociation() && getGeomAssociation()->getDim() == getDim()) - getGeomAssociation()->getGroupsName(gn); + Group::GroupManager& gm = getContext().getGroupManager(); + Geom::GeomEntity* asso = getGeomAssociation(); + if (asso && asso->getDim() == getDim()) { + gn = Utils::toNames(gm.getGroupsFor(asso)); + } } /*----------------------------------------------------------------------------*/ Mgx3D::Utils::SerializedRepresentation* TopoEntity:: diff --git a/src/Core/Topo/TopoManager.cpp b/src/Core/Topo/TopoManager.cpp index 472e2f4f..031725bb 100644 --- a/src/Core/Topo/TopoManager.cpp +++ b/src/Core/Topo/TopoManager.cpp @@ -5603,7 +5603,12 @@ const std::vector& TopoManager::getRefTopos(const Geom::GeomEntity* /*----------------------------------------------------------------------------*/ void TopoManager::addRefTopo(const Geom::GeomEntity* ge, TopoEntity* te) { - m_geom_associations[ge].push_back(te); + m_geom_associations[ge].push_back(te); +} +/*----------------------------------------------------------------------------*/ +void TopoManager::setRefTopos(const Geom::GeomEntity* ge, const std::vector& tes) +{ + m_geom_associations[ge] = tes; } /*----------------------------------------------------------------------------*/ void TopoManager::removeRefTopo(const Geom::GeomEntity* ge, TopoEntity* te) @@ -5614,11 +5619,6 @@ void TopoManager::removeRefTopo(const Geom::GeomEntity* ge, TopoEntity* te) v.erase(std::remove(v.begin(), v.end(), te), v.end()); } /*----------------------------------------------------------------------------*/ -void TopoManager::setRefTopos(const Geom::GeomEntity* ge, const std::vector& tes) -{ - m_geom_associations[ge] = tes; -} -/*----------------------------------------------------------------------------*/ } // end namespace Topo /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/Topo/Vertex.cpp b/src/Core/Topo/Vertex.cpp index f239ae8f..e22cabc6 100644 --- a/src/Core/Topo/Vertex.cpp +++ b/src/Core/Topo/Vertex.cpp @@ -557,16 +557,17 @@ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Vertex & v) << (v.isDestroyed()?" (DETRUIT) ":"") << (v.isEdited()?" (EN COURS D'EDITION) ":""); - if (v.getGeomAssociation()){ - o << ", projeté sur " << v.getGeomAssociation()->getName() - <<(v.getGeomAssociation()->isDestroyed()?" (DETRUITE)":""); + Geom::GeomEntity* asso = v.getGeomAssociation(); + if (asso){ + o << ", projeté sur " << asso->getName() + <<(asso->isDestroyed()?" (DETRUITE)":""); - std::vector gn; - v.getGeomAssociation()->getGroupsName(gn); + Group::GroupManager& gm = v.getContext().getGroupManager(); + std::vector gn = gm.getGroupsFor(asso); if (!gn.empty()) { o << " (groupes:"; for (size_t i=0; igetName(); o << ")"; } else { @@ -602,6 +603,7 @@ Topo::TopoInfo Vertex::getInfos() const Topo::TopoInfo infos; infos.name = getName(); infos.dimension = getDim(); + infos._groups = Utils::toNames(getGroups()); if (getGeomAssociation() != 0) infos.geom_entity = getGeomAssociation()->getName(); @@ -783,14 +785,12 @@ void Vertex::getAllVertices(std::vector& vertices, const bool unique) vertices.push_back(vtx); } /*----------------------------------------------------------------------------*/ -void Vertex::getGroupsName (std::vector& gn, bool byGeom, bool byTopo) const +void Vertex::getGroupsName (std::vector& gn) const { - if (byGeom) - TopoEntity::getGroupsName(gn, byGeom, byTopo); + TopoEntity::getGroupsName(gn); - if (byTopo) - for (uint i = 0; igetGroupsContainer().size(); ++i) - gn.push_back(m_topo_property->getGroupsContainer().get(i)->getName()); + for (uint i = 0; igetGroupsContainer().size(); ++i) + gn.push_back(m_topo_property->getGroupsContainer().get(i)->getName()); } /*----------------------------------------------------------------------------*/ void Vertex::add(Group::Group0D* grp) diff --git a/src/Core/protected/Geom/Curve.h b/src/Core/protected/Geom/Curve.h index 32a9fa05..00bd4367 100644 --- a/src/Core/protected/Geom/Curve.h +++ b/src/Core/protected/Geom/Curve.h @@ -10,7 +10,6 @@ #include "Services/MementoService.h" #include "Utils/Point.h" #include "Utils/Vector.h" -#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ @@ -229,29 +228,6 @@ class Curve: public GeomEntity { */ static bool isA(const std::string& name); - /*------------------------------------------------------------------------*/ - /** Ajoute le groupe parmis ceux auxquels appartient la courbe */ - void add(Group::Group1D* grp); - - /** Retire le groupe parmis ceux auxquels appartient la courbe */ - void remove(Group::Group1D* grp); - - /** Recherche le groupe parmis ceux auxquels appartient la courbe - * return vrai si trouvé */ - bool find(Group::Group1D* grp); - - /// Retourne les noms des groupes auxquels appartient cette entité - virtual void getGroupsName (std::vector& gn) const; - - /// Retourne la liste des groupes auxquels appartient cette entité - virtual void getGroups(std::vector& grp) const; - - /// Retourne la liste des groupes auxquels appartient cette entité - virtual const std::vector& getGroups() const {return m_groups;} - - /// Retourne le nombre de groupes - virtual int getNbGroups() const; - /*------------------------------------------------------------------------*/ /** \brief Return the surfaces incident to this curve */ @@ -261,11 +237,6 @@ class Curve: public GeomEntity { /** \brief Return the vertices incident to this curve */ const std::vector& getVertices() const { return m_vertices; } - - /*------------------------------------------------------------------------*/ - /** \brief détruit l'objet - */ - virtual void setDestroyed(bool b); /*------------------------------------------------------------------------*/ /** \brief indique si la courbe est un segment ou pas @@ -290,8 +261,6 @@ class Curve: public GeomEntity { private: std::vector m_surfaces; std::vector m_vertices; - /// Listes des groupes 1D auxquels appartient cette courbe - std::vector m_groups; /// représentation open cascade std::vector m_occ_edges; }; diff --git a/src/Core/protected/Geom/GeomEntity.h b/src/Core/protected/Geom/GeomEntity.h index b3467d20..572d9c95 100644 --- a/src/Core/protected/Geom/GeomEntity.h +++ b/src/Core/protected/Geom/GeomEntity.h @@ -19,10 +19,6 @@ /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ -namespace Group { -class GroupEntity; -} -/*----------------------------------------------------------------------------*/ /*! * \namespace Mgx3D::Geom * @@ -164,14 +160,9 @@ class GeomEntity : public Internal::InternalEntity{ virtual Utils::SerializedRepresentation* getDescription (bool alsoComputed) const; /*------------------------------------------------------------------------*/ - /// Retourne les noms des groupes auxquels appartient cette entité - virtual void getGroupsName (std::vector& gn) const; - - /// Retourne la liste des groupes auxquels appartient cette entité - virtual void getGroups(std::vector& grp) const; - - /// Retourne le nombre de groupes - virtual int getNbGroups() const; + /** \brief détruit l'objet + */ + virtual void setDestroyed(bool b); private: /// Propriétés géométriques (qui peut être spécifique, PropertyBox par exemple) diff --git a/src/Core/protected/Geom/Surface.h b/src/Core/protected/Geom/Surface.h index a531ccd8..59527a03 100644 --- a/src/Core/protected/Geom/Surface.h +++ b/src/Core/protected/Geom/Surface.h @@ -5,7 +5,6 @@ #include "Services/MementoService.h" #include "Utils/Vector.h" #include "Utils/Point.h" -#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ @@ -173,29 +172,6 @@ class Surface: public GeomEntity { */ static bool isA(const std::string& name); - /*------------------------------------------------------------------------*/ - /** Ajoute le groupe parmis ceux auxquels appartient la surface */ - virtual void add(Group::Group2D* grp); - - /** Retire le groupe parmis ceux auxquels appartient la surface */ - virtual void remove(Group::Group2D* grp); - - /** Recherche le groupe parmis ceux auxquels appartient la surface - * return vrai si trouvé */ - virtual bool find(Group::Group2D* grp); - - /// Retourne les noms des groupes auxquels appartient cette entité - virtual void getGroupsName (std::vector& gn) const; - - /// Retourne la liste des groupes auxquels appartient cette entité - virtual void getGroups(std::vector& grp) const; - - /// Retourne la liste des groupes 2D auxquels appartient cette entité - virtual const std::vector& getGroups() const {return m_groups;} - - /// Retourne le nombre de groupes - virtual int getNbGroups() const; - /*------------------------------------------------------------------------*/ /** \brief Return the curves incident to this surface */ @@ -204,12 +180,7 @@ class Surface: public GeomEntity { /*------------------------------------------------------------------------*/ /** \brief Return the volumes incident to this surface */ - const std::vector& getVolumes() const { return m_volumes; } - - /*------------------------------------------------------------------------*/ - /** \brief détruit l'objet - */ - virtual void setDestroyed(bool b); + const std::vector& getVolumes() const { return m_volumes; } /*------------------------------------------------------------------------*/ /** \brief indique si la surface est un plan ou pas @@ -221,8 +192,6 @@ class Surface: public GeomEntity { std::vector m_volumes; /// représentation open cascade std::vector m_occ_faces; - /// Listes des groupes 2D auxquels appartient cette surface - std::vector m_groups; }; /*----------------------------------------------------------------------------*/ } // end namespace Geom diff --git a/src/Core/protected/Geom/Vertex.h b/src/Core/protected/Geom/Vertex.h index cc60ecdb..75f8b56e 100644 --- a/src/Core/protected/Geom/Vertex.h +++ b/src/Core/protected/Geom/Vertex.h @@ -1,14 +1,12 @@ #ifndef MGX3D_GEOM_VERTEX_H_ #define MGX3D_GEOM_VERTEX_H_ /*----------------------------------------------------------------------------*/ -/*----------------------------------------------------------------------------*/ #include #include /*----------------------------------------------------------------------------*/ #include "Geom/GeomEntity.h" #include "Services/MementoService.h" #include "Utils/Point.h" -#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -159,39 +157,9 @@ class Vertex: public GeomEntity { */ friend TkUtil::UTF8String& operator<<(TkUtil::UTF8String& str, const Vertex& v); - /*------------------------------------------------------------------------*/ - /** Ajoute le groupe parmis ceux auxquels appartient le sommet */ - void add(Group::Group0D* grp); - - /** Retire le groupe parmis ceux auxquels appartient le sommet */ - void remove(Group::Group0D* grp); - - /** Recherche le groupe parmis ceux auxquels appartient le sommet - * return vrai si trouvé */ - bool find(Group::Group0D* grp); - - /// Retourne les noms des groupes auxquels appartient cette entité - virtual void getGroupsName (std::vector& gn) const; - - /// Retourne la liste des groupes auxquels appartient cette entité - virtual void getGroups(std::vector& grp) const; - - /// Retourne la liste des groupes auxquels appartient cette entité - virtual const std::vector& getGroups() const {return m_groups;} - - /// Retourne le nombre de groupes - virtual int getNbGroups() const; - - /*------------------------------------------------------------------------*/ - /** \brief détruit l'objet - */ - virtual void setDestroyed(bool b); - private: /// accès aux courbes incidentes std::vector m_curves; - /// Listes des groupes 0D auxquels appartient ce sommet - std::vector m_groups; /// représentation open cascade TopoDS_Vertex m_occ_vertex; }; diff --git a/src/Core/protected/Geom/Volume.h b/src/Core/protected/Geom/Volume.h index 82835e94..8cebac4d 100644 --- a/src/Core/protected/Geom/Volume.h +++ b/src/Core/protected/Geom/Volume.h @@ -3,7 +3,6 @@ /*----------------------------------------------------------------------------*/ #include "Geom/GeomEntity.h" #include "Services/MementoService.h" -#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ @@ -132,39 +131,9 @@ class Volume: public GeomEntity { */ static bool isA(const std::string& name); - /*------------------------------------------------------------------------*/ - /** Ajoute le groupe parmis ceux auxquels appartient le volume */ - void add(Group::Group3D* grp); - - /** Retire le groupe parmis ceux auxquels appartient le volume */ - void remove(Group::Group3D* grp); - - /** Recherche le groupe parmis ceux auxquels appartient le volume - * return vrai si trouvé */ - bool find(Group::Group3D* grp); - - /// Retourne les noms des groupes auxquels appartient cette entité - virtual void getGroupsName (std::vector& gn) const; - - /// Retourne la liste des groupes auxquels appartient cette entité - virtual void getGroups(std::vector& grp) const; - - /// Retourne la liste des groupes 3D auxquels appartient cette entité - virtual const std::vector& getGroups() const {return m_groups;} - - /// Retourne le nombre de groupes - virtual int getNbGroups() const; - - /*------------------------------------------------------------------------*/ - /** \brief détruit l'objet - */ - virtual void setDestroyed(bool b); - private: /// surfaces incidentes au volume std::vector m_surfaces; - /// Listes des groupes 3D auxquels appartient ce volume - std::vector m_groups; /// représentation open cascade TopoDS_Shape m_occ_shape; }; diff --git a/src/Core/protected/Group/GroupHelperForCommand.h b/src/Core/protected/Group/GroupHelperForCommand.h index 170bad58..9e7c848d 100644 --- a/src/Core/protected/Group/GroupHelperForCommand.h +++ b/src/Core/protected/Group/GroupHelperForCommand.h @@ -26,75 +26,70 @@ class GroupHelperForCommand { GroupHelperForCommand(Internal::InfoCommand& info_command, GroupManager& group_manager); virtual ~GroupHelperForCommand() = default; - template - TGroup* addToGroup(const std::string& group_name, TEntity* e) - { - TGroup* grp = m_group_manager.getNewGroup(group_name, &m_info_command); - addEntityToGroup(grp, e); - return grp; - } - GroupEntity* addToGroup(const std::string& group_name, Geom::GeomEntity* e); GroupEntity* addToGroup(const std::string& group_name, Topo::TopoEntity* e); - template - TGroup* removeFromGroup(const std::string& group_name, TEntity* e) - { - TGroup* grp = m_group_manager.getGroup(group_name, &m_info_command); - removeEntityFromGroup(grp, e); - return grp; - } - GroupEntity* removeFromGroup(const std::string& group_name, Geom::GeomEntity* e); GroupEntity* removeFromGroup(const std::string& group_name, Topo::TopoEntity* e); + // temporaire en attendant de restructurer la Topo + // (même remarque pour les templates privées ci-dessous) + std::vector getGroupsFor(const Topo::TopoEntity* e); + private: - template - void removeDefaultGroup(TEntity* entity) + template < + typename TGroup, typename = std::enable_if_t::value>, + typename TEntity, typename = std::enable_if_t::value> + > + TGroup* addToGroup(const std::string& group_name, TEntity* e) { - if (entity->getNbGroups() == 1) { - std::vector groups = entity->getGroups(); + TGroup* group = m_group_manager.getNewGroup(group_name, &m_info_command); + + // il faut peut-être enlever le groupe par défaut + if (e->getNbGroups() == 1) { + std::vector groups = e->getGroups(); if (groups[0]->isDefaultGroup()) { - groups[0]->remove(entity); - entity->remove(groups[0]); + groups[0]->remove(e); + e->remove(groups[0]); if (groups[0]->empty()) m_info_command.addGroupInfoEntity(groups[0], Internal::InfoCommand::DISABLE); else m_info_command.addGroupInfoEntity(groups[0], Internal::InfoCommand::DISPMODIFIED); } } - } - - template - void addEntityToGroup(TGroup* group, TEntity* entity) - { - // il faut peut-être enlever le groupe par défaut - removeDefaultGroup(entity); // on ajoute sauf si l'entité est déjà dans un groupe // et que le groupe correspond au groupe par defaut - if (! (entity->getNbGroups() > 0 && group->isDefaultGroup())) { - group->add(entity); - entity->add(group); + if (! (e->getNbGroups() > 0 && group->isDefaultGroup())) { + group->add(e); + e->add(group); m_info_command.addGroupInfoEntity(group, Internal::InfoCommand::DISPMODIFIED); } + + return group; } - template - void removeEntityFromGroup(TGroup* group, TEntity* entity) + template < + typename TGroup, typename = std::enable_if_t::value>, + typename TEntity, typename = std::enable_if_t::value> + > + TGroup* removeFromGroup(const std::string& group_name, TEntity* e) { - group->remove(entity); - entity->remove(group); + TGroup* group = m_group_manager.getGroup(group_name, &m_info_command); + group->remove(e); + e->remove(group); // il faut peut-être ajouter le groupe par défaut - if (entity->getNbGroups() == 0) { - addToGroup("", entity); + if (e->getNbGroups() == 0) { + addToGroup("", e); } if (group->empty()) m_info_command.addGroupInfoEntity(group, Internal::InfoCommand::DISABLE); else m_info_command.addGroupInfoEntity(group, Internal::InfoCommand::DISPMODIFIED); + + return group; } private: diff --git a/src/Core/protected/Group/GroupManager.h b/src/Core/protected/Group/GroupManager.h index fce2e2cc..219a9400 100644 --- a/src/Core/protected/Group/GroupManager.h +++ b/src/Core/protected/Group/GroupManager.h @@ -109,10 +109,12 @@ class GroupManager final : public Internal::CommandCreator { /// retourne l'entité à partir du nom, une exception si elle n'existe pas template ::value>> T* getGroup(const std::string& name, const bool exceptionIfNotFound=true) const; + GroupEntity* getGroup(const std::string& name, const int dim, const bool exceptionIfNotFound=true) const; /// retourne l'entité à partir du nom, et la créé si elle n'existe pas template ::value>> T* getNewGroup(const std::string& name, Internal::InfoCommand* icmd); + GroupEntity* getNewGroup(const std::string& name, const int dim, Internal::InfoCommand* icmd); /*------------------------------------------------------------------------*/ /// retourne la liste des groupes, sans ou avec ceux détruits @@ -334,10 +336,6 @@ class GroupManager final : public Internal::CommandCreator { std::map& filtre_rep, uint mark); - /*------------------------------------------------------------------------*/ - /** Retourne le groupe correspondant à la dimension */ - GroupEntity* getGroup(const std::string& name, const int dim, const bool exceptionIfNotFound=true) const; - /*------------------------------------------------------------------------*/ /** Retourne les volumes géométriques à partir des groupes sélectionnés */ void get(const std::vector& vg, std::vector& volumes); @@ -499,6 +497,32 @@ class GroupManager final : public Internal::CommandCreator { /** Vide un groupe suivant son nom et une dimension */ Internal::M3DCommandResult* clearGroup(int dim, const std::string& groupName); +#ifndef SWIG + /// Retourne les groupes associés à une entité + const std::vector& getGroupsFor(const Geom::GeomEntity* e); + /// Ajoute une association Entité-->Group + void addGroupFor(const Geom::GeomEntity* e, GroupEntity* g); + /// Positionne les associations Entité-->Group + void setGroupsFor(const Geom::GeomEntity* e, const std::vector& gs); + /// Enlève une association Entité-->Group + void removeGroupFor(const Geom::GeomEntity* e, GroupEntity* g); + /// Enlève toutes les associations Entité-->Group + void removeAllGroupsFor(const Geom::GeomEntity* e); + /// Retourne vrai si l'entité possède le groupe + bool hasGroupFor(const Geom::GeomEntity* e, GroupEntity* g); + /// Retourne les groupes filtrés + template ::value>> + std::vector getFilteredGroupsFor(const Geom::GeomEntity* e) + { + std::vector result; + for (GroupEntity* g : getGroupsFor(e)) { + if (T* casted = dynamic_cast(g)) { + result.push_back(casted); + } + } + return result; + } +#endif private: /// Conteneur pour les groupes @@ -506,6 +530,9 @@ class GroupManager final : public Internal::CommandCreator { /// ancien masque Utils::FilterEntity::objectType m_visibilityMask; + + /// Relation Entité --> Group + std::map> m_entities_groups; }; /*----------------------------------------------------------------------------*/ } // end namespace Group diff --git a/src/Core/protected/Mesh/CommandAddRemoveGroupName.h b/src/Core/protected/Mesh/CommandAddRemoveGroupName.h index 4c7e8bc7..d7cc6626 100644 --- a/src/Core/protected/Mesh/CommandAddRemoveGroupName.h +++ b/src/Core/protected/Mesh/CommandAddRemoveGroupName.h @@ -170,20 +170,19 @@ class CommandAddRemoveGroupName: public CommandCreateMesh */ void internalRedo(); +private: /*------------------------------------------------------------------------*/ /// met à jour les relation entre volumes de maillage et la topologie - void updateMesh(Geom::Volume* vol, std::string grpName, bool add); - void updateMesh(std::vector& blocs, std::string grpName, bool add); + void updateMesh(Geom::GeomEntity* e, std::string grpName, bool add); + void updateMesh(Geom::Volume* e, std::string grpName, bool add); + void updateMesh(Geom::Surface* e, std::string grpName, bool add); + void updateMesh(Geom::Curve* e, std::string grpName, bool add); - /// met à jour les relation entre surface de maillage et la topologie - void updateMesh(Geom::Surface* surf, std::string grpName, bool add); + void updateMesh(Topo::TopoEntity* e, std::string grpName, bool add); + void updateMesh(std::vector& blocs, std::string grpName, bool add); void updateMesh(std::vector& cofaces, std::string grpName, bool add); - - /// met à jour les relation entre nuages de maillage et la topologie - void updateMesh(Geom::Curve* crv, std::string grpName, bool add); void updateMesh(std::vector& coedges, std::string grpName, bool add); -private: /// helper pour la gestion des groupes dans les commandes Group::GroupHelperForCommand m_group_helper; diff --git a/src/Core/protected/Services/MementoService.h b/src/Core/protected/Services/MementoService.h index cf3a31cc..7b630298 100644 --- a/src/Core/protected/Services/MementoService.h +++ b/src/Core/protected/Services/MementoService.h @@ -52,17 +52,12 @@ namespace Mgx3D::Services struct Memento { std::vector topo_entities; + std::vector groups; std::vector volumes; std::vector surfaces; std::vector curves; std::vector vertices; - /// Listes des groupes 1D auxquels appartient cette courbe - std::vector groups0D; - std::vector groups1D; - std::vector groups2D; - std::vector groups3D; - /* ancienne représentation géométrique des entités que l'on a modifiées */ std::vector occ_shapes; diff --git a/src/Core/protected/Topo/Block.h b/src/Core/protected/Topo/Block.h index cc3c6d4e..2125ec9e 100644 --- a/src/Core/protected/Topo/Block.h +++ b/src/Core/protected/Topo/Block.h @@ -1,4 +1,3 @@ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_TOPO_BLOCK_H_ #define MGX3D_TOPO_BLOCK_H_ /*----------------------------------------------------------------------------*/ @@ -512,7 +511,7 @@ class Block : public TopoEntity { Face* getFace(Topo::Vertex* v0, Topo::Vertex* v1, Topo::Vertex* v2, Topo::Vertex* v3); /// Accesseur sur la liste de noms de groupes - virtual void getGroupsName (std::vector& gn, bool byGeom=true, bool byTopo=true) const; + virtual void getGroupsName (std::vector& gn) const; void add(Group::Group3D* grp); void remove(Group::Group3D* grp); diff --git a/src/Core/protected/Topo/CoEdge.h b/src/Core/protected/Topo/CoEdge.h index 7b386b62..2e74601b 100644 --- a/src/Core/protected/Topo/CoEdge.h +++ b/src/Core/protected/Topo/CoEdge.h @@ -1,8 +1,6 @@ -/*----------------------------------------------------------------------------*/ #ifndef TOPO_COEDGE_H_ #define TOPO_COEDGE_H_ /*----------------------------------------------------------------------------*/ -/*----------------------------------------------------------------------------*/ #include #include "Topo/TopoEntity.h" #include "Topo/CoEdgeMeshingProperty.h" @@ -406,7 +404,7 @@ class CoEdge : public TopoEntity { virtual double computeRatio(const Utils::Math::Point& pt); /// Accesseur sur la liste de noms de groupes - virtual void getGroupsName (std::vector& gn, bool byGeom=true, bool byTopo=true) const; + virtual void getGroupsName (std::vector& gn) const; void add(Group::Group1D* grp); void remove(Group::Group1D* grp); int getNbGroups() const; diff --git a/src/Core/protected/Topo/CoFace.h b/src/Core/protected/Topo/CoFace.h index 9aeb5a0d..b37d56b8 100644 --- a/src/Core/protected/Topo/CoFace.h +++ b/src/Core/protected/Topo/CoFace.h @@ -1,4 +1,3 @@ -/*----------------------------------------------------------------------------*/ #ifndef TOPO_COFACE_H_ #define TOPO_COFACE_H_ /*----------------------------------------------------------------------------*/ @@ -633,7 +632,7 @@ class CoFace : public TopoEntity { /// Accesseur sur la liste de noms de groupes - virtual void getGroupsName (std::vector& gn, bool byGeom=true, bool byTopo=true) const; + virtual void getGroupsName (std::vector& gn) const; void add(Group::Group2D* grp); void remove(Group::Group2D* grp); int getNbGroups() const; diff --git a/src/Core/protected/Topo/Edge.h b/src/Core/protected/Topo/Edge.h index 30c9a921..bac6e673 100644 --- a/src/Core/protected/Topo/Edge.h +++ b/src/Core/protected/Topo/Edge.h @@ -1,6 +1,3 @@ -/*----------------------------------------------------------------------------*/ -/** \file Edge.h -/*----------------------------------------------------------------------------*/ #ifndef TOPO_EDGE_H_ #define TOPO_EDGE_H_ /*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Topo/Face.h b/src/Core/protected/Topo/Face.h index c4beb84c..959a2123 100644 --- a/src/Core/protected/Topo/Face.h +++ b/src/Core/protected/Topo/Face.h @@ -1,15 +1,6 @@ -/*----------------------------------------------------------------------------*/ -/** \file Face - * - * \author Eric Brière de l'Isle - * - * \date 19/11/2010 - */ -/*----------------------------------------------------------------------------*/ #ifndef TOPO_FACE_H_ #define TOPO_FACE_H_ /*----------------------------------------------------------------------------*/ -/*----------------------------------------------------------------------------*/ #include "Topo/TopoEntity.h" #include "Topo/Vertex.h" #include "Topo/CoEdge.h" diff --git a/src/Core/protected/Topo/TopoEntity.h b/src/Core/protected/Topo/TopoEntity.h index fbe41e93..7f3d9a00 100644 --- a/src/Core/protected/Topo/TopoEntity.h +++ b/src/Core/protected/Topo/TopoEntity.h @@ -1,11 +1,4 @@ /*----------------------------------------------------------------------------*/ -/** \file TopoEntity.h - * - * \author Eric Brière de l'Isle - * - * \date 18 nov. 2010 - */ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_GEOM_TOPOENTITY_H_ #define MGX3D_GEOM_TOPOENTITY_H_ /*----------------------------------------------------------------------------*/ @@ -108,7 +101,7 @@ class TopoEntity : public Internal::InternalEntity{ /*------------------------------------------------------------------------*/ /// Accesseur sur la liste de noms de groupes - virtual void getGroupsName (std::vector& gn, bool byGeom, bool byTopo) const; + virtual void getGroupsName (std::vector& gn) const; /*------------------------------------------------------------------------*/ /** Duplique le TopoProperty pour en conserver une copie diff --git a/src/Core/protected/Topo/TopoManager.h b/src/Core/protected/Topo/TopoManager.h index 2264955e..8d52834d 100644 --- a/src/Core/protected/Topo/TopoManager.h +++ b/src/Core/protected/Topo/TopoManager.h @@ -1890,7 +1890,7 @@ class TopoManager final : public Internal::CommandCreator { #endif #ifndef SWIG - /// Retourne les entités topologiques associées, léve une exception si aucune + /// Retourne les entités topologiques associées à une entité géométrique const std::vector& getRefTopos(const Geom::GeomEntity* ge); /// Ajoute une association Geom-->Topo void addRefTopo(const Geom::GeomEntity* ge, TopoEntity* te); @@ -1898,7 +1898,7 @@ class TopoManager final : public Internal::CommandCreator { void setRefTopos(const Geom::GeomEntity* ge, const std::vector& tes); /// Enlève une association Geom-->Topo void removeRefTopo(const Geom::GeomEntity* ge, TopoEntity* te); - /// Retourne les entités topologiques filtrées, léve une exception si aucune + /// Retourne les entités topologiques filtrées template ::value>> std::vector getFilteredRefTopos(const Geom::GeomEntity* ge) { diff --git a/src/Core/protected/Topo/Vertex.h b/src/Core/protected/Topo/Vertex.h index 8daea680..5b9cf56e 100644 --- a/src/Core/protected/Topo/Vertex.h +++ b/src/Core/protected/Topo/Vertex.h @@ -1,11 +1,3 @@ -/*----------------------------------------------------------------------------*/ -/** \file Vertex.h - * - * \author Eric Brière de l'Isle - * - * \date 7/10/2010 - */ -/*----------------------------------------------------------------------------*/ #ifndef TOPO_VERTEX_H_ #define TOPO_VERTEX_H_ /*----------------------------------------------------------------------------*/ @@ -363,7 +355,7 @@ class Vertex : public TopoEntity { virtual bool isEdited() const; /// Accesseur sur la liste de noms de groupes - virtual void getGroupsName (std::vector& gn, bool byGeom=true, bool byTopo=true) const; + virtual void getGroupsName (std::vector& gn) const; /// Accesseur sur le conteneur pour les groupes void add(Group::Group0D* grp); diff --git a/src/Utils/protected/Utils/Entity.h b/src/Utils/protected/Utils/Entity.h index e439bc85..90fbc6c0 100644 --- a/src/Utils/protected/Utils/Entity.h +++ b/src/Utils/protected/Utils/Entity.h @@ -383,6 +383,13 @@ Entity::objectType typesToType (FilterEntity::objectType types); FilterEntity::objectType typeToTypes (Entity::objectType type); #ifndef SWIG template using EntitySet = std::set; +template std::vector toNames(const std::vector& entities) { + std::vector result; + result.reserve(entities.size()); + std::transform(entities.begin(), entities.end(), std::back_inserter(result), + [](T* e){ return e->getName(); }); + return result; +} #endif /*----------------------------------------------------------------------------*/ } // end namespace Utils diff --git a/test_link/test_groups.py b/test_link/test_groups.py index 5bd6ea27..9abf3788 100644 --- a/test_link/test_groups.py +++ b/test_link/test_groups.py @@ -98,7 +98,7 @@ def test_section_by_plane(): vol_info = ctx.getGeomManager().getInfos("Vol0000",3) assert "box" in vol_info.groups() # Section par un plan entre géométries avec topologies - ctx.getGeomManager ( ).sectionByPlane (["Vol0000"], Mgx3D.Plane(Mgx3D.Point(0, 0, .5), Mgx3D.Vector(0, 0, 1)), "aaa") + ctx.getGeomManager().sectionByPlane (["Vol0000"], Mgx3D.Plane(Mgx3D.Point(0, 0, .5), Mgx3D.Vector(0, 0, 1)), "aaa") # Les entités de dimension inférieure à 2 sont affectées au groupe aaa de manière explicite vol_info = ctx.getGeomManager().getInfos("Vol0001",3) assert "box" in vol_info.groups() @@ -152,7 +152,7 @@ def test_new_planar_surface(): # Création d'une boite avec une topologie ctx.getTopoManager().newBoxWithTopo (Mgx3D.Point(0, 0, 0), Mgx3D.Point(1, 1, 1), 10, 10, 10, "box") # Création de la surface Surf0006 - ctx.getGeomManager ( ).newPlanarSurface (["Crb0002","Crb0006","Crb0010","Crb0011"], "aaa") + ctx.getGeomManager().newPlanarSurface (["Crb0002","Crb0006","Crb0010","Crb0011"], "aaa") # Les entités de dimension inférieure à 2 sont affectées au groupe aaa de manière implicite # Cette commande crée 1 surface à partir de 4 courbes existantes surf_info = ctx.getGeomManager().getInfos("Surf0006",2) @@ -211,3 +211,14 @@ def test_changeGroupName(): with pytest.raises(RuntimeError) as excinfo: ctx.getGroupManager().changeGroupName("Hors_Groupe_3D", "TOTO", 3) assert "Il n'est pas possible de changer le nom du groupe par défaut" in str(excinfo.value) + +def test_topo_group(capfd): + ctx = Mgx3D.getStdContext() + ctx.clearSession() # Clean the session after the previous test + # Création d'une boite avec une topologie + ctx.getTopoManager().newBoxWithTopo (Mgx3D.Point(0, 0, 0), Mgx3D.Point(1, 1, 1), 10, 10, 10) + # Modifie le groupe aaa + ctx.getTopoManager().addToGroup (["Bl0000"], 3, "aaa") + + assert ctx.getGroupManager().getTopoBlocks("aaa", 3) == ["Bl0000"] + assert ctx.getTopoManager().getInfos("Bl0000",3).groups() == ["aaa"] \ No newline at end of file From 149eaff39cf29321007d9d5d351b72b601881ebc Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Tue, 28 Oct 2025 14:40:37 +0100 Subject: [PATCH 08/18] Small cleanings in geometry --- src/Core/Geom/Curve.cpp | 2 - src/Core/Geom/Surface_Geom.cpp | 10 ---- src/Core/Geom/Vertex_Geom.cpp | 2 - src/Core/Geom/Volume_Geom.cpp | 2 - src/Core/Group/GroupEntity.cpp | 2 +- src/Core/Internal/ExportMDLImplementation.cpp | 7 +-- src/Core/Internal/ImportMDLImplementation.cpp | 46 ++++++++--------- src/Core/protected/Geom/Curve.h | 33 +++++-------- src/Core/protected/Geom/GeomEntity.h | 41 +++++----------- src/Core/protected/Geom/Surface.h | 45 +++++++---------- src/Core/protected/Geom/Vertex.h | 49 ++++++++----------- src/Core/protected/Geom/Volume.h | 33 +++++-------- src/Core/protected/Group/GroupEntity.h | 7 ++- 13 files changed, 107 insertions(+), 172 deletions(-) diff --git a/src/Core/Geom/Curve.cpp b/src/Core/Geom/Curve.cpp index 9a1952e7..a51c2d78 100644 --- a/src/Core/Geom/Curve.cpp +++ b/src/Core/Geom/Curve.cpp @@ -32,8 +32,6 @@ namespace Mgx3D { /*----------------------------------------------------------------------------*/ namespace Geom { /*----------------------------------------------------------------------------*/ -const char* Curve::typeNameGeomCurve = "GeomCurve"; -/*----------------------------------------------------------------------------*/ Curve::Curve(Internal::Context& ctx, Utils::Property* prop, Utils::DisplayProperties* disp, GeomProperty* gprop, TopoDS_Edge& shape) :GeomEntity(ctx, prop, disp, gprop) diff --git a/src/Core/Geom/Surface_Geom.cpp b/src/Core/Geom/Surface_Geom.cpp index ba8c5f3f..53047ff9 100644 --- a/src/Core/Geom/Surface_Geom.cpp +++ b/src/Core/Geom/Surface_Geom.cpp @@ -27,16 +27,6 @@ namespace Mgx3D { /*----------------------------------------------------------------------------*/ namespace Geom { -/*----------------------------------------------------------------------------*/ -const char* Surface::typeNameGeomSurface = "GeomSurface"; - -/*----------------------------------------------------------------------------*/ -//void Surface::add(TopoDS_Edge e) -//{m_occ_edges.push_back(e);} -///*----------------------------------------------------------------------------*/ -//std::vector Surface::getEdges() -//{return m_occ_edges;} - /*----------------------------------------------------------------------------*/ Surface::Surface(Internal::Context& ctx, Utils::Property* prop, Utils::DisplayProperties* disp, diff --git a/src/Core/Geom/Vertex_Geom.cpp b/src/Core/Geom/Vertex_Geom.cpp index c1c501f1..665458ff 100644 --- a/src/Core/Geom/Vertex_Geom.cpp +++ b/src/Core/Geom/Vertex_Geom.cpp @@ -20,8 +20,6 @@ namespace Mgx3D { /*----------------------------------------------------------------------------*/ namespace Geom { /*----------------------------------------------------------------------------*/ -const char* Vertex::typeNameGeomVertex = "GeomVertex"; -/*----------------------------------------------------------------------------*/ Vertex::Vertex(Internal::Context& ctx, Utils::Property* prop, Utils::DisplayProperties* disp, GeomProperty* gprop, TopoDS_Vertex& shape) : GeomEntity(ctx, prop, disp, gprop) diff --git a/src/Core/Geom/Volume_Geom.cpp b/src/Core/Geom/Volume_Geom.cpp index 66b8e1ba..4b43be93 100644 --- a/src/Core/Geom/Volume_Geom.cpp +++ b/src/Core/Geom/Volume_Geom.cpp @@ -20,8 +20,6 @@ namespace Mgx3D { /*----------------------------------------------------------------------------*/ namespace Geom { /*----------------------------------------------------------------------------*/ -const char* Volume::typeNameGeomVolume = "GeomVolume"; -/*----------------------------------------------------------------------------*/ Volume::Volume(Internal::Context& ctx, Utils::Property* prop, Utils::DisplayProperties* disp, GeomProperty* gprop, TopoDS_Shape& shape) : GeomEntity(ctx, prop, disp, gprop) diff --git a/src/Core/Group/GroupEntity.cpp b/src/Core/Group/GroupEntity.cpp index 2160f75c..48b9d262 100644 --- a/src/Core/Group/GroupEntity.cpp +++ b/src/Core/Group/GroupEntity.cpp @@ -1,8 +1,8 @@ -/*----------------------------------------------------------------------------*/ #include "Group/GroupEntity.h" #include "Group/GroupEntityVisitor.h" #include "Internal/Context.h" #include "Mesh/MeshModificationItf.h" +#include "Services/DescriptionService.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Internal/ExportMDLImplementation.cpp b/src/Core/Internal/ExportMDLImplementation.cpp index 9293d693..ba7c6ccb 100644 --- a/src/Core/Internal/ExportMDLImplementation.cpp +++ b/src/Core/Internal/ExportMDLImplementation.cpp @@ -15,6 +15,7 @@ #include "Topo/CoFace.h" #include "Utils/Point.h" #include "Utils/Unit.h" +#include "Group/GroupManager.h" /*----------------------------------------------------------------------------*/ #include #include @@ -377,15 +378,15 @@ save(Geom::Surface* sf) // std::cout<<"nb_cd = "< grps; - sf->getGroupsName(grps); + Group::GroupManager& gm = m_context.getGroupManager(); + std::vector grps = gm.getGroupsFor(sf); cmd.u.area.groups_name = 0; if (!grps.empty()){ TkUtil::UTF8String grps_str (TkUtil::Charset::UTF_8); for (uint i=0; igetName(); } char* grps_ch = new char[grps_str.length()+1]; cmd.u.area.groups_name = grps_ch; diff --git a/src/Core/Internal/ImportMDLImplementation.cpp b/src/Core/Internal/ImportMDLImplementation.cpp index a94c9dc8..3a1faa07 100644 --- a/src/Core/Internal/ImportMDLImplementation.cpp +++ b/src/Core/Internal/ImportMDLImplementation.cpp @@ -113,6 +113,7 @@ void ImportMDLImplementation::performGeom(Internal::InfoCommand* icmd) bool isFiltered = getFilter(filter); // les surfaces + Group::GroupManager& gm = m_context.getGroupManager(); for (std::vector::const_iterator iter = m_vCmdArea.begin(); iter!=m_vCmdArea.end(); ++iter){ const T_MdlCommand& current_command = **iter; @@ -137,25 +138,24 @@ void ImportMDLImplementation::performGeom(Internal::InfoCommand* icmd) id_grp++; if (!m_prefixName.empty()) name = m_prefixName + name; - Group::Group1D* group = m_context.getGroupManager().getNewGroup1D(name, icmd); + Group::Group1D* group = gm.getNewGroup(name, icmd); if (id_grp == 1) group->setLevel(2); else group->setLevel(3); if (!group->find(crv)){ // il faut peut-être enlever le groupe par défaut - if (crv->getNbGroups() == 1){ - std::vector gn; - crv->getGroupsName(gn); - if (gn[0] == m_context.getGroupManager().getDefaultName(1)){ - Group::Group1D* grp = m_context.getGroupManager().getGroup1D(gn[0], icmd); + std::vector crv_groups = gm.getGroupsFor(crv); + if (crv_groups.size() == 1){ + Group::GroupEntity* grp = crv_groups[0]; + if (grp->getName() == gm.getDefaultName(1)){ + gm.removeGroupFor(crv, grp); grp->remove(crv); - crv->remove(grp); - icmd->addGroupInfoEntity(grp,Internal::InfoCommand::DISPMODIFIED); + icmd->addGroupInfoEntity(grp, Internal::InfoCommand::DISPMODIFIED); } } - crv->add(group); + gm.addGroupFor(crv, group); group->add(crv); } } @@ -197,12 +197,12 @@ void ImportMDLImplementation::performGeom(Internal::InfoCommand* icmd) id_grp++; if (!m_prefixName.empty()) name = m_prefixName + name; - Group::Group2D* group = m_context.getGroupManager().getNewGroup2D(name, icmd); + Group::Group2D* group = gm.getNewGroup(name, icmd); if (id_grp == 1) group->setLevel(2); else group->setLevel(3); - surf->add(group); + gm.addGroupFor(surf, group); group->add(surf); } } @@ -215,9 +215,9 @@ void ImportMDLImplementation::performGeom(Internal::InfoCommand* icmd) std::string nomDef = current_command.name.str(); if (!m_prefixName.empty()) nomDef = m_prefixName + nomDef; - Group::Group2D* group = m_context.getGroupManager().getNewGroup2D(nomDef, icmd); + Group::Group2D* group = gm.getNewGroup(nomDef, icmd); group->setLevel(1); - surf->add(group); + gm.addGroupFor(surf, group); group->add(surf); } @@ -246,12 +246,12 @@ void ImportMDLImplementation::performGeom(Internal::InfoCommand* icmd) id_grp++; if (!m_prefixName.empty()) name = m_prefixName + name; - Group::Group0D* group = m_context.getGroupManager().getNewGroup0D(name, icmd); + Group::Group0D* group = gm.getNewGroup(name, icmd); if (id_grp == 1) group->setLevel(2); else group->setLevel(3); - v->add(group); + gm.addGroupFor(v, group); group->add(v); } } @@ -592,14 +592,15 @@ MAJInterpolated(std::vector& coedges, Topo::CoFace* coface) Geom::Vertex* ImportMDLImplementation::getVertex(uint ptId) { Geom::Vertex* vtx = m_cor_ptId_vertex[ptId]; + Group::GroupManager& gm = m_context.getGroupManager(); if (!vtx){ const T_MdlCommand& command_pt = *m_vCmdPt[ptId]; vtx = Geom::EntityFactory(m_context).newVertex(Utils::Math::Point(command_pt.u.point.cd.x1,command_pt.u.point.cd.x2, 0.0)*m_scale_factor); m_newGeomEntities.push_back(vtx); m_cor_ptId_vertex[ptId] = vtx; - Group::Group0D* group = m_context.getGroupManager().getNewGroup0D("", m_icmd); - vtx->add(group); + Group::Group0D* group = gm.getNewGroup("", m_icmd); + gm.addGroupFor(vtx, group); group->add(vtx); } @@ -619,6 +620,7 @@ Geom::Vertex* ImportMDLImplementation::getVertex(uint ptId) Geom::Curve* ImportMDLImplementation::getCurve(const std::string name) { Geom::Curve* crv = m_cor_name_curve[name]; + Group::GroupManager& gm = m_context.getGroupManager(); if (!crv){ T_MdlCommand* ptr_current_command = m_cor_name_mdlCmd[name]; @@ -753,9 +755,9 @@ Geom::Curve* ImportMDLImplementation::getCurve(const std::string name) m_newGeomEntities.push_back(vtx1); m_newGeomEntities.push_back(vtx2); - Group::Group0D* group = m_context.getGroupManager().getNewGroup0D("", m_icmd); - vtx1->add(group); - vtx2->add(group); + Group::Group0D* group = gm.getNewGroup("", m_icmd); + gm.addGroupFor(vtx1, group); + gm.addGroupFor(vtx2, group); group->add(vtx1); group->add(vtx2); @@ -773,8 +775,8 @@ Geom::Curve* ImportMDLImplementation::getCurve(const std::string name) m_newGeomEntities.push_back(crv); m_cor_name_curve[name] = crv; - Group::Group1D* group = m_context.getGroupManager().getNewGroup1D("", m_icmd); - crv->add(group); + Group::Group1D* group = gm.getNewGroup("", m_icmd); + gm.addGroupFor(crv, group); group->add(crv); } } diff --git a/src/Core/protected/Geom/Curve.h b/src/Core/protected/Geom/Curve.h index 00bd4367..d8d05701 100644 --- a/src/Core/protected/Geom/Curve.h +++ b/src/Core/protected/Geom/Curve.h @@ -6,7 +6,6 @@ #include // CP : uint sur Bull /*----------------------------------------------------------------------------*/ #include "Geom/GeomEntity.h" -#include "Geom/GeomProperty.h" #include "Services/MementoService.h" #include "Utils/Point.h" #include "Utils/Vector.h" @@ -16,8 +15,6 @@ namespace Mgx3D { /*----------------------------------------------------------------------------*/ namespace Geom { - -class GeomProperty; /*----------------------------------------------------------------------------*/ /** * \class Curve @@ -27,7 +24,6 @@ class GeomProperty; class Curve: public GeomEntity { friend class Services::MementoService; - static const char* typeNameGeomCurve; public: @@ -57,34 +53,34 @@ class Curve: public GeomEntity { const std::vector& getOCCEdges() const { return m_occ_edges; } - virtual void apply(std::function const& lambda) const; - virtual void applyAndReturn(std::function const& lambda); - virtual void accept(ConstGeomEntityVisitor& v) const { v.visit(this); } - virtual void accept(GeomEntityVisitor& v) { v.visit(this); } + void apply(std::function const& lambda) const override; + void applyAndReturn(std::function const& lambda) override; + void accept(ConstGeomEntityVisitor& v) const override{ v.visit(this); } + void accept(GeomEntityVisitor& v) override { v.visit(this); } /*------------------------------------------------------------------------*/ /** \brief Crée une copie (avec allocation mémoire, appel à new) de l'objet * courant. */ - virtual GeomEntity* clone(Internal::Context&); + GeomEntity* clone(Internal::Context&) override; /*------------------------------------------------------------------------*/ /** \brief Destructeur */ virtual ~Curve() = default; - virtual bool isEqual(Geom::Curve* curve); + bool isEqual(Geom::Curve* curve); /*------------------------------------------------------------------------*/ /** \brief retourne la dimension de l'entité géométrique */ - virtual int getDim() const {return 1;} + int getDim() const override { return 1; } /*------------------------------------------------------------------------*/ /** \brief Calcule l'aire d'une entité: Pour une courbe, c'est la * longueur, pour une surface, l'aire, pour un volume le volume. */ - virtual double computeArea() const; + double computeArea() const override; /*------------------------------------------------------------------------*/ /** \brief Calcul de la boite englobante orientée selon les axes Ox,Oy,Oz @@ -92,7 +88,7 @@ class Curve: public GeomEntity { * \param pmin Les coordonnées min de la boite englobante * \param pmax Les coordonnées max de la boite englobante */ - virtual void computeBoundingBox(Utils::Math::Point& pmin, Utils::Math::Point& pmax) const; + void computeBoundingBox(Utils::Math::Point& pmin, Utils::Math::Point& pmax) const override; /*------------------------------------------------------------------------*/ /** \brief Donne le point en fonction du paramètre sur la courbe @@ -200,23 +196,18 @@ class Curve: public GeomEntity { * * \param liste d'entity */ - virtual void addAllDownLevelEntity(std::list& l_entity) const; + void addAllDownLevelEntity(std::list& l_entity) const; /*------------------------------------------------------------------------*/ /** \brief retourne un point sur l'objet au centre si possible * \author Eric Brière de l'Isle */ - virtual Utils::Math::Point getCenteredPosition() const; - - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) - */ - virtual std::string getTypeName() const {return typeNameGeomCurve;} + Utils::Math::Point getCenteredPosition() const override; /*------------------------------------------------------------------------*/ /** \brief Donne le type de l'objet */ - virtual Utils::Entity::objectType getType() const {return Utils::Entity::GeomCurve;} + Utils::Entity::objectType getType() const override { return Utils::Entity::GeomCurve; } /*------------------------------------------------------------------------*/ /** \brief Donne le nom court du type d'objet (pour le nommage des entités) diff --git a/src/Core/protected/Geom/GeomEntity.h b/src/Core/protected/Geom/GeomEntity.h index 572d9c95..96b534c4 100644 --- a/src/Core/protected/Geom/GeomEntity.h +++ b/src/Core/protected/Geom/GeomEntity.h @@ -2,7 +2,6 @@ #define MGX3D_GEOM_GEOMENTITY_H_ /*----------------------------------------------------------------------------*/ #include -#include #include /*----------------------------------------------------------------------------*/ #include @@ -13,27 +12,15 @@ #include "Utils/Point.h" #include "Geom/GeomProperty.h" #include "Geom/GeomEntityVisitor.h" -#include "Services/DescriptionService.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ -namespace Mgx3D { -/*----------------------------------------------------------------------------*/ /*! * \namespace Mgx3D::Geom * * \brief Espace de nom des classes associées à la géométrie - * - * */ -namespace Geom { -/*----------------------------------------------------------------------------*/ -class Volume; -class Surface; -class Curve; -class Vertex; -class GeomProperty; -class MementoEntity; +namespace Mgx3D::Geom { /*----------------------------------------------------------------------------*/ /** \enum Orientation gives a list of orientation option for geometric * entities. @@ -52,7 +39,7 @@ class MementoEntity; * sommets, courbes, surfaces et volumes géométriques. * */ -class GeomEntity : public Internal::InternalEntity{ +class GeomEntity : public Internal::InternalEntity { protected: /*------------------------------------------------------------------------*/ /** \brief Constructeur. Une entité délègue un certain nombre de calculs @@ -74,9 +61,7 @@ class GeomEntity : public Internal::InternalEntity{ /** \brief Crée une copie (avec allocation mémoire, appel à new) de l'objet * courant. */ - virtual GeomEntity* clone(Internal::Context&){ - throw TkUtil::Exception (TkUtil::UTF8String ("GeomEntity::clone pas implementee.", TkUtil::Charset::UTF_8)); - }; + virtual GeomEntity* clone(Internal::Context&) = 0; /*------------------------------------------------------------------------*/ /** \brief Destructeur @@ -100,7 +85,7 @@ class GeomEntity : public Internal::InternalEntity{ /** \brief Calcule l'aire d'une entité: Pour une courbe, c'est la * longueur, pour une surface, l'aire, pour un volume le volume. */ - virtual double computeArea() const =0; + virtual double computeArea() const = 0; /*------------------------------------------------------------------------*/ /** \brief Retourne l'aire d'une entité: Pour une courbe, c'est la @@ -111,9 +96,7 @@ class GeomEntity : public Internal::InternalEntity{ /** \brief Stocke l'aire d'une entité: Pour une courbe, c'est la * longueur, pour une surface, l'aire, pour un volume le volume. */ - virtual void setArea(double area) - {m_computedArea = area;} - + void setArea(double area) { m_computedArea = area; } void forceComputeArea() { m_computedAreaIsUpToDate = false; } /*------------------------------------------------------------------------*/ @@ -128,7 +111,7 @@ class GeomEntity : public Internal::InternalEntity{ /** \brief retourne un point sur l'objet au centre si possible * \author Eric Brière de l'Isle */ - virtual Utils::Math::Point getCenteredPosition() const =0; + virtual Utils::Math::Point getCenteredPosition() const = 0; /*------------------------------------------------------------------------*/ /** \brief Fournit l'accès à la propriété de l'entité géométrique @@ -164,6 +147,12 @@ class GeomEntity : public Internal::InternalEntity{ */ virtual void setDestroyed(bool b); + /*------------------------------------------------------------------------*/ + /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) + * + */ + std::string getTypeName() const override { return objectTypeToObjectTypeName(getType()); } + private: /// Propriétés géométriques (qui peut être spécifique, PropertyBox par exemple) GeomProperty* m_geomProp; @@ -173,12 +162,8 @@ class GeomEntity : public Internal::InternalEntity{ /// résultat de la commande computeArea, qui peut être longue mutable double m_computedArea; - }; /*----------------------------------------------------------------------------*/ -} // end namespace Geom -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D +} // end namespace Mgx3D::Geom /*----------------------------------------------------------------------------*/ #endif /* MGX3D_GEOM_GEOMENTITY_H_ */ -/*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Geom/Surface.h b/src/Core/protected/Geom/Surface.h index 59527a03..47ad7c81 100644 --- a/src/Core/protected/Geom/Surface.h +++ b/src/Core/protected/Geom/Surface.h @@ -14,11 +14,8 @@ namespace Mgx3D { /*----------------------------------------------------------------------------*/ namespace Geom { /*----------------------------------------------------------------------------*/ -class Loop; class Curve; class Volume; -class Vertex; -class GeomProperty; /*----------------------------------------------------------------------------*/ /** * \class Surface @@ -28,7 +25,6 @@ class GeomProperty; class Surface: public GeomEntity { friend class Services::MementoService; - static const char* typeNameGeomSurface; public: @@ -57,16 +53,16 @@ class Surface: public GeomEntity { const std::vector& getOCCFaces() const { return m_occ_faces; } - virtual void apply(std::function const& lambda) const; - virtual void applyAndReturn(std::function const& lambda); - virtual void accept(ConstGeomEntityVisitor& v) const { v.visit(this); } - virtual void accept(GeomEntityVisitor& v) { v.visit(this); } + void apply(std::function const& lambda) const override; + void applyAndReturn(std::function const& lambda) override; + void accept(ConstGeomEntityVisitor& v) const override { v.visit(this); } + void accept(GeomEntityVisitor& v) override { v.visit(this); } /*------------------------------------------------------------------------*/ /** \brief Crée une copie (avec allocation mémoire, appel à new) de l'objet * courant. */ - virtual GeomEntity* clone(Internal::Context&); + GeomEntity* clone(Internal::Context&) override; /*------------------------------------------------------------------------*/ /** \brief Destructeur @@ -79,18 +75,18 @@ class Surface: public GeomEntity { * \param pmin Les coordonnées min de la boite englobante * \param pmax Les coordonnées max de la boite englobante */ - virtual void computeBoundingBox(Utils::Math::Point& pmin, Utils::Math::Point& pmax) const; + void computeBoundingBox(Utils::Math::Point& pmin, Utils::Math::Point& pmax) const override; /*------------------------------------------------------------------------*/ /** \brief Calcule l'aire d'une entité: Pour une courbe, c'est la * longueur, pour une surface, l'aire, pour un volume le volume. */ - virtual double computeArea() const; + double computeArea() const override; /*------------------------------------------------------------------------*/ /** \brief retourne la dimension de l'entité géométrique */ - virtual int getDim() const {return 2;} + int getDim() const override { return 2; } /*------------------------------------------------------------------------*/ /** \brief Calcul la normale à une surface en un point @@ -98,7 +94,7 @@ class Surface: public GeomEntity { * \param P1 le point à projeter * \param V2 la normale recherchée suivant le projeté du point */ - virtual void normal(const Utils::Math::Point& P1, Utils::Math::Vector& V2) const; + void normal(const Utils::Math::Point& P1, Utils::Math::Vector& V2) const; /*------------------------------------------------------------------------*/ /** \brief Retourne le point de parametre (u,v) dans l'espace de parametre @@ -106,21 +102,21 @@ class Surface: public GeomEntity { * [V1,V2] retournées par getParametricBounds, une exception est * levée. La robustesse de cette méthode repose sur OCC */ - virtual Utils::Math::Point getPoint(const double u, const double v) const; + Utils::Math::Point getPoint(const double u, const double v) const; /*------------------------------------------------------------------------*/ /** \brief Ajoute v comme volume incident * * \param v un pointeur sur un volume */ - virtual void add(Volume* v); + void add(Volume* v); /*------------------------------------------------------------------------*/ /** \brief Ajoute c comme courbe incidente * * \param c un pointeur sur une courbe */ - virtual void add(Curve* c); + void add(Curve* c); /*------------------------------------------------------------------------*/ /** \brief Supprime v de la liste des volumes incidents. Si v n'apparait @@ -128,7 +124,7 @@ class Surface: public GeomEntity { * * \param v un pointeur sur un volume */ - virtual void remove(Volume* v); + void remove(Volume* v); /*------------------------------------------------------------------------*/ /** \brief Supprime c de la liste des courbes incidentes. Si c n'apparait @@ -136,7 +132,7 @@ class Surface: public GeomEntity { * * \param v un pointeur sur un volume */ - virtual void remove(Curve* c); + void remove(Curve* c); /*------------------------------------------------------------------------*/ /** \brief Ajoute à la liste les entités de niveaux inférieurs @@ -144,23 +140,18 @@ class Surface: public GeomEntity { * * \param liste d'entity */ - virtual void addAllDownLevelEntity(std::list& l_entity) const; + void addAllDownLevelEntity(std::list& l_entity) const; /*------------------------------------------------------------------------*/ /** \brief retourne un point sur l'objet au centre si possible * \author Eric Brière de l'Isle */ - virtual Utils::Math::Point getCenteredPosition() const; - - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) - */ - virtual std::string getTypeName() const {return typeNameGeomSurface;} + Utils::Math::Point getCenteredPosition() const override; /*------------------------------------------------------------------------*/ /** \brief Donne le type de l'objet */ - virtual Utils::Entity::objectType getType() const {return Utils::Entity::GeomSurface;} + Utils::Entity::objectType getType() const override { return Utils::Entity::GeomSurface; } /*------------------------------------------------------------------------*/ /** \brief Donne le nom court du type d'objet (pour le nommage des entités) @@ -185,7 +176,7 @@ class Surface: public GeomEntity { /*------------------------------------------------------------------------*/ /** \brief indique si la surface est un plan ou pas */ - virtual bool isPlanar() const; + bool isPlanar() const; private: std::vector m_curves; diff --git a/src/Core/protected/Geom/Vertex.h b/src/Core/protected/Geom/Vertex.h index 75f8b56e..bd6a0752 100644 --- a/src/Core/protected/Geom/Vertex.h +++ b/src/Core/protected/Geom/Vertex.h @@ -1,20 +1,17 @@ #ifndef MGX3D_GEOM_VERTEX_H_ #define MGX3D_GEOM_VERTEX_H_ -/*----------------------------------------------------------------------------*/ -#include -#include -/*----------------------------------------------------------------------------*/ #include "Geom/GeomEntity.h" #include "Services/MementoService.h" #include "Utils/Point.h" /*----------------------------------------------------------------------------*/ +#include +/*----------------------------------------------------------------------------*/ +#include +/*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ namespace Geom { class Curve; -class Surface; -class Volume; -class GeomProperty; /*----------------------------------------------------------------------------*/ /** * \class Vertex @@ -23,7 +20,6 @@ class GeomProperty; class Vertex: public GeomEntity { friend class Services::MementoService; - static const char* typeNameGeomVertex; public: @@ -41,16 +37,16 @@ class Vertex: public GeomEntity { const TopoDS_Vertex& getOCCVertex() const { return m_occ_vertex; } - virtual void apply(std::function const& lambda) const; - virtual void applyAndReturn(std::function const& lambda); - virtual void accept(ConstGeomEntityVisitor& v) const { v.visit(this); } - virtual void accept(GeomEntityVisitor& v) { v.visit(this); } + void apply(std::function const& lambda) const override; + void applyAndReturn(std::function const& lambda) override; + void accept(ConstGeomEntityVisitor& v) const override { v.visit(this); } + void accept(GeomEntityVisitor& v) override { v.visit(this); } /*------------------------------------------------------------------------*/ /** \brief Crée une copie (avec allocation mémoire, appel à new) de l'objet * courant. */ - virtual GeomEntity* clone(Internal::Context&); + GeomEntity* clone(Internal::Context&) override; /// Destructeur virtual ~Vertex(); @@ -58,18 +54,18 @@ class Vertex: public GeomEntity { /*------------------------------------------------------------------------*/ /** \brief retourne la dimension de l'entité géométrique */ - int getDim() const {return 0;} + int getDim() const override { return 0; } /*------------------------------------------------------------------------*/ /** \brief Fournit un résumé textuel de l'entité. */ - virtual std::string getSummary ( ) const; + std::string getSummary ( ) const override; /*------------------------------------------------------------------------*/ /** \brief Calcule l'aire d'une entité: Pour une courbe, c'est la * longueur, pour une surface, l'aire, pour un volume le volume. */ - double computeArea() const; + double computeArea() const override; /*------------------------------------------------------------------------*/ /** \brief Calcul de la boite englobante orientée selon les axes Ox,Oy,Oz @@ -77,7 +73,7 @@ class Vertex: public GeomEntity { * \param pmin Les coordonnées min de la boite englobante * \param pmax Les coordonnées max de la boite englobante */ - virtual void computeBoundingBox(Utils::Math::Point& pmin, Utils::Math::Point& pmax) const; + void computeBoundingBox(Utils::Math::Point& pmin, Utils::Math::Point& pmax) const override; /*------------------------------------------------------------------------*/ /** \brief Fournit l'accès aux courbes géométriques incidentes @@ -104,18 +100,17 @@ class Vertex: public GeomEntity { /*------------------------------------------------------------------------*/ /** \brief retourne un point sur l'objet au centre si possible */ - virtual Utils::Math::Point getCenteredPosition() const; + Utils::Math::Point getCenteredPosition() const override; /*------------------------------------------------------------------------*/ /** \brief retourne la position du Vertex */ - virtual Utils::Math::Point getCoord() const; + Utils::Math::Point getCoord() const; + + Utils::Math::Point getPoint() const{ return getCoord(); } - inline Utils::Math::Point getPoint() const{ - return getCoord(); - } -/*------------------------------------------------------------------------*/ + /*------------------------------------------------------------------------*/ /** \brief retourne la coordonnée en X du sommet */ double getX() const; @@ -128,15 +123,10 @@ class Vertex: public GeomEntity { */ double getZ() const; - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) - */ - virtual std::string getTypeName() const {return typeNameGeomVertex;} - /*------------------------------------------------------------------------*/ /** \brief Donne le type de l'objet */ - virtual Utils::Entity::objectType getType() const {return Utils::Entity::GeomVertex;} + Utils::Entity::objectType getType() const override { return Utils::Entity::GeomVertex; } /*------------------------------------------------------------------------*/ /** \brief Donne le nom court du type d'objet (pour le nommage des entités) @@ -152,6 +142,7 @@ class Vertex: public GeomEntity { /** \brief Surcharge pour l'écriture dans les flux */ friend std::ostream& operator<<(std::ostream& str, const Vertex& v); + /*------------------------------------------------------------------------*/ /** \brief Surcharge pour l'écriture dans les flux */ diff --git a/src/Core/protected/Geom/Volume.h b/src/Core/protected/Geom/Volume.h index 8cebac4d..e3234500 100644 --- a/src/Core/protected/Geom/Volume.h +++ b/src/Core/protected/Geom/Volume.h @@ -1,6 +1,5 @@ #ifndef MGX3D_GEOM_VOLUME_H_ #define MGX3D_GEOM_VOLUME_H_ -/*----------------------------------------------------------------------------*/ #include "Geom/GeomEntity.h" #include "Services/MementoService.h" /*----------------------------------------------------------------------------*/ @@ -11,8 +10,6 @@ namespace Mgx3D { /*----------------------------------------------------------------------------*/ namespace Geom { - -class GeomProperty; /*----------------------------------------------------------------------------*/ /** * \class Volume @@ -22,7 +19,6 @@ class GeomProperty; class Volume: public GeomEntity { friend class Services::MementoService; friend class GeomModificationBaseClass; - static const char* typeNameGeomVolume; public: @@ -40,16 +36,16 @@ class Volume: public GeomEntity { const TopoDS_Shape& getOCCShape() const { return m_occ_shape; } - virtual void apply(std::function const& lambda) const; - virtual void applyAndReturn(std::function const& lambda); - virtual void accept(ConstGeomEntityVisitor& v) const { v.visit(this); } - virtual void accept(GeomEntityVisitor& v) { v.visit(this); } + void apply(std::function const& lambda) const override; + void applyAndReturn(std::function const& lambda) override; + void accept(ConstGeomEntityVisitor& v) const override { v.visit(this); } + void accept(GeomEntityVisitor& v) override { v.visit(this); } /*------------------------------------------------------------------------*/ /** \brief Crée une copie (avec allocation mémoire, appel à new) de l'objet * courant. */ - virtual GeomEntity* clone(Internal::Context&); + GeomEntity* clone(Internal::Context&) override; /*------------------------------------------------------------------------*/ /** \brief Destructeur @@ -60,7 +56,7 @@ class Volume: public GeomEntity { /** \brief Calcule l'aire d'une entité: Pour une courbe, c'est la * longueur, pour une surface, l'aire, pour un volume le volume. */ - double computeArea() const; + double computeArea() const override; /*------------------------------------------------------------------------*/ /** \brief Calcul de la boite englobante orientée selon les axes Ox,Oy,Oz @@ -68,19 +64,19 @@ class Volume: public GeomEntity { * \param pmin Les coordonnées min de la boite englobante * \param pmax Les coordonnées max de la boite englobante */ - virtual void computeBoundingBox(Utils::Math::Point& pmin, Utils::Math::Point& pmax) const; + void computeBoundingBox(Utils::Math::Point& pmin, Utils::Math::Point& pmax) const override; /*------------------------------------------------------------------------*/ /** \brief retourne la dimension de l'entité géométrique */ - int getDim() const {return 3;} + int getDim() const override { return 3; } /*------------------------------------------------------------------------*/ /** \brief Fournit l'accès aux surfaces géométriques incidentes * * \param surfaces les surfaces incidentes */ - virtual const std::vector& getSurfaces() const {return m_surfaces;} + const std::vector& getSurfaces() const {return m_surfaces;} /*------------------------------------------------------------------------*/ /** \brief Ajoute s comme surface incidente @@ -103,23 +99,18 @@ class Volume: public GeomEntity { * * \param liste d'entity */ - virtual void addAllDownLevelEntity(std::list& l_entity) const; + void addAllDownLevelEntity(std::list& l_entity) const; /*------------------------------------------------------------------------*/ /** \brief retourne un point sur l'objet au centre si possible * \author Eric Brière de l'Isle */ - virtual Utils::Math::Point getCenteredPosition() const; - - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom du type d'objet (un nom distinct par type d'objet) - */ - virtual std::string getTypeName() const {return typeNameGeomVolume;} + Utils::Math::Point getCenteredPosition() const override; /*------------------------------------------------------------------------*/ /** \brief Donne le type de l'objet */ - virtual Utils::Entity::objectType getType() const {return Utils::Entity::GeomVolume;} + Utils::Entity::objectType getType() const { return Utils::Entity::GeomVolume; } /*------------------------------------------------------------------------*/ /** \brief Donne le nom court du type d'objet (pour le nommage des entités) diff --git a/src/Core/protected/Group/GroupEntity.h b/src/Core/protected/Group/GroupEntity.h index 1c15d1d6..a9990d4f 100644 --- a/src/Core/protected/Group/GroupEntity.h +++ b/src/Core/protected/Group/GroupEntity.h @@ -44,8 +44,8 @@ class GroupEntity : public Internal::InternalEntity{ uint level); public: - virtual void accept(ConstGroupEntityVisitor& visitor) const = 0 ; - virtual void accept(GroupEntityVisitor& visitor) = 0 ; + virtual void accept(ConstGroupEntityVisitor& visitor) const = 0; + virtual void accept(GroupEntityVisitor& visitor) = 0; /*------------------------------------------------------------------------*/ /** \brief Destructeur @@ -153,8 +153,7 @@ class GroupEntityT : public GroupEntity int getDim() const override { return TDIM; } Utils::Entity::objectType getType() const override { return TTYPE; } - std::string getTypeName() const override - { return Utils::Entity::objectTypeToObjectTypeName(TTYPE); } + std::string getTypeName() const override { return objectTypeToObjectTypeName(TTYPE); } }; /*----------------------------------------------------------------------------*/ using Group0D = GroupEntityT<0, Utils::Entity::Group0D>; From 9d304178cde8d2181c98625fe41b5107597b29a2 Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Thu, 30 Oct 2025 11:37:09 +0100 Subject: [PATCH 09/18] Removed unused getIndexOf methods --- src/Core/Geom/GeomManager.cpp | 63 --------------------------- src/Core/protected/Geom/GeomManager.h | 9 ---- src/Core/protected/Geom/Vertex.h | 1 + src/Utils/protected/Utils/Entity.h | 31 +++++++++---- 4 files changed, 23 insertions(+), 81 deletions(-) diff --git a/src/Core/Geom/GeomManager.cpp b/src/Core/Geom/GeomManager.cpp index f5fe6a04..1e63700b 100644 --- a/src/Core/Geom/GeomManager.cpp +++ b/src/Core/Geom/GeomManager.cpp @@ -4841,69 +4841,6 @@ GeomEntity* GeomManager::getEntity(const std::string& name, const bool exception return ge; } -/*----------------------------------------------------------------------------*/ -int GeomManager::getIndexOf(Vertex* v) const -{ - int index = -1; - for (unsigned int i=0; igetUniqueId()==m_vertices[i]->getUniqueId()) - index = i; - } - if(index==-1){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getIndexOf impossible pour un sommet"; - throw TkUtil::Exception(message); - } - return index; -} -/*----------------------------------------------------------------------------*/ -int GeomManager::getIndexOf(Curve* c) const -{ - int index = -1; - for (unsigned int i=0; igetUniqueId()==m_curves[i]->getUniqueId()) - index = i; - } - if(index==-1){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getIndexOf impossible pour une courbe"; - throw TkUtil::Exception(message); - } - return index; -} -/*----------------------------------------------------------------------------*/ -int GeomManager::getIndexOf(Surface* s) const -{ - int index = -1; - - for (unsigned int i=0; igetUniqueId()==m_surfaces[i]->getUniqueId()) - index = i; - } - if(index==-1){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getIndexOf impossible pour une surface"; - throw TkUtil::Exception(message); - } - return index; -} -/*----------------------------------------------------------------------------*/ -int GeomManager::getIndexOf(Volume* v) const -{ - int index = -1; - - for (unsigned int i=0; igetUniqueId()==m_volumes[i]->getUniqueId()) - index = i; - } - if(index==-1){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getIndexOf impossible pour un volume"; - throw TkUtil::Exception(message); - } - return index; -} - /*----------------------------------------------------------------------------*/ void GeomManager::addEntity (GeomEntity* ge) { diff --git a/src/Core/protected/Geom/GeomManager.h b/src/Core/protected/Geom/GeomManager.h index 2ebbd917..553852c6 100644 --- a/src/Core/protected/Geom/GeomManager.h +++ b/src/Core/protected/Geom/GeomManager.h @@ -1439,15 +1439,6 @@ class GeomManager final : public Internal::CommandCreator { /** Retourne le nom du dernier Vertex */ std::string getLastVertex() const; - /** Retourne l'indice du sommet v*/ - int getIndexOf(Vertex* v) const; - /** Retourne l'indice de la courbe c*/ - int getIndexOf(Curve* c) const; - /** Retourne l'indice de la surface s*/ - int getIndexOf(Surface* s) const; - /** Retourne l'indice du volume v*/ - int getIndexOf(Volume* v) const; - /** Ajoute un groupe à un ensemble d'entités géométriques, suivant une dimension */ Internal::M3DCommandResult* addToGroup(std::vector& ve, int dim, const std::string& groupName); SET_SWIG_COMPLETABLE_METHOD(addToGroup) diff --git a/src/Core/protected/Geom/Vertex.h b/src/Core/protected/Geom/Vertex.h index bd6a0752..0b45fb3f 100644 --- a/src/Core/protected/Geom/Vertex.h +++ b/src/Core/protected/Geom/Vertex.h @@ -1,5 +1,6 @@ #ifndef MGX3D_GEOM_VERTEX_H_ #define MGX3D_GEOM_VERTEX_H_ +/*----------------------------------------------------------------------------*/ #include "Geom/GeomEntity.h" #include "Services/MementoService.h" #include "Utils/Point.h" diff --git a/src/Utils/protected/Utils/Entity.h b/src/Utils/protected/Utils/Entity.h index 90fbc6c0..6b92d2ac 100644 --- a/src/Utils/protected/Utils/Entity.h +++ b/src/Utils/protected/Utils/Entity.h @@ -1,16 +1,9 @@ -/*----------------------------------------------------------------------------*/ -/** \file Entity.h - * - * \author Franck Ledoux, Eric Brière de l'Isle - * - * \date 30/11/2010 - */ -/*----------------------------------------------------------------------------*/ #ifndef UTIL_ENTITY_H_ #define UTIL_ENTITY_H_ /*----------------------------------------------------------------------------*/ #include "Utils/DisplayRepresentation.h" #include "Utils/SerializedRepresentation.h" +#include #include #include #include @@ -381,15 +374,35 @@ private : Entity::objectType typesToType (FilterEntity::objectType types); FilterEntity::objectType typeToTypes (Entity::objectType type); + #ifndef SWIG template using EntitySet = std::set; -template std::vector toNames(const std::vector& entities) { + +template::value>> +std::vector toNames(const std::vector& entities) +{ std::vector result; result.reserve(entities.size()); std::transform(entities.begin(), entities.end(), std::back_inserter(result), [](T* e){ return e->getName(); }); return result; } + +template::value>> +int getIndexOf(const std::vector& entities, T* e) +{ + int index = -1; + for (unsigned int i=0; igetUniqueId() == entities[i]->getUniqueId()) + index = i; + } + if (index == -1) { + TkUtil::UTF8String message (TkUtil::Charset::UTF_8); + message <<"getIndexOf impossible pour un volume"; + throw TkUtil::Exception(message); + } + return index; +} #endif /*----------------------------------------------------------------------------*/ } // end namespace Utils From f89c7aa854fae909d2bd1048ecbc01ab6e75f2a9 Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Thu, 30 Oct 2025 13:50:15 +0100 Subject: [PATCH 10/18] Remove unused files --- src/Utils/Handle.cpp | 51 ----- src/Utils/protected/Utils/Handle.h | 207 -------------------- src/Utils/protected/Utils/HandleContainer.h | 181 ----------------- 3 files changed, 439 deletions(-) delete mode 100644 src/Utils/Handle.cpp delete mode 100644 src/Utils/protected/Utils/Handle.h delete mode 100644 src/Utils/protected/Utils/HandleContainer.h diff --git a/src/Utils/Handle.cpp b/src/Utils/Handle.cpp deleted file mode 100644 index e9f16de9..00000000 --- a/src/Utils/Handle.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* - * \file Handle.cpp - * - * \author Franck Ledoux - * - * \date 19/10/2010 - */ -/*----------------------------------------------------------------------------*/ -#include "Utils/Handle.h" -/*----------------------------------------------------------------------------*/ -namespace Mgx3D { -/*----------------------------------------------------------------------------*/ -namespace Utils { -/*----------------------------------------------------------------------------*/ -RefCountObject::RefCountObject():m_nbRefs(0) -{} -/*----------------------------------------------------------------------------*/ -RefCountObject::~RefCountObject() -{ - killBehaviour(); -} -/*----------------------------------------------------------------------------*/ -void RefCountObject::killBehaviour(){ -// if(getNbRefs()!=0) -// throw TkUtil::Exception("Still references!"); -} -/*----------------------------------------------------------------------------*/ -void RefCountObject::increaseNbRefs() -{ - m_nbRefs+=1; -} -/*----------------------------------------------------------------------------*/ -void RefCountObject::decreaseNbRefs() -{ - if(m_nbRefs!=0) - m_nbRefs-=1; - - if(m_nbRefs==0) - noMoreHandle(); -} -/*----------------------------------------------------------------------------*/ -int RefCountObject::getNbRefs() const -{ - return m_nbRefs; -} -/*----------------------------------------------------------------------------*/ -} // end namespace Utils -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D -/*----------------------------------------------------------------------------*/ diff --git a/src/Utils/protected/Utils/Handle.h b/src/Utils/protected/Utils/Handle.h deleted file mode 100644 index 060d9f6b..00000000 --- a/src/Utils/protected/Utils/Handle.h +++ /dev/null @@ -1,207 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/** \file Handle.h - * - * \author Franck Ledoux - * - * \date 19/10/2010 - */ -/*----------------------------------------------------------------------------*/ -#ifndef UTILS_HANDLE_H_ -#define UTILS_HANDLE_H_ -/*----------------------------------------------------------------------------*/ -#include -/*----------------------------------------------------------------------------*/ -namespace Mgx3D { -/*----------------------------------------------------------------------------*/ -namespace Utils { -/*----------------------------------------------------------------------------*/ -/** \class RefCountObject - * \brief Fournit le service de comptage de référence pour les objets des - * classes héritant de RefCountObject - */ -/*----------------------------------------------------------------------------*/ -class RefCountObject{ - -public: - - /*------------------------------------------------------------------------*/ - /** \brief Constructeur. - */ - RefCountObject(); - - /*------------------------------------------------------------------------*/ - /** \brief Destructeur - */ - virtual ~RefCountObject(); - - - /*------------------------------------------------------------------------*/ - /** \brief méthode à implémenter par les classes filles de RefCountObject. - * Cette méthode est appelée lors de l'appel au destructeur. En - * particulier, quel choix faire si il reste des références sur - * this. Par défaut, une exception est levée - */ - virtual void killBehaviour(); - - /*------------------------------------------------------------------------*/ - /** \brief méthode à implémenter par les classes filles de RefCountObject. - * Cette méthode est appelée lors du décrément du compteur de - * référence si celui-ci vaut 0. Chaque classe fille doit donc - * implémenter son comportement par défaut quand plus aucun objet - * de type "Handle" ne le référence. - */ - virtual void noMoreHandle() =0; - - /*------------------------------------------------------------------------*/ - /** \brief augmente de 1 le nombre de références sur l'objet - */ - void increaseNbRefs(); - - /*------------------------------------------------------------------------*/ - /** \brief diminue de 1 le nombre de références sur l'objet - */ - void decreaseNbRefs(); - - /*------------------------------------------------------------------------*/ - /** \brief Retourne le nombre de références sur l'objet en question. - */ - int getNbRefs() const; - - /*------------------------------------------------------------------------*/ - /** \brief surcharge de l'opérateur d'égalité - */ - const RefCountObject& operator = (const RefCountObject&); - - -private: - - /** compteur de référence sur l'objet */ - int m_nbRefs; -}; -/*----------------------------------------------------------------------------*/ -/** \class Handle - * \brief Fournit un service pour la gestion de pointeurs où l'objet pointé - * héritant de RefCountObject maintient un compteur de référence des - * entités ayant une poignée sur lui. L'objet pointé est de type T. - * - * \param T le type de l'objet pointé, qui est forcément une classe et pas un - * type de base - */ -/*----------------------------------------------------------------------------*/ -template -class Handle{ - -public: - - /*------------------------------------------------------------------------*/ - /** \brief Constructeur par défaut. - */ - Handle():m_ref(0){} - - /*------------------------------------------------------------------------*/ - /** \brief Constructeur sur un objet de type T qui hérite forcément de - * RefCountObject sinon une erreur de compilation survient. - */ - Handle(T* ptr):m_ref(ptr){ - if(m_ref) - m_ref->increaseNbRefs(); - } - - /*------------------------------------------------------------------------*/ - /** \brief Constructeur par copie. - */ - Handle(const Handle& h):m_ref(h.m_ref){ - if(m_ref) - m_ref->increaseNbRefs(); - } - - /*------------------------------------------------------------------------*/ - /** \brief Destructeur - */ - virtual ~Handle(){ - if(m_ref) - m_ref->decreaseNbRefs(); - } - - /*------------------------------------------------------------------------*/ - /** \brief surcharge de l'opérateur = à partir d'un pointeur T* - */ - Handle& operator=(T* ptr){ - // on fait attention à ne pas créer une poignet sur le même objet - if(m_ref==ptr) - return *this; - /* sinon on se déréférence de l'objet sur lequel on pointait et on - * se référence sur ptr - */ - if(m_ref) - m_ref->decreaseNbRefs(); - m_ref = ptr; - if(m_ref) - m_ref->increaseNbRefs(); - return *this; - } - - /*------------------------------------------------------------------------*/ - /** \brief surcharge de l'opérateur = à partir d'une autre poignée - */ - Handle& operator=(const Handle& h){ - // on fait attention à ne pas créer une poignet sur le même objet - if(m_ref==h.m_ref) - return *this; - /* sinon on se déréférence de l'objet sur lequel on pointait et on - * se référence sur ptr - */ - if(m_ref) - m_ref->decreaseNbRefs(); - m_ref = h.m_ref; - if(m_ref) - m_ref->increaseNbRefs(); - return *this; - } - - /*------------------------------------------------------------------------*/ - /** \brief Accès au pointeur encapsulé - */ - T& operator*() const { return *m_ref;} - /*------------------------------------------------------------------------*/ - /** \brief Accès au pointeur encapsulé - */ - T* operator->() const { return m_ref;} - - /*------------------------------------------------------------------------*/ - /** \brief Accès au pointeur encapsulé - */ - operator T*() const { return m_ref;} - - /*------------------------------------------------------------------------*/ - /** \brief Surcharge de l'opérateur < pour les conteneurs de la STL - */ - bool operator< (const Handle& h) const { - return m_ref& h) const { - return m_ref==h.m_ref; - } - /*------------------------------------------------------------------------*/ - /** \brief Surcharge de l'opérateur != - */ - bool operator!=(const Handle& h) const { - return m_ref!=h.m_ref; - } - -private: - - /** l'objet pointé*/ - T* m_ref; -}; -/*----------------------------------------------------------------------------*/ -} // end namespace Utils -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D -/*----------------------------------------------------------------------------*/ -#endif /* UTILS_HANDLE_H_ */ -/*----------------------------------------------------------------------------*/ diff --git a/src/Utils/protected/Utils/HandleContainer.h b/src/Utils/protected/Utils/HandleContainer.h deleted file mode 100644 index 0bed17dd..00000000 --- a/src/Utils/protected/Utils/HandleContainer.h +++ /dev/null @@ -1,181 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* - * \file HandleContainer.h - * - * \author Eric Brière de l'Isle - * - * \date 23 févr. 2012 - */ -/*----------------------------------------------------------------------------*/ -#ifndef UTILS_HANDLECONTAINER_H_ -#define UTILS_HANDLECONTAINER_H_ -/*----------------------------------------------------------------------------*/ -#include "Utils/Handle.h" -#include -#include -#include -/*----------------------------------------------------------------------------*/ -namespace Mgx3D { -/*----------------------------------------------------------------------------*/ -namespace Utils { -/*----------------------------------------------------------------------------*/ - -/*----------------------------------------------------------------------------*/ -/** \class HandleContainer - * \brief Conteneur (du type vector) sur des Handles - */ -/*----------------------------------------------------------------------------*/ -template -class HandleContainer{ - -public: - /// ajoute une entité (un handle sur cette entité) - void add(T* entity) - { - Utils::Handle he(entity); - m_entities.push_back(he); - } - - /*----------------------------------------------------------------------------*/ - /// ajoute un vecteur d'entités - void add(const std::vector >& entities) - { - m_entities.insert(m_entities.end(), entities.begin(), entities.end()); - } - - /// ajoute une liste d'entités - void add(const std::list >& entities) - { - m_entities.insert(m_entities.end(), entities.begin(), entities.end()); - } - - /*----------------------------------------------------------------------------*/ - /// recherche et enlève l'entité - void remove(T* entity, const bool exceptionIfNotFound) - { - uint i = 0; - for (; i >::iterator iter; - // Utils::Handle he(entity); - // iter = find(m_entities.begin(), m_entities.end(), he); - // if (iter != m_entities.end()) - // m_entities.erase(iter); - // else if(exceptionIfNotFound) - // throw TkUtil::Exception("Erreur interne (pas d'entité), avec HandleContainer::remove"); - } - - /*----------------------------------------------------------------------------*/ - /// copie le contenu du conteneur - void get(std::vector >& entities) const - { - entities.clear(); - entities.insert(entities.end(), m_entities.begin(), m_entities.end()); - } - - /*----------------------------------------------------------------------------*/ - /// copie le contenu du conteneur - void get(std::list >& entities) const - { - entities.clear(); - entities.insert(entities.end(), m_entities.begin(), m_entities.end()); - } - - /*----------------------------------------------------------------------------*/ - /// accès directe au contenu du conteneur - const std::vector >& get() const - { - return m_entities; - } - - /*----------------------------------------------------------------------------*/ - /// copie le contenu du conteneur - void clone(HandleContainer& cont) - { - m_entities.insert(m_entities.end(), cont.m_entities.begin(), cont.m_entities.end()); - } - - /*----------------------------------------------------------------------------*/ - /// retourne la ième entité - Utils::Handle get(uint ind) const - { -#ifdef _DEBUG2 - if (ind>=m_entities.size()) - throw TkUtil::Exception("Erreur interne (indice trop élevé), avec HandleContainer::get"); -#endif - - return m_entities[ind]; - } - - /*----------------------------------------------------------------------------*/ - /// modifie la ième entité - void set(uint ind, T* entity) - { -#ifdef _DEBUG2 - if (ind>=m_entities.size()) - throw TkUtil::Exception("Erreur interne (indice trop élevé), avec HandleContainer::set"); -#endif - - m_entities[ind] = entity; - } - - /*----------------------------------------------------------------------------*/ - /// \return Le nombre d'entités - uint getNb() const - { - return m_entities.size(); - } - - /*----------------------------------------------------------------------------*/ - /// vide le conteneur - void clear() - { - m_entities.clear(); - } - - /*----------------------------------------------------------------------------*/ - /// change la taille du conteneur - void resize(uint nb) - { - m_entities.resize(nb); - } - - /*----------------------------------------------------------------------------*/ - /// recherche si une entité est présente ou non - bool find(T* entity) - { - uint i = 0; - for (; i > m_entities; -}; -/*----------------------------------------------------------------------------*/ -} // end namespace Utils -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D -/*----------------------------------------------------------------------------*/ - -#endif /* UTILS_HANDLECONTAINER_H_ */ From aa89da12246c738136d4e4969a95f15ecb52ec12 Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Fri, 31 Oct 2025 15:40:01 +0100 Subject: [PATCH 11/18] Remove home made container from topo entities --- src/Core/Geom/ExportVTKImplementation.cpp | 31 +- src/Core/Internal/EntitiesHelper.cpp | 4 +- src/Core/Internal/ServiceGeomToTopo.cpp | 12 +- src/Core/Mesh/CommandCreateMesh.cpp | 6 +- .../CommandCreateSubVolumeBetweenSheets.cpp | 47 +- src/Core/Mesh/CommandMeshExplorer.cpp | 44 +- src/Core/Mesh/CommandNewBlocksMesh.cpp | 14 +- src/Core/Mesh/CommandNewFacesMesh.cpp | 12 +- src/Core/Mesh/MeshImplementation.cpp | 40 +- src/Core/Mesh/MeshImplementationGMSH.cpp | 3 +- .../Mesh/MeshImplementationStructured.cpp | 115 +- src/Core/Mesh/MeshImplementationTetgen.cpp | 9 +- src/Core/Mesh/Volume.cpp | 24 +- src/Core/Topo/Block.cpp | 1063 +++--- src/Core/Topo/CoEdge.cpp | 545 +-- src/Core/Topo/CoFace.cpp | 1034 +++--- .../Topo/CommandChangeVertexSameLocation.cpp | 10 +- .../Topo/CommandChangeVerticesLocation.cpp | 6 +- src/Core/Topo/CommandCreateTopo.cpp | 18 +- src/Core/Topo/CommandDestroyTopo.cpp | 121 +- src/Core/Topo/CommandDuplicateTopo.cpp | 9 +- src/Core/Topo/CommandEditTopo.cpp | 69 +- src/Core/Topo/CommandExtendSplitBlock.cpp | 6 +- src/Core/Topo/CommandExtendSplitFace.cpp | 26 +- src/Core/Topo/CommandExtrudeFace.cpp | 119 +- src/Core/Topo/CommandExtrudeTopo.cpp | 113 +- src/Core/Topo/CommandFuse2Blocks.cpp | 35 +- src/Core/Topo/CommandFuse2EdgeList.cpp | 9 +- src/Core/Topo/CommandFuse2Edges.cpp | 22 +- src/Core/Topo/CommandFuse2FaceList.cpp | 38 +- src/Core/Topo/CommandFuse2Faces.cpp | 4 +- src/Core/Topo/CommandFuse2Vertices.cpp | 21 +- src/Core/Topo/CommandFuseCoEdges.cpp | 28 +- src/Core/Topo/CommandGlue2Blocks.cpp | 17 +- src/Core/Topo/CommandGlue2Topo.cpp | 42 +- src/Core/Topo/CommandInsertHole.cpp | 162 +- src/Core/Topo/CommandMakeBlocksByRevol.cpp | 763 ++-- src/Core/Topo/CommandModificationTopo.cpp | 153 +- src/Core/Topo/CommandNewTopo.cpp | 13 +- .../Topo/CommandNewTopoOGridOnGeometry.cpp | 3189 +++++++++-------- src/Core/Topo/CommandNewTopoOnGeometry.cpp | 113 +- src/Core/Topo/CommandProjectEdgesOnCurves.cpp | 8 +- .../Topo/CommandSetBlockMeshingProperty.cpp | 75 +- ...etEdgeMeshingPropertyToParallelCoEdges.cpp | 4 +- src/Core/Topo/CommandSetGeomAssociation.cpp | 21 +- src/Core/Topo/CommandSnapVertices.cpp | 197 +- src/Core/Topo/CommandSplitBlock.cpp | 6 +- src/Core/Topo/CommandSplitBlocks.cpp | 14 +- src/Core/Topo/CommandSplitBlocksWithOgrid.cpp | 454 +-- src/Core/Topo/CommandSplitFaces.cpp | 98 +- src/Core/Topo/CommandSplitFacesWithOgrid.cpp | 294 +- src/Core/Topo/CommandTransformTopo.cpp | 42 +- src/Core/Topo/Edge.cpp | 382 +- .../Topo/EdgeMeshingPropertyInterpolate.cpp | 10 +- src/Core/Topo/ExportBlocksImplementation.cpp | 90 +- src/Core/Topo/Face.cpp | 757 ++-- src/Core/Topo/ImportBlocksImplementation.cpp | 12 +- .../Topo/SetNbMeshingEdgesImplementation.cpp | 67 +- src/Core/Topo/TopoHelper.cpp | 459 +-- src/Core/Topo/TopoManager.cpp | 67 +- src/Core/Topo/Vertex.cpp | 225 +- src/Core/protected/Topo/Block.h | 62 +- src/Core/protected/Topo/BlockTopoProperty.h | 47 +- src/Core/protected/Topo/CoEdge.h | 50 +- src/Core/protected/Topo/CoEdgeTopoProperty.h | 43 +- src/Core/protected/Topo/CoFace.h | 109 +- src/Core/protected/Topo/CoFaceTopoProperty.h | 47 +- .../Topo/CommandNewTopoOGridOnGeometry.h | 4 +- src/Core/protected/Topo/Edge.h | 73 +- src/Core/protected/Topo/EdgeTopoProperty.h | 46 +- src/Core/protected/Topo/Face.h | 96 +- src/Core/protected/Topo/FaceTopoProperty.h | 46 +- src/Core/protected/Topo/Vertex.h | 35 +- src/Core/protected/Topo/VertexTopoProperty.h | 41 +- src/QtComponents/QtMgx3DEdgePanel.cpp | 8 +- .../VTKGMDSEntityRepresentation.cpp | 29 +- src/Utils/protected/Utils/Entity.h | 44 +- 77 files changed, 5212 insertions(+), 6959 deletions(-) diff --git a/src/Core/Geom/ExportVTKImplementation.cpp b/src/Core/Geom/ExportVTKImplementation.cpp index 4d156b0d..dda9a189 100644 --- a/src/Core/Geom/ExportVTKImplementation.cpp +++ b/src/Core/Geom/ExportVTKImplementation.cpp @@ -60,28 +60,16 @@ void ExportVTKImplementation::perform(Internal::InfoCommand* icmd) std::vector topo_blocs; m_context.getTopoManager().getBlocks(topo_blocs); - std::vector topo_cofaces; - std::vector topo_coedges; - std::vector topo_vertices; - topo_blocs[0]->getCoFaces(topo_cofaces); - topo_blocs[0]->getCoEdges(topo_coedges); - topo_blocs[0]->getVertices(topo_vertices); -// -// std::vector surfaces; -// std::vector clouds; -// m_context.getMeshManager().getSurfaces(surfaces); -// m_context.getMeshManager().getClouds(clouds); - gmds::Mesh& mesh = m_context.getMeshManager().getMesh()->getGMDSMesh(); { // surfaces - for(unsigned int iCoFace=0; iCoFacegetCoFaces()) { - Geom::Surface* surf_tmp = dynamic_cast (topo_cofaces[iCoFace]->getGeomAssociation()); + Geom::Surface* surf_tmp = dynamic_cast (coface->getGeomAssociation()); CHECK_NULL_PTR_ERROR(surf_tmp); auto surf = mesh.newGroup(surf_tmp->getName()); - std::vector& elems = topo_cofaces[iCoFace]->faces(); + std::vector& elems = coface->faces(); std::vector face_elems; face_elems.resize(elems.size()); for(unsigned int iGMDSFace=0; iGMDSFacegetCoEdges()) { - Geom::Curve* curv_tmp = dynamic_cast (topo_coedges[iCoEdge]->getGeomAssociation()); + Geom::Curve* curv_tmp = dynamic_cast (coedge->getGeomAssociation()); CHECK_NULL_PTR_ERROR(curv_tmp); auto cl = mesh.newGroup(curv_tmp->getName()); - std::vector& elems = topo_coedges[iCoEdge]->nodes(); + std::vector& elems = coedge->nodes(); std::vector node_elems; node_elems.resize(elems.size()); @@ -112,13 +100,12 @@ void ExportVTKImplementation::perform(Internal::InfoCommand* icmd) } // vertices - for(unsigned int iVertex=0; iVertexgetVertices()) { - Geom::Vertex* vert_tmp = dynamic_cast (topo_vertices[iVertex]->getGeomAssociation()); + Geom::Vertex* vert_tmp = dynamic_cast (vertex->getGeomAssociation()); CHECK_NULL_PTR_ERROR(vert_tmp); auto cl = mesh.newGroup(vert_tmp->getName()); - gmds::Node elem = mesh.get(topo_vertices[iVertex]->getNode()); - + gmds::Node elem = mesh.get(vertex->getNode()); cl->add(elem); } } diff --git a/src/Core/Internal/EntitiesHelper.cpp b/src/Core/Internal/EntitiesHelper.cpp index e370f53b..b77bd421 100644 --- a/src/Core/Internal/EntitiesHelper.cpp +++ b/src/Core/Internal/EntitiesHelper.cpp @@ -428,9 +428,7 @@ Geom::Surface* EntitiesHelper::getCommonSurface(Topo::CoFace* coface) #endif Geom::Surface* surface = 0; - std::vector coedges; - coface->getCoEdges(coedges, true); - + std::vector coedges = coface->getCoEdges(); if (!coedges.empty()){ // recherche d'une surface commune à tous les groupes de surfaces // associés aux différentes arêtes diff --git a/src/Core/Internal/ServiceGeomToTopo.cpp b/src/Core/Internal/ServiceGeomToTopo.cpp index 1c169ad2..adaac175 100644 --- a/src/Core/Internal/ServiceGeomToTopo.cpp +++ b/src/Core/Internal/ServiceGeomToTopo.cpp @@ -63,8 +63,7 @@ bool ServiceGeomToTopo::convertBlockStructured(const int ni, const int nj, const // cas où le nombre de bras est donné par l'utilisateur if (ni>0 && nj>0 && nk>0){ - std::vector coedges; - bloc->getCoEdges(coedges); + std::vector coedges = bloc->getCoEdges(); if (coedges.size() != 12){ throw TkUtil::Exception(TkUtil::UTF8String ("Erreur interne, on impose une discrétisation à un bloc qui n'a pas que 12 arêtes", TkUtil::Charset::UTF_8)); } @@ -372,14 +371,11 @@ std::vector ServiceGeomToTopo::getEdges(std::vector& // accumulation des coedges pour une edge do { // std::cout<<"vtx_i = "<getName()< coedges_loc; - vtx_i->getCoEdges(coedges_loc); -// std::cout<<"coedges_loc.size() = "<getCoEdges()) + if (filtre_coedges[ce_loc] == 1) + coedge = ce_loc; if (coedge == 0) throw TkUtil::Exception(TkUtil::UTF8String ("Erreur interne, plus d'arête lors du parcours de proche en proche", TkUtil::Charset::UTF_8)); filtre_coedges[coedge] = 2; diff --git a/src/Core/Mesh/CommandCreateMesh.cpp b/src/Core/Mesh/CommandCreateMesh.cpp index 487cf2ce..fabbfd32 100644 --- a/src/Core/Mesh/CommandCreateMesh.cpp +++ b/src/Core/Mesh/CommandCreateMesh.cpp @@ -1064,15 +1064,13 @@ meshAndModify(std::list& list_cofaces) #ifdef _DEBUG2 std::cout<<" on doit mailler "<getName()< vertices; - coface->getVertices(vertices); + const std::vector& vertices = coface->getVertices(); for (uint i=0; iisMeshed()) mesh (vertices[i]); } - std::vector aretes; - coface->getCoEdges(aretes); + std::vector aretes = coface->getCoEdges(); for (uint i=0; iisPreMeshed() && !aretes[i]->isMeshed()) preMesh (aretes[i]); diff --git a/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp b/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp index e8a1f099..b2c9dc42 100644 --- a/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp +++ b/src/Core/Mesh/CommandCreateSubVolumeBetweenSheets.cpp @@ -112,21 +112,12 @@ internalRedo() void CommandCreateSubVolumeBetweenSheets:: selectCoFaces(std::map& filtre_coface) { - for (uint j=0; jisStructured() && blk->isMeshed()){ - - std::vector cofaces; - - blk->getCoFaces(cofaces); - - for (std::vector::iterator iter1 = cofaces.begin(); - iter1 != cofaces.end(); ++iter1){ - filtre_coface[*iter1] = 1; + for (Topo::CoFace* coface : blk->getCoFaces()) { + filtre_coface[coface] = 1; //std::cout<<"filtre_coface à 1 pour "<<(*iter1)->getName()<isStructured() && blk->isMeshed()) else if (!blk->isStructured()){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); @@ -140,7 +131,7 @@ selectCoFaces(std::map& filtre_coface) <<" n'est pas maillé"; throw TkUtil::Exception(message); } - } // end for j + } // end for blk } /*----------------------------------------------------------------------------*/ void CommandCreateSubVolumeBetweenSheets:: @@ -167,8 +158,7 @@ computePosCoEdge(std::map& filtre_coface, #ifdef _DEBUG_SHEETS std::cout<<"### coedge : "<getName()<<", pos1 : "< cofaces; - coedge_dep->getCoFaces(cofaces); + std::vector cofaces = coedge_dep->getCoFaces(); for (std::vector::iterator iter1 = cofaces.begin(); iter1 != cofaces.end(); ++iter1){ @@ -184,19 +174,20 @@ computePosCoEdge(std::map& filtre_coface, // recherche du côté dans lequel est cette arête, et le nombre de bras de maillage jusqu'à la coupe Topo::Edge* edge_dep = coface->getEdgeContaining(coedge_dep); //std::cout<<"edge_dep : "<<*edge_dep; - uint ind_edge_dep = coface->getIndex(edge_dep); + uint ind_edge_dep = Utils::getIndexOf(edge_dep, coface->getEdges()); // direction de la face qui est coupée Topo::CoFace::eDirOnCoFace dirCoFaceSplit = (ind_edge_dep%2?Topo::CoFace::i_dir:Topo::CoFace::j_dir); Topo::Vertex* vertex1; Topo::Vertex* vertex2; + const std::vector& cf_vertices = coface->getVertices(); if (dirCoFaceSplit == Topo::CoFace::i_dir){ - vertex1 = coface->getVertex(1); - vertex2 = coface->getVertex(0); + vertex1 = cf_vertices[1]; + vertex2 = cf_vertices[0]; } else { - vertex1 = coface->getVertex(1); - vertex2 = coface->getVertex(2); + vertex1 = cf_vertices[1]; + vertex2 = cf_vertices[2]; } if (ind_edge_dep>1){ @@ -233,14 +224,15 @@ computePosCoEdge(std::map& filtre_coface, Topo::Edge* edge_ar = 0; // si on est sur le côté face à la dégénérescence, on met à 0 l'arête d'arrivée - if (coface->getNbEdges() == 4){ + const std::vector & cf_edges = coface->getEdges(); + if (cf_edges.size() == 4){ uint ind_edge_ar = (ind_edge_dep+2)%4; - edge_ar = coface->getEdge(ind_edge_ar); + edge_ar = cf_edges[ind_edge_ar]; } else { if (ind_edge_dep == 0) - edge_ar = coface->getEdge(2); + edge_ar = cf_edges[2]; else if (ind_edge_dep == 2) - edge_ar = coface->getEdge(0); + edge_ar = cf_edges[0]; else edge_ar = 0; } @@ -339,9 +331,10 @@ computePosBlock(std::map &filtre1_coedge, std::cout<<"getCoEdgesBetweenVertices entre "<getVertex(0)->getName() <<" et "<getVertex(ind_vtx)->getName()<<" d'indice "<getVertex(0), bloc->getVertex(ind_vtx), iCoedges[i], coedges_between); + std::vector vertices = bloc->getVertices(); + Topo::Vertex* vtx = vertices[0]; + Topo::TopoHelper::getCoEdgesBetweenVertices(vtx, vertices[ind_vtx], iCoedges[i], coedges_between); - Topo::Vertex* vtx = bloc->getVertex(0); for (std::vector::iterator iter3 = coedges_between.begin(); iter3 != coedges_between.end(); ++iter3){ Topo::CoEdge* coedge = *iter3; @@ -353,7 +346,7 @@ computePosBlock(std::map &filtre1_coedge, dir = (Topo::Block::eDirOnBlock)i; uint ratio = ratios[coedge]; uint dec = ratio-1; - if (vtx == coedge->getVertex(0)){ + if (vtx == coedge->getVertices()[0]){ pos1_blk += (filtre1_coedge[coedge]+dec)/ratio; pos2_blk += (filtre2_coedge[coedge]+dec)/ratio; } diff --git a/src/Core/Mesh/CommandMeshExplorer.cpp b/src/Core/Mesh/CommandMeshExplorer.cpp index 144a91bb..957aa065 100644 --- a/src/Core/Mesh/CommandMeshExplorer.cpp +++ b/src/Core/Mesh/CommandMeshExplorer.cpp @@ -164,12 +164,7 @@ selectCoFaceAndBlocks(std::map& filtre_coface, #ifdef _DEBUG_EXPLORER std::cout<<" bloc pris en compte : "<getName()< cofaces; - - blk->getCoFaces(cofaces); - - for (Topo::CoFace* coface : cofaces){ + for (Topo::CoFace* coface : blk->getCoFaces()){ filtre_coface[coface] = 1; //std::cout<<"filtre_coface à 1 pour "<<(coface)->getName()<& filtre_coface, #ifdef _DEBUG_EXPLORER std::cout<<" bloc pris en compte : "<getName()< cofaces; - - blk->getCoFaces(cofaces); - - for (Topo::CoFace* coface : cofaces){ + for (Topo::CoFace* coface : blk->getCoFaces()){ filtre_coface[coface] = 1; //std::cout<<"filtre_coface à 1 pour "<getName()<& filtre_coface, #ifdef _DEBUG_EXPLORER std::cout<<"### coedge : "<getName()<<", pos : "< cofaces; - coedge_dep->getCoFaces(cofaces); + std::vector cofaces = coedge_dep->getCoFaces(); for (std::vector::iterator iter1 = cofaces.begin(); iter1 != cofaces.end(); ++iter1){ @@ -244,7 +233,7 @@ computePosCoEdge(std::map& filtre_coface, // recherche du côté dans lequel est cette arête, et le nombre de bras de maillage jusqu'à la coupe Topo::Edge* edge_dep = coface->getEdgeContaining(coedge_dep); //std::cout<<"edge_dep : "<<*edge_dep; - uint ind_edge_dep = coface->getIndex(edge_dep); + uint ind_edge_dep = Utils::getIndexOf(edge_dep, coface->getEdges()); // direction de la face qui est coupée @@ -252,12 +241,13 @@ computePosCoEdge(std::map& filtre_coface, Topo::Vertex* vertex1; Topo::Vertex* vertex2; + const std::vector& cf_vertices = coface->getVertices(); if (dirCoFaceSplit == Topo::CoFace::i_dir){ - vertex1 = coface->getVertex(1); - vertex2 = coface->getVertex(0); + vertex1 = cf_vertices[1]; + vertex2 = cf_vertices[0]; } else { - vertex1 = coface->getVertex(1); - vertex2 = coface->getVertex(2); + vertex1 = cf_vertices[1]; + vertex2 = cf_vertices[2]; } if (ind_edge_dep>1){ @@ -289,14 +279,15 @@ computePosCoEdge(std::map& filtre_coface, Topo::Edge* edge_ar = 0; // si on est sur le côté face à la dégénérescence, on met à 0 l'arête d'arrivée - if (coface->getNbEdges() == 4){ + const std::vector & cf_edges = coface->getEdges(); + if (cf_edges.size() == 4){ uint ind_edge_ar = (ind_edge_dep+2)%4; - edge_ar = coface->getEdge(ind_edge_ar); + edge_ar = cf_edges[ind_edge_ar]; } else { if (ind_edge_dep == 0) - edge_ar = coface->getEdge(2); + edge_ar = cf_edges[2]; else if (ind_edge_dep == 2) - edge_ar = coface->getEdge(0); + edge_ar = cf_edges[0]; else edge_ar = 0; } @@ -378,9 +369,10 @@ computePosBlock(std::map& filtre_block, std::cout<<"getCoEdgesBetweenVertices entre "<getVertex(0)->getName() <<" et "<getVertex(ind_vtx)->getName()<<" d'indice "<getVertex(0), bloc->getVertex(ind_vtx), iCoedges[i], coedges_between); + std::vector vertices = bloc->getVertices(); + Topo::Vertex* vtx = vertices[0];; + Topo::TopoHelper::getCoEdgesBetweenVertices(vtx, vertices[ind_vtx], iCoedges[i], coedges_between); - Topo::Vertex* vtx = bloc->getVertex(0); for (std::vector::iterator iter3 = coedges_between.begin(); iter3 != coedges_between.end(); ++iter3){ Topo::CoEdge* coedge = *iter3; @@ -391,7 +383,7 @@ computePosBlock(std::map& filtre_block, dir = (Topo::Block::eDirOnBlock)i; uint ratio = ratios[coedge]; uint dec = ratio-1; - if (vtx == coedge->getVertex(0)) + if (vtx == coedge->getVertices()[0]) pos_blk += (filtre_coedge[coedge]+dec)/ratio; else pos_blk += (coedge->getNbMeshingEdges() - filtre_coedge[coedge] + 1 + dec)/ratio; diff --git a/src/Core/Mesh/CommandNewBlocksMesh.cpp b/src/Core/Mesh/CommandNewBlocksMesh.cpp index aa37055f..e8185c8f 100644 --- a/src/Core/Mesh/CommandNewBlocksMesh.cpp +++ b/src/Core/Mesh/CommandNewBlocksMesh.cpp @@ -87,13 +87,10 @@ internalExecute() setStepProgression (1.); setStep (++step, "Recensement des faces", 0.); std::list list_cofaces; - std::vector cofaces; for (uint i=0; igetCoFaces(cofaces); - - for (uint j=0; jisMeshed()) - list_cofaces.push_back(cofaces[j]); + for (Topo::CoFace* coface : m_blocks[i]->getCoFaces()) + if (!coface->isMeshed()) + list_cofaces.push_back(coface); } list_cofaces.sort(Utils::Entity::compareEntity); list_cofaces.unique(); @@ -107,10 +104,7 @@ internalExecute() { std::set set_coedges; for (auto b: m_blocks) { - std::vector coedges; - b->getCoEdges(coedges); - - for (auto ce: coedges) { + for (auto ce: b->getCoEdges()) { set_coedges.insert(ce); } } diff --git a/src/Core/Mesh/CommandNewFacesMesh.cpp b/src/Core/Mesh/CommandNewFacesMesh.cpp index 932a0ac3..8e039bae 100644 --- a/src/Core/Mesh/CommandNewFacesMesh.cpp +++ b/src/Core/Mesh/CommandNewFacesMesh.cpp @@ -95,15 +95,11 @@ internalExecute() // applied to adjacent surfaces { std::set set_coedges; - for (auto cf: list_cofaces) { - std::vector coedges; - cf->getCoEdges(coedges); - - for (auto ce: coedges) { + for (Topo::CoFace* cf : list_cofaces) + for (Topo::CoEdge* ce : cf->getCoEdges()) set_coedges.insert(ce); - } - } - for (auto ce: set_coedges) { + + for (Topo::CoEdge* ce: set_coedges) { ce->clearPoints(); ce->getMeshingData()->setPreMeshed(false); } diff --git a/src/Core/Mesh/MeshImplementation.cpp b/src/Core/Mesh/MeshImplementation.cpp index c5c0cb61..904988ef 100644 --- a/src/Core/Mesh/MeshImplementation.cpp +++ b/src/Core/Mesh/MeshImplementation.cpp @@ -442,7 +442,7 @@ void MeshImplementation::writeCGNS(std::string nom) Topo::Block* bloc = blocks[i]; if (bloc->isMeshed() && bloc->isStructured()){ - if (bloc->getNbVertices() != 8){ + if (bloc->getVertices().size() != 8){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message << "Erreur dans MeshImplementation::writeCGNS, cas dégénéré non implémenté pour " <getName(); @@ -516,12 +516,10 @@ void MeshImplementation::writeCGNS(std::string nom) // les relations avec les autres blocs - std::vector cofaces; - bloc->getCoFaces(cofaces); + std::vector cofaces = bloc->getCoFaces(); for (uint j=0; j coface_blocks; - cofaces[j]->getBlocks(coface_blocks); + std::vector coface_blocks = cofaces[j]->getBlocks(); if (coface_blocks.size() == 2){ Topo::CoFace* coface = cofaces[j]; Topo::Block* bloc_vois = (coface_blocks[0] == bloc?coface_blocks[1]:coface_blocks[0]); @@ -540,8 +538,7 @@ void MeshImplementation::writeCGNS(std::string nom) } // recherche des indices de noeuds dans les blocs pour les extrémités (les sommets) des faces communes - std::vector coface_vertices; - coface->getVertices(coface_vertices); + const std::vector& coface_vertices = coface->getVertices(); // stockage des indices par sommet std::vector > idxIJK_vertices; @@ -1077,8 +1074,7 @@ void MeshImplementation::mesh(Mesh::CommandCreateMesh* command, Topo::Block* bl) if (getContext().getMeshDim() == Internal::Context::MESH2D) throw TkUtil::Exception (TkUtil::UTF8String ("Il n'est pas possible de mailler des blocs alors que le maillage n'est pas 3D en sortie", TkUtil::Charset::UTF_8)); - std::vector faces; - bl->getFaces(faces); + std::vector faces = bl->getFaces(); for (uint i=0; i cofaces; - fa->getCoFaces(cofaces); - for (uint i=0; igetCoFaces()) + mesh(command, coface); } /*----------------------------------------------------------------------------*/ /// Construction des points du maillage d'une face @@ -1157,10 +1150,8 @@ void MeshImplementation::mesh(Mesh::CommandCreateMesh* command, Topo::CoFace* fa /*----------------------------------------------------------------------------*/ void MeshImplementation::mesh(Mesh::CommandCreateMesh* command, Topo::Edge* ed) { - std::vector coedges; - ed->getCoEdges(coedges); - for (uint i=0; igetCoEdges()) + mesh(command, ce); } /*----------------------------------------------------------------------------*/ /// Construction des points du maillage d'une arête @@ -1199,9 +1190,10 @@ void MeshImplementation::mesh(Mesh::CommandCreateMesh* command, Topo::CoEdge* ed ed->saveCoEdgeMeshingData(&command->getInfoCommand()); // on met toujours les noeuds aux extrémités - if (!ed->getVertex(0)->isMeshed()) - mesh(command, ed->getVertex(0)); - ed->nodes().push_back(ed->getVertex(0)->getNode()); + const std::vector& ed_vertices = ed->getVertices(); + if (!ed_vertices[0]->isMeshed()) + mesh(command, ed_vertices[0]); + ed->nodes().push_back(ed_vertices[0]->getNode()); const uint nbBrasI = ed->getNbMeshingEdges(); for (uint i=1; iaddCreatedNode(nd.id()); } - if (!ed->getVertex(1)->isMeshed()) - mesh(command, ed->getVertex(1)); - ed->nodes().push_back(ed->getVertex(1)->getNode()); + if (!ed_vertices[1]->isMeshed()) + mesh(command, ed_vertices[1]); + ed->nodes().push_back(ed_vertices[1]->getNode()); // ajoute les noeuds aux groupes suivant ce qui a été demandé _addNodesInClouds(command, ed); diff --git a/src/Core/Mesh/MeshImplementationGMSH.cpp b/src/Core/Mesh/MeshImplementationGMSH.cpp index fdfc4deb..c863ad88 100644 --- a/src/Core/Mesh/MeshImplementationGMSH.cpp +++ b/src/Core/Mesh/MeshImplementationGMSH.cpp @@ -81,8 +81,7 @@ void MeshImplementation::meshDelaunayGMSH(Mesh::CommandCreateMesh* command, Topo std::cout <<"=== traitement des arêtes de la face "<getName()< edges; - fa->getEdges(edges); + std::vector edges = fa->getEdges(); // Set qui contient tous les noeuds gmds std::set gmds_node_ids; diff --git a/src/Core/Mesh/MeshImplementationStructured.cpp b/src/Core/Mesh/MeshImplementationStructured.cpp index 7514a946..440301c3 100644 --- a/src/Core/Mesh/MeshImplementationStructured.cpp +++ b/src/Core/Mesh/MeshImplementationStructured.cpp @@ -113,6 +113,8 @@ void MeshImplementation::preMeshStructured(Topo::Block* bl) // on va mettre en premier dans le tableau des id, ceux du bord bl->nodes().resize(nbNoeudsI*nbNoeudsJ*nbNoeudsK); + std::vector bl_faces = bl->getFaces(); + std::vector bl_vertices = bl->getVertices(); #ifdef _DEBUG_MESH for (uint i=0; igetNbFaces()){ - Topo::Face* face = bl->getFace(cote); - + if (cotegetNbVertices() == 8){ - Topo::Face::eDirOnFace iDir = face->getDir(bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][1]), - bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][2])); - Topo::Face::eDirOnFace jDir = face->getDir(bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][1]), - bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][0])); + if (bl_vertices.size() == 8){ + Topo::Face::eDirOnFace iDir = face->getDir(bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][1]], + bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][2]]); + Topo::Face::eDirOnFace jDir = face->getDir(bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][1]], + bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][0]]); if (iDir == Topo::Face::j_dir){ // on permute les nombres int tmp = nbPtI; @@ -182,12 +183,12 @@ void MeshImplementation::preMeshStructured(Topo::Block* bl) nbPtJ = tmp; } } - else if (face->getNbVertices() == 4) { + else if (face->getVertices().size() == 4) { assert(cote<5); - Topo::Face::eDirOnFace iDir = face->getDir(bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][1]), - bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][2])); - Topo::Face::eDirOnFace jDir = face->getDir(bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][1]), - bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][0])); + Topo::Face::eDirOnFace iDir = face->getDir(bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][1]], + bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][2]]); + Topo::Face::eDirOnFace jDir = face->getDir(bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][1]], + bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][0]]); if (iDir == Topo::Face::j_dir){ // on permute les nombres int tmp = nbPtI; @@ -195,7 +196,7 @@ void MeshImplementation::preMeshStructured(Topo::Block* bl) nbPtJ = tmp; } } - else if (face->getNbVertices() == 3) { + else if (face->getVertices().size() == 3) { // l'ordre est bon ... } else @@ -206,21 +207,21 @@ void MeshImplementation::preMeshStructured(Topo::Block* bl) // cas sans/avec dégénéréscence, on tient compte du fait que la face si elle est dégénérée // elle l'est sur sa dernière arête - if (face->getNbVertices() == 4) + if (face->getVertices().size() == 4) // demander les points de la face avec respect de l'ordre des sommets internes du bloc - if (bl->getNbVertices() == 8) - face->getNodes(bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][0]), - bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][1]), - bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][2]), - bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][3]), + if (bl_vertices.size() == 8) + face->getNodes(bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][0]], + bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][1]], + bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][2]], + bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnBlock[cote][3]], nodes); else { if (cote >= 5) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, MeshImplementation::meshStructured, cote trop grand", TkUtil::Charset::UTF_8)); - face->getNodes(bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][0]), - bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][1]), - bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][2]), - bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][3]), + face->getNodes(bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][0]], + bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][1]], + bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][2]], + bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][3]], nodes); } else { @@ -228,11 +229,11 @@ void MeshImplementation::preMeshStructured(Topo::Block* bl) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne avec cote == 5 alors qu'il y a une face dégénérée", TkUtil::Charset::UTF_8)); // recherche du sens - if (bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][1]) == face->getVertex(1) - && bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][2]) == face->getVertex(2)) + if (bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][1]] == face->getVertices()[1] + && bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][2]] == face->getVertices()[2]) face->getNodes(0, true, nodes); - else if (bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][1]) == face->getVertex(2) - && bl->getVertex(Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][2]) == face->getVertex(1)) + else if (bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][1]] == face->getVertices()[2] + && bl_vertices[Topo::TopoHelper::tabIndVtxByFaceOnDegBlock[cote][2]] == face->getVertices()[1]) face->getNodes(3, false, nodes); else { TkUtil::UTF8String message (TkUtil::Charset::UTF_8); @@ -270,10 +271,10 @@ void MeshImplementation::preMeshStructured(Topo::Block* bl) else { // cas de la dernière face dégénérées // 3 cas possibles: en un point ou suivant l'un des 2 côtés - - if (bl->getNbVertices() == 5){ + std::vector bl_faces = bl->getFaces(); + if (bl_vertices.size() == 5){ // copie le noeud au sommet - gmds::Node node = getGMDSMesh().get(bl->getVertex(4)->getNode()); + gmds::Node node = getGMDSMesh().get(bl_vertices[4]->getNode()); Utils::Math::Point pt = getCoordNode(node); for(uint jface=0, jbloc=jblocdep; jfacegetFace(0)->getNbVertices() == 3 - && bl->getFace(1)->getNbVertices() == 3 - && bl->getFace(2)->getNbVertices() == 4 - && bl->getFace(3)->getNbVertices() == 4) { + else if (bl_faces[0]->getVertices().size() == 3 + && bl_faces[1]->getVertices().size() == 3 + && bl_faces[2]->getVertices().size() == 4 + && bl_faces[3]->getVertices().size() == 4) { // La face dégénérée étant la dernière, on utilise ce qui a été // remplit par les autres faces (les arêtes de cette face) pour remplir l'intérieur @@ -296,10 +297,10 @@ void MeshImplementation::preMeshStructured(Topo::Block* bl) } } - else if (bl->getFace(0)->getNbVertices() == 4 - && bl->getFace(1)->getNbVertices() == 4 - && bl->getFace(2)->getNbVertices() == 3 - && bl->getFace(3)->getNbVertices() == 3) { + else if (bl_faces[0]->getVertices().size() == 4 + && bl_faces[1]->getVertices().size() == 4 + && bl_faces[2]->getVertices().size() == 3 + && bl_faces[3]->getVertices().size() == 3) { for(uint jface=0, jbloc=jblocdep; jfacegetName() << ", les faces dégénérées ne rentre pas dans l'une des 3 possibilitées"; throw TkUtil::Exception (message); - } // else ... (bl->getNbVertices() == 5) + } // else ... (bl->getVertices().size() == 5) } // end else (cotegetNbFaces()) } // end for cote<6 @@ -462,19 +463,21 @@ void MeshImplementation::preMeshStructured(Topo::CoFace* coface) } // cas pour les arêtes non dégénérées - if (cotegetNbEdges()){ - Topo::Edge* arete = coface->getEdge(cote); + const std::vector& cf_edges = coface->getEdges(); + const std::vector& cf_vertices = coface->getVertices(); + if (cote nodes; - if (coface->getNbVertices() == 4) - arete->getNodes(coface->getVertex(Topo::TopoHelper::tabIndVtxByEdgeOnFace[cote][0]), - coface->getVertex(Topo::TopoHelper::tabIndVtxByEdgeOnFace[cote][1]), + if (cf_vertices.size() == 4) + arete->getNodes(cf_vertices[Topo::TopoHelper::tabIndVtxByEdgeOnFace[cote][0]], + cf_vertices[Topo::TopoHelper::tabIndVtxByEdgeOnFace[cote][1]], nodes); else { assert(cote<5); - arete->getNodes(coface->getVertex(Topo::TopoHelper::tabIndVtxByEdgeOnDegFace[cote][0]), - coface->getVertex(Topo::TopoHelper::tabIndVtxByEdgeOnDegFace[cote][1]), + arete->getNodes(cf_vertices[Topo::TopoHelper::tabIndVtxByEdgeOnDegFace[cote][0]], + cf_vertices[Topo::TopoHelper::tabIndVtxByEdgeOnDegFace[cote][1]], nodes); } @@ -489,8 +492,8 @@ void MeshImplementation::preMeshStructured(Topo::CoFace* coface) else { // cas d'une arête dégénérées (la dernière) uint jface = 0; - uint nbPtI = coface->getEdge(cote-2)->getNbNodes(); - gmds::Node node = getGMDSMesh().get(coface->getVertex(0)->getNode()); + uint nbPtI = cf_edges[cote-2]->getNbNodes(); + gmds::Node node = getGMDSMesh().get(cf_vertices[0]->getNode()); for(uint iarete=0, jface=idep[cote]; iaretenodes()[jface] = node.id(); l_points[jface] = getCoordNode(node); @@ -1007,7 +1010,9 @@ void MeshImplementation::_addRegionsInVolumes(Mesh::CommandCreateMesh* command, uint jBegin = 0, jEnd = nbBrasJ; uint kBegin = 0, kEnd = nbBrasK; - if (bl->getNbVertices() != 8) // K MAX + std::vector bl_faces = bl->getFaces(); + std::vector bl_vertices = bl->getVertices(); + if (bl_vertices.size() != 8) // K MAX kEnd-=1; gmds::Mesh& gmds_mesh = getGMDSMesh(); @@ -1149,9 +1154,9 @@ void MeshImplementation::_addRegionsInVolumes(Mesh::CommandCreateMesh* command, } // for (uint k=kBegin; kgetNbVertices() != 8){ // K MAX - bool degI = (bl->getFace(2)->getNbVertices() == 3); - bool degJ = (bl->getFace(0)->getNbVertices() == 3); + if (bl_vertices.size() != 8){ // K MAX + bool degI = (bl_faces[2]->getVertices().size() == 3); + bool degJ = (bl_faces[0]->getVertices().size() == 3); if(!areRegionsTested) { for (uint k=kEnd; kgetNbVertices() != 8){ // K MAX + } // if (bl->getVertices().size() != 8){ // K MAX #undef nodeIJ @@ -1421,7 +1426,7 @@ void MeshImplementation::_addFacesInSurfaces(Mesh::CommandCreateMesh* command, T uint jBegin = 0, jEnd = nbBrasJ; // les triangles (juste à une extrémité: j_max) - if (fa->getNbVertices() == 3){ + if (fa->getVertices().size() == 3){ jEnd-=1; for (uint i=iBegin; i topo_vertices; - bl->getVertices(topo_vertices); + std::vector topo_vertices = bl->getVertices(); double x=0, y=0, z=0; for(unsigned int i=0;ifaces; - bl->getFaces(faces); + std::vector faces = bl->getFaces(); std::vector > mesh_faces; std::vector mesh_faces_in1Surf; std::vector mesh_nodes; @@ -56,8 +54,7 @@ meshDelaunayTetgen(Mesh::CommandCreateMesh* command, Topo::Block* bl) double ratio_hauteur_pyramides = meshingProp->getRatioPyramidSize(); for(unsigned int i=0;i cofaces; - faces[i]->getCoFaces(cofaces); + std::vector cofaces = faces[i]->getCoFaces(); for(unsigned int k=0;k local_mesh_faces; diff --git a/src/Core/Mesh/Volume.cpp b/src/Core/Mesh/Volume.cpp index 851e6b1b..ed046c97 100644 --- a/src/Core/Mesh/Volume.cpp +++ b/src/Core/Mesh/Volume.cpp @@ -240,25 +240,11 @@ void Volume::getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestr // la liste des faces externes au groupe de blocs // on utilise une map et on marque les faces à chaque fois // qu'elles sont vus - std::map marque_faces; - std::vector faces; - for (std::vector::iterator - iter1 = blocs.begin(); iter1 != blocs.end(); ++iter1) - { - (*iter1)->getFaces(faces); - std::vector cofaces; - for (std::vector::iterator - iter2 = faces.begin(); iter2 != faces.end();++iter2) - { - (*iter2)->getCoFaces(cofaces); - for (std::vector::iterator - iter3 = cofaces.begin(); iter3 != cofaces.end(); - ++iter3) - { - marque_faces[*iter3] += 1; - } // for (std::vector ... - } // for (std::vector ... - } // for (std::vector ... + std::map marque_faces; + for (Topo::Block* bloc : blocs) + for (Topo::Face* face : bloc->getFaces()) + for (Topo::CoFace* coface : face->getCoFaces()) + marque_faces[coface] += 1; // on cumule les noeuds, en évitant les doublons std::vector nodes; diff --git a/src/Core/Topo/Block.cpp b/src/Core/Topo/Block.cpp index 905e7810..2ff43859 100644 --- a/src/Core/Topo/Block.cpp +++ b/src/Core/Topo/Block.cpp @@ -129,8 +129,8 @@ Block(Internal::Context& ctx, throw TkUtil::Exception(messErr); } - m_topo_property->getFaceContainer().add(faces); - m_topo_property->getVertexContainer().add(vertices); + Utils::append(m_topo_property->getFaceContainer(), faces); + Utils::append(m_topo_property->getVertexContainer(), vertices); _init(); } @@ -154,15 +154,23 @@ Block(Internal::Context& ctx, int ni, int nj, int nk) m_mesh_property = new BlockMeshingPropertyTransfinite(); // bloc avec les sommets équivalents à ceux d'une boite de taille 1 - - m_topo_property->getVertexContainer().add(new Topo::Vertex(ctx, Utils::Math::Point(0,0,0))); - m_topo_property->getVertexContainer().add(new Topo::Vertex(ctx, Utils::Math::Point(1,0,0))); - m_topo_property->getVertexContainer().add(new Topo::Vertex(ctx, Utils::Math::Point(0,1,0))); - m_topo_property->getVertexContainer().add(new Topo::Vertex(ctx, Utils::Math::Point(1,1,0))); - m_topo_property->getVertexContainer().add(new Topo::Vertex(ctx, Utils::Math::Point(0,0,1))); - m_topo_property->getVertexContainer().add(new Topo::Vertex(ctx, Utils::Math::Point(1,0,1))); - m_topo_property->getVertexContainer().add(new Topo::Vertex(ctx, Utils::Math::Point(0,1,1))); - m_topo_property->getVertexContainer().add(new Topo::Vertex(ctx, Utils::Math::Point(1,1,1))); + Vertex* v0 = new Topo::Vertex(ctx, Utils::Math::Point(0,0,0)); + Vertex* v1 = new Topo::Vertex(ctx, Utils::Math::Point(1,0,0)); + Vertex* v2 = new Topo::Vertex(ctx, Utils::Math::Point(0,1,0)); + Vertex* v3 = new Topo::Vertex(ctx, Utils::Math::Point(1,1,0)); + Vertex* v4 = new Topo::Vertex(ctx, Utils::Math::Point(0,0,1)); + Vertex* v5 = new Topo::Vertex(ctx, Utils::Math::Point(1,0,1)); + Vertex* v6 = new Topo::Vertex(ctx, Utils::Math::Point(0,1,1)); + Vertex* v7 = new Topo::Vertex(ctx, Utils::Math::Point(1,1,1)); + + m_topo_property->getVertexContainer().push_back(v0); + m_topo_property->getVertexContainer().push_back(v1); + m_topo_property->getVertexContainer().push_back(v2); + m_topo_property->getVertexContainer().push_back(v3); + m_topo_property->getVertexContainer().push_back(v4); + m_topo_property->getVertexContainer().push_back(v5); + m_topo_property->getVertexContainer().push_back(v6); + m_topo_property->getVertexContainer().push_back(v7); // les arêtes (communes) dont on ne conserve pas de lien dans le bloc std::vector coedges; @@ -173,18 +181,18 @@ Block(Internal::Context& ctx, int ni, int nj, int nk) EdgeMeshingPropertyUniform empJ(nj?nj:ctx.getTopoManager().getDefaultNbMeshingEdges()); EdgeMeshingPropertyUniform empK(nk?nk:ctx.getTopoManager().getDefaultNbMeshingEdges()); - coedges.push_back(new Topo::CoEdge(ctx, &empI, getVertex(0), getVertex(1))); - coedges.push_back(new Topo::CoEdge(ctx, &empI, getVertex(2), getVertex(3))); - coedges.push_back(new Topo::CoEdge(ctx, &empI, getVertex(4), getVertex(5))); - coedges.push_back(new Topo::CoEdge(ctx, &empI, getVertex(6), getVertex(7))); - coedges.push_back(new Topo::CoEdge(ctx, &empJ, getVertex(0), getVertex(2))); - coedges.push_back(new Topo::CoEdge(ctx, &empJ, getVertex(1), getVertex(3))); - coedges.push_back(new Topo::CoEdge(ctx, &empJ, getVertex(4), getVertex(6))); - coedges.push_back(new Topo::CoEdge(ctx, &empJ, getVertex(5), getVertex(7))); - coedges.push_back(new Topo::CoEdge(ctx, &empK, getVertex(0), getVertex(4))); - coedges.push_back(new Topo::CoEdge(ctx, &empK, getVertex(1), getVertex(5))); - coedges.push_back(new Topo::CoEdge(ctx, &empK, getVertex(2), getVertex(6))); - coedges.push_back(new Topo::CoEdge(ctx, &empK, getVertex(3), getVertex(7))); + coedges.push_back(new Topo::CoEdge(ctx, &empI, v0, v1)); + coedges.push_back(new Topo::CoEdge(ctx, &empI, v2, v3)); + coedges.push_back(new Topo::CoEdge(ctx, &empI, v4, v5)); + coedges.push_back(new Topo::CoEdge(ctx, &empI, v6, v7)); + coedges.push_back(new Topo::CoEdge(ctx, &empJ, v0, v2)); + coedges.push_back(new Topo::CoEdge(ctx, &empJ, v1, v3)); + coedges.push_back(new Topo::CoEdge(ctx, &empJ, v4, v6)); + coedges.push_back(new Topo::CoEdge(ctx, &empJ, v5, v7)); + coedges.push_back(new Topo::CoEdge(ctx, &empK, v0, v4)); + coedges.push_back(new Topo::CoEdge(ctx, &empK, v1, v5)); + coedges.push_back(new Topo::CoEdge(ctx, &empK, v2, v6)); + coedges.push_back(new Topo::CoEdge(ctx, &empK, v3, v7)); // création des Edges qui utilisent les CoEdges std::vector edges; @@ -197,17 +205,17 @@ Block(Internal::Context& ctx, int ni, int nj, int nk) CoFace* coface; coface = new Topo::CoFace(ctx, edges[4], edges[8], edges[6], edges[10]); - m_topo_property->getFaceContainer().add(new Topo::Face(ctx, coface)); + m_topo_property->getFaceContainer().push_back(new Topo::Face(ctx, coface)); coface = new Topo::CoFace(ctx, edges[5], edges[9], edges[7], edges[11]); - m_topo_property->getFaceContainer().add(new Topo::Face(ctx, coface)); + m_topo_property->getFaceContainer().push_back(new Topo::Face(ctx, coface)); coface = new Topo::CoFace(ctx, edges[0], edges[8], edges[2], edges[9]); - m_topo_property->getFaceContainer().add(new Topo::Face(ctx, coface)); + m_topo_property->getFaceContainer().push_back(new Topo::Face(ctx, coface)); coface = new Topo::CoFace(ctx, edges[1], edges[10], edges[3], edges[11]); - m_topo_property->getFaceContainer().add(new Topo::Face(ctx, coface)); + m_topo_property->getFaceContainer().push_back(new Topo::Face(ctx, coface)); coface = new Topo::CoFace(ctx, edges[0], edges[4], edges[1], edges[5]); - m_topo_property->getFaceContainer().add(new Topo::Face(ctx, coface)); + m_topo_property->getFaceContainer().push_back(new Topo::Face(ctx, coface)); coface = new Topo::CoFace(ctx, edges[2], edges[6], edges[3], edges[7]); - m_topo_property->getFaceContainer().add(new Topo::Face(ctx, coface)); + m_topo_property->getFaceContainer().push_back(new Topo::Face(ctx, coface)); _init(); @@ -225,8 +233,9 @@ _init() #endif // association remontante - for (uint i=0; iaddBlock(this); + std::vector faces = getFaces(); + for (uint i=0; iaddBlock(this); getContext ( ).newGraphicalRepresentation (*this); } /*----------------------------------------------------------------------------*/ @@ -283,7 +292,7 @@ getVertex(bool cote_i, bool cote_j, bool cote_k) throw TkUtil::Exception (TkUtil::UTF8String ("Block::getVertex(bool,bool,bool) n'est pas possible avec un bloc non structuré", TkUtil::Charset::UTF_8)); uint indice = (cote_i?1:0) + (cote_j?2:0) + (cote_k?4:0); - Topo::Vertex* vtx = getVertex(indice); + Topo::Vertex* vtx = getVertices()[indice]; #ifdef _DEBUG2 std::cout<<"Block::getVertex("<<(cote_i?"true":"false")<<", "<<(cote_j?"true":"false")<<", "<<(cote_k?"true":"false")<<") => "<getName()<& cofaces) const +std::vector Block:: +getCoFaces() const { - cofaces.clear(); - std::list l_cf; - for(uint i=0; i & local_cofaces = - face->getCoFaces(); - l_cf.insert(l_cf.end(), local_cofaces.begin(), local_cofaces.end()); + Utils::EntitySet cofaces(Utils::Entity::compareEntity); + for(Face* face : getFaces()) { + const std::vector& local_cofaces = face->getCoFaces(); + cofaces.insert(local_cofaces.begin(), local_cofaces.end()); } - l_cf.sort(Utils::Entity::compareEntity); - l_cf.unique(); - - cofaces.insert(cofaces.end(),l_cf.begin(),l_cf.end()); -} -/*----------------------------------------------------------------------------*/ -uint Block:: -getNbCoFaces() const -{ - std::vector cofaces; - getCoFaces(cofaces); - return cofaces.size(); + return Utils::toVect(cofaces); } /*----------------------------------------------------------------------------*/ -void Block:: -getEdges(std::vector& edges) const +std::vector Block:: +getEdges() const { - edges.clear(); - std::list l_e; - for(uint i=0; i getNbCoFaces();j++) { - const std::vector & local_edges = - face->getCoFace(j)->getEdges(); - l_e.insert(l_e.end(), local_edges.begin(), local_edges.end()); + Utils::EntitySet edges(Utils::Entity::compareEntity); + for(Face* face : getFaces()) { + for(CoFace* coface : face->getCoFaces()) { + const std::vector& local_edges = coface->getEdges(); + edges.insert(local_edges.begin(), local_edges.end()); } } - l_e.sort(Utils::Entity::compareEntity); - l_e.unique(); - - edges.insert(edges.end(),l_e.begin(),l_e.end()); + return Utils::toVect(edges); } /*----------------------------------------------------------------------------*/ -uint Block:: -getNbEdges() const +std::vector Block:: +getAllVertices() const { - std::vector edges; - getEdges(edges); - return edges.size(); -} -/*----------------------------------------------------------------------------*/ -void Block::getAllVertices(std::vector& vertices, bool unique) const -{ - vertices.clear(); - if (unique){ - std::list l_v; - for(uint i=0; i getNbCoFaces();j++) { - CoFace* coface = face->getCoFace(j); - for(uint k=0; k < coface->getNbEdges();k++) { - Edge* edge = coface->getEdge(k); - for(uint l=0; l < edge->getNbCoEdges(); l++){ - CoEdge* coedge = edge->getCoEdge(l); - - const std::vector & local_vertices = coedge->getVertices(); - - l_v.insert(l_v.end(), local_vertices.begin(), local_vertices.end()); - } - } - } - } - - l_v.sort(Utils::Entity::compareEntity); - l_v.unique(); - - vertices.insert(vertices.end(),l_v.begin(),l_v.end()); - } - else { - for(uint i=0; i getNbCoFaces();j++) { - CoFace* coface = face->getCoFace(j); - for(uint k=0; k < coface->getNbEdges();k++) { - Edge* edge = coface->getEdge(k); - for(uint l=0; l < edge->getNbCoEdges(); l++){ - CoEdge* coedge = edge->getCoEdge(l); - - const std::vector & local_vertices = coedge->getVertices(); - - vertices.insert(vertices.end(), local_vertices.begin(), local_vertices.end()); - } - } - } - } + Utils::EntitySet vertices(Utils::Entity::compareEntity); + for(Face* face : getFaces()) { + for(CoFace* coface : face->getCoFaces()) { + for(Edge* edge : coface->getEdges()) { + for(CoEdge* coedge : edge->getCoEdges()){ + const std::vector& local_vertices = coedge->getVertices(); + vertices.insert(local_vertices.begin(), local_vertices.end()); + } + } + } } + return Utils::toVect(vertices); } /*----------------------------------------------------------------------------*/ -void Block::getCoEdges(std::vector& coedges, bool unique) const +std::vector Block:: +getCoEdges() const { - if (unique){ - coedges.clear(); - std::list l_e; - for(uint i=0; i getNbCoFaces();j++) { - CoFace* coface = face->getCoFace(j); - for(uint k=0; k < coface->getNbEdges();k++) { - const std::vector & local_coedges = - coface->getEdge(k)->getCoEdges(); - l_e.insert(l_e.end(), local_coedges.begin(), local_coedges.end()); - } - } - } - l_e.sort(Utils::Entity::compareEntity); - l_e.unique(); - - coedges.insert(coedges.end(),l_e.begin(),l_e.end()); - } - else { - coedges.clear(); - for(uint i=0; i getNbCoFaces();j++) { - CoFace* coface = face->getCoFace(j); - for(uint k=0; k < coface->getNbEdges();k++) { - const std::vector & local_coedges = - coface->getEdge(k)->getCoEdges(); - coedges.insert(coedges.end(), local_coedges.begin(), local_coedges.end()); - } - } - } - } - -} -/*----------------------------------------------------------------------------*/ -uint Block:: -getNbCoEdges() const -{ - std::vector coedges; - getCoEdges(coedges); - return coedges.size(); + Utils::EntitySet coedges(Utils::Entity::compareEntity); + for(Face* face : getFaces()) { + for(CoFace* coface : face->getCoFaces()) { + for(Edge* edge : coface->getEdges()) { + const std::vector& local_coedges = edge->getCoEdges(); + coedges.insert(local_coedges.begin(), local_coedges.end()); + } + } + } + return Utils::toVect(coedges); } /*----------------------------------------------------------------------------*/ void Block:: replace(Topo::Vertex* v1, Topo::Vertex* v2, bool propagate_up, bool propagate_down, Internal::InfoCommand* icmd) { - Topo::Vertex* v_tmp; - - for (uint i=0; i vertices = getVertices(); + for (uint i=0; igetVertexContainer().set(i, v2); + m_topo_property->getVertexContainer()[i] = v2; } - if (propagate_down) - for (uint j=0; jreplace(v1, v2, propagate_up, propagate_down, icmd); - + if (propagate_down) { + std::vector faces = getFaces(); + for (uint j=0; jreplace(v1, v2, propagate_up, propagate_down, icmd); + } } /*----------------------------------------------------------------------------*/ void Block:: replace(Face* f1, Face* f2, Internal::InfoCommand* icmd) { - for (uint i=0; i faces = getFaces(); + for (uint i=0; igetFaceContainer().set(i, f2); + m_topo_property->getFaceContainer()[i] = f2; f1->saveFaceTopoProperty(icmd); f2->saveFaceTopoProperty(icmd); @@ -471,8 +391,9 @@ replace(Face* f1, Face* f2, Internal::InfoCommand* icmd) void Block:: replace(CoEdge* e1, CoEdge* e2, Internal::InfoCommand* icmd) { - for (uint i=0; ireplace(e1, e2, icmd); + std::vector faces = getFaces(); + for (uint i=0; ireplace(e1, e2, icmd); } /*----------------------------------------------------------------------------*/ //#define _DEBUG_REPRESENTATION @@ -500,6 +421,8 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const std::vector& points = tdr->getPoints(); std::vector& indicesFilaire = tdr->getCurveDiscretization(); std::vector& indicesSurf = tdr->getSurfaceDiscretization(); + std::vector vertices = getVertices(); + std::vector faces = getFaces(); // recherche du barycentre Utils::Math::Point barycentre = getBarycentre(); @@ -509,10 +432,10 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const if (tdr->hasRepresentation(Utils::DisplayRepresentation::WIRE)){ indicesFilaire.clear(); - if (getNbVertices() == 8 && isStructured()){ + if (vertices.size() == 8 && isStructured()){ - for (uint i=0; igetCoord() - barycentre) * shrink); + for (uint i=0; igetCoord() - barycentre) * shrink); // construction des 12 arêtes en se servant du modèle de construction du bloc indicesFilaire.push_back(0); @@ -553,16 +476,15 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const } else { // utilisation de toutes les arêtes et construction de la représentation filaire - std::vector edges; - getEdges(edges); + std::vector edges = getEdges(); for (std::vector::iterator iter = edges.begin(); iter != edges.end(); ++iter) { - Topo::Edge* edge = *iter; - if (edge->getNbVertices() == 2){ + const std::vector& edge_vertices = (*iter)->getVertices(); + if (edge_vertices.size() == 2){ for (uint i=0; i<2; i++){ indicesFilaire.push_back(points.size()); - points.push_back(barycentre + (edge->getVertex(i)->getCoord() - barycentre) * shrink); + points.push_back(barycentre + (edge_vertices[i]->getCoord() - barycentre) * shrink); } } } // end for iter = edges.begin() @@ -571,9 +493,9 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const else if (tdr->hasRepresentation(Utils::DisplayRepresentation::SOLID)) { // représentation à l'aide de 2 triangles par côté - if (getNbVertices() == 8 && isStructured()){ - for (uint i=0; igetCoord() - barycentre) * shrink); + if (vertices.size() == 8 && isStructured()){ + for (uint i=0; igetCoord() - barycentre) * shrink); indicesSurf.push_back(0); indicesSurf.push_back(1); @@ -626,11 +548,11 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const else { // utilisation d'une représentation de chacune des faces (sans shrink) // que l'on reporte dans celle du block. - for (uint i=0; igetRepresentation (tr, checkDestroyed); + faces[i]->getRepresentation (tr, checkDestroyed); std::vector& face_points = tr.getPoints(); std::vector& face_indicesSurf = tr.getSurfaceDiscretization(); @@ -654,7 +576,7 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const std::vector& indices = tdr->getCurveDiscretization(); // un point de départ pour la représentation - Utils::Math::Point orig = (barycentre + (getVertex(0)->getCoord() - barycentre) * shrink); + Utils::Math::Point orig = (barycentre + (vertices[0]->getCoord() - barycentre) * shrink); // trois vecteurs pour orienter et placer dans l'espace la représentation Utils::Math::Vector vect1; @@ -673,9 +595,9 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const std::vector coedges_dirI; std::vector coedges_dirJ; std::vector coedges_dirK; - TopoHelper::getCoEdgesBetweenVertices(getVertex(0), getVertex(1), iCoedges, coedges_dirI); - TopoHelper::getCoEdgesBetweenVertices(getVertex(0), getVertex(2), jCoedges, coedges_dirJ); - TopoHelper::getCoEdgesBetweenVertices(getVertex(0), getVertex(4), kCoedges, coedges_dirK); + TopoHelper::getCoEdgesBetweenVertices(vertices[0], vertices[1], iCoedges, coedges_dirI); + TopoHelper::getCoEdgesBetweenVertices(vertices[0], vertices[2], jCoedges, coedges_dirJ); + TopoHelper::getCoEdgesBetweenVertices(vertices[0], vertices[4], kCoedges, coedges_dirK); // on va prendre la coedge1 et vect1 qui suivent le sens de la discrétisation (s'il y en a un) CoEdge* coedge1 = coedges_dirI[0]; @@ -706,9 +628,10 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const <getVertex(0) == getVertex(0)) + const std::vector& coedge1_vertices = coedge1->getVertices(); + if (coedge1_vertices[0] == vertices[0]) vect1 = Utils::Math::Vector(points_coedge1[0], points_coedge1[1]); - else if (coedge1->getVertex(1) == getVertex(0)) + else if (coedge1_vertices[1] == vertices[0]) vect1 = Utils::Math::Vector(points_coedge1[points_coedge1.size()-1], points_coedge1[points_coedge1.size()-2]); else { @@ -718,9 +641,10 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const throw TkUtil::Exception(messErr); } - if (coedge2->getVertex(0) == getVertex(0)) + const std::vector& coedge2_vertices = coedge2->getVertices(); + if (coedge2_vertices[0] == vertices[0]) vect2 = Utils::Math::Vector(points_coedge2[0], points_coedge2[1]); - else if (coedge2->getVertex(1) == getVertex(0)) + else if (coedge2_vertices[1] == vertices[0]) vect2 = Utils::Math::Vector(points_coedge2[points_coedge2.size()-1], points_coedge2[points_coedge2.size()-2]); else { @@ -730,9 +654,10 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const throw TkUtil::Exception(messErr); } - if (coedge3->getVertex(0) == getVertex(0)) + const std::vector& coedge3_vertices = coedge3->getVertices(); + if (coedge3_vertices[0] == vertices[0]) vect3 = Utils::Math::Vector(points_coedge3[0], points_coedge3[1]); - else if (coedge3->getVertex(1) == getVertex(0)) + else if (coedge3_vertices[1] == vertices[0]) vect3 = Utils::Math::Vector(points_coedge3[points_coedge3.size()-1], points_coedge3[points_coedge3.size()-2]); else { @@ -873,12 +798,11 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const else { // recherche de 3 vecteurs - std::vector coedges; - getCoEdges(coedges); + std::vector coedges = getCoEdges(); // on cherche les coedges reliées au sommet 0 du bloc std::vector coedges_som0; for (uint i=0; ifind(getVertex(0))) + if (Utils::contains(vertices[0], coedges[i]->getVertices())) coedges_som0.push_back(coedges[i]); if (coedges_som0.size() == 1){ @@ -902,9 +826,11 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const std::vector points_coedge2; coedge1->getPoints(coedge1->getMeshingProperty(), points_coedge1, true); coedge2->getPoints(coedge2->getMeshingProperty(), points_coedge2, true); - if (coedge1->getVertex(0) == getVertex(0)) + + const std::vector& coedge1_vertices = coedge1->getVertices(); + if (coedge1_vertices[0] == vertices[0]) vect1 = Utils::Math::Vector(points_coedge1[0], points_coedge1[1]); - else if (coedge1->getVertex(1) == getVertex(0)) + else if (coedge1_vertices[1] == vertices[0]) vect1 = Utils::Math::Vector(points_coedge1[points_coedge1.size()-1], points_coedge1[points_coedge1.size()-2]); else { @@ -914,9 +840,10 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const throw TkUtil::Exception(messErr); } - if (coedge2->getVertex(0) == getVertex(0)) + const std::vector& coedge2_vertices = coedge2->getVertices(); + if (coedge2_vertices[0] == vertices[0]) vect2 = Utils::Math::Vector(points_coedge2[0], points_coedge2[1]); - else if (coedge2->getVertex(1) == getVertex(0)) + else if (coedge2_vertices[1] == vertices[0]) vect2 = Utils::Math::Vector(points_coedge2[points_coedge2.size()-1], points_coedge2[points_coedge2.size()-2]); else { @@ -927,10 +854,10 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const } // cas cycliques - if (coedge1->getVertex(0) == coedge1->getVertex(1)){ + if (coedge1_vertices[0] == coedge1_vertices[1]){ vect3 = Utils::Math::Vector(points_coedge1[points_coedge1.size()-1], points_coedge1[points_coedge1.size()-2]); - } else if (coedge1->getVertex(0) == coedge1->getVertex(1)){ + } else if (coedge1_vertices[0] == coedge1_vertices[1]){ vect3 = Utils::Math::Vector(points_coedge2[points_coedge2.size()-1], points_coedge2[points_coedge2.size()-2]); } else @@ -959,9 +886,11 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const coedge1->getPoints(coedge1->getMeshingProperty(), points_coedge1, true); coedge2->getPoints(coedge2->getMeshingProperty(), points_coedge2, true); coedge3->getPoints(coedge3->getMeshingProperty(), points_coedge3, true); - if (coedge1->getVertex(0) == getVertex(0)) + + const std::vector& coedge1_vertices = coedge1->getVertices(); + if (coedge1_vertices[0] == vertices[0]) vect1 = Utils::Math::Vector(points_coedge1[0], points_coedge1[1]); - else if (coedge1->getVertex(1) == getVertex(0)) + else if (coedge1_vertices[1] == vertices[0]) vect1 = Utils::Math::Vector(points_coedge1[points_coedge1.size()-1], points_coedge1[points_coedge1.size()-2]); else { @@ -971,9 +900,10 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const throw TkUtil::Exception(messErr); } - if (coedge2->getVertex(0) == getVertex(0)) + const std::vector& coedge2_vertices = coedge2->getVertices(); + if (coedge2_vertices[0] == vertices[0]) vect2 = Utils::Math::Vector(points_coedge2[0], points_coedge2[1]); - else if (coedge2->getVertex(1) == getVertex(0)) + else if (coedge2_vertices[1] == vertices[0]) vect2 = Utils::Math::Vector(points_coedge2[points_coedge2.size()-1], points_coedge2[points_coedge2.size()-2]); else { @@ -983,9 +913,10 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const throw TkUtil::Exception(messErr); } - if (coedge3->getVertex(0) == getVertex(0)) + const std::vector& coedge3_vertices = coedge3->getVertices(); + if (coedge3_vertices[0] == vertices[0]) vect3 = Utils::Math::Vector(points_coedge3[0], points_coedge3[1]); - else if (coedge3->getVertex(1) == getVertex(0)) + else if (coedge3_vertices[1] == vertices[0]) vect3 = Utils::Math::Vector(points_coedge3[points_coedge3.size()-1], points_coedge3[points_coedge3.size()-2]); else { @@ -1120,8 +1051,7 @@ getDescription (bool alsoComputed) const Utils::SerializedRepresentation topoRelation ("Relations topologiques", ""); - std::vector vtx; - getVertices(vtx); + std::vector vtx = getVertices(); Utils::SerializedRepresentation vertices ("Sommets topologiques", TkUtil::NumericConversions::toStr(vtx.size())); @@ -1133,8 +1063,7 @@ getDescription (bool alsoComputed) const if (Internal::InternalPreferences::instance ( )._displayFace.getValue ( )){ - std::vector fa; - getFaces(fa); + std::vector fa = getFaces(); Utils::SerializedRepresentation faces ("Faces topologiques", TkUtil::NumericConversions::toStr(fa.size())); @@ -1146,8 +1075,7 @@ getDescription (bool alsoComputed) const topoRelation.addPropertiesSet (faces); } else { - std::vector fa; - getCoFaces(fa); + std::vector fa = getCoFaces(); Utils::SerializedRepresentation cofaces ("Faces topologiques", TkUtil::NumericConversions::toStr(fa.size())); @@ -1181,10 +1109,11 @@ bool Block:: structurable() { if (!isStructured()) { - if (getNbFaces() == 6){ + std::vector faces = getFaces(); + if (faces.size() == 6){ // il faut de plus que les faces soient structurables for (uint i=0; i<6; i++) - if (!getFace(i)->structurable()) + if (!faces[i]->structurable()) return false; } else @@ -1203,9 +1132,10 @@ unstructure(Internal::InfoCommand* icmd) throw TkUtil::Exception (TkUtil::UTF8String ("Non structuration d'un bloc non prévue", TkUtil::Charset::UTF_8)); // propage la non-structuration aux faces autant que possible + std::vector faces = getFaces(); for (uint i=0; i<6; i++) - if (getFace(i)->unstructurable()) - getFace(i)->unstructure(icmd); + if (faces[i]->unstructurable()) + faces[i]->unstructure(icmd); } /*----------------------------------------------------------------------------*/ void Block::setStructured(Internal::InfoCommand* icmd, bool str) @@ -1233,16 +1163,16 @@ structure(Internal::InfoCommand* icmd) // message1<<*this; // log (TkUtil::TraceLog (message1, TkUtil::Log::TRACE_4)); + std::vector faces = getFaces(); for (uint i=0; i<6; i++) - getFace(i)->structure(icmd); + faces[i]->structure(icmd); // Réordonne les Faces comme pour Bibop3D // cela suppose que les sommets soit ordonnés std::vector sorted_faces; // On tient compte du cas avec bloc à 5 ou 6 sommets - std::vector vertices; - getHexaVertices(vertices); + std::vector vertices = getHexaVertices(); for (uint i=0; i<6; i++){ sorted_faces.push_back(getFace( @@ -1254,7 +1184,7 @@ structure(Internal::InfoCommand* icmd) } m_topo_property->getFaceContainer().clear(); - m_topo_property->getFaceContainer().add(sorted_faces); + Utils::append(m_topo_property->getFaceContainer(), sorted_faces); BlockMeshingProperty* prop = new BlockMeshingPropertyTransfinite(); switchBlockMeshingProperty(icmd, prop); @@ -1282,8 +1212,9 @@ check() const } // on lance la vérification des faces - for (uint i=0; icheck(); + std::vector faces = getFaces(); + for (uint i=0; icheck(); if (getGeomAssociation() && getGeomAssociation()->isDestroyed()){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -1295,11 +1226,11 @@ check() const if (isStructured()){ // les faces doivent être structurées - for (uint i=0; iisStructured()) { + for (uint i=0; iisStructured()) { TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Erreur avec le bloc structuré "<getName() + <<", sa face "<getName() <<" n'est pas structurée"; throw TkUtil::Exception(messErr); } @@ -1309,20 +1240,19 @@ check() const uint tabDirAretesFace[6][2] = {{2, 1}, {2, 1}, {2, 0}, {2, 0}, {1, 0}, {1, 0}}; // construction d'un tableau avec les 8 sommets en duplicant les sommets en cas de dégénérescence - std::vector sommets; - getHexaVertices(sommets); + std::vector sommets = getHexaVertices(); // calcul le nombre de bras pour chacune des directions uint nbBrasDir[3]; getNbMeshingEdges(nbBrasDir[0], nbBrasDir[1], nbBrasDir[2]); // on vérifie que chacune des Face a le même nombre de bras que ce que l'on a trouvé pour le bloc - for (uint iFace=0; iFacegetNbMeshingEdges(nb1, nb2); - Face::eDirOnFace dirFace = getFace(iFace)->getDir(v0, v1); + faces[iFace]->getNbMeshingEdges(nb1, nb2); + Face::eDirOnFace dirFace = faces[iFace]->getDir(v0, v1); // on permute si nécessaire pour que le premier (nb1) corresponde à la première direction tabDirAretesFace if (dirFace == Face::j_dir){ uint nb_tmp = nb1; @@ -1332,7 +1262,7 @@ check() const if (nb1 != nbBrasDir[tabDirAretesFace[iFace][0]]){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); - messErr << "Erreur avec la face structurée "<getName() + messErr << "Erreur avec la face structurée "<getName() << " dans le bloc " <getName() + messErr << "Erreur avec la face structurée "<getName() << " dans le bloc " <& sommets) const +std::vector Block:: +getHexaVertices() const { - sommets.resize(8); - - if (getNbVertices() == 8){ + std::vector vertices = getVertices(); + std::vector sommets(8); + if (vertices.size() == 8){ for (uint i=0; i<8; i++) - sommets[i] = getVertex(i); - } else if (getNbVertices() == 5){ + sommets[i] = vertices[i]; + } else if (vertices.size() == 5){ for (uint i=0; i<5; i++) - sommets[i] = getVertex(i); + sommets[i] = vertices[i]; sommets[5] = sommets[4]; sommets[6] = sommets[4]; sommets[7] = sommets[4]; - } else if (getNbVertices() == 6){ + } else if (vertices.size() == 6){ for (uint i=0; i<4; i++) - sommets[i] = getVertex(i); - - if (getFace(0)->getNbVertices() == 3 && getFace(1)->getNbVertices() == 3){ - sommets[4] = getVertex(4); - sommets[5] = getVertex(5); - sommets[6] = getVertex(4); - sommets[7] = getVertex(5); - } else if (getFace(2)->getNbVertices() == 3 && getFace(3)->getNbVertices() == 3){ - sommets[4] = getVertex(4); - sommets[5] = getVertex(4); - sommets[6] = getVertex(5); - sommets[7] = getVertex(5); + sommets[i] = vertices[i]; + + std::vector faces = getFaces(); + if (faces[0]->getVertices().size() == 3 && faces[1]->getVertices().size() == 3){ + sommets[4] = vertices[4]; + sommets[5] = vertices[5]; + sommets[6] = vertices[4]; + sommets[7] = vertices[5]; + } else if (faces[2]->getVertices().size() == 3 && faces[3]->getVertices().size() == 3){ + sommets[4] = vertices[4]; + sommets[5] = vertices[4]; + sommets[6] = vertices[5]; + sommets[7] = vertices[5]; } else throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne avec Block::getHexaVertices(), nb de sommets non prévus dans une des faces", TkUtil::Charset::UTF_8)); } else throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne avec Block::getHexaVertices(), nb de sommets non prévus", TkUtil::Charset::UTF_8)); + + return sommets; } /*----------------------------------------------------------------------------*/ Face* Block:: @@ -1417,16 +1350,17 @@ getFace(Topo::Vertex* v0, Topo::Vertex* v1, Topo::Vertex* v2, Topo::Vertex* v3) // recherche d'une face avec les nbVtx sommets de marqués Face* face_ok = 0; - for (uint i=0; i faces = getFaces(); + for (uint i=0; i & local_vertices = getFace(i)->getVertices(); + const std::vector & local_vertices = faces[i]->getVertices(); for (std::vector::const_iterator iter2 = local_vertices.begin(); iter2 != local_vertices.end(); ++iter2) { if (filtre_sommets[*iter2] == 1) nb_marques+=1; } if (nb_marques == nbVtx) - face_ok = getFace(i); + face_ok = faces[i]; } if (!face_ok){ std::cerr<<"Erreur avec Block::getFace("<getName()<<"," @@ -1471,15 +1405,15 @@ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Block & b) else o << ", sans projection"; - o << " avec "<<(short)b.getNbFaces()<<" faces:\n"; - const std::vector & faces = b.getFaces(); + const std::vector& faces = b.getFaces(); + o << " avec "<<(short)faces.size()<<" faces:\n"; for (uint i=0; igetName()<<"\n"; // o << *faces[i]<<"\n"; o << "\n"; - o << b.getName()<< " bloc avec "<<(short)b.getNbVertices()<<" sommets:\n"; - const std::vector & vertices = b.getVertices(); + const std::vector & vertices = b.getVertices(); + o << b.getName()<< " bloc avec "<<(short)vertices.size()<<" sommets:\n"; for (uint i=0; igetName(); - std::vector vertices; - getVertices(vertices); + const std::vector& vertices = getVertices(); infos._vertices = Utils::toNames(vertices); - std::vector coedges; - getCoEdges(coedges); + std::vector coedges = getCoEdges(); infos._coedges = Utils::toNames(coedges); - std::vector cofaces; - getCoFaces(cofaces); + std::vector cofaces = getCoFaces(); infos._cofaces = Utils::toNames(cofaces); return infos; } /*----------------------------------------------------------------------------*/ -//void Block:: -//getEdges(eDirOnBlock dir, std::vector & edges) const -//{ -// -// if (!isStructured()) -// throw TkUtil::Exception("Block::getEdges(dir) n'est pas possible avec un bloc non structuré"); -// -// std::list l_e; -// -// // attention, un bloc structuré a 5, 6 ou 8 sommets suivant les dégénérescences -// if (dir == i_dir){ -// l_e.push_back(getFace(2)->getEdge(getVertex(0),getVertex(1))); -// l_e.push_back(getFace(4)->getEdge(getVertex(0),getVertex(1))); -// l_e.push_back(getFace(4)->getEdge(getVertex(2),getVertex(3))); -// l_e.push_back(getFace(3)->getEdge(getVertex(2),getVertex(3))); -// -// if (getNbFaces() == 6){ -// l_e.push_back(getFace(2)->getEdge(getVertex(4),getVertex(5))); -// l_e.push_back(getFace(5)->getEdge(getVertex(4),getVertex(5))); -// l_e.push_back(getFace(5)->getEdge(getVertex(6),getVertex(7))); -// l_e.push_back(getFace(3)->getEdge(getVertex(6),getVertex(7))); -// } -// else if (getFace(2)->getNbVertices() == 4){ -// l_e.push_back(getFace(2)->getEdge(getVertex(4),getVertex(5))); -// l_e.push_back(getFace(3)->getEdge(getVertex(4),getVertex(5))); -// } -// -// } -// else if (dir == j_dir){ -// l_e.push_back(getFace(0)->getEdge(getVertex(0),getVertex(2))); -// l_e.push_back(getFace(4)->getEdge(getVertex(0),getVertex(2))); -// l_e.push_back(getFace(4)->getEdge(getVertex(1),getVertex(3))); -// l_e.push_back(getFace(1)->getEdge(getVertex(1),getVertex(3))); -// -// if (getNbFaces() == 6){ -// l_e.push_back(getFace(0)->getEdge(getVertex(4),getVertex(6))); -// l_e.push_back(getFace(5)->getEdge(getVertex(4),getVertex(6))); -// l_e.push_back(getFace(5)->getEdge(getVertex(5),getVertex(7))); -// l_e.push_back(getFace(1)->getEdge(getVertex(5),getVertex(7))); -// } -// else if (getFace(0)->getNbVertices() == 4){ -// l_e.push_back(getFace(0)->getEdge(getVertex(4),getVertex(5))); -// l_e.push_back(getFace(1)->getEdge(getVertex(4),getVertex(5))); -// } -// -// } -// else if (dir == k_dir){ -// -// // construction d'un tableau avec les 8 sommets en duplicant les sommets en cas de dégénérescence -// std::vector sommets; -// getHexaVertices(sommets); -// -// if (getFace(0)->getNbVertices() == 3 && getFace(1)->getNbVertices() == 3) { -// l_e.push_back(getFace(0)->getEdge(0)); -// l_e.push_back(getFace(0)->getEdge(2)); -// l_e.push_back(getFace(1)->getEdge(0)); -// l_e.push_back(getFace(1)->getEdge(2)); -// } -// else { -// l_e.push_back(getFace(0)->getEdge(sommets[0],sommets[4])); -// l_e.push_back(getFace(0)->getEdge(sommets[2],sommets[6])); -// l_e.push_back(getFace(1)->getEdge(sommets[1],sommets[5])); -// l_e.push_back(getFace(1)->getEdge(sommets[3],sommets[7])); -// } -// -// if (getFace(2)->getNbVertices() == 3 && getFace(3)->getNbVertices() == 3) { -// l_e.push_back(getFace(2)->getEdge(0)); -// l_e.push_back(getFace(2)->getEdge(2)); -// l_e.push_back(getFace(3)->getEdge(0)); -// l_e.push_back(getFace(3)->getEdge(2)); -// } -// else { -// l_e.push_back(getFace(2)->getEdge(sommets[0],sommets[4])); -// l_e.push_back(getFace(2)->getEdge(sommets[1],sommets[5])); -// l_e.push_back(getFace(3)->getEdge(sommets[2],sommets[6])); -// l_e.push_back(getFace(3)->getEdge(sommets[3],sommets[7])); -// } -// -// } -// else -// throw TkUtil::Exception("Block::getEdges avec une direction non prévue"); -// -// l_e.sort(Utils::Entity::compareEntity); -// l_e.unique(); -// -// edges.clear(); -// edges.insert(edges.end(),l_e.begin(),l_e.end()); -//} -/*----------------------------------------------------------------------------*/ void Block:: getOrientedCoEdges(std::vector & iCoedges, std::vector & jCoedges, @@ -1627,24 +1469,13 @@ getOrientedCoEdges(std::vector & iCoedges, // on marque les CoEdges dans le bloc std::map filtre_coedge; - for(uint f=0; f < getNbFaces(); f++){ - Face* face = getFace(f); - - for(uint i=0; i < face->getNbCoFaces(); i++){ - CoFace* coface = face->getCoFace(i); - - for(uint j=0; j < coface->getNbEdges(); j++){ - Edge* edge = coface->getEdge(j); - - for(uint k=0; k < edge->getNbCoEdges(); k++){ - CoEdge* coedge = edge->getCoEdge(k); + const std::vector& faces = getFaces(); + for(Face* face : faces) + for(CoFace* coface : face->getCoFaces()) + for(Edge* edge : coface->getEdges()) + for(CoEdge* coedge : edge->getCoEdges()) filtre_coedge[coedge] = 1; - } // for(uint k=0; k < edge->getNbCoEdges(); k++) - } // for(uint j=0; j < coface->getNbEdges(); j++) - } // for(uint i=0; i < getNbCoFaces(); i++) - } // for(uint f=0; f < getNbFaces(); f++) - // tableau de 3 vecteurs de CoEdges pour le stockage temporaire std::vector tabCoedges[3]; uint indDir1 = 0; @@ -1652,8 +1483,8 @@ getOrientedCoEdges(std::vector & iCoedges, // ordre des faces pour un parcours avec des faces ayant une coedge en commun const uint tabIndFace[6] = {4, 0, 2, 1, 3, 5}; - for (uint i=0; i iCoedges_face; std::vector jCoedges_face; @@ -1732,17 +1563,18 @@ getOrientedCoEdges(std::vector & iCoedges, } // for (uint i=0; i& vertices = getVertices(); std::vector coedges_between; // inutilisé for (uint i=0; i<3 && iCoedges.empty(); i++) - if (TopoHelper::getCoEdgesBetweenVertices(getVertex(0), getVertex(1), tabCoedges[i], coedges_between)) + if (TopoHelper::getCoEdgesBetweenVertices(vertices[0], vertices[1], tabCoedges[i], coedges_between)) iCoedges = tabCoedges[i]; for (uint i=0; i<3 && jCoedges.empty(); i++) - if (TopoHelper::getCoEdgesBetweenVertices(getVertex(0), getVertex(2), tabCoedges[i], coedges_between)) + if (TopoHelper::getCoEdgesBetweenVertices(vertices[0], vertices[2], tabCoedges[i], coedges_between)) jCoedges = tabCoedges[i]; for (uint i=0; i<3 && kCoedges.empty(); i++) - if (TopoHelper::getCoEdgesBetweenVertices(getVertex(0), getVertex(4), tabCoedges[i], coedges_between)) + if (TopoHelper::getCoEdgesBetweenVertices(vertices[0], vertices[4], tabCoedges[i], coedges_between)) kCoedges = tabCoedges[i]; if (iCoedges.empty() || jCoedges.empty() || kCoedges.empty()){ @@ -1779,11 +1611,13 @@ getNbMeshingEdges(uint& nbI, uint& nbJ, uint& nbK, bool accept_error) const // on utilise la recherche des discrétisations pour 2 faces orthogonales uint nbI_face0, nbJ_face0, nbI_face4, nbJ_face4; - getFace(0)->getNbMeshingEdges(nbI_face0, nbJ_face0, accept_error); - getFace(4)->getNbMeshingEdges(nbI_face4, nbJ_face4, accept_error); + const std::vector& faces = getFaces(); + faces[0]->getNbMeshingEdges(nbI_face0, nbJ_face0, accept_error); + faces[4]->getNbMeshingEdges(nbI_face4, nbJ_face4, accept_error); - Face::eDirOnFace dirI = getFace(4)->getDir(getVertex(0), getVertex(1)); - Face::eDirOnFace dirK = getFace(0)->getDir(getVertex(0), getVertex(4)); + const std::vector& vertices = getVertices(); + Face::eDirOnFace dirI = faces[4]->getDir(vertices[0], vertices[1]); + Face::eDirOnFace dirK = faces[0]->getDir(vertices[0], vertices[4]); if (dirI == Face::i_dir){ nbI = nbI_face4; @@ -1933,8 +1767,9 @@ fuse(Block* bloc_B, // recherche de la face dont tous les sommets ont un sommet en correspondance Face* face_A = 0; bool faceATrouvee = false; - for (uint i=0; i& faces = getFaces(); + for (uint i=0; i & vertices = face->getVertices(); bool tousMarques = true; @@ -1959,8 +1794,9 @@ fuse(Block* bloc_B, Face* face_B = 0; bool faceBTrouvee = false; - for (uint i=0; igetNbFaces() && !faceBTrouvee; i++){ - Face* face = bloc_B->getFace(i); + const std::vector& Bfaces = bloc_B->getFaces(); + for (uint i=0; i vertices = face->getVertices(); bool tousMarques = true; @@ -2038,13 +1874,12 @@ void Block::extendSplit(CoEdge* arete, // recherche dans une face du bloc et voisine de l'arête // une arête d'une direction différente std::map filtre_coface; - std::vector cofaces; - getCoFaces(cofaces); + std::vector cofaces = getCoFaces(); for (std::vector::iterator iter = cofaces.begin(); iter != cofaces.end(); ++iter) filtre_coface[*iter] = 1; - arete->getCoFaces(cofaces); + cofaces = arete->getCoFaces(); CoFace* coface = 0; for (std::vector::iterator iter = cofaces.begin(); iter != cofaces.end(); ++iter) @@ -2057,11 +1892,9 @@ void Block::extendSplit(CoEdge* arete, CoEdge* coedge = 0; std::vector coedges; uint marque_arete = dir + 1; - coface->getCoEdges(coedges); - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter) - if (filtre_coedge[*iter] != marque_arete) - coedge = *iter; + for (Topo::CoEdge* ce : coface->getCoEdges()) + if (filtre_coedge[ce] != marque_arete) + coedge = ce; if (0 == coedge) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, on ne trouve pas d'arête dans une autre direction et dans une même coface", TkUtil::Charset::UTF_8)); @@ -2070,11 +1903,13 @@ void Block::extendSplit(CoEdge* arete, timer.reset(); timer.start(); #endif - if (coedge->getVertex(0) == arete->getVertex(0) - || coedge->getVertex(0) == arete->getVertex(1)) + const std::vector& ce_vertices = coedge->getVertices(); + const std::vector& ar_vertices = arete->getVertices(); + if (ce_vertices[0] == ar_vertices[0] + || ce_vertices[0] == ar_vertices[1]) split(coedge, 0.0, newBlocs, icmd); - else if (coedge->getVertex(1) == arete->getVertex(0) - || coedge->getVertex(1) == arete->getVertex(1)) + else if (ce_vertices[1] == ar_vertices[0] + || ce_vertices[1] == ar_vertices[1]) split(coedge, 1.0, newBlocs, icmd); else throw TkUtil::Exception (TkUtil::UTF8String ("On ne trouve pas de sommet commun entre l'arête sélectionnée et l'arête transverse", TkUtil::Charset::UTF_8)); @@ -2131,8 +1966,7 @@ split(CoEdge* arete, double ratio, #endif // les faces communes autorisées pour la coupe - std::vector blk_cofaces; - getCoFaces(blk_cofaces); + std::vector blk_cofaces = getCoFaces(); // les Edges qui coupent le bloc en deux std::vector splitingEdges; @@ -2150,15 +1984,17 @@ split(CoEdge* arete, double ratio, // les faces qui ne sont pas concernées par la coupe uint ind_face0 = dirSplit*2; - Face* face0 = getFace(ind_face0); - Face* face1 = (getNbVertices()!=8 && dirSplit==k_dir?0:getFace(dirSplit*2+1)); + const std::vector& faces = getFaces(); + Face* face0 = faces[ind_face0]; + const std::vector& vertices = getVertices(); + Face* face1 = (vertices.size()!=8 && dirSplit==k_dir?0:faces[dirSplit*2+1]); Face* faceI[4]; Face* newFaceI[4][2]; #ifdef _DEBUG_SPLIT std::cout<<"face0 : "<getName()<getNbVertices(); + uint nbFacesCoupees = face0->getVertices().size(); #ifdef _DEBUG_TIMER timer.reset(); @@ -2166,10 +2002,10 @@ split(CoEdge* arete, double ratio, #endif for (uint i=0; isplit(splitingEdges, newFaceI[i][0], newFaceI[i][1], icmd); @@ -2201,19 +2037,19 @@ split(CoEdge* arete, double ratio, continue; Topo::Vertex* vtx; - if (i == 0 && getNbVertices() != 8) + if (i == 0 && vertices.size() != 8) // on évite le sommet du bloc s'il est dégénéré - vtx = getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1]); + vtx = vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1]]; else - vtx = getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][i]); + vtx = vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][i]]; #ifdef _DEBUG_SPLIT std::cout <<"sommet "<getName()<<" pour ordonner les 2 faces : " <getName()<<" et "<getName()<find(vtx)){ + if (Utils::contains(vtx, newFaceI[i][0]->getVertices())){ // rien à faire - } else if (newFaceI[i][1]->find(vtx)) { + } else if (Utils::contains(vtx, newFaceI[i][1]->getVertices())) { // il faut permuter les 2 faces Face* face_tmp = newFaceI[i][1]; newFaceI[i][1] = newFaceI[i][0]; @@ -2234,15 +2070,15 @@ split(CoEdge* arete, double ratio, // on se base sur les 2 sommets en contact avec la face inchangée Topo::Vertex* vtx1; Topo::Vertex* vtx2; - if (getNbVertices() == 6 && ind_face0 == 0 && i == 3) - vtx1 = getVertex(5); + if (vertices.size() == 6 && ind_face0 == 0 && i == 3) + vtx1 = vertices[5]; else - vtx1 = getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][i]); + vtx1 = vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][i]]; - if (getNbVertices() == 6 && nbFacesCoupees == 4 && ind_face0 == 0 && i == 2) - vtx2 = getVertex(5); + if (vertices.size() == 6 && nbFacesCoupees == 4 && ind_face0 == 0 && i == 2) + vtx2 = vertices[5]; else - vtx2 = getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][(i+1)%nbFacesCoupees]); + vtx2 = vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][(i+1)%nbFacesCoupees]]; if (i>=4) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, Bloc::split echoue avec i trop grand", TkUtil::Charset::UTF_8)); @@ -2349,12 +2185,12 @@ split(CoEdge* arete, double ratio, std::vector vertices_2; // les nouveaux blocs dépendent du type de bloc au départ - if (getNbVertices() == 8){ + if (vertices.size() == 8){ // cas du bloc hexaédrique - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][0])); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1])); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][3])); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2])); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][0]]); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1]]); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][3]]); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2]]); vertices_1.push_back(splitingVertices[0]); vertices_1.push_back(splitingVertices[1]); vertices_1.push_back(splitingVertices[3]); @@ -2390,16 +2226,16 @@ split(CoEdge* arete, double ratio, faces_2.push_back(face1); - } else if (getNbVertices() == 6){ + } else if (vertices.size() == 6){ // cas du bloc avec dégénérescence en prisme if (nbFacesCoupees == 3){ // cas avec une coupe des 3 faces quadrangulaires - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1])); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1]]); vertices_1.push_back(splitingVertices[1]); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2])); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2]]); vertices_1.push_back(splitingVertices[2]); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][0])); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][0]]); vertices_1.push_back(splitingVertices[0]); faces_1.push_back(face0); @@ -2424,9 +2260,9 @@ split(CoEdge* arete, double ratio, } else if (0 == newFaceI[3][0]) { // cas de la coupe des 2 faces triangulaires, du quad à la base, et on suit l'arête somitale - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1])); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1]]); vertices_1.push_back(splitingVertices[1]); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2])); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2]]); vertices_1.push_back(splitingVertices[2]); vertices_1.push_back(splitingVertices[0]); vertices_1.push_back(splitingVertices[3]); @@ -2460,10 +2296,10 @@ split(CoEdge* arete, double ratio, faces_1.push_back(face0); faces_1.push_back(new_face_1); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][0])); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1])); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][3])); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2])); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][0]]); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1]]); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][3]]); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2]]); vertices_1.push_back(splitingVertices[0]); vertices_1.push_back(splitingVertices[1]); vertices_1.push_back(splitingVertices[3]); @@ -2496,7 +2332,7 @@ split(CoEdge* arete, double ratio, vertices_2.push_back(vtx); } - } else if (getNbVertices() == 5){ + } else if (vertices.size() == 5){ // cas du bloc avec dégénérescence en pyramide if (nbFacesCoupees == 4) { @@ -2508,10 +2344,10 @@ split(CoEdge* arete, double ratio, faces_1.push_back(face0); faces_1.push_back(new_face_1); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][0])); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1])); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][3])); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2])); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][0]]); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1]]); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][3]]); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2]]); vertices_1.push_back(splitingVertices[0]); vertices_1.push_back(splitingVertices[1]); vertices_1.push_back(splitingVertices[3]); @@ -2538,11 +2374,11 @@ split(CoEdge* arete, double ratio, } else { // cas avec la coupe de la base (quad) et de 2 tri - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1])); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][1]]); vertices_1.push_back(splitingVertices[1]); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2])); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][2]]); vertices_1.push_back(splitingVertices[2]); - vertices_1.push_back(getVertex(TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][0])); + vertices_1.push_back(vertices[TopoHelper::tabIndVtxByFaceOnBlock[ind_face0][0]]); faces_1.push_back(face0); faces_1.push_back(new_face_1); @@ -2585,9 +2421,7 @@ split(CoEdge* arete, double ratio, block_1->setGeomAssociation(getGeomAssociation()); block_2->setGeomAssociation(getGeomAssociation()); - Utils::Container& groups = m_topo_property->getGroupsContainer(); - for (uint i=0; igetGroupsContainer()){ gr->add(block_1); gr->add(block_2); block_1->add(gr); @@ -2652,14 +2486,12 @@ unrefine(eDirOnBlock dir, // on met à 2 la marque pour les CoFace et CoEdge reliés à 2 blocs std::map filtre_coedges; std::map filtre_cofaces; - for(uint f=0; f < getNbFaces(); f++){ - Face* face = getFace(f); - - for(uint i=0; i < face->getNbCoFaces(); i++){ - CoFace* coface = face->getCoFace(i); + const std::vector& faces = getFaces(); + for(Face* face : faces){ + for(CoFace* coface : face->getCoFaces()){ // la CoFace est-elle entre 2 blocs ? bool coFaceInterne = false; - if (coface->getNbFaces() == 2){ + if (coface->getFaces().size() == 2){ filtre_cofaces[coface] = 2; coFaceInterne = true; } @@ -2668,20 +2500,12 @@ unrefine(eDirOnBlock dir, coFaceInterne = false; } - for(uint j=0; j < coface->getNbEdges(); j++){ - Edge* edge = coface->getEdge(j); - - for(uint k=0; k < edge->getNbCoEdges(); k++){ - CoEdge* coedge = edge->getCoEdge(k); - if (coFaceInterne) { + for(Edge* edge : coface->getEdges()) + for(CoEdge* coedge : edge->getCoEdges()) + if (coFaceInterne) filtre_coedges[coedge] = 2; - } - else { - if (filtre_coedges[coedge] != 2) - filtre_coedges[coedge] = 1; - } - } // for(uint k=0; k < edge->getNbCoEdges(); k++) - } // for(uint j=0; j < coface->getNbEdges(); j++) + else if (filtre_coedges[coedge] != 2) + filtre_coedges[coedge] = 1; } // for(uint i=0; i < getNbCoFaces(); i++) } // for(uint f=0; f < getNbFaces(); f++) @@ -2714,34 +2538,29 @@ unrefine(eDirOnBlock dir, // si elles sont marquées à 1, on traite les Edges: // pour les CoEdges marquées à 2, on déraffine l'arête // pour les CoEdges marquées à 1, on modifie la discrétisation + const std::vector& vertices = getVertices(); for (uint f=0; f<4; f++) - if (tabIndFaceParDir[dir][f]getDir(getVertex(TopoHelper::tabIndVtxByEdgeAndDirOnBlock[dir][indFace][0]), - getVertex(TopoHelper::tabIndVtxByEdgeAndDirOnBlock[dir][indFace][1])); + Face::eDirOnFace dirLoc = face->getDir(vertices[TopoHelper::tabIndVtxByEdgeAndDirOnBlock[dir][indFace][0]], + vertices[TopoHelper::tabIndVtxByEdgeAndDirOnBlock[dir][indFace][1]]); - for(uint i=0; i < face->getNbCoFaces(); i++){ - CoFace* coface = face->getCoFace(i); + for(uint i=0; i < face->getCoFaces().size(); i++){ + CoFace* coface = face->getCoFaces()[i]; if (filtre_cofaces[coface] == 2){ int old_ratio = face->getRatio(coface, dirLoc); face->saveFaceMeshingProperty(icmd); face->setRatio(coface, old_ratio*ratio, dirLoc); } else { - std::vector edges; - coface->getEdges(edges); - - for (std::vector::iterator iter1=edges.begin(); - iter1!=edges.end(); ++iter1){ - Edge* edge = *iter1; - std::vector coedges; - edge->getCoEdges(coedges); + for (Edge* edge : coface->getEdges()){ + std::vector coedges = edge->getCoEdges(); for (std::vector::iterator iter2=coedges.begin(); iter2!=coedges.end(); ++iter2){ CoEdge* coedge = *iter2; @@ -2756,7 +2575,7 @@ unrefine(eDirOnBlock dir, } else if (filtre_coedges[coedge] == 2){ - if (edge->getNbCoFaces() != 1){ + if (edge->getCoFaces().size() != 1){ // on duplique l'arête Edge* new_edge = edge->clone(); if (icmd) @@ -2812,9 +2631,10 @@ free(Internal::InfoCommand* icmd) setDestroyed(true); // suppression des relations remontantes des faces vers ce block - for (uint i=0; isaveFaceTopoProperty(icmd); - getFace(i)->removeBlock(this, false); + const std::vector& faces = getFaces(); + for (uint i=0; isaveFaceTopoProperty(icmd); + faces[i]->removeBlock(this); } clearDependancy(); @@ -2824,15 +2644,15 @@ void Block:: degenerateFaceInVertex(uint id, Internal::InfoCommand* icmd) { // la face qui disparait - Face* face = getFace(id); + Face* face = getFaces()[id]; - if (face->getNbCoFaces() != 1) + if (face->getCoFaces().size() != 1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, il n'est pas prévu de faire appel à Block::degenerateFaceInEdge pour une face composée", TkUtil::Charset::UTF_8)); // la coface qui disparait - CoFace* coface = face->getCoFace(0); + CoFace* coface = face->getCoFaces()[0]; - if (coface->getNbVertices() != 4) + if (coface->getVertices().size() != 4) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, il n'est pas prévu de faire appel à Block::degenerateFaceInVertex pour une face avec autre chose que 4 sommets", TkUtil::Charset::UTF_8)); // sauvegarde pour undo ou retour en arrière en cas d'échec @@ -2843,24 +2663,25 @@ degenerateFaceInVertex(uint id, Internal::InfoCommand* icmd) // les fusions de sommets des arêtes (qui disparaissent de la face) - Edge* a0 = coface->getEdge(0); - Edge* a2 = coface->getEdge(2); + const std::vector& edges = coface->getEdges(); + Edge* a0 = edges[0]; + Edge* a2 = edges[2]; a0->collapse(icmd); a2->collapse(icmd); - Edge* a1 = coface->getEdge(0); - Edge* a3 = coface->getEdge(1); + Edge* a1 = edges[0]; + Edge* a3 = edges[1]; a1->merge(a3, icmd, false); a1->collapse(icmd); coface->free(icmd); face->free(icmd); - m_topo_property->getFaceContainer().remove(face, true); + Utils::remove(face, m_topo_property->getFaceContainer()); // suppression des sommets de la liste m_topo_property->getVertexContainer().resize(5); // des fois que ... - if (getVertex(4)->isDestroyed()) + if (getVertices()[4]->isDestroyed()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne Block::degenerateFaceInVertex, le sommet conservé est détruit", TkUtil::Charset::UTF_8)); } /*----------------------------------------------------------------------------*/ @@ -2871,13 +2692,13 @@ degenerateFaceInEdge(uint id, Topo::Vertex* v1, Topo::Vertex* v2, // comme pour degenerateFaceInVertex, mais sans le dernier collapse // la face qui disparait - Face* face = getFace(id); + Face* face = getFaces()[id]; - if (face->getNbCoFaces() != 1) + if (face->getCoFaces().size() != 1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, il n'est pas prévu de faire appel à Block::degenerateFaceInEdge pour une face composée", TkUtil::Charset::UTF_8)); // la coface qui disparait - CoFace* coface = face->getCoFace(0); + CoFace* coface = face->getCoFaces()[0]; // sauvegarde pour undo ou retour en arrière en cas d'échec saveBlockTopoProperty(icmd); @@ -2891,22 +2712,24 @@ degenerateFaceInEdge(uint id, Topo::Vertex* v1, Topo::Vertex* v2, a0->collapse(icmd); a2->collapse(icmd); - Edge* a1 = coface->getEdge(0); - Edge* a3 = coface->getEdge(1); + const std::vector edges = coface->getEdges(); + Edge* a1 = edges[0]; + Edge* a3 = edges[1]; a1->merge(a3, icmd, false); coface->free(icmd); face->free(icmd); - m_topo_property->getFaceContainer().remove(face, true); + Utils::remove(face, m_topo_property->getFaceContainer()); // suppression des sommets de la liste // tout d'abord, on évite de se retrouver avec 2 sommets identiques dans la liste restante - if (getVertex(4) == getVertex(5)) - m_topo_property->getVertexContainer().set(5, getVertex(6)); + const std::vector vertices = getVertices(); + if (vertices[4] == vertices[5]) + m_topo_property->getVertexContainer()[5] = vertices[6]; m_topo_property->getVertexContainer().resize(6); // des fois que ... - if (getVertex(4)->isDestroyed() || getVertex(5)->isDestroyed()) + if (vertices[4]->isDestroyed() || vertices[5]->isDestroyed()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne Block::degenerateFaceInEdge, l'un des sommets conservés est détruit", TkUtil::Charset::UTF_8)); } /*----------------------------------------------------------------------------*/ @@ -2929,10 +2752,10 @@ permuteToKmaxFace(uint id, Internal::InfoCommand* icmd) if (!isStructured()) throw TkUtil::Exception (TkUtil::UTF8String ("Block::permuteToKmaxFace n'est possible qu'avec un bloc structuré", TkUtil::Charset::UTF_8)); - if (getNbVertices() != 8) + if (getVertices().size() != 8) throw TkUtil::Exception (TkUtil::UTF8String ("Block::permuteToKmaxFace n'est possible qu'avec un bloc structuré à 8 sommets", TkUtil::Charset::UTF_8)); - if (getNbFaces() != 6) + if (getFaces().size() != 6) throw TkUtil::Exception (TkUtil::UTF8String ("Block::permuteToKmaxFace n'est possible qu'avec un bloc structuré à 6 faces", TkUtil::Charset::UTF_8)); // un filtre sur les arêtes pour passer des sommets vers les aretes sans sortir du bloc ou de la face @@ -2941,62 +2764,42 @@ permuteToKmaxFace(uint id, Internal::InfoCommand* icmd) std::map filtre_sommets; // les arêtes du bloc - std::vector edges; - getEdges(edges); - for (std::vector::iterator iter = edges.begin(); - iter != edges.end(); ++iter){ - filtre_aretes[*iter] = 1; - } + for (Edge* edge : getEdges()) + filtre_aretes[edge] = 1; // les arêtes de la face à mettre en k_max, // en tenant compte des arêtes qui s'appuient sur les coedges, dans d'autres faces // donc on passe par toutes les coedges - std::vector coedges; - getFace(id)->getCoEdges(coedges); - for (std::vector::iterator iter1 = coedges.begin(); - iter1 != coedges.end(); ++iter1){ - (*iter1)->getEdges(edges); - for (std::vector::iterator iter = edges.begin(); - iter != edges.end(); ++iter) - filtre_aretes[*iter] = 3; - } + Face* face_id = getFaces()[id]; + for (CoEdge* coedge : face_id->getCoEdges()) + for (Edge* e : coedge->getEdges()) + filtre_aretes[e] = 3; // les arêtes de la face à mettre en k_max, strictement dans la face - getFace(id)->getEdges(edges); - for (std::vector::iterator iter = edges.begin(); - iter != edges.end(); ++iter) - filtre_aretes[*iter] = 2; + for (Edge* edge : face_id->getEdges()) + filtre_aretes[edge] = 2; - - std::vector sommets; - getFace(id)->getVertices(sommets); - for (std::vector::iterator iter = sommets.begin(); - iter != sommets.end(); ++iter) - filtre_sommets[*iter] = 2; + for (Topo::Vertex* v : face_id->getVertices()) + filtre_sommets[v] = 2; // on se donne un sommet de départ (l'indice 7 car on veut mettre la face en k_max) - Topo::Vertex* p7 = getFace(id)->getVertex(0); + Topo::Vertex* p7 = face_id->getVertices()[0]; // recherche de 2 arêtes marqués dans la face parmis les arêtes reliées au sommet de départ std::vector aretesTriedre; - p7->getEdges(edges); - for (std::vector::iterator iter = edges.begin(); - iter != edges.end(); ++iter){ - if (filtre_aretes[*iter] == 2){ - aretesTriedre.push_back(*iter); - } - } + for (Edge* p7_edge : p7->getEdges()) + if (filtre_aretes[p7_edge] == 2) + aretesTriedre.push_back(p7_edge); if (aretesTriedre.size() != 2) throw TkUtil::Exception (TkUtil::UTF8String ("Block::permuteToKmaxFace ne trouve pas 2 arêtes dans la face depuis un des points", TkUtil::Charset::UTF_8)); // recherche d'1 arête marquée dans le bloc mais hors de la face - for (std::vector::iterator iter = edges.begin(); - iter != edges.end(); ++iter) - if (filtre_aretes[*iter] == 1){ - Topo::Vertex* som_op = (*iter)->getOppositeVertex(p7); + for (Edge* p7_edge : p7->getEdges()) + if (filtre_aretes[p7_edge] == 1){ + Topo::Vertex* som_op = p7_edge->getOppositeVertex(p7); if (filtre_sommets[som_op] != 2){ - aretesTriedre.push_back(*iter); + aretesTriedre.push_back(p7_edge); filtre_sommets[som_op] = 2; // pour ne pas prendre 2 fois cette arête } } @@ -3027,7 +2830,7 @@ permuteToKmaxFace(uint id, Internal::InfoCommand* icmd) #endif // recherche de p4 (opposé à p7, dans la face) - Edge* arete7 = getFace(id)->getOppositeEdge(getFace(id)->getEdge(p7, p5)); + Edge* arete7 = face_id->getOppositeEdge(face_id->getEdge(p7, p5)); Topo::Vertex* p4 = arete7->getOppositeVertex(p6); #ifdef _DEBUG_PERM std::cout<<"p4 = "<getName()<::iterator iterSom = somDep.begin(); - iterSom != somDep.end(); ++iterSom) { + for (Topo::Vertex* vtx : somDep) { // recherche d'1 arête marqué dans le bloc mais hors de la face Edge* arete = 0; - (*iterSom)->getEdges(edges); - for (std::vector::iterator iter = edges.begin(); - iter != edges.end(); ++iter) - if (filtre_aretes[*iter] == 1) - arete = *iter; + for (Edge* vtx_edge : vtx->getEdges()) + if (filtre_aretes[vtx_edge] == 1) + arete = vtx_edge; if (!arete) throw TkUtil::Exception (TkUtil::UTF8String ("Block::permuteToKmaxFace ne trouve pas 1 arête dans le bloc, hors de la face, depuis un sommet donné", TkUtil::Charset::UTF_8)); - somOpp.push_back(arete->getOppositeVertex(*iterSom)); + somOpp.push_back(arete->getOppositeVertex(vtx)); #ifdef _DEBUG_PERM std::cout<<" getOppositeVertex dans l'arete "<getName() - << " pour sommet "<<(*iterSom)->getName() + << " pour sommet "<getName() <<" donne sommet "<getName()< Block : "<<*this< vertices = getVertices(); + if (7 != vertices.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Block::reverseOrder7Vertices n'est pas possible avec autre chose qu'un bloc à 7 sommets", TkUtil::Charset::UTF_8)); - if (6 != getNbFaces()) + std::vector faces = getFaces(); + if (6 != faces.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Block::reverseOrder7Vertices n'est pas possible avec autre chose qu'un bloc à 6 côtés", TkUtil::Charset::UTF_8)); // identification de l'indice du sommet à la dégénérescence @@ -3114,9 +2916,9 @@ void Block::reverseOrder7Vertices() // les faces triangulaires std::vector faces_tri; - for (uint i=0; igetNbVertices()) - faces_tri.push_back(getFace(i)); + for (uint i=0; igetVertices().size()) + faces_tri.push_back(faces[i]); if (2 != faces_tri.size()){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -3126,19 +2928,19 @@ void Block::reverseOrder7Vertices() } Vertex* vtx_deg = TopoHelper::getCommonVertex(faces_tri[0], faces_tri[1]); - uint ind_deg = getIndex(vtx_deg); + uint ind_deg = Utils::getIndexOf(vtx_deg, vertices); // identification des indices des 2 sommets opposés à ce sommet à la dégénérescence // il s'agit des sommets opposés au sommet deg / face quadrangulaires // les faces quad qui contiennent vtx_deg std::vector faces_quad; - for (uint i=0; igetNbVertices()){ - std::vector vertices = getFace(i)->getVertices(); + for (uint i=0; igetVertices().size()){ + std::vector vertices = faces[i]->getVertices(); if (std::find(vertices.begin(), vertices.end(), vtx_deg) != vertices.end()) - faces_quad.push_back(getFace(i)); + faces_quad.push_back(faces[i]); } @@ -3151,10 +2953,15 @@ void Block::reverseOrder7Vertices() throw TkUtil::Exception(messErr); } - Vertex* vtx_opp1 = faces_quad[0]->getVertex((faces_quad[0]->getIndex(vtx_deg)+2) %4); - Vertex* vtx_opp2 = faces_quad[1]->getVertex((faces_quad[1]->getIndex(vtx_deg)+2) %4); - uint ind_opp1 = getIndex(vtx_opp1); - uint ind_opp2 = getIndex(vtx_opp2); + auto fa1_vertices = faces_quad[0]->getVertices(); + int if1 = Utils::getIndexOf(vtx_deg, fa1_vertices); + Vertex* vtx_opp1 = fa1_vertices[(if1+2)%4]; + uint ind_opp1 = Utils::getIndexOf(vtx_opp1, vertices); + + auto fa2_vertices = faces_quad[1]->getVertices(); + int if2 = Utils::getIndexOf(vtx_deg, fa2_vertices); + Vertex* vtx_opp2 = fa2_vertices[(if2+2)%4]; + uint ind_opp2 = Utils::getIndexOf(vtx_opp2, vertices); #ifdef _DEBUG_REVERSE std::cout<<"vtx_deg: "<getName()<getVertexContainer().clear(); - getBlockTopoProperty()->getVertexContainer().add(loc_vtx); + getBlockTopoProperty()->getVertexContainer() = loc_vtx; // idem avec les faces - getBlockTopoProperty()->getFaceContainer().clear(); - getBlockTopoProperty()->getFaceContainer().add(loc_faces); + getBlockTopoProperty()->getFaceContainer() = loc_faces; #ifdef _DEBUG_REVERSE std::cout<<" bloc après reverseOrder7Vertices : "<<*this< faces; - getFaces(faces); + std::vector faces = getFaces(); for (std::vector::iterator iter1 = faces.begin(); iter1 != faces.end(); ++iter1){ Topo::Face* face = *iter1; Topo::Block* bloc_opp = face->getOppositeBlock(this); - for (uint j=0; jgetNbCoFaces(); j++){ - Topo::CoFace* coface = face->getCoFace(j); + for (uint j=0; jgetCoFaces().size(); j++){ + Topo::CoFace* coface = face->getCoFaces()[j]; // cas où on affecte une méthode structurée if (new_ppty->getMeshLaw() == BlockMeshingProperty::transfinite) { @@ -3356,20 +3160,19 @@ isEdited() const void Block:: getRatios(std::map &ratios) { - for (uint i=0; i faces = getFaces(); + for (uint i=0; igetNbCoFaces(); j++){ - CoFace* coface = face->getCoFace(j); - + for (CoFace* coface : face->getCoFaces()){ uint ratio_i = face->getRatio(coface, 0); uint ratio_j = face->getRatio(coface, 1); if (ratio_i > 1 || ratio_j > 1) haveRatio = true; - } // end for jgetNbCofaces() + } if (haveRatio){ #ifdef _DEBUG2 @@ -3380,13 +3183,10 @@ getRatios(std::map &ratios) face->getOrientedCoEdges(dirCoedges[0], dirCoedges[1]); std::map coedge2dir; for (uint dir=0; dir<2; dir++) - for (std::vector::iterator iter = dirCoedges[dir].begin(); - iter != dirCoedges[dir].end(); ++iter) - coedge2dir[*iter] = dir; - - for (uint j=0; jgetNbCoFaces(); j++){ - CoFace* coface = face->getCoFace(j); + for (CoEdge* coedge : dirCoedges[dir]) + coedge2dir[coedge] = dir; + for (CoFace* coface : face->getCoFaces()){ uint ratio_dir[2]; for (uint dir=0; dir<2; dir++) ratio_dir[dir] = face->getRatio(coface, dir); @@ -3395,11 +3195,11 @@ getRatios(std::map &ratios) for (uint cote=0; cote<2; cote++){ uint ind = cote*2 + dir; // on évite la 4ème arête d'une coface dégénérée - if (ind < coface->getNbEdges()){ - Edge* edge = coface->getEdge(ind); + const std::vector cf_edges = coface->getEdges(); + if (ind < cf_edges.size()){ + Edge* edge = cf_edges[ind]; - for (uint l=0; lgetNbCoEdges(); l++){ - CoEdge* coedge = edge->getCoEdge(l); + for (CoEdge* coedge : edge->getCoEdges()){ uint ratio = edge->getRatio(coedge); // cas d'une coedge non encore vue if (ratios[coedge] == 0){ @@ -3410,25 +3210,20 @@ getRatios(std::map &ratios) <<"="<getNbCoEdges() + } // end for coedge } // end if (ind < coface->getNbEdges()) } // end for cote<2 } // end for dir<2 - - } // end for jgetNbCofaces() + } // end for coface } // end if (haveRatio) else { // on évite ici l'appel à getOrientedCoEdges qui coûte un peu // recherche des ratios sur les coedges - for (uint j=0; jgetNbCoFaces(); j++){ - CoFace* coface = face->getCoFace(j); - for (uint k=0; kgetNbEdges(); k++){ - Edge* edge = coface->getEdge(k); - for (uint l=0; lgetNbCoEdges(); l++){ - CoEdge* coedge = edge->getCoEdge(l); - + for (CoFace* coface : face->getCoFaces()) + for (Edge* edge : coface->getEdges()) + for (CoEdge* coedge : edge->getCoEdges()) if (ratios[coedge] == 0){ uint ratio = edge->getRatio(coedge); ratios[coedge] = ratio; @@ -3436,9 +3231,6 @@ getRatios(std::map &ratios) std::cout<getName()<<" a pour ratio "<getNbCoEdges() - } /// end for kgetNbEdges() - } // end for jgetNbCofaces() } // end else / if (haveRatio) } // end for i vertices; - getVertices(vertices); + std::vector vertices = getVertices(); for (uint i=0; igetCoord(); barycentre /= (double)vertices.size(); @@ -3459,28 +3250,28 @@ void Block::getGroupsName (std::vector& gn) const { TopoEntity::getGroupsName(gn); - for (uint i = 0; igetGroupsContainer().get(i)->getName()); + for (auto gr : m_topo_property->getGroupsContainer()) + gn.push_back(gr->getName()); } /*----------------------------------------------------------------------------*/ void Block::add(Group::Group3D* grp) { - m_topo_property->getGroupsContainer().add(grp); + m_topo_property->getGroupsContainer().push_back(grp); } /*----------------------------------------------------------------------------*/ void Block::remove(Group::Group3D* grp) { - m_topo_property->getGroupsContainer().remove(grp); + Utils::remove(grp, m_topo_property->getGroupsContainer()); } /*----------------------------------------------------------------------------*/ int Block::getNbGroups() const { - return m_topo_property->getGroupsContainer().getNb(); + return m_topo_property->getGroupsContainer().size(); } /*----------------------------------------------------------------------------*/ std::vector Block::getGroups() const { - return m_topo_property->getGroupsContainer().get(); + return m_topo_property->getGroupsContainer(); } /*----------------------------------------------------------------------------*/ void Block::setDestroyed(bool b) @@ -3493,7 +3284,7 @@ void Block::setDestroyed(bool b) return; // on retire la relation depuis les groupes - Utils::Container& groups = m_topo_property->getGroupsContainer(); + auto groups = m_topo_property->getGroupsContainer(); #ifdef _DEBUG2 std::cout<<"Les groupes:"; for (uint i=0; iremove(this); } else for (uint i=0; iadd(this); } @@ -3528,16 +3319,16 @@ unsigned long Block::getNbInternalMeshingNodes() } else { unsigned short res = m_mesh_data->nodes().size(); - for (uint i=0;igetNbInternalMeshingNodes(); - std::vector coedges; - getCoEdges(coedges); + std::vector vertices = getVertices(); + for (uint i=0;igetNbInternalMeshingNodes(); + + std::vector coedges = getCoEdges(); for (uint i=0;igetNbInternalMeshingNodes(); - std::vector cofaces; - getCoFaces(cofaces); + std::vector cofaces = getCoFaces(); for (uint i=0;igetNbInternalMeshingNodes(); diff --git a/src/Core/Topo/CoEdge.cpp b/src/Core/Topo/CoEdge.cpp index 9207b8e0..a5d63ee5 100644 --- a/src/Core/Topo/CoEdge.cpp +++ b/src/Core/Topo/CoEdge.cpp @@ -72,8 +72,8 @@ CoEdge(Internal::Context& ctx, , m_mesh_data(new CoEdgeMeshingData()) , m_save_mesh_data(0) { - m_topo_property->getVertexContainer().add(v1); - m_topo_property->getVertexContainer().add(v2); + m_topo_property->getVertexContainer().push_back(v1); + m_topo_property->getVertexContainer().push_back(v2); // association remontante v1->addCoEdge(this); @@ -142,6 +142,16 @@ CoEdge:: } } /*----------------------------------------------------------------------------*/ +void CoEdge::addEdge(Edge* e) +{ + m_topo_property->getEdgeContainer().push_back(e); +} +/*----------------------------------------------------------------------------*/ +void CoEdge::removeEdge(Edge* e) +{ + Utils::remove(e, m_topo_property->getEdgeContainer()); +} +/*----------------------------------------------------------------------------*/ void CoEdge:: replace(Topo::Vertex* v1, Topo::Vertex* v2, bool propagate_up, bool propagate_down, Internal::InfoCommand* icmd) { @@ -154,6 +164,7 @@ replace(Topo::Vertex* v1, Topo::Vertex* v2, bool propagate_up, bool propagate_do #endif // transmet aux Edges + const std::vector& edges = getEdges(); if (propagate_up) /* * 9/7/2025 ** ATTENTION ** @@ -161,12 +172,13 @@ replace(Topo::Vertex* v1, Topo::Vertex* v2, bool propagate_up, bool propagate_do * car Edge::replace appelle Edge::free qui modifie la liste * des edges de la coedge ce qui perturbe le parcours de la boucle. */ - for (uint j=0; jreplace(v1, v2, propagate_up, propagate_down, icmd); + for (uint j=0; jreplace(v1, v2, propagate_up, propagate_down, icmd); bool found = false; - for (uint i=0; i& vertices = getVertices(); + for (uint i=0; isaveVertexTopoProperty(icmd); saveCoEdgeTopoProperty(icmd); - m_topo_property->getVertexContainer().set(i,v2); + m_topo_property->getVertexContainer()[i] = v2; v1->removeCoEdge(this); v2->addCoEdge(this); } @@ -195,11 +207,8 @@ merge(CoEdge* ed, Internal::InfoCommand* icmd) // on remplace ed dans les arêtes associées à ed // On travaille sur une copie car il y a une mise à jour en même temps des arêtes - std::vector edges; - ed->getEdges(edges); - - for (std::vector::iterator iter=edges.begin(); - iter != edges.end(); ++iter) + std::vector edges = ed->getEdges(); + for (auto iter = edges.begin(); iter != edges.end(); ++iter) (*iter)->replace(ed, this, icmd); // récupère l'association côté ed si celle de this est dédtruite, ou si la dimension de la geom est inférieure @@ -218,9 +227,10 @@ collapse(Internal::InfoCommand* icmd) { //std::cout<<"CoEdge::collapse pour : "<<*this<& vertices = getVertices(); + if (vertices.size() != 2) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne CoEdge::collapse avec autre chose que 2 sommets", TkUtil::Charset::UTF_8)); - if (getVertex(0) == getVertex(1)) + if (vertices[0] == vertices[1]) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne CoEdge::collapse avec 2 sommets identiques", TkUtil::Charset::UTF_8)); setDestroyed(true); @@ -228,8 +238,8 @@ collapse(Internal::InfoCommand* icmd) if (icmd) icmd->addTopoInfoEntity(this,Internal::InfoCommand::DELETED); - // on supprime getVertex(1) - getVertex(0)->merge(getVertex(1), icmd); + // on supprime vertices[1] + vertices[0]->merge(vertices[1], icmd); free(icmd); } @@ -247,15 +257,15 @@ setDestroyed(bool b) if (isDestroyed() == b) return; - Utils::Container& groups = m_topo_property->getGroupsContainer(); + auto groups = m_topo_property->getGroupsContainer(); if (b) for (uint i=0; iremove(this); } else for (uint i=0; iadd(this); } @@ -281,15 +291,15 @@ free(Internal::InfoCommand* icmd) } // on supprime l'arête des relations des sommets vers les arêtes communes - for (uint i=0; isaveVertexTopoProperty(icmd); - getVertex(i)->removeCoEdge(this, false); + for (Vertex* v : getVertices()) { + v->saveVertexTopoProperty(icmd); + v->removeCoEdge(this); } // idem entre arêtes et arêtes communes - for (uint i=0; isaveEdgeTopoProperty(icmd); - getEdge(i)->removeCoEdge(this, false); + for (Edge* e : getEdges()) { + e->saveEdgeTopoProperty(icmd); + e->removeCoEdge(this); } clearDependancy(); @@ -304,13 +314,14 @@ split(uint nbMeshingEdges, Internal::InfoCommand* icmd) std::cout<<"CoEdge::split("<& vertices = getVertices(); if (nbMeshingEdges == 0) - return getVertex(0); + return vertices[0]; else if (nbMeshingEdges == getNbMeshingEdges()) - return getVertex(1); + return vertices[1]; else { - getVertex(0)->saveVertexTopoProperty(icmd); - getVertex(1)->saveVertexTopoProperty(icmd); + vertices[0]->saveVertexTopoProperty(icmd); + vertices[1]->saveVertexTopoProperty(icmd); // utilisation des points placés suivant la projection et la discrétisation std::vector points; @@ -331,19 +342,19 @@ split(uint nbMeshingEdges, Internal::InfoCommand* icmd) Geom::Curve* curve = dynamic_cast (getGeomAssociation()); if (curve){ - curve->getParametricsPoints(getVertex(0)->getCoord(), - getVertex(1)->getCoord(), + curve->getParametricsPoints(vertices[0]->getCoord(), + vertices[1]->getCoord(), 1, &ratio, points); } else { - points.push_back(getVertex(0)->getCoord() + (getVertex(1)->getCoord() - getVertex(0)->getCoord()) * ratio); + points.push_back(vertices[0]->getCoord() + (vertices[1]->getCoord() - vertices[0]->getCoord()) * ratio); Geom::GeomProjectVisitor gpv(points[0]); getGeomAssociation()->accept(gpv); points[0] = gpv.getProjectedPoint(); } } else { - points.push_back(getVertex(0)->getCoord() + (getVertex(1)->getCoord() - getVertex(0)->getCoord()) * ratio); + points.push_back(vertices[0]->getCoord() + (vertices[1]->getCoord() - vertices[0]->getCoord()) * ratio); } new_vertex = new Topo::Vertex(getContext(), points[0]); @@ -384,8 +395,9 @@ std::vector CoEdge::split(Topo::Vertex* vtx, uint nbMeshingEdges, Inter // création de 2 nouvelles arêtes communes - Topo::CoEdge* coedge1 = new Topo::CoEdge(getContext(), cemp1, getVertex(0), vtx); - Topo::CoEdge* coedge2 = new Topo::CoEdge(getContext(), cemp2, vtx, getVertex(1)); + const std::vector& vertices = getVertices(); + Topo::CoEdge* coedge1 = new Topo::CoEdge(getContext(), cemp1, vertices[0], vtx); + Topo::CoEdge* coedge2 = new Topo::CoEdge(getContext(), cemp2, vtx, vertices[1]); if (icmd){ icmd->addTopoInfoEntity(coedge1, Internal::InfoCommand::CREATED); icmd->addTopoInfoEntity(coedge2, Internal::InfoCommand::CREATED); @@ -397,9 +409,9 @@ std::vector CoEdge::split(Topo::Vertex* vtx, uint nbMeshingEdges, Inter coedge2->setGeomAssociation(getGeomAssociation()); } - Utils::Container& groups = m_topo_property->getGroupsContainer(); + auto groups = m_topo_property->getGroupsContainer(); for (uint i=0; iadd(coedge1); gr->add(coedge2); coedge1->add(gr); @@ -410,33 +422,32 @@ std::vector CoEdge::split(Topo::Vertex* vtx, uint nbMeshingEdges, Inter delete cemp2; // on ajoute les 2 arêtes - for (uint i=0; igetRatio(this); + const std::vector& edges = getEdges(); + for (uint i=0; igetRatio(this); // cas où il faut reporter la semi conformité sur les nouvelles arêtes communes if (ratio != 1){ - getEdge(i)->saveEdgeMeshingProperty(icmd); - getEdge(i)->setRatio(coedge1, ratio); - getEdge(i)->setRatio(coedge2, ratio); + edges[i]->saveEdgeMeshingProperty(icmd); + edges[i]->setRatio(coedge1, ratio); + edges[i]->setRatio(coedge2, ratio); } - getEdge(i)->saveEdgeTopoProperty(icmd); - getEdge(i)->addCoEdge(coedge1); - getEdge(i)->addCoEdge(coedge2); + edges[i]->saveEdgeTopoProperty(icmd); + edges[i]->addCoEdge(coedge1); + edges[i]->addCoEdge(coedge2); - coedge1->addEdge(getEdge(i)); - coedge2->addEdge(getEdge(i)); + coedge1->addEdge(edges[i]); + coedge2->addEdge(edges[i]); } // on met de côté la liste des Edges touchées - std::vector edges; - getEdges(edges); + std::vector sauv_edges = getEdges(); // on supprime cette arête (this) free(icmd); // remet les CoEdges dans l'ordre / arête if (sortCoEdges) - for (std::vector::iterator iter1 = edges.begin(); - iter1 != edges.end(); ++iter1) + for (auto iter1 = sauv_edges.begin(); iter1 != sauv_edges.end(); ++iter1) (*iter1)->sortCoEdges(); #ifdef _DEBUG_SPLIT @@ -459,8 +470,9 @@ std::vector CoEdge::split(uint nbMeshingEdges1, uint nbMeshingEdg std::cout<<"CoEdge::split("<saveVertexTopoProperty(icmd); - getVertex(1)->saveVertexTopoProperty(icmd); + const std::vector& vertices = getVertices(); + vertices[0]->saveVertexTopoProperty(icmd); + vertices[1]->saveVertexTopoProperty(icmd); Topo::Vertex* new_vertex1 = 0; Topo::Vertex* new_vertex2 = 0; @@ -486,15 +498,15 @@ std::vector CoEdge::split(uint nbMeshingEdges1, uint nbMeshingEdg if (getGeomAssociation()){ Geom::Curve* curve = dynamic_cast (getGeomAssociation()); if (curve){ - curve->getParametricsPoints(getVertex(0)->getCoord(), - getVertex(1)->getCoord(), + curve->getParametricsPoints(vertices[0]->getCoord(), + vertices[1]->getCoord(), 2, l_ratios, points); } else{ - points.push_back(getVertex(0)->getCoord() - + (getVertex(1)->getCoord() - getVertex(0)->getCoord()) * l_ratios[0]); - points.push_back(getVertex(0)->getCoord() - + (getVertex(1)->getCoord() - getVertex(0)->getCoord()) * l_ratios[1]); + points.push_back(vertices[0]->getCoord() + + (vertices[1]->getCoord() - vertices[0]->getCoord()) * l_ratios[0]); + points.push_back(vertices[0]->getCoord() + + (vertices[1]->getCoord() - vertices[0]->getCoord()) * l_ratios[1]); Geom::GeomProjectVisitor gpv0(points[0]); getGeomAssociation()->accept(gpv0); @@ -506,10 +518,10 @@ std::vector CoEdge::split(uint nbMeshingEdges1, uint nbMeshingEdg } } else { - points.push_back(getVertex(0)->getCoord() - + (getVertex(1)->getCoord() - getVertex(0)->getCoord()) * l_ratios[0]); - points.push_back(getVertex(0)->getCoord() - + (getVertex(1)->getCoord() - getVertex(0)->getCoord()) * l_ratios[1]); + points.push_back(vertices[0]->getCoord() + + (vertices[1]->getCoord() - vertices[0]->getCoord()) * l_ratios[0]); + points.push_back(vertices[0]->getCoord() + + (vertices[1]->getCoord() - vertices[0]->getCoord()) * l_ratios[1]); } delete [] l_ratios; @@ -557,14 +569,14 @@ std::vector CoEdge::split(uint nbMeshingEdges1, uint nbMeshingEdg // création de 3 nouvelles arêtes communes Topo::CoEdge *coedge1, *coedge2, *coedge3; if (!permutation){ - coedge1 = new Topo::CoEdge(getContext(), cemp1, getVertex(0), new_vertex1); + coedge1 = new Topo::CoEdge(getContext(), cemp1, vertices[0], new_vertex1); coedge2 = new Topo::CoEdge(getContext(), cemp2, new_vertex1, new_vertex2); - coedge3 = new Topo::CoEdge(getContext(), cemp3, new_vertex2, getVertex(1)); + coedge3 = new Topo::CoEdge(getContext(), cemp3, new_vertex2, vertices[1]); } else { - coedge1 = new Topo::CoEdge(getContext(), cemp1, getVertex(0), new_vertex2); + coedge1 = new Topo::CoEdge(getContext(), cemp1, vertices[0], new_vertex2); coedge2 = new Topo::CoEdge(getContext(), cemp2, new_vertex2, new_vertex1); - coedge3 = new Topo::CoEdge(getContext(), cemp3, new_vertex1, getVertex(1)); + coedge3 = new Topo::CoEdge(getContext(), cemp3, new_vertex1, vertices[1]); } if (icmd){ @@ -582,9 +594,9 @@ std::vector CoEdge::split(uint nbMeshingEdges1, uint nbMeshingEdg new_vertex2->setGeomAssociation(getGeomAssociation()); } - Utils::Container& groups = m_topo_property->getGroupsContainer(); + auto groups = m_topo_property->getGroupsContainer(); for (uint i=0; iadd(coedge1); gr->add(coedge2); gr->add(coedge3); @@ -598,36 +610,35 @@ std::vector CoEdge::split(uint nbMeshingEdges1, uint nbMeshingEdg delete cemp3; // on ajoute les 3 arêtes - for (uint i=0; igetRatio(this); + const std::vector& edges = getEdges(); + for (uint i=0; igetRatio(this); // cas où il faut reporter la semi conformité sur les nouvelles arêtes communes if (ratio != 1){ - getEdge(i)->saveEdgeMeshingProperty(icmd); - getEdge(i)->setRatio(coedge1, ratio); - getEdge(i)->setRatio(coedge2, ratio); - getEdge(i)->setRatio(coedge3, ratio); + edges[i]->saveEdgeMeshingProperty(icmd); + edges[i]->setRatio(coedge1, ratio); + edges[i]->setRatio(coedge2, ratio); + edges[i]->setRatio(coedge3, ratio); } - getEdge(i)->saveEdgeTopoProperty(icmd); - getEdge(i)->addCoEdge(coedge1); - getEdge(i)->addCoEdge(coedge2); - getEdge(i)->addCoEdge(coedge3); + edges[i]->saveEdgeTopoProperty(icmd); + edges[i]->addCoEdge(coedge1); + edges[i]->addCoEdge(coedge2); + edges[i]->addCoEdge(coedge3); - coedge1->addEdge(getEdge(i)); - coedge2->addEdge(getEdge(i)); - coedge3->addEdge(getEdge(i)); + coedge1->addEdge(edges[i]); + coedge2->addEdge(edges[i]); + coedge3->addEdge(edges[i]); } // on met de côté la liste des Edges touchées - std::vector edges; - getEdges(edges); + std::vector sauv_edges = getEdges(); // on supprime celle-ci (this) free(icmd); // remet les CoEdges dans l'ordre / arête - for (std::vector::iterator iter1 = edges.begin(); - iter1 != edges.end(); ++iter1) + for (auto iter1 = sauv_edges.begin(); iter1 != sauv_edges.end(); ++iter1) (*iter1)->sortCoEdges(); #ifdef _DEBUG_SPLIT @@ -665,14 +676,15 @@ split(std::vector nbMeshingEdges, Internal::InfoCommand* icmd) uint nbVerticesToCreate = nbMeshingEdges.size(); // on fait un pré-traitement pour les cas extrémité + const std::vector& vertices = getVertices(); std::vector newVertices; newVertices.resize(nbMeshingEdges.size()); if (nbMeshingEdges[0] == 0){ - newVertices[0] = getVertex(0); + newVertices[0] = vertices[0]; nbVerticesToCreate--; } else if (nbMeshingEdges[0] == getNbMeshingEdges()){ - newVertices[0] = getVertex(1); + newVertices[0] = vertices[1]; nbVerticesToCreate--; } else @@ -680,11 +692,11 @@ split(std::vector nbMeshingEdges, Internal::InfoCommand* icmd) if (nbMeshingEdges.size() == 2){ if (nbMeshingEdges[1] == 0){ - newVertices[1] = getVertex(0); + newVertices[1] = vertices[0]; nbVerticesToCreate--; } else if (nbMeshingEdges[1] == getNbMeshingEdges()){ - newVertices[1] = getVertex(1); + newVertices[1] = vertices[1]; nbVerticesToCreate--; } else @@ -708,11 +720,12 @@ split(std::vector nbMeshingEdges, Internal::InfoCommand* icmd) /*----------------------------------------------------------------------------*/ Topo::Vertex* CoEdge::getOppositeVertex(Topo::Vertex* v) const { - if (v == getVertex(0)){ - return getVertex(1); + const std::vector& vertices = getVertices(); + if (v == vertices[0]){ + return vertices[1]; } - else if (v == getVertex(1)){ - return getVertex(0); + else if (v == vertices[1]){ + return vertices[0]; } else{ std::cerr <<"CoEdge::getOppositeVertex("<getName()<<") dans "<<*this; @@ -721,38 +734,19 @@ Topo::Vertex* CoEdge::getOppositeVertex(Topo::Vertex* v) const return 0; } /*----------------------------------------------------------------------------*/ -void CoEdge:: -getBlocks(std::vector& blocks) const +std::vector CoEdge:: +getBlocks() const { - std::list l_b; - - std::vector local_edges; - getEdges(local_edges); - - for (std::vector::iterator iter1 = local_edges.begin(); - iter1 != local_edges.end(); ++iter1){ - std::vector loc_cofaces; - (*iter1)->getCoFaces(loc_cofaces); - - for (std::vector::iterator iter2 = loc_cofaces.begin(); - iter2 != loc_cofaces.end(); ++iter2){ - std::vector loc_faces; - (*iter2)->getFaces(loc_faces); - - for (std::vector::iterator iter3 = loc_faces.begin(); - iter3 != loc_faces.end(); ++iter3){ - std::vector loc_bl; - (*iter3)->getBlocks(loc_bl); - - l_b.insert(l_b.end(), loc_bl.begin(), loc_bl.end()); + Utils::EntitySet blocks(Utils::Entity::compareEntity); + for (Edge* edge : getEdges()){ + for (CoFace* loc_coface : edge->getCoFaces()){ + for (Face* face : loc_coface->getFaces()){ + std::vector loc_bl = face->getBlocks(); + blocks.insert(loc_bl.begin(), loc_bl.end()); } } } - - l_b.sort(Utils::Entity::compareEntity); - l_b.unique(); - - blocks.insert(blocks.end(),l_b.begin(),l_b.end()); + return Utils::toVect(blocks); } /*----------------------------------------------------------------------------*/ //#define _DEBUG_REPRESENTATION @@ -788,15 +782,16 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const indices.clear(); // NB: pas d'affichage dans le cas d'une arête avec un seul sommet - if (getNbVertices() < 2) + const std::vector& vertices = getVertices(); + if (vertices.size() < 2) return; if (tdr->hasRepresentation(Utils::DisplayRepresentation::WIRE)){ if (tdr->hasRepresentation(Utils::DisplayRepresentation::MINIMUMWIRE) && !tdr->hasRepresentation(Utils::DisplayRepresentation::SHOWMESHSHAPE)){ - points.push_back(getVertex(0)->getCoord()); - points.push_back(getVertex(1)->getCoord()); + points.push_back(vertices[0]->getCoord()); + points.push_back(vertices[1]->getCoord()); indices.push_back(0); indices.push_back(1); } else { @@ -827,7 +822,7 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const #ifdef _DEBUG_REPRESENTATION std::cout<<" SHOWASSOCIATION -> vers "<getName()<getCoord() + getVertex(1)->getCoord() ) / 2; + Utils::Math::Point pt1 = (vertices[0]->getCoord() + vertices[1]->getCoord() ) / 2; #ifdef _DEBUG_REPRESENTATION std::cout<<" pt1 "< &points, b #endif // dni->initCoeff(); - Utils::Math::Point pt0 = getVertex(0)->getCoord(); - Utils::Math::Point pt1 = getVertex(1)->getCoord(); + const std::vector& vertices = getVertices(); + Utils::Math::Point pt0 = vertices[0]->getCoord(); + Utils::Math::Point pt1 = vertices[1]->getCoord(); bool pt0_projected = false; bool pt1_projected = false; if (project){ - Geom::GeomEntity* ge0 = getVertex(0)->getGeomAssociation(); - if (ge0 && !getVertex(0)->isMeshed()){ + Geom::GeomEntity* ge0 = vertices[0]->getGeomAssociation(); + if (ge0 && !vertices[0]->isMeshed()){ Geom::GeomProjectVisitor gpv(pt0); ge0->accept(gpv); pt0 = gpv.getProjectedPoint(); pt0_projected = true; } - Geom::GeomEntity* ge1 = getVertex(1)->getGeomAssociation(); - if (ge1 && !getVertex(1)->isMeshed()){ + Geom::GeomEntity* ge1 = vertices[1]->getGeomAssociation(); + if (ge1 && !vertices[1]->isMeshed()){ Geom::GeomProjectVisitor gpv(pt1); ge1->accept(gpv); pt1 = gpv.getProjectedPoint(); @@ -1319,8 +1315,8 @@ getPoints(CoEdgeMeshingProperty* dni, std::vector &points, b Utils::Math::Point vect = (pt1 - pt0); #ifdef _DEBUG_GETPOINTS - std::cout<<" pt0 "<getName()<<": "<getName()<<": "<getName()<<": "<getName()<<": "< "<<(getGeomAssociation()?getGeomAssociation()->getName():"0")<getMeshLaw() "<getMeshLawName()< &points, b message << "Pb avec création d'une courbe par projection de " << getName() << " sur la surface " << ge->getName() << ".\n"; if (Utils::Math::MgxNumeric::isNearlyZero(vect.norme())) { - std::string n0 = getVertex(0)->getName(); - std::string n1 = getVertex(1)->getName(); - message << getVertex(0)->getName() << " et " << getVertex(1)->getName() << " sont confondus après projection.\n"; + std::string n0 = vertices[0]->getName(); + std::string n1 = vertices[1]->getName(); + message << vertices[0]->getName() << " et " << vertices[1]->getName() << " sont confondus après projection.\n"; } message << "Le pb est peut-être lié à une projection sur un demi cercle => couper l'arête en deux. "; @@ -1443,9 +1439,10 @@ getPoints(CoEdgeMeshingProperty* dni, std::vector &points, b // regarde si l'on est dans le cas de l'arête projetée sur l'intégralité de la courbe auto crv_vertices = curve->getVertices(); - if (getNbVertices() == 2 && crv_vertices.size() == 2 - && ( (getVertex(0)->getCoord() == crv_vertices[0]->getCoord() && getVertex(1)->getCoord() == crv_vertices[1]->getCoord()) - || (getVertex(0)->getCoord() == crv_vertices[1]->getCoord() && getVertex(1)->getCoord() == crv_vertices[0]->getCoord()) ) + auto vertices = getVertices(); + if (vertices.size() == 2 && crv_vertices.size() == 2 + && ( (vertices[0]->getCoord() == crv_vertices[0]->getCoord() && vertices[1]->getCoord() == crv_vertices[1]->getCoord()) + || (vertices[0]->getCoord() == crv_vertices[1]->getCoord() && vertices[1]->getCoord() == crv_vertices[0]->getCoord()) ) ){ dni->initCoeff(curve->getArea()); #ifdef _DEBUG_GETPOINTS @@ -1454,7 +1451,7 @@ getPoints(CoEdgeMeshingProperty* dni, std::vector &points, b } else if (curve->isLinear()) { // pas de pb pour le cas linéaire - double dist = getVertex(0)->getCoord().length(getVertex(1)->getCoord()); + double dist = vertices[0]->getCoord().length(vertices[1]->getCoord()); dni->initCoeff(dist); #ifdef _DEBUG_GETPOINTS std::cout<<" initCoeff cas linéaire avec dist"< &points, b } - double dist = getVertex(0)->getCoord().length(getVertex(1)->getCoord()); + double dist = vertices[0]->getCoord().length(vertices[1]->getCoord()); dni->initCoeff(dist); //dni->initCoeff(); #ifdef _DEBUG_GETPOINTS @@ -1841,8 +1838,8 @@ getPoints(CoEdgeMeshingProperty* dni, std::vector &points, b // recherche de la normale Utils::Math::Vector normale; - Topo::Vertex* vtx0 = getVertex(dni->getSide()); - Topo::Vertex* vtxN = getVertex(1-dni->getSide()); + Topo::Vertex* vtx0 = vertices[dni->getSide()]; + Topo::Vertex* vtxN = vertices[1-dni->getSide()]; Utils::Math::Point pt0 = vtx0->getCoord(); Utils::Math::Point ptN = vtxN->getCoord(); Utils::Math::Point vect = (ptN - pt0); @@ -1907,8 +1904,8 @@ getPoints(CoEdgeMeshingProperty* dni, std::vector &points, b else if (curves2.size() == 1){ // l'arête doit être dans le plan Z=0 - if (!Utils::Math::MgxNumeric::isNearlyZero(getVertex(0)->getCoord().getZ()) - || !Utils::Math::MgxNumeric::isNearlyZero(getVertex(1)->getCoord().getZ())){ + if (!Utils::Math::MgxNumeric::isNearlyZero(vertices[0]->getCoord().getZ()) + || !Utils::Math::MgxNumeric::isNearlyZero(vertices[1]->getCoord().getZ())){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message << "On ne sait pas définir la normale pour l'arête " < vtx; - getVertices(vtx); - - Utils::SerializedRepresentation topoRelation ("Relations topologiques", ""); - - Utils::SerializedRepresentation vertices ("Sommets topologiques", + auto vtx = getVertices(); + Utils::SerializedRepresentation topoRelation ("Relations topologiques", ""); + Utils::SerializedRepresentation vertices ("Sommets topologiques", TkUtil::NumericConversions::toStr(vtx.size())); - for (std::vector::iterator iter = vtx.begin( ); vtx.end( )!=iter; iter++) - vertices.addProperty ( - Utils::SerializedRepresentation::Property ( - (*iter)->getName ( ), *(*iter))); + for (auto iter = vtx.begin(); vtx.end()!=iter; iter++) + vertices.addProperty(Utils::SerializedRepresentation::Property((*iter)->getName(), *(*iter))); topoRelation.addPropertiesSet (vertices); if (Internal::InternalPreferences::instance ( )._displayEdge.getValue ( )){ - std::vector ed; - getEdges(ed); - - Utils::SerializedRepresentation edges ("Arêtes topologiques", + auto ed = getEdges(); + Utils::SerializedRepresentation edges ("Arêtes topologiques", TkUtil::NumericConversions::toStr(ed.size())); - for (std::vector::iterator iter = ed.begin( ); ed.end( )!=iter; iter++) - edges.addProperty ( - Utils::SerializedRepresentation::Property ( - (*iter)->getName ( ), *(*iter))); + for (auto iter = ed.begin(); ed.end()!=iter; iter++) + edges.addProperty(Utils::SerializedRepresentation::Property((*iter)->getName(), *(*iter))); topoRelation.addPropertiesSet (edges); } else { - std::vector fa; - getCoFaces(fa); - - Utils::SerializedRepresentation cofaces ("Faces topologiques", + auto fa = getCoFaces(); + Utils::SerializedRepresentation cofaces ("Faces topologiques", TkUtil::NumericConversions::toStr(fa.size())); - for (std::vector::iterator iter = fa.begin( ); fa.end( )!=iter; iter++) - cofaces.addProperty ( - Utils::SerializedRepresentation::Property ( - (*iter)->getName ( ), *(*iter))); + for (auto iter = fa.begin(); fa.end()!=iter; iter++) + cofaces.addProperty (Utils::SerializedRepresentation::Property((*iter)->getName(), *(*iter))); topoRelation.addPropertiesSet (cofaces); } description->addPropertiesSet (topoRelation); - std::vector grp = getGroups(); + auto grp = getGroups(); if (!grp.empty()){ - Utils::SerializedRepresentation groupe ("Relation vers les groupes", + Utils::SerializedRepresentation groupe ("Relation vers les groupes", TkUtil::NumericConversions::toStr(grp.size())); - for (std::vector::iterator iter = grp.begin( ); iter!=grp.end( ); ++iter) - groupe.addProperty ( - Utils::SerializedRepresentation::Property ( - (*iter)->getName ( ), *(*iter))); + for (auto iter = grp.begin(); iter!=grp.end(); ++iter) + groupe.addProperty (Utils::SerializedRepresentation::Property((*iter)->getName ( ), *(*iter))); description->addPropertiesSet (groupe); @@ -2368,11 +2350,13 @@ check() const if (isMeshed()) return; - for (uint i=0; icheck(); + const std::vector& vertices = getVertices(); + for (uint i=0; icheck(); - for (uint i=0; iisDestroyed()){ + const std::vector& edges = getEdges(); + for (uint i=0; iisDestroyed()){ std::cerr<<"CoEdge::check() pour l'arête commune "<getName(); - std::vector vertices; - getVertices(vertices); - for (Vertex* v : vertices) - infos._vertices.push_back(v->getName()); - - std::vector edges; - getEdges(edges); - for (Edge* e : edges) - infos._edges.push_back(e->getName()); - - std::vector cofaces; - getCoFaces(cofaces); - for (CoFace* f : cofaces) - infos._cofaces.push_back(f->getName()); - - std::vector blocks; - getBlocks(blocks); - for (Block* b : blocks) - infos._blocks.push_back(b->getName()); - return infos; } /*----------------------------------------------------------------------------*/ @@ -2556,7 +2524,8 @@ getNodes(Topo::Vertex* v1, Topo::Vertex* v2, gmds::Mesh& gmds_mesh = getContext().getMeshManager().getMesh()->getGMDSMesh(); - if (v1 == getVertex(0) && v2 == getVertex(1)){ + const std::vector& vertices = getVertices(); + if (v1 == vertices[0] && v2 == vertices[1]){ for (std::vector::iterator iter = m_mesh_data->nodes().begin(); iter != m_mesh_data->nodes().end(); ++iter) vectNd.push_back(gmds_mesh.get(*iter)); @@ -2565,7 +2534,7 @@ getNodes(Topo::Vertex* v1, Topo::Vertex* v2, std::cout<<" sens normal"<::reverse_iterator iter = m_mesh_data->nodes().rbegin(); iter != m_mesh_data->nodes().rend(); ++iter) vectNd.push_back(gmds_mesh.get(*iter)); @@ -2582,8 +2551,8 @@ getNodes(Topo::Vertex* v1, Topo::Vertex* v2, << v1->getName() << "\", " << v2->getName() << "\") avec l'arête " << getName() << " qui a comme sommets:"; - for (uint i=0; inodes().size() = "<nodes().size()< CoEdge::getAllVertices() const { -#ifdef _DEBUG - if (isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message << "CoEdge::getNbVertices() pour arête "<getVertexContainer().getNb(); -} -/*----------------------------------------------------------------------------*/ -void CoEdge::getAllVertices(std::vector& vertices, const bool unique) const -{ - vertices.clear(); - std::list l_v; + Utils::EntitySet vertices(Utils::Entity::compareEntity); const std::vector & local_vertices = getVertices(); - - l_v.insert(l_v.end(), local_vertices.begin(), local_vertices.end()); - - l_v.sort(Utils::Entity::compareEntity); - l_v.unique(); - - vertices.insert(vertices.end(),l_v.begin(),l_v.end()); + vertices.insert(local_vertices.begin(), local_vertices.end()); + return Utils::toVect(vertices); } /*----------------------------------------------------------------------------*/ -void CoEdge:: -getCoFaces(std::vector& cofaces) const +std::vector CoEdge:: +getCoFaces() const { - std::list l_f; - - std::vector edges; - getEdges(edges); - - for (std::vector::iterator iter1 = edges.begin(); - iter1 != edges.end(); ++iter1){ - std::vector loc_cofaces; - (*iter1)->getCoFaces(loc_cofaces); - - l_f.insert(l_f.end(), loc_cofaces.begin(), loc_cofaces.end()); + Utils::EntitySet cofaces(Utils::Entity::compareEntity); + for (Edge* e : getEdges()){ + const std::vector& loc_cofaces = e->getCoFaces(); + cofaces.insert(loc_cofaces.begin(), loc_cofaces.end()); } - - l_f.sort(Utils::Entity::compareEntity); - l_f.unique(); - - cofaces.insert(cofaces.end(),l_f.begin(),l_f.end()); -} -/*----------------------------------------------------------------------------*/ -uint CoEdge:: -getNbCofaces() const -{ - std::vector cofaces; - getCoFaces(cofaces); - return cofaces.size(); + return Utils::toVect(cofaces); } /*----------------------------------------------------------------------------*/ bool CoEdge:: @@ -2688,11 +2619,12 @@ computeRatio(const Utils::Math::Point& pt) // si la création des points ne peut se faire, on procède autrement // cela peut apparaitre si l'arête n'est que partiellement sur une surface par ex - if (getNbVertices() != 2) + const std::vector& vertices = getVertices(); + if (vertices.size() != 2) throw TkUtil::Exception (TkUtil::UTF8String ("Pas possible de projeter un point sur arête avec autre chose que 2 sommets", TkUtil::Charset::UTF_8)); - Point pt0 = getVertex(0)->getCoord(); - Point pt1 = getVertex(1)->getCoord(); + Point pt0 = vertices[0]->getCoord(); + Point pt1 = vertices[1]->getCoord(); double norme = (pt1-pt0).norme2(); double scale = (pt-pt0).dot(pt1-pt0); @@ -2703,118 +2635,40 @@ computeRatio(const Utils::Math::Point& pt) return scale/norme; } - -// if (getGeomAssociation()){ -// Geom::Curve* curve = dynamic_cast (getGeomAssociation()); -// if (curve){ -// double param1 = 0; -// double param2 = 0; -// curve->getParameter(getVertex(0)->getCoord(), param1); -// curve->getParameter(getVertex(getNbVertices()==1?0:1)->getCoord(), param2); -// -// Point ptProj; -// curve->project(pt, ptProj); -// -// double paramPt = 0; -// curve->getParameter(ptProj, paramPt); -// -//#ifdef _DEBUG_SPLIT -// std::cout<<"computeRatio entre "<getName()<<" et "< "<<(paramPt-param1)/(param2-param1)< points; -// getPoints(getMeshingProperty(), points, true); -// -// // vrai dès que l'on trouve le segment sur lequel est projeté le pt -// bool trouve = false; -// double long_tot = 0.0; -// double ratio_tot = 0.0; -// for (uint i=0; igetName()<<" et "< "<getCoord(); -// Point pt1 = getVertex(1)->getCoord(); -// -// double norme = (pt1-pt0).norme2(); -// double scale = (pt-pt0).dot(pt1-pt0); -// -//#ifdef _DEBUG_SPLIT -// std::cout<<"computeRatio entre "< "<& gn) const { TopoEntity::getGroupsName(gn); - for (uint i = 0; igetGroupsContainer().size(); ++i) - gn.push_back(m_topo_property->getGroupsContainer().get(i)->getName()); + for (auto gr : m_topo_property->getGroupsContainer()) + gn.push_back(gr->getName()); } /*----------------------------------------------------------------------------*/ void CoEdge::add(Group::Group1D* grp) { - m_topo_property->getGroupsContainer().add(grp); + m_topo_property->getGroupsContainer().push_back(grp); } /*----------------------------------------------------------------------------*/ void CoEdge::remove(Group::Group1D* grp) { - m_topo_property->getGroupsContainer().remove(grp); + Utils::remove(grp, m_topo_property->getGroupsContainer()); } /*----------------------------------------------------------------------------*/ int CoEdge::getNbGroups() const { - return m_topo_property->getGroupsContainer().getNb(); + return m_topo_property->getGroupsContainer().size(); } /*----------------------------------------------------------------------------*/ std::vector CoEdge::getGroups() const { - return m_topo_property->getGroupsContainer().get(); + return m_topo_property->getGroupsContainer(); } /*----------------------------------------------------------------------------*/ unsigned long CoEdge::getNbInternalMeshingNodes() { - if (getNbVertices() == 1 || getVertex(0) == getVertex(1)) + const std::vector& vertices = getVertices(); + if (vertices.size() == 1 || vertices[0] == vertices[1]) return getNbMeshingEdges(); else return getNbMeshingEdges() - 1; @@ -2948,8 +2802,7 @@ detectLoopReference(const Topo::CoEdge* coedge_dep, const Topo::CoEdge* coedge, } // vérifie que les coedges ne dépendent pas de coedge_dep - std::vector coedges_ref; - edge_ref->getCoEdges(coedges_ref); + std::vector coedges_ref = edge_ref->getCoEdges(); detectLoopReference(coedge_dep, coedges_ref, filtre_coedges); updateModificationTime(coedge, coedges_ref); } diff --git a/src/Core/Topo/CoFace.cpp b/src/Core/Topo/CoFace.cpp index 9e6ebcd5..85926de9 100644 --- a/src/Core/Topo/CoFace.cpp +++ b/src/Core/Topo/CoFace.cpp @@ -209,10 +209,10 @@ init(std::vector &edges, (*iter)->addCoFace(this); // on copie les arêtes - m_topo_property->getEdgeContainer().add(edges); + m_topo_property->getEdgeContainer() = edges; // on copie les sommets - m_topo_property->getVertexContainer().add(vertices); + m_topo_property->getVertexContainer() = vertices; getContext ( ).newGraphicalRepresentation (*this); } @@ -235,7 +235,7 @@ init(std::vector &edges) (*iter)->addCoFace(this); // on copie les arêtes - m_topo_property->getEdgeContainer().add(edges); + m_topo_property->getEdgeContainer() = edges; // dans le cas non structuré, on s'arrange pour que les arêtes soient ordonnées // (forment un ou plusieurs cycles), pas seulement suivant l'id @@ -246,12 +246,11 @@ init(std::vector &edges) // cas avec trou, on met juste les sommets dans l'ordre en évitant les doublons std::map filtre_sommets; - for (uint i=0; igetNbVertices(); j++){ - Topo::Vertex* som = getEdge(i)->getVertex(j); + for (Edge* edge : getEdges()){ + for (Topo::Vertex* som : edge->getVertices()){ if (filtre_sommets[som] == 0){ filtre_sommets[som] = 1; - m_topo_property->getVertexContainer().add(som); + m_topo_property->getVertexContainer().push_back(som); } } } @@ -271,47 +270,47 @@ init(std::vector &edges) // récupération des sommets ordonnés de manière équivalente aux arêtes // avec comme premiers sommets ceux de la première arête - if (getNbEdges()==0) + const std::vector& cf_edges = getEdges(); + if (cf_edges.size()==0) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne (pas d'arête), avec CoFace::CoFace", TkUtil::Charset::UTF_8)); - else if (getNbEdges()==1){ - if (getEdge(0)->getVertex(0) != getEdge(0)->getVertex(1)) + else if (cf_edges.size()==1){ + if (cf_edges[0]->getVertices()[0] != cf_edges[0]->getVertices()[1]) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne (une unique arête avec des sommets différents), avec CoFace::CoFace", TkUtil::Charset::UTF_8)); else - m_topo_property->getVertexContainer().add(getEdge(0)->getVertex(0)); + m_topo_property->getVertexContainer().push_back(cf_edges[0]->getVertices()[0]); } else { // recherche du sens de la première arête et du sommet commun avec la dernière - Edge* eN = getEdge(getNbEdges()-1); - Edge* e1 = getEdge(0); + Edge* eN = cf_edges[cf_edges.size()-1]; + Edge* e1 = cf_edges[0]; bool sens_normal; - if (e1->getVertex(0) == eN->getVertex(0) || e1->getVertex(0) == eN->getVertex(1)) + if (e1->getVertices()[0] == eN->getVertices()[0] || e1->getVertices()[0] == eN->getVertices()[1]) sens_normal = true; - else if (e1->getVertex(1) == eN->getVertex(0) || e1->getVertex(1) == eN->getVertex(1)) + else if (e1->getVertices()[1] == eN->getVertices()[0] || e1->getVertices()[1] == eN->getVertices()[1]) sens_normal = false; else{ std::cerr << "CoFace::init(...) pour "<::iterator iter = edges.begin(); - iter != edges.end(); ++iter) - std::cerr <<(**iter); + for (Edge* edge : edges) + std::cerr <<*edge; std::cerr <getVertex(0):getEdge(0)->getVertex(1)); - m_topo_property->getVertexContainer().add(som_commun); + Topo::Vertex* som_commun = (sens_normal?cf_edges[0]->getVertices()[0]:cf_edges[0]->getVertices()[1]); + m_topo_property->getVertexContainer().push_back(som_commun); // on boucle sur les arêtes en cherchant le sens de l'arête en fonction du sommet commun - for (uint i=0; igetName()<<" avec les sommets: "<getVertex(0)->getName()<<" et "<getVertex(1)->getName()<getName()<<" avec les sommets: "<getVertices()[0]->getName()<<" et "<getVertices()[1]->getName()<getName()<getVertex(0) == som_commun) + if (ei->getVertices()[0] == som_commun) sens_normal = true; - else if (ei->getVertex(1) == som_commun) + else if (ei->getVertices()[1] == som_commun) sens_normal = false; else { std::cout << "CoFace::init(...) pour "< &edges) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne (pas de sommet commun avec ième arête), avec CoFace::CoFace", TkUtil::Charset::UTF_8)); } // sommet commun avec l'arête suivante - som_commun = (sens_normal?ei->getVertex(1):ei->getVertex(0)); - m_topo_property->getVertexContainer().add(som_commun); + som_commun = (sens_normal?ei->getVertices()[1]:ei->getVertices()[0]); + m_topo_property->getVertexContainer().push_back(som_commun); } // // suppression du dernier sommet (aussi le premier) @@ -340,12 +339,11 @@ void CoFace:: sortEdges() { // std::cout <<"CoFace::sortEdges() \n"; - if (getNbEdges()<=1) + if (getEdges().size()<=1) return; // liste des arêtes initiales (sous forme de liste pour optimiser les erase()) - std::list initial_edges; - m_topo_property->getEdgeContainer().get(initial_edges); + std::list initial_edges = Utils::toList(m_topo_property->getEdgeContainer()); // arêtes ordonnées std::vector sorted_edges; @@ -369,12 +367,10 @@ sortEdges() for (std::list::iterator iter = initial_edges.begin(); iter != initial_edges.end(); ++iter){ - for (uint i=0; igetNbVertices(); i++){ + for (Topo::Vertex* vert_prec : prec_edge->getVertices()){ // un Vertex de l'Edge précédent - Topo::Vertex* vert_prec = prec_edge->getVertex(i); uint nb_com_vtx_i = 0; - for (uint j=0; j<(*iter)->getNbVertices(); j++){ - Topo::Vertex* vert_suiv = (*iter)->getVertex(j); + for (Topo::Vertex* vert_suiv : (*iter)->getVertices()){ if (vert_prec == vert_suiv) nb_com_vtx_i++; } @@ -405,11 +401,10 @@ sortEdges() } // end while (!m_edges.empty()) - if (getNbEdges() != sorted_edges.size()) + if (getEdges().size() != sorted_edges.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne dans CoFace::sortEdges(), vecteurs de tailles différentes", TkUtil::Charset::UTF_8)); - m_topo_property->getEdgeContainer().clear(); - m_topo_property->getEdgeContainer().add(sorted_edges); + m_topo_property->getEdgeContainer() = sorted_edges; } /*----------------------------------------------------------------------------*/ CoFace:: @@ -468,48 +463,49 @@ replace(Topo::Vertex* v1, Topo::Vertex* v2, bool propagate_up, bool propagate_do // if (isDestroyed()) // return; - for (uint i=0; i& vertices = getVertices(); + for (uint i=0; igetVertexContainer().find(v2)){ + if (Utils::contains(v2, getVertices())){ if (isStructured()){ - if (getNbVertices() == 4){ + if (vertices.size() == 4){ permuteToJmaxEdge(getEdge(v1,v2), icmd); - if (v1 == getVertex(0)) - m_topo_property->getVertexContainer().set(0, v2); + if (v1 == vertices[0]) + m_topo_property->getVertexContainer()[0] = v2; m_topo_property->getVertexContainer().resize(3); // suppression de l'arête m_topo_property->getEdgeContainer().resize(3); } else { - m_topo_property->getEdgeContainer().remove(getEdge(v1,v2), true); - m_topo_property->getVertexContainer().remove(v1, true); + Utils::remove(getEdge(v1,v2), m_topo_property->getEdgeContainer()); + Utils::remove(v1, m_topo_property->getVertexContainer()); } } else { permuteToLastEdge(getEdge(v1,v2), icmd); - if (v1 == getVertex(0)) - m_topo_property->getVertexContainer().set(0, v2); - uint new_size = m_topo_property->getVertexContainer().getNb()-1; + if (v1 == vertices[0]) + m_topo_property->getVertexContainer()[0] = v2; + uint new_size = m_topo_property->getVertexContainer().size()-1; m_topo_property->getVertexContainer().resize(new_size); m_topo_property->getEdgeContainer().resize(new_size); } } else - m_topo_property->getVertexContainer().set(i, v2); + m_topo_property->getVertexContainer()[i] = v2; - }// end if (v1 == getVertex(i)) + }// end if (v1 == vertices[i]) // transmet aux entités de niveau supérieur (les Faces) if (propagate_up) - for (uint j=0; jreplace(v1, v2, propagate_up, propagate_down, icmd); + for (uint j=0; jreplace(v1, v2, propagate_up, propagate_down, icmd); if (propagate_down) - for (uint j=0; jreplace(v1, v2, propagate_up, propagate_down, icmd); + for (uint j=0; jreplace(v1, v2, propagate_up, propagate_down, icmd); // // une des arêtes disparait // if (getNbVertices() == 2){ @@ -517,7 +513,7 @@ replace(Topo::Vertex* v1, Topo::Vertex* v2, bool propagate_up, bool propagate_do // } // destruction de la face si elle est dégénérée en une arête ou moins - if (getNbVertices()<3){ + if (vertices.size()<3){ // free(icmd); setDestroyed(true); if (icmd) @@ -534,10 +530,10 @@ replace(Edge* e1, Edge* e2, Internal::InfoCommand* icmd) if (isDestroyed()) return; - for (uint i=0; igetEdgeContainer().set(i, e2); + m_topo_property->getEdgeContainer()[i] = e2; e1->saveEdgeTopoProperty(icmd); e2->saveEdgeTopoProperty(icmd); @@ -551,8 +547,8 @@ replace(Edge* e1, Edge* e2, Internal::InfoCommand* icmd) void CoFace:: replace(CoEdge* e1, CoEdge* e2, Internal::InfoCommand* icmd) { - for (uint i=0; ireplace(e1, e2, icmd); + for (uint i=0; ireplace(e1, e2, icmd); } /*----------------------------------------------------------------------------*/ void CoFace:: @@ -568,22 +564,19 @@ merge(CoFace* coface, Internal::InfoCommand* icmd) // on remplace coface dans les faces qui référencent cette CoFace // On travaille sur une copie car il y a une mise à jour en même temps de la liste des faces - std::vector faces; - coface->getFaces(faces); + std::vector faces = coface->getFaces(); for (std::vector::iterator iter = faces.begin(); iter != faces.end(); ++iter) (*iter)->replace(coface, this, icmd); // il faut libérer les arêtes de la face commune qui disparait - std::vector edges; - coface->getEdges(edges); - + std::vector edges = coface->getEdges(); for (std::vector::iterator iter = edges.begin(); iter != edges.end(); ++iter){ (*iter)->saveEdgeTopoProperty(icmd); (*iter)->removeCoFace(coface); - if ((*iter)->getNbCoFaces() == 0){ + if ((*iter)->getCoFaces().size() == 0){ // cas où l'arête peut être supprimée (*iter)->free(icmd); } @@ -613,7 +606,7 @@ setDestroyed(bool b) return; // on retire la relation depuis les groupes - Utils::Container& groups = m_topo_property->getGroupsContainer(); + auto groups = m_topo_property->getGroupsContainer(); #ifdef _DEBUG2 std::cout<<"Les groupes:"; for (uint i=0; iremove(this); } else for (uint i=0; iadd(this); } @@ -659,15 +652,15 @@ free(Internal::InfoCommand* icmd) setDestroyed(true); // on supprime la face commune des relations des faces vers les faces communes - for (uint i=0; isaveFaceTopoProperty(icmd); - getFace(i)->removeCoFace(this, false); + for (uint i=0; isaveFaceTopoProperty(icmd); + getFaces()[i]->removeCoFace(this); } // idem entre arêtes et cette face commune - for (uint i=0; isaveEdgeTopoProperty(icmd); - getEdge(i)->removeCoFace(this, false); + for (uint i=0; isaveEdgeTopoProperty(icmd); + getEdges()[i]->removeCoFace(this); } clearDependancy(); @@ -716,11 +709,11 @@ split(eDirOnCoFace dir, std::vector& edges1, std::vector& edges3, // il faut supprimer les sommets sur un bord de la face std::vector vtx1bis; std::vector vtx2bis; - if (!find(vtx1[0])){ // on fait le test que sur un des sommets + if (!Utils::contains(vtx1[0], getVertices())){ // on fait le test que sur un des sommets vtx1bis.push_back(vtx1[0]); vtx2bis.push_back(vtx2[0]); } - if (!find(vtx1[1])){ + if (!Utils::contains(vtx1[1], getVertices())){ vtx1bis.push_back(vtx1[1]); vtx2bis.push_back(vtx2[1]); } @@ -770,13 +763,14 @@ split2(eDirOnCoFace dir, std::vector& edges1, std::vector& edges3, Edge* edge0 = 0; Edge* edge2 = 0; + const std::vector& edges = getEdges(); if (dir == i_dir){ - edge0 = getEdge(0); - edge2 = getEdge(2); + edge0 = edges[0]; + edge2 = edges[2]; } else { - edge0 = getEdge(1); - if (getNbEdges() == 4) - edge2 = getEdge(3); + edge0 = edges[1]; + if (edges.size() == 4) + edge2 = edges[3]; } #ifdef _DEBUG_SPLIT std::cout<<"edge0 : "<getName()<& edges1, std::vector& edges3, // récupération de la discrétisation d'une arête du bord CoEdgeMeshingProperty* cemp = 0; - bool edge0_isOnAxe = (Utils::Math::MgxNumeric::isNearlyZero(edge0->getVertex(0)->getY()) - && Utils::Math::MgxNumeric::isNearlyZero(edge0->getVertex(1)->getY())); - bool edge2_isOnAxe = (edge2 && Utils::Math::MgxNumeric::isNearlyZero(edge2->getVertex(0)->getY()) - && Utils::Math::MgxNumeric::isNearlyZero(edge2->getVertex(1)->getY())); + bool edge0_isOnAxe = (Utils::Math::MgxNumeric::isNearlyZero(edge0->getVertices()[0]->getY()) + && Utils::Math::MgxNumeric::isNearlyZero(edge0->getVertices()[1]->getY())); + bool edge2_isOnAxe = (edge2 && Utils::Math::MgxNumeric::isNearlyZero(edge2->getVertices()[0]->getY()) + && Utils::Math::MgxNumeric::isNearlyZero(edge2->getVertices()[1]->getY())); #ifdef _DEBUG_SPLIT std::cout<<"edge0_isOnAxe : "<getNbCoEdges() == 1 - && !(edge0->getCoEdge(0)->getMeshLaw() == CoEdgeMeshingProperty::interpolate // on évite l'interpolation vers l'axe + if (edge0->getCoEdges().size() == 1 + && !(edge0->getCoEdges()[0]->getMeshLaw() == CoEdgeMeshingProperty::interpolate // on évite l'interpolation vers l'axe && edge2_isOnAxe)){ - CoEdge* coedge0 = edge0->getCoEdge(0); + CoEdge* coedge0 = edge0->getCoEdges()[0]; #ifdef _DEBUG_SPLIT std::cout<<" Utilisation de la discrétisation de "<getName()<<" (edge0)"<getMeshingProperty()->clone(); // inverse le sens si nécessaire - if (edges1[0]->find(coedge0->getVertex(1)) - || edges1[1]->find(coedge0->getVertex(1)) ){ + Vertex* ce_vtx = coedge0->getVertices()[1]; + if (Utils::contains(ce_vtx, edges1[0]->getVertices()) + || Utils::contains(ce_vtx, edges1[1]->getVertices())){ cemp->setDirect(!coedge0->getMeshingProperty()->getDirect()); #ifdef _DEBUG_SPLIT std::cout<<" avec inversion du sens"<getNbCoEdges() == 1 - && !(edge2->getCoEdge(0)->getMeshLaw() == CoEdgeMeshingProperty::interpolate // on évite l'interpolation vers l'axe + else if (0 != edge2 && edge2->getCoEdges().size() == 1 + && !(edge2->getCoEdges()[0]->getMeshLaw() == CoEdgeMeshingProperty::interpolate // on évite l'interpolation vers l'axe && edge0_isOnAxe)){ - CoEdge* coedge2 = edge2->getCoEdge(0); + CoEdge* coedge2 = edge2->getCoEdges()[0]; #ifdef _DEBUG_SPLIT std::cout<<" Utilisation de la discrétisation de "<getName()<<" (edge2)"<getMeshingProperty()->clone(); - if (edges1[0]->find(coedge2->getVertex(1)) - || edges1[1]->find(coedge2->getVertex(1)) ){ + Vertex* ce_vtx = coedge2->getVertices()[1]; + if (Utils::contains(ce_vtx, edges1[0]->getVertices()) + || Utils::contains(ce_vtx, edges1[1]->getVertices())){ cemp->setDirect(!coedge2->getMeshingProperty()->getDirect()); #ifdef _DEBUG_SPLIT std::cout<<" avec inversion du sens"<& edges1, std::vector& edges3, edge = edge2; if (edge) { - std::vector coedgesName; - for (uint i=0; igetNbCoEdges(); i++) - coedgesName.push_back(edge->getCoEdge(i)->getName()); + std::vector coedgesName = Utils::toNames(edge->getCoEdges()); cemp = new EdgeMeshingPropertyInterpolate(edge->getNbMeshingEdges(), coedgesName); } } @@ -876,8 +870,8 @@ split2(eDirOnCoFace dir, std::vector& edges1, std::vector& edges3, } // on vérifie si c'est la première ou la deuxième Edge qui est en relation avec edge0 - bool edges1_sens = edge0->find(edges1[0]->getVertex(0)); - bool edges3_sens = (edges3.empty()?true:edge0->find(edges3[0]->getVertex(0))); + bool edges1_sens = Utils::contains(edges1[0]->getVertices()[0], edge0->getVertices()); + bool edges3_sens = (edges3.empty() ? true : Utils::contains(edges3[0]->getVertices()[0], edge0->getVertices())); // création des 2 nouvelles faces communes Topo::CoFace* coface1 = 0; @@ -929,9 +923,7 @@ split2(eDirOnCoFace dir, std::vector& edges1, std::vector& edges3, coface2->setGeomAssociation(getGeomAssociation()); } - Utils::Container& groups = m_topo_property->getGroupsContainer(); - for (uint i=0; igetGroupsContainer()){ gr->add(coface1); gr->add(coface2); coface1->add(gr); @@ -939,13 +931,13 @@ split2(eDirOnCoFace dir, std::vector& edges1, std::vector& edges3, } // on ajoute les 2 CoFaces aux faces - for (uint i=0; isaveFaceTopoProperty(icmd); - getFace(i)->addCoFace(coface1); - getFace(i)->addCoFace(coface2); + for (Face* f : getFaces()) { + f->saveFaceTopoProperty(icmd); + f->addCoFace(coface1); + f->addCoFace(coface2); - coface1->addFace(getFace(i)); - coface2->addFace(getFace(i)); + coface1->addFace(f); + coface2->addFace(f); } // destruction de la face commune actuelle @@ -989,13 +981,12 @@ split3(eDirOnCoFace dir, std::vector& edges1, std::vector& edges3, throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, CoFace::split3 devrait recevoir 2 groupes de 2 sommets", TkUtil::Charset::UTF_8)); // on met les sommets dans l'ordre pour éviter de croiser les arêtes - if (getNbVertices()==4){ + if (getVertices().size()==4){ // l'indice de l'arête dans laquelle sont les sommets de vtx1 uint ind_edge_vtx1=5; - for (uint i=0; i all_vtx; - getEdge(i)->getAllVertices(all_vtx); + for (uint i=0; i all_vtx = getEdges()[i]->getAllVertices(); for (uint j=0; j& edges1, std::vector& edges3, if (ind_edge_vtx1 == 5) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, CoFace::split3, on ne trouve pas vtx1[0] dans l'une des arêtes", TkUtil::Charset::UTF_8)); uint ind_edge_vtx2=5; - for (uint i=0; i all_vtx; - getEdge(i)->getAllVertices(all_vtx); + for (uint i=0; i all_vtx = getEdges()[i]->getAllVertices(); for (uint j=0; j& edges1, std::vector& edges3, std::vector coedges_between; std::vector innerVertices; - TopoHelper::getCoEdgesBetweenVertices(getVertex(ind_edge_vtx1), getVertex((ind_edge_vtx1+1)%4), - getEdge(ind_edge_vtx1)->getCoEdges(), coedges_between); + TopoHelper::getCoEdgesBetweenVertices(getVertices()[ind_edge_vtx1], getVertices()[(ind_edge_vtx1+1)%4], + getEdges()[ind_edge_vtx1]->getCoEdges(), coedges_between); TopoHelper::getInnerVertices(coedges_between, innerVertices); #ifdef _DEBUG_SPLIT std::cout<<" innerVertices pour ind_edge_vtx1 :"<& edges1, std::vector& edges3, bool vtx1_same_dir = (vtx1[0] == innerVertices[0]); coedges_between.clear(); innerVertices.clear(); - TopoHelper::getCoEdgesBetweenVertices(getVertex((ind_edge_vtx2+1)%4), getVertex(ind_edge_vtx2), - getEdge(ind_edge_vtx2)->getCoEdges(), coedges_between); + TopoHelper::getCoEdgesBetweenVertices(getVertices()[(ind_edge_vtx2+1)%4], getVertices()[ind_edge_vtx2], + getEdges()[ind_edge_vtx2]->getCoEdges(), coedges_between); TopoHelper::getInnerVertices(coedges_between, innerVertices); #ifdef _DEBUG_SPLIT std::cout<<" innerVertices pour ind_edge_vtx2 :"<& edges1, std::vector& edges3, vtx2[0] = vtx2[1]; vtx2[1] = vtxTmp; } - } // end if (getNbVertices()==4) + } // end if (getVertices().size()==4) Edge* edge0 = 0; Edge* edge2 = 0; + const std::vector& edges = getEdges(); if (dir == i_dir){ - edge0 = getEdge(0); - edge2 = getEdge(2); + edge0 = edges[0]; + edge2 = edges[2]; } else { - edge0 = getEdge(1); - if (getNbEdges() == 4) - edge2 = getEdge(3); + edge0 = edges[1]; + if (edges.size() == 4) + edge2 = edges[3]; } //std::cout<<"edge0 : "<getName()<getName()<getNbCoEdges() == 1){ - cemp = edge0->getCoEdge(0)->getMeshingProperty()->clone(); + if (edge0->getCoEdges().size() == 1){ + cemp = edge0->getCoEdges()[0]->getMeshingProperty()->clone(); // inverse le sens si nécessaire - if (edges1[0]->find(edge0->getVertex(1)) - || edges1[1]->find(edge0->getVertex(1)) ) + if (Utils::contains(edge0->getVertices()[1], edges1[0]->getVertices()) + || Utils::contains(edge0->getVertices()[1], edges1[1]->getVertices())) cemp->setDirect(!edge0->getMeshingProperty()->getDirect()); } - else if (0 != edge2 && edge2->getNbCoEdges() == 1){ - cemp = edge2->getCoEdge(0)->getMeshingProperty()->clone(); - if (edges1[0]->find(edge2->getVertex(1)) - || edges1[1]->find(edge2->getVertex(1)) ) + else if (0 != edge2 && edge2->getCoEdges().size() == 1){ + cemp = edge2->getCoEdges()[0]->getMeshingProperty()->clone(); + if (Utils::contains(edge2->getVertices()[1], edges1[0]->getVertices()) + || Utils::contains(edge2->getVertices()[1], edges1[1]->getVertices())) cemp->setDirect(!edge2->getMeshingProperty()->getDirect()); } else @@ -1104,14 +1095,15 @@ split3(eDirOnCoFace dir, std::vector& edges1, std::vector& edges3, } // on vérifie si c'est la première ou la dernière Edge qui est en relation avec edge0 - bool edges1_sens = edge0->find(edges1[0]->getVertex(0)); - bool edges3_sens = (edges3.empty()?true:edge0->find(edges3[0]->getVertex(0))); + bool edges1_sens = Utils::contains(edges1[0]->getVertices()[0], edge0->getVertices()); + bool edges3_sens = (edges3.empty() ? true : Utils::contains(edges3[0]->getVertices()[0], edge0->getVertices())); // on regarde s'il faut permuter ou non l'ordre des newEdge1 et newEdge2 bool newEdges_sens; - if (edges1[edges1_sens?0:2]->find(vtx1[0]) || edges1[edges1_sens?0:2]->find(vtx2[0])) + const std::vector& ed_vertices = edges1[edges1_sens?0:2]->getVertices(); + if (Utils::contains(vtx1[0], ed_vertices) || Utils::contains(vtx2[0], ed_vertices)) newEdges_sens = true; - else if (edges1[edges1_sens?0:2]->find(vtx1[1]) || edges1[edges1_sens?0:2]->find(vtx2[1])) + else if (Utils::contains(vtx1[1], ed_vertices) || Utils::contains(vtx2[1], ed_vertices)) newEdges_sens = false; else throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, CoFace::split3 on ne trouve pas l'ordre pour les nouvelles arêtes", TkUtil::Charset::UTF_8)); @@ -1183,9 +1175,7 @@ split3(eDirOnCoFace dir, std::vector& edges1, std::vector& edges3, coface3->setGeomAssociation(getGeomAssociation()); } - Utils::Container& groups = m_topo_property->getGroupsContainer(); - for (uint i=0; igetGroupsContainer()){ gr->add(coface1); gr->add(coface2); gr->add(coface3); @@ -1195,15 +1185,15 @@ split3(eDirOnCoFace dir, std::vector& edges1, std::vector& edges3, } // on ajoute les 3 CoFaces aux faces - for (uint i=0; isaveFaceTopoProperty(icmd); - getFace(i)->addCoFace(coface1); - getFace(i)->addCoFace(coface2); - getFace(i)->addCoFace(coface3); + for (Face* f : getFaces()) { + f->saveFaceTopoProperty(icmd); + f->addCoFace(coface1); + f->addCoFace(coface2); + f->addCoFace(coface3); - coface1->addFace(getFace(i)); - coface2->addFace(getFace(i)); - coface3->addFace(getFace(i)); + coface1->addFace(f); + coface2->addFace(f); + coface3->addFace(f); } // destruction de la face commune actuelle @@ -1268,13 +1258,14 @@ splitOgrid(eDirOnCoFace dir, #endif std::vector splitingEdges; + Topo::Vertex* face_vtx0 = getVertices()[0]; if (edges1.size() == 2){ // cas de la création de 3 faces en Ogrid // création du sommet au centre de la face (sommet du o-grid) - Utils::Math::Point pt = getVertex(0)->getCoord() - + (vtx1[0]->getCoord() - getVertex(0)->getCoord()) * ratio; + Utils::Math::Point pt = face_vtx0->getCoord() + + (vtx1[0]->getCoord() - face_vtx0->getCoord()) * ratio; Topo::Vertex* new_vertex = new Topo::Vertex(getContext(), pt); #ifdef _DEBUG_SPLIT @@ -1303,10 +1294,10 @@ splitOgrid(eDirOnCoFace dir, } // on vérifie si c'est la première ou la deuxième Edge qui est en relation avec le sommet à la dégénérescence - bool edges0_sens = edges0[0]->find(getVertex(0)); - bool edges2_sens = edges2[0]->find(getVertex(0)); + bool edges0_sens = Utils::contains(face_vtx0, edges0[0]->getVertices()); + bool edges2_sens = Utils::contains(face_vtx0, edges2[0]->getVertices()); // on vérifie si c'est la première ou la deuxième Edge qui est en relation avec edges0 - bool edges1_sens = edges1[0]->find(getVertex(1)); + bool edges1_sens = Utils::contains(getVertices()[1], edges1[0]->getVertices()); // on ajuste les discrétisations // on conserve celles sur le côté opposé à la dégénérescence (le 1) @@ -1318,9 +1309,9 @@ splitOgrid(eDirOnCoFace dir, uint nbMeshingEdges0 = edge0->getNbMeshingEdges(); uint nbMeshingEdges1 = edge1->getNbMeshingEdges(); - if (edge0->getNbCoEdges() != 1) + if (edge0->getCoEdges().size() != 1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, CoFace::splitOgrid on a edges0 composée de plusieurs arêtes communes", TkUtil::Charset::UTF_8)); - CoEdge* coedge0 = edge0->getCoEdge(0); + CoEdge* coedge0 = edge0->getCoEdges()[0]; #ifdef _DEBUG_SPLIT std::cout<<"coedge0 : "<getName()<getCoEdge(0); + CoEdge* coedge2 = edge2->getCoEdges()[0]; #ifdef _DEBUG_SPLIT std::cout<<"coedge2 : "<getName()<getNbCoEdges() != 1) + if (edge0->getCoEdges().size() != 1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, CoFace::splitOgrid on a edges0 composée de plusieurs arêtes communes", TkUtil::Charset::UTF_8)); - CoEdge* coedge0 = edge0->getCoEdge(0); - CoEdge* coedge2 = edge2->getCoEdge(0); + CoEdge* coedge0 = edge0->getCoEdges()[0]; + CoEdge* coedge2 = edge2->getCoEdges()[0]; #ifdef _DEBUG_SPLIT std::cout<<"coedge0 : "<getName()<getName()<getNbMeshingEdges() != coedge0->getNbMeshingEdges()){ - if (coedge2->getNbEdges() == 1){ + if (coedge2->getEdges().size() == 1){ CoEdgeMeshingProperty* cmp = coedge2->setProperty(coedge0->getMeshingProperty()->clone()); delete cmp; } @@ -1380,23 +1371,23 @@ splitOgrid(eDirOnCoFace dir, // Création des 3 coedges CoEdge* coedge1 = new Topo::CoEdge(getContext(), - edges0[edges0_sens?1:0]->getCoEdge(0)->getMeshingProperty(), + edges0[edges0_sens?1:0]->getCoEdges()[0]->getMeshingProperty(), new_vertex, vtx1[0]); - if (edges0[edges0_sens?1:0]->getNbCoEdges() != 1) + if (edges0[edges0_sens?1:0]->getCoEdges().size() != 1) TopoHelper::copyMeshingProperty(edges0[edges0_sens?1:0] ,coedge1); Topo::Edge* newEdge1 = new Topo::Edge(getContext(), coedge1); CoEdge* coedge0 = new Topo::CoEdge(getContext(), - edges2[edges2_sens?0:1]->getCoEdge(0)->getMeshingProperty(), + edges2[edges2_sens?0:1]->getCoEdges()[0]->getMeshingProperty(), new_vertex, vtx0[0]); - if (edges2[edges2_sens?0:1]->getNbCoEdges() != 1) + if (edges2[edges2_sens?0:1]->getCoEdges().size() != 1) TopoHelper::copyMeshingProperty(edges2[edges2_sens?0:1] ,coedge0); Topo::Edge* newEdge0 = new Topo::Edge(getContext(), coedge0); CoEdge* coedge2 = new Topo::CoEdge(getContext(), - edges0[edges0_sens?0:1]->getCoEdge(0)->getMeshingProperty(), + edges0[edges0_sens?0:1]->getCoEdges()[0]->getMeshingProperty(), new_vertex, vtx2[0]); - if (edges0[edges0_sens?0:1]->getNbCoEdges() != 1) + if (edges0[edges0_sens?0:1]->getCoEdges().size() != 1) TopoHelper::copyMeshingProperty(edges0[edges0_sens?0:1] ,coedge2); Topo::Edge* newEdge2 = new Topo::Edge(getContext(), coedge2); @@ -1460,9 +1451,7 @@ splitOgrid(eDirOnCoFace dir, new_vertex->setGeomAssociation(getGeomAssociation()); } - Utils::Container& groups = m_topo_property->getGroupsContainer(); - for (uint i=0; igetGroupsContainer()){ gr->add(coface0); gr->add(coface1); gr->add(coface2); @@ -1479,10 +1468,10 @@ splitOgrid(eDirOnCoFace dir, // cas de la création de 4 faces en Ogrid // création des 2 sommets au centre de la face (sommet du o-grid) - Utils::Math::Point pt1 = getVertex(0)->getCoord() - + (vtx1[0]->getCoord() - getVertex(0)->getCoord()) * ratio; - Utils::Math::Point pt2 = getVertex(0)->getCoord() - + (vtx1[1]->getCoord() - getVertex(0)->getCoord()) * ratio; + Utils::Math::Point pt1 = face_vtx0->getCoord() + + (vtx1[0]->getCoord() - face_vtx0->getCoord()) * ratio; + Utils::Math::Point pt2 = face_vtx0->getCoord() + + (vtx1[1]->getCoord() - face_vtx0->getCoord()) * ratio; std::vector new_vtx; new_vtx.push_back(new Topo::Vertex(getContext(), pt1)); @@ -1494,14 +1483,14 @@ splitOgrid(eDirOnCoFace dir, } // on vérifie si c'est la première ou la deuxième Edge qui est en relation avec le sommet à la dégénérescence - bool edges0_sens = edges0[0]->find(getVertex(0)); - bool edges2_sens = edges2[0]->find(getVertex(0)); + bool edges0_sens = Utils::contains(face_vtx0, edges0[0]->getVertices()); + bool edges2_sens = Utils::contains(face_vtx0, edges2[0]->getVertices()); // le sommet opposé au centre sur edges0 - Topo::Vertex* vtx_edges0_opp = edges0[edges0_sens?1:0]->getOppositeVertex(edges0[edges0_sens?0:1]->getOppositeVertex(getVertex(0))); + Topo::Vertex* vtx_edges0_opp = edges0[edges0_sens?1:0]->getOppositeVertex(edges0[edges0_sens?0:1]->getOppositeVertex(face_vtx0)); // on vérifie si c'est la première (ou la troisième) Edge qui est en relation avec edges0 - bool edges1_sens = edges1[0]->find(vtx_edges0_opp); + bool edges1_sens = Utils::contains(vtx_edges0_opp, edges1[0]->getVertices()); // vrai si vtx1[0] relié à l'arête elle même reliée au premier sommet - bool vtx1_sens = edges1[edges1_sens?0:2]->find(vtx1[0]); + bool vtx1_sens = Utils::contains(vtx1[0], edges1[edges1_sens?0:2]->getVertices()); #ifdef _DEBUG_SPLIT std::cout<<" edges0_sens = "<<(edges0_sens?"vrai":"faux")<getNbMeshingEdges(); uint nbMeshingEdges1 = edge1->getNbMeshingEdges(); if (nbMeshingEdges1 != nbMeshingEdges0 + nbMeshingEdges2){ - if (edge0->getNbCoEdges() != 1 || edge2->getNbCoEdges() != 1) + if (edge0->getCoEdges().size() != 1 || edge2->getCoEdges().size() != 1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, CoFace::splitOgrid on a edges0 ou edges2 composée de plusieurs arêtes communes", TkUtil::Charset::UTF_8)); @@ -1544,8 +1533,8 @@ splitOgrid(eDirOnCoFace dir, uint n2 = nbMeshingEdges1 - n1; Topo::CoEdgeMeshingProperty* cmp1 = new Topo::EdgeMeshingPropertyUniform(n1); Topo::CoEdgeMeshingProperty* cmp2 = new Topo::EdgeMeshingPropertyUniform(n2); - cmp1 = edge0->getCoEdge(0)->setProperty(cmp1); - cmp2 = edge2->getCoEdge(0)->setProperty(cmp2); + cmp1 = edge0->getCoEdges()[0]->setProperty(cmp1); + cmp2 = edge2->getCoEdges()[0]->setProperty(cmp2); delete cmp1; delete cmp2; } @@ -1554,44 +1543,44 @@ splitOgrid(eDirOnCoFace dir, // Création des 5 coedges CoEdge* coedge1 = new Topo::CoEdge(getContext(), - edges0[edges0_sens?1:0]->getCoEdge(0)->getMeshingProperty(), + edges0[edges0_sens?1:0]->getCoEdges()[0]->getMeshingProperty(), new_vtx[vtx1_sens?0:1], vtx1[vtx1_sens?0:1]); - if (edges0[edges0_sens?1:0]->getNbCoEdges() != 1) + if (edges0[edges0_sens?1:0]->getCoEdges().size() != 1) TopoHelper::copyMeshingProperty(edges0[edges0_sens?1:0] ,coedge1); Topo::Edge* newEdge1 = new Topo::Edge(getContext(), coedge1); CoEdge* coedge2 = new Topo::CoEdge(getContext(), - edges0[edges0_sens?1:0]->getCoEdge(0)->getMeshingProperty(), + edges0[edges0_sens?1:0]->getCoEdges()[0]->getMeshingProperty(), new_vtx[vtx1_sens?1:0], vtx1[vtx1_sens?1:0]); - if (edges0[edges0_sens?1:0]->getNbCoEdges() != 1) + if (edges0[edges0_sens?1:0]->getCoEdges().size() != 1) TopoHelper::copyMeshingProperty(edges0[edges0_sens?1:0] ,coedge2); Topo::Edge* newEdge2 = new Topo::Edge(getContext(), coedge2); CoEdge* coedge3 = new Topo::CoEdge(getContext(), - edges1[0]->getCoEdge(0)->getMeshingProperty(), + edges1[0]->getCoEdges()[0]->getMeshingProperty(), new_vtx[vtx1_sens?0:1], vtx0[0]); - if (edges1[0]->getNbCoEdges() != 1) + if (edges1[0]->getCoEdges().size() != 1) TopoHelper::copyMeshingProperty(edges1[0] ,coedge3); Topo::Edge* newEdge3 = new Topo::Edge(getContext(), coedge3); CoEdge* coedge4 = new Topo::CoEdge(getContext(), - edges1[1]->getCoEdge(0)->getMeshingProperty(), + edges1[1]->getCoEdges()[0]->getMeshingProperty(), new_vtx[0], new_vtx[1]); - if (edges1[1]->getNbCoEdges() != 1) + if (edges1[1]->getCoEdges().size() != 1) TopoHelper::copyMeshingProperty(edges1[1] ,coedge4); Topo::Edge* newEdge4 = new Topo::Edge(getContext(), coedge4); CoEdge* coedge5 = new Topo::CoEdge(getContext(), - edges1[0]->getCoEdge(0)->getMeshingProperty(), + edges1[0]->getCoEdges()[0]->getMeshingProperty(), new_vtx[vtx1_sens?1:0], vtx2[0]); - if (edges1[0]->getNbCoEdges() != 1) + if (edges1[0]->getCoEdges().size() != 1) TopoHelper::copyMeshingProperty(edges1[0] ,coedge5); Topo::Edge* newEdge5 = new Topo::Edge(getContext(), coedge5); // l'arête de part et d'autre du sommet dégénéré std::vector coedges6; - coedges6.push_back(edges0[edges0_sens?0:1]->getCoEdge(0)); - coedges6.push_back(edges2[edges2_sens?0:1]->getCoEdge(0)); + coedges6.push_back(edges0[edges0_sens?0:1]->getCoEdges()[0]); + coedges6.push_back(edges2[edges2_sens?0:1]->getCoEdges()[0]); Topo::Edge* newEdge6 = new Topo::Edge(getContext(), vtx0[0], vtx2[0], coedges6); // destruction des 2 Edges inutilisées edges0[edges0_sens?0:1]->free(icmd); @@ -1679,9 +1668,7 @@ splitOgrid(eDirOnCoFace dir, new_vtx[1]->setGeomAssociation(getGeomAssociation()); } - Utils::Container& groups = m_topo_property->getGroupsContainer(); - for (uint i=0; igetGroupsContainer()){ gr->add(coface0); gr->add(coface1); gr->add(coface2); @@ -1706,27 +1693,25 @@ splitOgrid(eDirOnCoFace dir, return splitingEdges; } /*----------------------------------------------------------------------------*/ -uint CoFace::getNbVertices() const +void CoFace::addEdge(Edge* e) { -#ifdef _DEBUG - if (isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message << "CoFace::getNbVertices() pour face "<getVertexContainer().getNb(); + m_topo_property->getEdgeContainer().push_back(e); +} +/*----------------------------------------------------------------------------*/ +void CoFace::removeEdge(Edge* e) +{ + Utils::remove(e, m_topo_property->getEdgeContainer()); } /*----------------------------------------------------------------------------*/ Edge* CoFace:: getEdge(Topo::Vertex* v1, Topo::Vertex* v2) const { - for(unsigned int i=0; i getNbVertices() == 2){ - Topo::Vertex* s1 = getEdge(i)->getVertex(0); - Topo::Vertex* s2 = getEdge(i)->getVertex(1); + for(Edge* e : getEdges()){ + if (e->getVertices().size() == 2){ + Topo::Vertex* s1 = e->getVertices()[0]; + Topo::Vertex* s2 = e->getVertices()[1]; if ((s1 == v1 && s2 == v2) || (s1 == v2 && s2 == v1)) - return getEdge(i); + return e; } } @@ -1746,32 +1731,38 @@ getEdge(Topo::Vertex* v1, Topo::Vertex* v2) const Edge* CoFace:: getEdgeContaining(const CoEdge* coedge) const { - for(unsigned int i=0; i find(coedge)) - return getEdge(i); + for(Edge* e : getEdges()) + if (Utils::contains(coedge, e->getCoEdges())) + return e; throw TkUtil::Exception (TkUtil::UTF8String ("CoFace::getEdgeContaining(coedge) ne trouve l'arête contenant cette arête commune", TkUtil::Charset::UTF_8)); } /*----------------------------------------------------------------------------*/ +uint CoFace:: +getIndex(CoEdge* coedge) const +{ + return Utils::getIndexOf(getEdgeContaining(coedge), getEdges()); +} +/*----------------------------------------------------------------------------*/ Edge* CoFace:: getOppositeEdge(Edge* e) const { if (!isStructured()) return 0; - if (getNbEdges() == 3){ - if (e == getEdge(0)) - return getEdge(2); - else if (e == getEdge(2)) - return getEdge(1); + const std::vector& edges = getEdges(); + if (edges.size() == 3){ + if (e == edges[0]) + return edges[2]; + else if (e == edges[2]) + return edges[1]; else return 0; } else for (uint i=0; i<4; i++) { - Edge* e1 = getEdge(i); - if (e1 == e) - return getEdge((i+2)%4); + if (edges[i] == e) + return edges[(i+2)%4]; } // on a échoué @@ -1794,27 +1785,26 @@ getOppositeCoEdge(CoEdge* coedge_dep, bool& inverse_sens) const uint cote_dep = getIndex(coedge_dep); // on sort si on fait face au côté dégénéré - if (getNbEdges()==3 && cote_dep == 1) + const std::vector& edges = getEdges(); + if (edges.size()==3 && cote_dep == 1) return coedge_opp; uint cote_opp = (cote_dep+2)%4; // récupération des sommets de la face avec le dernier sommet dupliqué pour le cas dégénéré - std::vector vertices; - getVertices(vertices); + std::vector vertices = getVertices(); if (vertices.size() == 3) vertices.push_back(vertices[0]); - Edge* edge_dep = getEdge(cote_dep); - Edge* edge_opp = getEdge(cote_opp); + Edge* edge_dep = edges[cote_dep]; + Edge* edge_opp = edges[cote_opp]; // recherche des arêtes triées côté départ Vertex* vtx1_dep = vertices[cote_dep]; Vertex* vtx2_dep = vertices[(cote_dep+1)%4]; //std::cout<<"vtx1_dep = "<getName()<getName()<<" - "<getName()< points_edge2; edge1->getPoints(points_edge1); edge2->getPoints(points_edge2); - if (edge1->getVertex(0) == getVertex(1) - || edge1->getVertex(1) == getVertex(lastId)) + if (edge1->getVertices()[0] == vertices[1] + || edge1->getVertices()[1] == vertices[lastId]) vect1 = Utils::Math::Vector(points_edge1[0], points_edge1[1]); - else if (edge1->getVertex(1) == getVertex(1) - || edge1->getVertex(0) == getVertex(lastId)) + else if (edge1->getVertices()[1] == vertices[1] + || edge1->getVertices()[0] == vertices[lastId]) vect1 = Utils::Math::Vector(points_edge1[points_edge1.size()-1], points_edge1[points_edge1.size()-2]); else { @@ -2073,11 +2056,11 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const throw TkUtil::Exception(messErr); } - if (edge2->getVertex(0) == getVertex(1) - || edge2->getVertex(1) == getVertex(lastId)) + if (edge2->getVertices()[0] == vertices[1] + || edge2->getVertices()[1] == vertices[lastId]) vect2 = Utils::Math::Vector(points_edge2[0], points_edge2[1]); - else if (edge2->getVertex(1) == getVertex(1) - || edge2->getVertex(0) == getVertex(lastId)) + else if (edge2->getVertices()[1] == vertices[1] + || edge2->getVertices()[0] == vertices[lastId]) vect2 = Utils::Math::Vector(points_edge2[points_edge2.size()-1], points_edge2[points_edge2.size()-2]); else { @@ -2087,16 +2070,16 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const throw TkUtil::Exception(messErr); } - if (edge1->getVertex(1) == getVertex(lastId) || edge1->getVertex(0) == getVertex(lastId)){ + if (edge1->getVertices()[1] == vertices[lastId] || edge1->getVertices()[0] == vertices[lastId]){ vect2 *= -1; - if (edge1->getVertex(1) == getVertex(0) || edge1->getVertex(0) == getVertex(0)) + if (edge1->getVertices()[1] == vertices[0] || edge1->getVertices()[0] == vertices[0]) orig = points[0]; else orig = points[2]; } - else if (edge2->getVertex(1) == getVertex(lastId) || edge2->getVertex(0) == getVertex(lastId)){ + else if (edge2->getVertices()[1] == vertices[lastId] || edge2->getVertices()[0] == vertices[lastId]){ vect1 *= -1; - if (edge2->getVertex(1) == getVertex(0) || edge2->getVertex(0) == getVertex(0)) + if (edge2->getVertices()[1] == vertices[0] || edge2->getVertices()[0] == vertices[0]) orig = points[0]; else orig = points[2]; @@ -2163,8 +2146,7 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const else { // recherche de 2 vecteurs - std::vector coedges; - getCoEdges(coedges, false); + std::vector coedges = getCoEdges(); if (coedges.size() == 1){ CoEdge* coedge1 = coedges[0]; std::vector points_coedge1; @@ -2185,9 +2167,10 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const std::vector points_coedge2; coedge1->getPoints(points_coedge1); coedge2->getPoints(points_coedge2); - if (coedge1->getVertex(0) == getVertex(1)) + const std::vector& vertices = getVertices(); + if (coedge1->getVertices()[0] == vertices[1]) vect1 = Utils::Math::Vector(points_coedge1[0], points_coedge1[1]); - else if (coedge1->getVertex(1) == getVertex(1)) + else if (coedge1->getVertices()[1] == vertices[1]) vect1 = Utils::Math::Vector(points_coedge1[points_coedge1.size()-1], points_coedge1[points_coedge1.size()-2]); else { @@ -2197,9 +2180,9 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const throw TkUtil::Exception(messErr); } - if (coedge2->getVertex(0) == getVertex(1)) + if (coedge2->getVertices()[0] == vertices[1]) vect2 = Utils::Math::Vector(points_coedge2[0], points_coedge2[1]); - else if (coedge2->getVertex(1) == getVertex(1)) + else if (coedge2->getVertices()[1] == vertices[1]) vect2 = Utils::Math::Vector(points_coedge2[points_coedge2.size()-1], points_coedge2[points_coedge2.size()-2]); else { @@ -2334,36 +2317,30 @@ getDescription (bool alsoComputed) const Utils::SerializedRepresentation topoRelation ("Relations topologiques", ""); - std::vector vtx; - getVertices(vtx); - + const std::vector& vtx = getVertices(); Utils::SerializedRepresentation vertices ("Sommets topologiques", TkUtil::NumericConversions::toStr(vtx.size())); - for (std::vector::iterator iter = vtx.begin( ); vtx.end( )!=iter; iter++) + for (auto iter = vtx.begin( ); vtx.end( )!=iter; iter++) vertices.addProperty ( Utils::SerializedRepresentation::Property ( (*iter)->getName ( ), *(*iter))); topoRelation.addPropertiesSet (vertices); if (Internal::InternalPreferences::instance ( )._displayEdge.getValue ( )){ - std::vector ed; - getEdges(ed); - + const std::vector& ed = getEdges(); Utils::SerializedRepresentation edges ("Arêtes topologiques", TkUtil::NumericConversions::toStr(ed.size())); - for (std::vector::iterator iter = ed.begin( ); ed.end( )!=iter; iter++) + for (auto iter = ed.begin( ); ed.end( )!=iter; iter++) edges.addProperty ( Utils::SerializedRepresentation::Property ( (*iter)->getName ( ), *(*iter))); topoRelation.addPropertiesSet (edges); } else { - std::vector ce; - getCoEdges(ce, false); - + std::vector ce = getCoEdges(); Utils::SerializedRepresentation coedges ("Arêtes topologiques", TkUtil::NumericConversions::toStr(ce.size())); - for (std::vector::iterator iter = ce.begin( ); ce.end( )!=iter; iter++) + for (auto iter = ce.begin( ); ce.end( )!=iter; iter++) coedges.addProperty ( Utils::SerializedRepresentation::Property ( (*iter)->getName ( ), *(*iter))); @@ -2371,14 +2348,11 @@ getDescription (bool alsoComputed) const } if (Internal::InternalPreferences::instance ( )._displayFace.getValue ( )){ - std::vector fa; - getFaces(fa); - + std::vector fa = getFaces(); if (!fa.empty()){ Utils::SerializedRepresentation faces ("Faces topologiques", TkUtil::NumericConversions::toStr(fa.size())); - - for (std::vector::iterator iter = fa.begin( ); fa.end( )!=iter; iter++) + for (auto iter = fa.begin( ); fa.end( )!=iter; iter++) faces.addProperty ( Utils::SerializedRepresentation::Property ( (*iter)->getName ( ), *(*iter))); @@ -2386,13 +2360,11 @@ getDescription (bool alsoComputed) const } } else { - std::vector bl; - getBlocks(bl); - + std::vector bl = getBlocks(); if (!bl.empty()){ Utils::SerializedRepresentation blocks ("Blocs topologiques", TkUtil::NumericConversions::toStr(bl.size())); - for (std::vector::iterator iter = bl.begin( ); bl.end( )!=iter; iter++) + for (auto iter = bl.begin( ); bl.end( )!=iter; iter++) blocks.addProperty ( Utils::SerializedRepresentation::Property ( (*iter)->getName ( ), *(*iter))); @@ -2406,7 +2378,7 @@ getDescription (bool alsoComputed) const if (!grp.empty()){ Utils::SerializedRepresentation groupe ("Relation vers les groupes", TkUtil::NumericConversions::toStr(grp.size())); - for (std::vector::iterator iter = grp.begin( ); iter!=grp.end( ); ++iter) + for (auto iter = grp.begin( ); iter!=grp.end( ); ++iter) groupe.addProperty ( Utils::SerializedRepresentation::Property ( (*iter)->getName ( ), *(*iter))); @@ -2426,21 +2398,22 @@ isStructured() const /*----------------------------------------------------------------------------*/ bool CoFace::structurable() { - if (!isStructured()) { - if (m_topo_property->hasHole()) + if (!isStructured()) { + if (m_topo_property->hasHole()) return false; - if ((getNbEdges() == 4) // 4 côtés et discrétisations des arêtes opposées == - && (getEdge(0)->getNbMeshingEdges() - == getEdge(2)->getNbMeshingEdges()) - && (getEdge(1)->getNbMeshingEdges() - == getEdge(3)->getNbMeshingEdges())) - return true; - else if ((getNbEdges() == 3) // 3 côtés et discrétisations des arêtes opposées == - && (getEdge(0)->getNbMeshingEdges() - == getEdge(2)->getNbMeshingEdges())) - return true; - else + const std::vector& edges = getEdges(); + if ((edges.size() == 4) // 4 côtés et discrétisations des arêtes opposées == + && (edges[0]->getNbMeshingEdges() + == edges[2]->getNbMeshingEdges()) + && (edges[1]->getNbMeshingEdges() + == edges[3]->getNbMeshingEdges())) + return true; + else if ((edges.size() == 3) // 3 côtés et discrétisations des arêtes opposées == + && (edges[0]->getNbMeshingEdges() + == edges[2]->getNbMeshingEdges())) + return true; + else return false; } return true; @@ -2449,10 +2422,9 @@ bool CoFace::structurable() bool CoFace::unstructurable() { // il faut que tous les blocs incidents soient non structurés - for (uint j=0; jgetNbBlocks(); i++) - if (face->getBlock(i)->isStructured()) + for (Face* face : getFaces()){ + for (Block* block : face->getBlocks()) + if (block->isStructured()) return false; } return true; @@ -2495,10 +2467,11 @@ uint CoFace::check() const if (isStructured()){ // il faut qu'il y ait 3 ou 4 arêtes - if (getNbEdges() != 3 && getNbEdges() != 4){ + const int nb_edges = getEdges().size(); + if (nb_edges != 3 && nb_edges != 4){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Erreur avec la face commune structurée "<getNbCoEdges(); j++){ + for (uint j=0; jgetCoEdges().size(); j++){ if (j) messErr<<", "; - messErr << aretes[0]->getCoEdge(j)->getName()<<" ("<<(short)aretes[0]->getCoEdge(j)->getNbMeshingEdges()<<")"; + messErr << aretes[0]->getCoEdges()[j]->getName()<<" ("<<(short)aretes[0]->getCoEdges()[j]->getNbMeshingEdges()<<")"; } messErr<<"] et ["; - for (uint j=0; jgetNbCoEdges(); j++){ + for (uint j=0; jgetCoEdges().size(); j++){ if (j) messErr<<", "; - messErr << aretes[1]->getCoEdge(j)->getName()<<" ("<<(short)aretes[1]->getCoEdge(j)->getNbMeshingEdges()<<")"; + messErr << aretes[1]->getCoEdges()[j]->getName()<<" ("<<(short)aretes[1]->getCoEdges()[j]->getNbMeshingEdges()<<")"; } messErr<<"]"; throw TkUtil::Exception(messErr); @@ -2532,17 +2505,17 @@ uint CoFace::check() const } // end if (isStructured()) // sinon on ne vérifie rien pour la face - for(uint i=0; i < getNbEdges();i++) - getEdge(i)->check(); + for(Edge* e : getEdges()) + e->check(); - if (getNbFaces()>2){ + if (getFaces().size()>2){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "La face commune "<isDestroyed()){ + for (Face* f : getFaces()) + if (f->isDestroyed()){ std::cerr<<"CoFace::check() pour la face commune "< & edges = f.getEdges(); + o << " avec "<<(short)edges.size()<<" arêtes:\n"; for (uint i=0; igetName(); // o <<*edges[i]; o << "\n"; - o << " " << f.getName()<< " face commune avec "<<(short)f.getNbVertices()<<" sommets:\n"; const std::vector & vertices = f.getVertices(); + const std::vector & faces = f.getFaces(); + o << " " << f.getName()<< " face commune avec "<<(short)vertices.size()<<" sommets:\n"; for (uint i=0; i & coedges = vertices[i]->getCoEdges(); o << " ce sommet pointe sur les arêtes communes :"; for (uint j=0; j & faces = f.getFaces(); - if (faces.empty()){ o << " cette face commune ne pointe sur aucune face."; } @@ -2659,34 +2631,13 @@ Topo::TopoInfo CoFace::getInfos() const infos.name = getName(); infos.dimension = getDim(); infos._groups = Utils::toNames(getGroups()); + infos._vertices = Utils::toNames(getVertices()); + infos._coedges = Utils::toNames(getCoEdges()); + infos._edges = Utils::toNames(getEdges()); + infos._faces = Utils::toNames(getFaces()); + infos._blocks = Utils::toNames(getBlocks()); if (getGeomAssociation() != 0) infos.geom_entity = getGeomAssociation()->getName(); - - std::vector vertices; - getVertices(vertices); - for (Vertex* v : vertices) - infos._vertices.push_back(v->getName()); - - std::vector coedges; - getCoEdges(coedges); - for (CoEdge* e : coedges) - infos._coedges.push_back(e->getName()); - - std::vector edges; - getEdges(edges); - for (Edge* e : edges) - infos._edges.push_back(e->getName()); - - std::vector faces; - getFaces(faces); - for (Face* f : faces) - infos._faces.push_back(f->getName()); - - std::vector blocks; - getBlocks(blocks); - for (Block* b : blocks) - infos._blocks.push_back(b->getName()); - return infos; } /*----------------------------------------------------------------------------*/ @@ -2713,7 +2664,7 @@ TkUtil::UTF8String CoFace::getInfoBlock() const if (!bloc->isStructured()) throw TkUtil::Exception (TkUtil::UTF8String ("CoFace::getInfoBlock() ne fonctionne pas pour un bloc non structuré", TkUtil::Charset::UTF_8)); - uint ind = bloc->getIndex(face); + uint ind = Utils::getIndexOf(face, bloc->getFaces()); TkUtil::UTF8String str (TkUtil::Charset::UTF_8); @@ -2726,7 +2677,8 @@ void CoFace:: getNodes(Topo::Vertex* sommet1, Topo::Vertex* sommet2, Topo::Vertex* sommet3, Topo::Vertex* sommet4, std::vector &vectNd) { - uint nbVtx = getNbVertices(); + const std::vector vertices = getVertices(); + uint nbVtx = vertices.size(); #ifdef _DEBUG TkUtil::UTF8String message1 (TkUtil::Charset::UTF_8); message1 << "CoFace::getNodes(" @@ -2745,7 +2697,7 @@ getNodes(Topo::Vertex* sommet1, Topo::Vertex* sommet2, Topo::Vertex* sommet3, To // calcul le décalage entre les sommets internes et ceux donnés uint decalage; - for (decalage=0; decalagegetUniqueId() - <<" dans ("<getUniqueId() - <<", "<getUniqueId() - <<", "<getUniqueId(); + <<" dans ("<getUniqueId() + <<", "<getUniqueId() + <<", "<getUniqueId(); if (nbVtx == 4) - message <<", "<getUniqueId(); + message <<", "<getUniqueId(); message <<")"; throw TkUtil::Exception(message); } @@ -2765,19 +2717,20 @@ getNodes(Topo::Vertex* sommet1, Topo::Vertex* sommet2, Topo::Vertex* sommet3, To bool sens_directe; - if (sommet2 == getVertex((decalage+1)%nbVtx)) + if (sommet2 == vertices[(decalage+1)%nbVtx]) sens_directe = true; - else if (sommet2 == getVertex((decalage+nbVtx-1)%nbVtx)) + else if (sommet2 == vertices[(decalage+nbVtx-1)%nbVtx]) sens_directe = false; else { #ifdef _DEBUG + TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message << "on ne trouve pas le 2ème sommet "<getUniqueId() - <<" dans ("<getUniqueId() - <<", "<getUniqueId() - <<", "<getUniqueId(); + <<" dans ("<getUniqueId() + <<", "<getUniqueId() + <<", "<getUniqueId(); if (nbVtx == 4) - message <<", "<getUniqueId(); + message <<", "<getUniqueId(); message <<") avec decalage de "<<(short)decalage; throw TkUtil::Exception(message); #endif @@ -2786,22 +2739,22 @@ getNodes(Topo::Vertex* sommet1, Topo::Vertex* sommet2, Topo::Vertex* sommet3, To #ifdef _DEBUG // vérification sur l'ensemble des sommets if (((nbVtx == 4) && - ((sens_directe && (sommet1!=getVertex(decalage) - || sommet2 != getVertex((decalage+1)%4) - || sommet3 != getVertex((decalage+2)%4) - || sommet4 != getVertex((decalage+3)%4))) - || (!sens_directe && (sommet1!=getVertex(decalage) - || sommet2 != getVertex((decalage+3)%4) - || sommet3 != getVertex((decalage+2)%4) - || sommet4 != getVertex((decalage+1)%4))))) + ((sens_directe && (sommet1!=vertices[decalage] + || sommet2 != vertices[(decalage+1)%4] + || sommet3 != vertices[(decalage+2)%4] + || sommet4 != vertices[(decalage+3)%4])) + || (!sens_directe && (sommet1!=vertices[decalage] + || sommet2 != vertices[(decalage+3)%4] + || sommet3 != vertices[(decalage+2)%4] + || sommet4 != vertices[(decalage+1)%4])))) || // cas à 3 sommets ((nbVtx == 3) && - ((sens_directe && (sommet1!=getVertex(decalage) - || sommet2 != getVertex((decalage+1)%3) - || sommet3 != getVertex((decalage+2)%3))) - || (!sens_directe && (sommet1!=getVertex(decalage) - || sommet2 != getVertex((decalage+2)%3) - || sommet3 != getVertex((decalage+1)%3)))))){ + ((sens_directe && (sommet1!=vertices[decalage] + || sommet2 != vertices[(decalage+1)%3] + || sommet3 != vertices[(decalage+2)%3])) + || (!sens_directe && (sommet1!=vertices[decalage] + || sommet2 != vertices[(decalage+2)%3] + || sommet3 != vertices[(decalage+1)%3]))))){ TkUtil::UTF8String message_err (TkUtil::Charset::UTF_8); message_err << "CoFace::getNodes(" <getName()<<"," @@ -2844,8 +2797,8 @@ getNodes(uint decalage, //std::cout << "this :"<<*this; #endif - const uint nbBrasI = getEdge(j_min)->getNbMeshingEdges(); - const uint nbBrasJ = getEdge(i_min)->getNbMeshingEdges(); + const uint nbBrasI = getEdges()[j_min]->getNbMeshingEdges(); + const uint nbBrasJ = getEdges()[i_min]->getNbMeshingEdges(); const uint nbNoeudsI = nbBrasI + 1; const uint nbNoeudsJ = nbBrasJ + 1; @@ -3025,21 +2978,16 @@ fuse(CoFace* face_B, Edge* arete_A = getEdge(som_1A, som_2A); Edge* arete_B = face_B->getEdge(som_1B, som_2B); - - - std::vector coedges_A; - arete_A->getCoEdges(coedges_A); - - std::vector coedges_B; - arete_B->getCoEdges(coedges_B); + std::vector coedges_A = arete_A->getCoEdges(); + std::vector coedges_B = arete_B->getCoEdges(); int nbDiscrA = 0; int nbDiscrB = 0; - if (arete_A->getNbCoEdges() != 1 || arete_B->getNbCoEdges() != 1) { + if (arete_A->getCoEdges().size() != 1 || arete_B->getCoEdges().size() != 1) { - if(arete_A->getNbCoEdges() != arete_B->getNbCoEdges() - && arete_A->getNbCoEdges() > 1 && arete_B->getNbCoEdges() > 1){ + if(arete_A->getCoEdges().size() != arete_B->getCoEdges().size() + && arete_A->getCoEdges().size() > 1 && arete_B->getCoEdges().size() > 1){ TkUtil::UTF8String err (TkUtil::Charset::UTF_8); err << "CoFace::fuse impossible (pour le moment) avec des arêtes composées d'un nombre différent d'arêtes communes (" <getName()<<" et "<getName()<<")"; @@ -3076,8 +3024,8 @@ fuse(CoFace* face_B, } }else{ - CoEdge* coedge_A = arete_A->getCoEdge(0); - CoEdge* coedge_B = arete_B->getCoEdge(0); + CoEdge* coedge_A = arete_A->getCoEdges()[0]; + CoEdge* coedge_B = arete_B->getCoEdges()[0]; nbDiscrA = coedge_A->getNbMeshingEdges(); nbDiscrB = coedge_B->getNbMeshingEdges(); @@ -3125,16 +3073,14 @@ fuse(CoFace* face_B, Edge* arete_B = face_B->getEdge(som_1, som_2); - if (arete_A->getNbCoEdges() != 1 || arete_B->getNbCoEdges() != 1){ + if (arete_A->getCoEdges().size() != 1 || arete_B->getCoEdges().size() != 1){ // s'il y en a autant dans les 2 arêtes, on tente de faire la fusion // en ordonnant les arêtes depuis un sommet - if (arete_A->getNbCoEdges() == arete_B->getNbCoEdges()){ - std::vector coedges_A; - arete_A->getCoEdges(coedges_A); + if (arete_A->getCoEdges().size() == arete_B->getCoEdges().size()){ + std::vector coedges_A = arete_A->getCoEdges(); std::vector coedges_A_ord; TopoHelper::getCoEdgesBetweenVertices(som_1, som_2, coedges_A, coedges_A_ord); - std::vector coedges_B; - arete_B->getCoEdges(coedges_B); + std::vector coedges_B = arete_B->getCoEdges(); std::vector coedges_B_ord; TopoHelper::getCoEdgesBetweenVertices(som_1, som_2, coedges_B, coedges_B_ord); @@ -3148,10 +3094,10 @@ fuse(CoFace* face_B, for (uint j=0; jmerge(coedges_B_ord[j], icmd); } - else if (arete_A->getNbCoEdges() == 1) { + else if (arete_A->getCoEdges().size() == 1) { arete_B->merge(arete_A, icmd, true); } - else if (arete_B->getNbCoEdges() == 1) { + else if (arete_B->getCoEdges().size() == 1) { arete_A->merge(arete_B, icmd, true); } else { @@ -3165,8 +3111,8 @@ fuse(CoFace* face_B, } else { // cas avec une seule arête de part et d'autre - CoEdge* coedge_A = arete_A->getCoEdge(0); - CoEdge* coedge_B = arete_B->getCoEdge(0); + CoEdge* coedge_A = arete_A->getCoEdges()[0]; + CoEdge* coedge_B = arete_B->getCoEdges()[0]; coedge_A->merge(coedge_B, icmd); } @@ -3213,10 +3159,8 @@ switchCoFaceMeshingProperty(Internal::InfoCommand* icmd, CoFaceMeshingProperty* bool new_structured = prop->isStructured(); // on propage seulement la destructuration if ((old_structured != new_structured) && old_structured){ - std::vector faces; - getFaces(faces); - for (std::vector::iterator iter = faces.begin(); iter != faces.end(); ++iter) - (*iter)->setStructured(icmd, new_structured); + for (Face* f : getFaces()) + f->setStructured(icmd, new_structured); } } @@ -3336,7 +3280,7 @@ permuteToJmaxEdge(Edge* edge, Internal::InfoCommand* icmd) // std::cout << " avec edge : "<<*edge<& edges = getEdges(); + for (ind = 0; ind initial_edges; std::vector sorted_edges; - std::vector initial_vertices; std::vector sorted_vertices; sorted_edges.resize(4); sorted_vertices.resize(4); - m_topo_property->getEdgeContainer().get(initial_edges); - m_topo_property->getVertexContainer().get(initial_vertices); + std::vector initial_edges = getEdges(); + std::vector initial_vertices = getVertices(); for (uint i=0; i<4; i++){ sorted_edges[(i+dec)%4] = initial_edges[i]; sorted_vertices[(i+dec)%4] = initial_vertices[i]; } - m_topo_property->getEdgeContainer().clear(); - m_topo_property->getEdgeContainer().add(sorted_edges); - m_topo_property->getVertexContainer().clear(); - m_topo_property->getVertexContainer().add(sorted_vertices); + m_topo_property->getEdgeContainer() = sorted_edges; + m_topo_property->getVertexContainer() = sorted_vertices; } // end if (ind != 4) } /*----------------------------------------------------------------------------*/ @@ -3384,7 +3325,7 @@ permuteToLastEdge(Edge* edge, Internal::InfoCommand* icmd) // std::cout << " avec edge : "<<*edge<& edges = getEdges(); + for (ind = 0; ind initial_edges; std::vector sorted_edges; - std::vector initial_vertices; std::vector sorted_vertices; sorted_edges.resize(nb); sorted_vertices.resize(nb); - m_topo_property->getEdgeContainer().get(initial_edges); - m_topo_property->getVertexContainer().get(initial_vertices); + std::vector initial_edges = getEdges(); + std::vector initial_vertices = getVertices(); for (uint i=0; igetEdgeContainer().clear(); - m_topo_property->getEdgeContainer().add(sorted_edges); - m_topo_property->getVertexContainer().clear(); - m_topo_property->getVertexContainer().add(sorted_vertices); + m_topo_property->getEdgeContainer() = sorted_edges; + m_topo_property->getVertexContainer() = sorted_vertices; } // end if (ind != nb-1) } @@ -3433,14 +3370,15 @@ getEdges(eDirOnCoFace dir, std::vector & edges) const { if (!isStructured()) throw TkUtil::Exception (TkUtil::UTF8String ("CoFace::getEdges(dir) n'est pas possible avec une surface non structurée", TkUtil::Charset::UTF_8)); - edges.clear(); + edges.clear(); + const std::vector& coface_edges = getEdges(); if (dir == i_dir){ - edges.push_back(getEdge(1)); - if (getNbEdges() == 4) - edges.push_back(getEdge(3)); + edges.push_back(coface_edges[1]); + if (coface_edges.size() == 4) + edges.push_back(coface_edges[3]); } else if (dir == j_dir){ - edges.push_back(getEdge(0)); - edges.push_back(getEdge(2)); + edges.push_back(coface_edges[0]); + edges.push_back(coface_edges[2]); } else throw TkUtil::Exception (TkUtil::UTF8String ("CoFace::getEdges avec une direction non prévue", TkUtil::Charset::UTF_8)); } @@ -3460,7 +3398,6 @@ getOrientedCoEdges(std::vector & iCoedges, // il suffit de cumuler les CoEdges pour chacune des arêtes suivant chaque direction std::vector edges; - getEdges(i_dir, edges); for (std::vector::iterator iter = edges.begin(); iter != edges.end(); ++iter){ @@ -3484,9 +3421,10 @@ getNbMeshingEdges(uint& nbI, uint& nbJ) const if (!isStructured()) throw TkUtil::Exception (TkUtil::UTF8String ("CoFace::getNbMeshingEdges(,) n'est pas possible avec une surface commune non structurée", TkUtil::Charset::UTF_8)); - if (getNbEdges()){ - nbI = getEdge(1)->getNbMeshingEdges(); - nbJ = getEdge(0)->getNbMeshingEdges(); + const std::vector& edges = getEdges(); + if (edges.size()){ + nbI = edges[1]->getNbMeshingEdges(); + nbJ = edges[0]->getNbMeshingEdges(); } else { nbI = 0; @@ -3494,29 +3432,15 @@ getNbMeshingEdges(uint& nbI, uint& nbJ) const } } /*----------------------------------------------------------------------------*/ -void CoFace:: -getCoEdges(std::vector& coedges, bool unique) const -{ - if (unique){ - coedges.clear(); - std::list l_e; - for(uint j=0; j < getNbEdges();j++) { - const std::vector & local_coedges = getEdge(j)->getCoEdges(); - l_e.insert(l_e.end(), local_coedges.begin(), local_coedges.end()); - } - - l_e.sort(Utils::Entity::compareEntity); - l_e.unique(); - - coedges.insert(coedges.end(),l_e.begin(),l_e.end()); - } - else { - coedges.clear(); - for(uint j=0; j < getNbEdges();j++) { - const std::vector & local_coedges = getEdge(j)->getCoEdges(); - coedges.insert(coedges.end(), local_coedges.begin(), local_coedges.end()); - } +std::vector CoFace:: +getCoEdges() const +{ + Utils::EntitySet coedges(Utils::Entity::compareEntity); + for(Edge* e : getEdges()) { + const std::vector & local_coedges = e->getCoEdges(); + coedges.insert(local_coedges.begin(), local_coedges.end()); } + return Utils::toVect(coedges); } /*----------------------------------------------------------------------------*/ CoFace::eDirOnCoFace CoFace::getDir(Vertex* v1, Vertex* v2) const @@ -3524,19 +3448,20 @@ CoFace::eDirOnCoFace CoFace::getDir(Vertex* v1, Vertex* v2) const if (!isStructured()) throw TkUtil::Exception (TkUtil::UTF8String ("CoFace::getDir(V1, v2) n'est pas possible avec une surface non structurée", TkUtil::Charset::UTF_8)); - uint nbVtx = getNbVertices(); + const std::vector& vertices = getVertices(); + uint nbVtx = vertices.size(); // on se base uniquement sur l'ordre des sommets dans la face commune - if ( (v1 == getVertex(0) && v2 == getVertex(1)) - || (v1 == getVertex(1) && v2 == getVertex(0)) - || (nbVtx == 4 && v1 == getVertex(2) && v2 == getVertex(3)) - || (nbVtx == 4 && v1 == getVertex(3) && v2 == getVertex(2)) - || (nbVtx == 3 && v1 == getVertex(2) && v2 == getVertex(0)) - || (nbVtx == 3 && v1 == getVertex(0) && v2 == getVertex(2)) ) + if ( (v1 == vertices[0] && v2 == vertices[1]) + || (v1 == vertices[1] && v2 == vertices[0]) + || (nbVtx == 4 && v1 == vertices[2] && v2 == vertices[3]) + || (nbVtx == 4 && v1 == vertices[3] && v2 == vertices[2]) + || (nbVtx == 3 && v1 == vertices[2] && v2 == vertices[0]) + || (nbVtx == 3 && v1 == vertices[0] && v2 == vertices[2]) ) return j_dir; - else if ( (v1 == getVertex(1) && v2 == getVertex(2)) - || (v1 == getVertex(2) && v2 == getVertex(1)) - || (nbVtx == 4 && v1 == getVertex(0) && v2 == getVertex(3)) - || (nbVtx == 4 && v1 == getVertex(3) && v2 == getVertex(0)) ) + else if ( (v1 == vertices[1] && v2 == vertices[2]) + || (v1 == vertices[2] && v2 == vertices[1]) + || (nbVtx == 4 && v1 == vertices[0] && v2 == vertices[3]) + || (nbVtx == 4 && v1 == vertices[3] && v2 == vertices[0]) ) return i_dir; else { std::cerr<<"CoFace::getDir("<getName()<<", "<getName()<<") dans la face commune : "<<*this<& vertices, const bool unique) const +std::vector CoFace::getAllVertices() const { - vertices.clear(); - if (unique){ - std::list l_v; - for(uint j=0; j < getNbEdges();j++) { - const std::vector & local_coedges = getEdge(j)->getCoEdges(); - for (uint i=0; i & local_vertices = local_coedges[i]->getVertices(); - - l_v.insert(l_v.end(), local_vertices.begin(), local_vertices.end()); - } - } - - l_v.sort(Utils::Entity::compareEntity); - l_v.unique(); - - vertices.insert(vertices.end(),l_v.begin(),l_v.end()); - } - else { - for(uint j=0; j < getNbEdges();j++) { - const std::vector & local_coedges = getEdge(j)->getCoEdges(); - for (uint i=0; i & local_vertices = local_coedges[i]->getVertices(); - - vertices.insert(vertices.end(), local_vertices.begin(), local_vertices.end()); - } - } + Utils::EntitySet vertices(Utils::Entity::compareEntity); + for(Edge* e : getEdges()) { + const std::vector & local_coedges = e->getCoEdges(); + for (uint i=0; i & local_vertices = local_coedges[i]->getVertices(); + vertices.insert(local_vertices.begin(), local_vertices.end()); + } } - + return Utils::toVect(vertices); } /*----------------------------------------------------------------------------*/ CoEdgeMeshingProperty* CoFace:: @@ -3587,17 +3493,16 @@ getMeshingProperty(eDirOnCoFace dir, bool & is_inverted) for (std::vector::iterator iter = edges.begin(); iter != edges.end(); ++iter) - if ((*iter)->getNbCoEdges() == 1){ - CoEdge* coedge = (*iter)->getCoEdge(0); + if ((*iter)->getCoEdges().size() == 1){ + CoEdge* coedge = (*iter)->getCoEdges()[0]; if ((*iter)->getRatio(coedge) == 1){ - std::vector vertices; - coedge->getVertices(vertices); + const std::vector& vertices = coedge->getVertices(); uint ind_edge = getIndex(coedge); - if (getVertex(Topo::TopoHelper::tabIndVtxByEdgeOnFace[ind_edge][0]) == vertices[0] - && getVertex(Topo::TopoHelper::tabIndVtxByEdgeOnFace[ind_edge][1]) == vertices[1]) + if (vertices[Topo::TopoHelper::tabIndVtxByEdgeOnFace[ind_edge][0]] == vertices[0] + && vertices[Topo::TopoHelper::tabIndVtxByEdgeOnFace[ind_edge][1]] == vertices[1]) is_inverted = false; - else if (getVertex(Topo::TopoHelper::tabIndVtxByEdgeOnFace[ind_edge][0]) == vertices[1] - && getVertex(Topo::TopoHelper::tabIndVtxByEdgeOnFace[ind_edge][1]) == vertices[0]) + else if (vertices[Topo::TopoHelper::tabIndVtxByEdgeOnFace[ind_edge][0]] == vertices[1] + && vertices[Topo::TopoHelper::tabIndVtxByEdgeOnFace[ind_edge][1]] == vertices[0]) is_inverted = true; else throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne dans CoFace::getMeshingProperty, on ne retrouve pas les noeuds de l'arête", TkUtil::Charset::UTF_8)); @@ -3617,17 +3522,10 @@ getNeighbour(std::vector& cofaces) { std::list l_f; - for(uint j=0; j < getNbEdges();j++) { - const std::vector & coedges = getEdge(j)->getCoEdges(); - - for (std::vector::const_iterator iter1 = coedges.begin(); - iter1 != coedges.end(); ++iter1){ - const std::vector & edges = (*iter1)->getEdges(); - - for (std::vector::const_iterator iter2 = edges.begin(); - iter2 != edges.end(); ++iter2){ - const std::vector & loc_cofaces = (*iter2)->getCoFaces(); - + for(Edge* edge : getEdges()) { + for (CoEdge* coedge : edge->getCoEdges()){ + for (Edge* coedge_edge : coedge->getEdges()){ + const std::vector & loc_cofaces = coedge_edge->getCoFaces(); l_f.insert(l_f.end(), loc_cofaces.begin(), loc_cofaces.end()); } } @@ -3677,41 +3575,32 @@ isEdited() const || m_save_mesh_data != 0; } /*----------------------------------------------------------------------------*/ -void CoFace:: -getBlocks(std::vector& blocks) const +void CoFace::addFace(Face* f) { - std::list l_b; - - std::vector faces; - getFaces(faces); - - for (std::vector::iterator iter1 = faces.begin(); - iter1 != faces.end(); ++iter1){ - std::vector loc_bl; - (*iter1)->getBlocks(loc_bl); - - l_b.insert(l_b.end(), loc_bl.begin(), loc_bl.end()); - } - - l_b.sort(Utils::Entity::compareEntity); - l_b.unique(); - - blocks.insert(blocks.end(),l_b.begin(),l_b.end()); + m_topo_property->getFaceContainer().push_back(f); +} +/*----------------------------------------------------------------------------*/ +void CoFace::removeFace(Face* f) +{ + Utils::remove(f, m_topo_property->getFaceContainer()); } /*----------------------------------------------------------------------------*/ -uint CoFace::getNbBlocks() const +std::vector CoFace:: +getBlocks() const { - std::vector blocks; - getBlocks(blocks); - return blocks.size(); + Utils::EntitySet blocks(Utils::Entity::compareEntity); + for (Face* f : getFaces()) { + std::vector loc_bl = f->getBlocks(); + blocks.insert(loc_bl.begin(), loc_bl.end()); + } + return Utils::toVect(blocks); } /*----------------------------------------------------------------------------*/ Utils::Math::Point CoFace::getBarycentre() const { Utils::Math::Point barycentre; - std::vector vertices; - getVertices(vertices); + const std::vector& vertices = getVertices(); if (vertices.size()){ for (uint i=0; igetCoord(); @@ -3725,27 +3614,27 @@ void CoFace::getGroupsName (std::vector& gn) const TopoEntity::getGroupsName(gn); for (uint i = 0; igetGroupsContainer().size(); ++i) - gn.push_back(m_topo_property->getGroupsContainer().get(i)->getName()); + gn.push_back(m_topo_property->getGroupsContainer()[i]->getName()); } /*----------------------------------------------------------------------------*/ void CoFace::add(Group::Group2D* grp) { - m_topo_property->getGroupsContainer().add(grp); + m_topo_property->getGroupsContainer().push_back(grp); } /*----------------------------------------------------------------------------*/ void CoFace::remove(Group::Group2D* grp) { - m_topo_property->getGroupsContainer().remove(grp); + Utils::remove(grp, m_topo_property->getGroupsContainer()); } /*----------------------------------------------------------------------------*/ int CoFace::getNbGroups() const { - return m_topo_property->getGroupsContainer().getNb(); + return m_topo_property->getGroupsContainer().size(); } /*----------------------------------------------------------------------------*/ std::vector CoFace::getGroups() const { - return m_topo_property->getGroupsContainer().get(); + return m_topo_property->getGroupsContainer(); } /*----------------------------------------------------------------------------*/ unsigned long CoFace::getNbInternalMeshingNodes() @@ -3759,13 +3648,11 @@ unsigned long CoFace::getNbInternalMeshingNodes() } else { unsigned short res = m_mesh_data->nodes().size(); - for (uint i=0;igetNbInternalMeshingNodes(); + for (Vertex* v : getVertices()) + res -= v->getNbInternalMeshingNodes(); - std::vector coedges; - getCoEdges(coedges, false); - for (uint i=0;igetNbInternalMeshingNodes(); + for (CoEdge* ce : getCoEdges()) + res -= ce->getNbInternalMeshingNodes(); return res; } @@ -3774,17 +3661,14 @@ unsigned long CoFace::getNbInternalMeshingNodes() void CoFace::MAJInterpolated(CoFace* newCoface, std::vector& newEdges) { //std::cout<<"MAJInterpolated("<getName()<<")"< coedges; // on marque dans un premier temps les nouvelles arêtes std::map filtre_coedges; - for (uint i=0; igetCoEdges(coedges); - for (uint j=0; jgetCoEdges()) + filtre_coedges[ce] = 1; - newCoface->getCoEdges(coedges); + std::vector coedges = newCoface->getCoEdges(); std::string oldCoFaceName = getName(); std::string newCoFaceName = newCoface->getName(); // d'abord les anciennes arêtes @@ -3832,9 +3716,7 @@ void CoFace::MAJInterpolated(CoFace* newCoface, std::vector& newEdges) } Edge* edge_ref = newCoface->getOppositeEdge(edge_dep); - std::vector coedges_ref; - edge_ref->getCoEdges(coedges_ref); - + std::vector coedges_ref = edge_ref->getCoEdges(); for (uint j=0; jgetMeshingProperty()->getMeshLaw() == CoEdgeMeshingProperty::interpolate){ //std::cout<<" prise en compte de l'arête "<getName()< blocks; - // liste des cofaces modifiées - std::vector cofaces; - m_vertex->saveVertexGeomProperty(&getInfoCommand(), true); m_vertex->setCoord(m_target->getCoord()); - m_vertex->getBlocks(blocks); - - m_vertex->getCoFaces(cofaces); + std::vector blocks = m_vertex->getBlocks(); // liste des blocs modifiés + std::vector cofaces = m_vertex->getCoFaces(); // liste des cofaces modifiées std::sort(blocks.begin(), blocks.end(), Utils::Entity::compareEntity); auto lastblocks = std::unique(blocks.begin(), blocks.end()); diff --git a/src/Core/Topo/CommandChangeVerticesLocation.cpp b/src/Core/Topo/CommandChangeVerticesLocation.cpp index d1025731..3811a0d6 100644 --- a/src/Core/Topo/CommandChangeVerticesLocation.cpp +++ b/src/Core/Topo/CommandChangeVerticesLocation.cpp @@ -116,12 +116,10 @@ internalExecute() vtx->setCoord(newPt); - std::vector l_blocks; - vtx->getBlocks(l_blocks); + std::vector l_blocks = vtx->getBlocks(); blocks.insert(blocks.end(), l_blocks.begin(), l_blocks.end()); - std::vector l_cofaces; - vtx->getCoFaces(l_cofaces); + std::vector l_cofaces = vtx->getCoFaces(); cofaces.insert(cofaces.end(), l_cofaces.begin(), l_cofaces.end()); } diff --git a/src/Core/Topo/CommandCreateTopo.cpp b/src/Core/Topo/CommandCreateTopo.cpp index 7383cce2..807a00ff 100644 --- a/src/Core/Topo/CommandCreateTopo.cpp +++ b/src/Core/Topo/CommandCreateTopo.cpp @@ -63,11 +63,8 @@ void CommandCreateTopo::split() for (std::vector::const_iterator iter = m_blocks.begin(); iter != m_blocks.end(); ++iter) { const std::vector & vertices = (*iter)->getVertices(); - std::vector coedges; - std::vector cofaces; - - (*iter)->getCoEdges(coedges); - (*iter)->getCoFaces(cofaces); + std::vector coedges = (*iter)->getCoEdges(); + std::vector cofaces = (*iter)->getCoFaces(); l_v.insert(l_v.end(), vertices.begin(), vertices.end()); l_ce.insert(l_ce.end(), coedges.begin(), coedges.end()); @@ -75,18 +72,16 @@ void CommandCreateTopo::split() // entités pour lesquelles il n'est pas prévu de les représenté ni de les utiliser // mais pour lesquelles il est utile de les marquer comme CREATED - std::vector edges; + std::vector edges = (*iter)->getEdges(); const std::vector & faces = (*iter)->getFaces(); - (*iter)->getEdges(edges); l_e.insert(l_e.end(), edges.begin(), edges.end()); l_f.insert(l_f.end(), faces.begin(), faces.end()); } for (std::vector::const_iterator iter = m_cofaces.begin(); iter != m_cofaces.end(); ++iter) { - const std::vector & vertices = (*iter)->getVertices(); - std::vector coedges; - (*iter)->getCoEdges(coedges); + const std::vector& vertices = (*iter)->getVertices(); + std::vector coedges = (*iter)->getCoEdges(); l_v.insert(l_v.end(), vertices.begin(), vertices.end()); l_ce.insert(l_ce.end(), coedges.begin(), coedges.end()); @@ -94,8 +89,7 @@ void CommandCreateTopo::split() // entités pour lesquelles il n'est pas prévu de les représenté ni de les utiliser // mais pour lesquelles il est utile de les marquer comme CREATED - std::vector edges; - (*iter)->getEdges(edges); + const std::vector& edges = (*iter)->getEdges(); l_e.insert(l_e.end(), edges.begin(), edges.end()); } diff --git a/src/Core/Topo/CommandDestroyTopo.cpp b/src/Core/Topo/CommandDestroyTopo.cpp index 15b8606c..5a856967 100644 --- a/src/Core/Topo/CommandDestroyTopo.cpp +++ b/src/Core/Topo/CommandDestroyTopo.cpp @@ -160,11 +160,8 @@ void CommandDestroyTopo::destroy(CoFace* coface) mark(coface); // marque égallement les entités de niveau supérieur - std::vector blocks; - coface->getBlocks(blocks); - for (std::vector::iterator iter = blocks.begin(); - iter != blocks.end(); ++iter) - mark(*iter); + for (Block* bl : coface->getBlocks()) + mark(bl); // parcours les entités pour déterminer si elles dépendent encore // de quelque chose qui n'est pas marqué @@ -180,18 +177,11 @@ void CommandDestroyTopo::destroy(CoEdge* coedge) mark(coedge); // marque égallement les entités de niveau supérieur - std::vector cofaces; - coedge->getCoFaces(cofaces); - for (std::vector::iterator iter1 = cofaces.begin(); - iter1 != cofaces.end(); ++iter1){ - CoFace* coface = *iter1; + for (CoFace* coface : coedge->getCoFaces()){ mark(coface); - std::vector blocks; - coface->getBlocks(blocks); - for (std::vector::iterator iter2 = blocks.begin(); - iter2 != blocks.end(); ++iter2) - mark(*iter2); + for (Block* bl : coface->getBlocks()) + mark(bl); } // end for iter1 // parcours les entités pour déterminer si elles dépendent encore @@ -208,27 +198,14 @@ void CommandDestroyTopo::destroy(Vertex* vertex) mark(vertex); // marque égallement les entités de niveau supérieur - std::vector coedges; - vertex->getCoEdges(coedges); - for (std::vector::iterator iter0 = coedges.begin(); - iter0 != coedges.end(); ++iter0){ - CoEdge* coedge = *iter0; + for (CoEdge* coedge : vertex->getCoEdges()){ mark(coedge); - - std::vector cofaces; - coedge->getCoFaces(cofaces); - for (std::vector::iterator iter1 = cofaces.begin(); - iter1 != cofaces.end(); ++iter1){ - CoFace* coface = *iter1; + for (CoFace* coface : coedge->getCoFaces()){ mark(coface); - - std::vector blocks; - coface->getBlocks(blocks); - for (std::vector::iterator iter2 = blocks.begin(); - iter2 != blocks.end(); ++iter2) - mark(*iter2); - } // end for iter1 - } // end for iter0 + for (Block* bl : coface->getBlocks()) + mark(bl); + } + } // parcours les entités pour déterminer si elles dépendent encore // de quelque chose qui n'est pas marqué // si ce n'est pas le cas, alors elles sont à détruire @@ -242,9 +219,7 @@ void CommandDestroyTopo::mark(Block* bloc) m_filtre_blocks.insert(bloc); - std::vector faces; - bloc->getFaces(faces); - + std::vector faces = bloc->getFaces(); for (std::vector::iterator iter = faces.begin(); iter != faces.end(); ++iter) mark(*iter); @@ -255,12 +230,8 @@ void CommandDestroyTopo::mark(Face* face) m_filtre_faces.insert(face); if (m_propagate){ - std::vector cofaces; - face->getCoFaces(cofaces); - - for (std::vector::iterator iter = cofaces.begin(); - iter != cofaces.end(); ++iter) - mark(*iter); + for (CoFace* coface : face->getCoFaces()) + mark(coface); } } /*----------------------------------------------------------------------------*/ @@ -271,39 +242,25 @@ void CommandDestroyTopo::mark(CoFace* coface) m_filtre_cofaces.insert(coface); - std::vector edges; - coface->getEdges(edges); - - for (std::vector::iterator iter = edges.begin(); - iter != edges.end(); ++iter) - mark(*iter); + for (Edge* edge : coface->getEdges()) + mark(edge); } /*----------------------------------------------------------------------------*/ void CommandDestroyTopo::mark(Edge* edge) { m_filtre_edges.insert(edge); - - std::vector coedges; - edge->getCoEdges(coedges); - if (m_propagate){ - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter) - mark(*iter); + for (CoEdge* coedge : edge->getCoEdges()) + mark(coedge); } } /*----------------------------------------------------------------------------*/ void CommandDestroyTopo::mark(CoEdge* coedge) { m_filtre_coedges.insert(coedge); - - std::vector vertices; - coedge->getVertices(vertices); - if (m_propagate){ - for (std::vector::iterator iter = vertices.begin(); - iter != vertices.end(); ++iter) - mark(*iter); + for (Vertex* v : coedge->getVertices()) + mark(v); } } /*----------------------------------------------------------------------------*/ @@ -314,11 +271,8 @@ void CommandDestroyTopo::mark(Vertex* vertex) /*----------------------------------------------------------------------------*/ bool CommandDestroyTopo::dependUnmarqued(Face* face) { - std::vector blocs; - face->getBlocks(blocs); - for (std::vector::iterator iter = blocs.begin(); - iter != blocs.end(); ++iter) - if (m_filtre_blocks.count(*iter) == 0) + for (Block* b : face->getBlocks()) + if (m_filtre_blocks.count(b) == 0) return true; return false; @@ -326,11 +280,8 @@ bool CommandDestroyTopo::dependUnmarqued(Face* face) /*----------------------------------------------------------------------------*/ bool CommandDestroyTopo::dependUnmarqued(CoFace* coface) { - std::vector faces; - coface->getFaces(faces); - for (std::vector::iterator iter = faces.begin(); - iter != faces.end(); ++iter) - if (m_filtre_faces.count(*iter) == 0) + for (Face* face : coface->getFaces()) + if (m_filtre_faces.count(face) == 0) return true; return false; @@ -338,14 +289,8 @@ bool CommandDestroyTopo::dependUnmarqued(CoFace* coface) /*----------------------------------------------------------------------------*/ bool CommandDestroyTopo::dependUnmarqued(Edge* edge) { - std::vector cofaces; - edge->getCoFaces(cofaces); -// if (cofaces.size()>1) -// std::cout<<"CommandDestroyTopo::dependUnmarqued, trouve que "<getName()<<" est relié à "<::iterator iter = cofaces.begin(); - iter != cofaces.end(); ++iter) - if (m_filtre_cofaces.count(*iter) == 0) + for (CoFace* coface : edge->getCoFaces()) + if (m_filtre_cofaces.count(coface) == 0) return true; return false; @@ -353,11 +298,8 @@ bool CommandDestroyTopo::dependUnmarqued(Edge* edge) /*----------------------------------------------------------------------------*/ bool CommandDestroyTopo::dependUnmarqued(CoEdge* coedge) { - std::vector edges; - coedge->getEdges(edges); - for (std::vector::iterator iter = edges.begin(); - iter != edges.end(); ++iter) - if (m_filtre_edges.count(*iter) == 0) + for (Edge* e : coedge->getEdges()) + if (m_filtre_edges.count(e) == 0) return true; return false; @@ -365,11 +307,8 @@ bool CommandDestroyTopo::dependUnmarqued(CoEdge* coedge) /*----------------------------------------------------------------------------*/ bool CommandDestroyTopo::dependUnmarqued(Vertex* vertex) { - std::vector coedges; - vertex->getCoEdges(coedges); - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter) - if (m_filtre_coedges.count(*iter) == 0) + for (CoEdge* coedge : vertex->getCoEdges()) + if (m_filtre_coedges.count(coedge) == 0) return true; return false; diff --git a/src/Core/Topo/CommandDuplicateTopo.cpp b/src/Core/Topo/CommandDuplicateTopo.cpp index 6c4709ff..e7fe1373 100644 --- a/src/Core/Topo/CommandDuplicateTopo.cpp +++ b/src/Core/Topo/CommandDuplicateTopo.cpp @@ -177,8 +177,9 @@ duplicate(CoEdge* ce) { CoEdge* new_coedge = m_corr_coedge[ce]; if (new_coedge == 0){ - Vertex* new_vtx1 = duplicate(ce->getVertex(0)); - Vertex* new_vtx2 = duplicate(ce->getVertex(1)); + const std::vector vertices = ce->getVertices(); + Vertex* new_vtx1 = duplicate(vertices[0]); + Vertex* new_vtx2 = duplicate(vertices[1]); CoEdgeMeshingProperty* cemp = ce->getMeshingProperty()->clone(); new_coedge = new CoEdge(getContext(), cemp, new_vtx1, new_vtx2); @@ -197,8 +198,8 @@ duplicate(Edge* ed) { Edge* new_edge = m_corr_edge[ed]; if (new_edge == 0){ - Vertex* new_vtx1 = duplicate(ed->getVertex(0)); - Vertex* new_vtx2 = duplicate(ed->getVertex(1)); + Vertex* new_vtx1 = duplicate(ed->getVertices()[0]); + Vertex* new_vtx2 = duplicate(ed->getVertices()[1]); const std::vector & coedges = ed->getCoEdges(); std::vector new_coedges; diff --git a/src/Core/Topo/CommandEditTopo.cpp b/src/Core/Topo/CommandEditTopo.cpp index e0a9d4dc..af4a8157 100644 --- a/src/Core/Topo/CommandEditTopo.cpp +++ b/src/Core/Topo/CommandEditTopo.cpp @@ -537,10 +537,9 @@ getPreviewRepresentationTopoModif(Utils::DisplayRepresentation& dr) #endif // on regarde si l'un des sommets a son nombre d'arêtes qui n'a pas changé bool nb_change = true; - std::vector vertices; - coedge->getVertices(vertices); + const std::vector& vertices = coedge->getVertices(); for (uint i=0; igetNbCoEdges() == nb_coedges_by_vertex[vertices[i]]){ + if (vertices[i]->getCoEdges().size() == nb_coedges_by_vertex[vertices[i]]){ nb_change = false; //std::cout<<" "<getName()<<" avait "<getNbCoEdges()<getType() == Utils::Entity::TopoCoEdge){ CoEdge* coedge = dynamic_cast(te); CHECK_NULL_PTR_ERROR(coedge); - std::vector vertices; - coedge->getVertices(vertices); + const std::vector& vertices = coedge->getVertices(); #ifdef _DEBUG_PREVIEW std::cout<<" On ajoute l'arête "<getName()<getType() == Utils::Entity::TopoCoEdge){ CoEdge* coedge = dynamic_cast(te); CHECK_NULL_PTR_ERROR(coedge); - std::vector vertices; - coedge->getVertices(vertices); + const std::vector& vertices = coedge->getVertices(); #ifdef _DEBUG_PREVIEW std::cout<<" On ajoute l'arête "<getName()<& cofaces_dep, #ifdef _DEBUG_REVOL std::cout<<"== duplique "<<(*iter1)->getName()< edges_dep; + std::vector edges_dep = (*iter1)->getEdges(); std::vector edges_arr; - (*iter1)->getEdges(edges_dep); for (std::vector::iterator iter2 = edges_dep.begin(); iter2 != edges_dep.end(); ++iter2){ @@ -706,9 +702,8 @@ duplicate(std::vector& cofaces_dep, Edge* newEdge = corr_edge[*iter2]; if (!newEdge){ - std::vector coedges_dep; + std::vector coedges_dep = (*iter2)->getCoEdges(); std::vector coedges_arr; - (*iter2)->getCoEdges(coedges_dep); for (std::vector::iterator iter3 = coedges_dep.begin(); iter3 != coedges_dep.end(); ++iter3){ @@ -767,8 +762,8 @@ duplicate(std::vector& cofaces_dep, // on duplique même si on est sur l'axe newEdge = new Topo::Edge(getContext(), - corr_vertex[(*iter2)->getVertex(0)], - corr_vertex[(*iter2)->getVertex(1)], + corr_vertex[(*iter2)->getVertices()[0]], + corr_vertex[(*iter2)->getVertices()[1]], coedges_arr); // reprise de la semi-conformité for (std::vector::iterator iter3 = coedges_dep.begin(); @@ -813,8 +808,7 @@ duplicate(std::vector& cofaces_dep, std::cout<<"corr_coface "<<(*iter1)->getName()<<" => "<getName()< coedges; - newCoface->getCoEdges(coedges, false); + std::vector coedges = newCoface->getCoEdges(); for (uint i=0; i& cofaces, if (surf) (*iter1)->setGeomAssociation(S2S[surf]); - std::vector coedges; - (*iter1)->getCoEdges(coedges); - + std::vector coedges = (*iter1)->getCoEdges(); for (std::vector::iterator iter3 = coedges.begin(); iter3 != coedges.end(); ++iter3){ @@ -894,12 +886,10 @@ updateGeomAssociation(std::vector& cofaces, } } - std::vector vertices; - (*iter3)->getVertices(vertices); + const std::vector& vertices = (*iter3)->getVertices(); getInfoCommand().addTopoInfoEntity(*iter3,Internal::InfoCommand::DISPMODIFIED); - for (std::vector::iterator iter4 = vertices.begin(); - iter4 != vertices.end(); ++iter4){ + for (auto iter4 = vertices.begin(); iter4 != vertices.end(); ++iter4){ Geom::GeomEntity* ge = (*iter4)->getGeomAssociation(); #ifdef _DEBUG2 std::cout<<" traite"<<*(*iter4)<& cofaces, (*iter1)->setGeomAssociation(0); - std::vector coedges; - (*iter1)->getCoEdges(coedges); - + std::vector coedges = (*iter1)->getCoEdges(); for (std::vector::iterator iter3 = coedges.begin(); iter3 != coedges.end(); ++iter3){ @@ -969,12 +957,10 @@ updateGeomAssociation(std::vector& cofaces, if (getInfoCommand().addTopoInfoEntity(*iter3,Internal::InfoCommand::DISPMODIFIED)) (*iter3)->saveTopoProperty(); - std::vector vertices; - (*iter3)->getVertices(vertices); + const std::vector& vertices = (*iter3)->getVertices(); getInfoCommand().addTopoInfoEntity(*iter3,Internal::InfoCommand::DISPMODIFIED); - for (std::vector::iterator iter4 = vertices.begin(); - iter4 != vertices.end(); ++iter4){ + for (auto iter4 = vertices.begin(); iter4 != vertices.end(); ++iter4){ Geom::GeomEntity* ge = (*iter4)->getGeomAssociation(); // on laisse les relation vers une entité qui n'est pas détruite (cas sur l'axe par ex) @@ -1082,8 +1068,7 @@ void CommandEditTopo::mergeCoEdges(Vertex* vtx, std::map& keep_coe { std::map filtre_vertices; - std::vector coedges; - vtx->getCoEdges(coedges); + std::vector coedges = vtx->getCoEdges(); for (uint i=0; igetOppositeVertex(vtx); @@ -1118,12 +1103,11 @@ void CommandEditTopo::mergeCoFaces(Vertex* vtx, std::map& keep_cof std::cout<<"CommandEditTopo::mergeCoFaces("<getName()<<")"< cofaces; - vtx->getCoFaces(cofaces); + std::vector cofaces = vtx->getCoFaces(); for (uint i=0; igetNbBlocks() == 1){ + if (coface->getBlocks().size() == 1){ std::map filtre_cofaces; #ifdef _DEBUG_MERGE @@ -1131,21 +1115,16 @@ void CommandEditTopo::mergeCoFaces(Vertex* vtx, std::map& keep_cof #endif // pour chacun des sommets, marque les cofaces adjacentes - std::vector vertices; - coface->getVertices(vertices); - + std::vector vertices = coface->getVertices(); for (uint j=0; jgetName()< loc_cofaces; - vertices[j]->getCoFaces(loc_cofaces); - - for (uint k=0; kgetCoFaces()){ + filtre_cofaces[loc_coface] += 1; #ifdef _DEBUG_MERGE - std::cout<<" coface "<getName()<<" marquée à "<getName()<<" marquée à "<& keep_cof // on vérifie que les sommets communs sont aux extrémités des faces et pas internes à un côté std::map filtre_vertices; - coface1->getVertices(vertices); + vertices = coface1->getVertices(); for (uint j=0; jgetVertices(vertices); + vertices = coface2->getVertices(); for (uint j=0; j &nb_coedges_by_vertex) { // stocke pour chacun des sommets le nombre d'arêtes auxquelles il est relié - std::vector all_vertices; - m_bloc->getAllVertices(all_vertices); - for (uint i=0; igetNbCoEdges(); + for (Topo::Vertex* vtx : m_bloc->getAllVertices()) + nb_coedges_by_vertex[vtx] = vtx->getCoEdges().size(); } /*----------------------------------------------------------------------------*/ void CommandExtendSplitBlock::getPreviewRepresentation(Utils::DisplayRepresentation& dr) diff --git a/src/Core/Topo/CommandExtendSplitFace.cpp b/src/Core/Topo/CommandExtendSplitFace.cpp index 1f2a424e..6bde7c9f 100644 --- a/src/Core/Topo/CommandExtendSplitFace.cpp +++ b/src/Core/Topo/CommandExtendSplitFace.cpp @@ -37,22 +37,16 @@ internalExecute() << " de nom unique " << getUniqueName ( ); // vérification que le sommet n'est pas à une extrémité de la coface, sinon cela ne ferait rien - std::vector vertices; - m_coface->getVertices(vertices); - for (std::vector::iterator iter = vertices.begin(); iter != vertices.end(); ++iter) - if (m_sommet == *iter) + for (Topo::Vertex* v : m_coface->getVertices()) + if (m_sommet == v) throw TkUtil::Exception (TkUtil::UTF8String ("La face ne peut être découpée avec un sommet au sommet de la face (en prendre un sur un côté)", TkUtil::Charset::UTF_8)); // recherche de l'arête de la face qui contient ce sommet - std::vector coedges; - m_coface->getCoEdges(coedges); - CoEdge* coedge = 0; - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter) - if ((*iter)->find(m_sommet)) - coedge = *iter; + for (Topo::CoEdge* e : m_coface->getCoEdges()) + if (Utils::contains(m_sommet, e->getVertices())) + coedge = e; if (coedge == 0) throw TkUtil::Exception (TkUtil::UTF8String ("La face ne peut être découpée avec ce sommet, on ne trouve pas d'arête contenant ce sommet", TkUtil::Charset::UTF_8)); @@ -62,9 +56,9 @@ internalExecute() std::vector cofaces; cofaces.push_back(m_coface); - if (coedge->getVertex(0) == m_sommet) + if (coedge->getVertices()[0] == m_sommet) TopoHelper::splitFaces(cofaces, coedge, 0, 0, false, false, splitingEdges, &getInfoCommand()); - else if (coedge->getVertex(1) == m_sommet) + else if (coedge->getVertices()[1] == m_sommet) TopoHelper::splitFaces(cofaces, coedge, 1, 0, false, false, splitingEdges, &getInfoCommand()); else throw TkUtil::Exception (TkUtil::UTF8String ("La face ne peut être découpée avec ce sommet, on ne trouve retrouve pas ce sommet dans l'arête", TkUtil::Charset::UTF_8)); @@ -85,10 +79,8 @@ void CommandExtendSplitFace:: countNbCoEdgesByVertices(std::map &nb_coedges_by_vertex) { // stocke pour chacun des sommets le nombre d'arêtes auxquelles il est relié - std::vector all_vertices; - m_coface->getAllVertices(all_vertices); - for (uint i=0; igetNbCoEdges(); + for (Topo::Vertex * vtx : m_coface->getAllVertices()) + nb_coedges_by_vertex[vtx] = vtx->getCoEdges().size(); } /*----------------------------------------------------------------------------*/ void CommandExtendSplitFace::getPreviewRepresentation(Utils::DisplayRepresentation& dr) diff --git a/src/Core/Topo/CommandExtrudeFace.cpp b/src/Core/Topo/CommandExtrudeFace.cpp index d9e10e35..cc7d920e 100644 --- a/src/Core/Topo/CommandExtrudeFace.cpp +++ b/src/Core/Topo/CommandExtrudeFace.cpp @@ -95,24 +95,19 @@ namespace Mgx3D { f->setGeomAssociation(0); //Réinitialisation associations géométriques des sommets des faces, possible doublons - std::vector f_vertices; - f->getVertices(f_vertices); - for(auto v : f_vertices){ + for(Topo::Vertex* v : f->getVertices()){ v->setGeomAssociation(0); } //Réinitialisation associations géométriques des aretes des faces, possible doublons - std::vector f_edges; - f->getEdges(f_edges); - for(auto e : f_edges){ + for(Topo::Edge* e : f->getEdges()){ e->setGeomAssociation(0); } //------------------------ //------------------------ //Chaque face dupliquée est associée aux groupe de la face de base - std::vector groups = m_cofaces[i_f]->getGroups(); - for (Group::Group2D* gr : groups) { + for (Group::Group2D* gr : m_cofaces[i_f]->getGroups()) { gr->add(f); f->add(gr); } @@ -197,42 +192,36 @@ namespace Mgx3D { for (; iter1_0 != cofaces_0.end(); ++iter1_0, ++iter1_1){ - std::vector edges_0; - std::vector edges_1; - (*iter1_0)->getEdges(edges_0); - (*iter1_1)->getEdges(edges_1); + const std::vector& edges_0 = (*iter1_0)->getEdges(); + const std::vector& edges_1 = (*iter1_1)->getEdges(); if (edges_0.size() != edges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeCoEdges avec des nombres de Edge différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter2_0 = edges_0.begin(); - std::vector::iterator iter2_1 = edges_1.begin(); + auto iter2_0 = edges_0.begin(); + auto iter2_1 = edges_1.begin(); for (; iter2_0 != edges_0.end(); ++iter2_0, ++iter2_1){ - std::vector coedges_0; - std::vector coedges_1; - (*iter2_0)->getCoEdges(coedges_0); - (*iter2_1)->getCoEdges(coedges_1); + std::vector coedges_0 = (*iter2_0)->getCoEdges(); + std::vector coedges_1 = (*iter2_1)->getCoEdges(); if (coedges_0.size() != coedges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeCoEdges avec des nombres de CoEdge différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter3_0 = coedges_0.begin(); - std::vector::iterator iter3_1 = coedges_1.begin(); + auto iter3_0 = coedges_0.begin(); + auto iter3_1 = coedges_1.begin(); for (; iter3_0 != coedges_0.end(); ++iter3_0, ++iter3_1){ - std::vector vertices_0; - std::vector vertices_1; - (*iter3_0)->getVertices(vertices_0); - (*iter3_1)->getVertices(vertices_1); + const std::vector& vertices_0 = (*iter3_0)->getVertices(); + const std::vector& vertices_1 = (*iter3_1)->getVertices(); if (vertices_0.size() != vertices_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeCoEdges avec des nombres de Vertex différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter4_0 = vertices_0.begin(); - std::vector::iterator iter4_1 = vertices_1.begin(); + auto iter4_0 = vertices_0.begin(); + auto iter4_1 = vertices_1.begin(); for (; iter4_0 != vertices_0.end(); ++iter4_0, ++iter4_1){ Vertex* vtx0 = *iter4_0; @@ -277,23 +266,19 @@ namespace Mgx3D { for (; iter1_0 != cofaces_0.end(); ++iter1_0, ++iter1_1){ - std::vector edges_0; - std::vector edges_1; - (*iter1_0)->getEdges(edges_0); - (*iter1_1)->getEdges(edges_1); + const std::vector& edges_0 = (*iter1_0)->getEdges();; + const std::vector& edges_1 = (*iter1_1)->getEdges(); if (edges_0.size() != edges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeFaces avec des nombres de Edge différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter2_0 = edges_0.begin(); - std::vector::iterator iter2_1 = edges_1.begin(); + auto iter2_0 = edges_0.begin(); + auto iter2_1 = edges_1.begin(); for (; iter2_0 != edges_0.end(); ++iter2_0, ++iter2_1){ - std::vector coedges_0; - std::vector coedges_1; - (*iter2_0)->getCoEdges(coedges_0); - (*iter2_1)->getCoEdges(coedges_1); + std::vector coedges_0 = (*iter2_0)->getCoEdges(); + std::vector coedges_1 = (*iter2_1)->getCoEdges(); if (coedges_0.size() != coedges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeFaces avec des nombres de CoEdge différents", TkUtil::Charset::UTF_8)); @@ -308,10 +293,8 @@ namespace Mgx3D { if (filtre_vu[coedge_0] == 0){ filtre_vu[coedge_0] = 1; - std::vector vertices_0; - std::vector vertices_1; - (*iter3_0)->getVertices(vertices_0); - (*iter3_1)->getVertices(vertices_1); + const std::vector& vertices_0 = (*iter3_0)->getVertices(); + const std::vector& vertices_1 = (*iter3_1)->getVertices(); if (vertices_0.size() != vertices_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeFaces avec des nombres de Vertex différents", TkUtil::Charset::UTF_8)); @@ -395,8 +378,8 @@ namespace Mgx3D { getInfoCommand().addTopoInfoEntity(faces[0], Internal::InfoCommand::CREATED); getInfoCommand().addTopoInfoEntity(faces[1], Internal::InfoCommand::CREATED); - if (!((coface_0->getNbEdges() == 4 && coface_1->getNbEdges() == 4) - || (coface_0->getNbEdges() == 3 && coface_1->getNbEdges() == 3))) + if (!((coface_0->getEdges().size() == 4 && coface_1->getEdges().size() == 4) + || (coface_0->getEdges().size() == 3 && coface_1->getEdges().size() == 3))) { TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Erreur interne, la création d'un bloc ne peut se faire pour la face "<getName() @@ -409,21 +392,21 @@ namespace Mgx3D { uint tabIndFace[4] = {0, 2, 1, 3}; // on ordonne les sommets pour être compatible avec l'ordre pour le Block - vertices.push_back(coface_0->getVertex(tabIndVtx[0])); - vertices.push_back(coface_1->getVertex(tabIndVtx[0])); - vertices.push_back(coface_0->getVertex(tabIndVtx[1])); - vertices.push_back(coface_1->getVertex(tabIndVtx[1])); - vertices.push_back(coface_0->getVertex(tabIndVtx[2])); - if (coface_0->getNbEdges() == 4){ - if (vertices.back() != coface_1->getVertex(tabIndVtx[2])) - vertices.push_back(coface_1->getVertex(tabIndVtx[2])); - vertices.push_back(coface_0->getVertex(tabIndVtx[3])); - if (vertices.back() != coface_1->getVertex(tabIndVtx[3])) - vertices.push_back(coface_1->getVertex(tabIndVtx[3])); + vertices.push_back(coface_0->getVertices()[tabIndVtx[0]]); + vertices.push_back(coface_1->getVertices()[tabIndVtx[0]]); + vertices.push_back(coface_0->getVertices()[tabIndVtx[1]]); + vertices.push_back(coface_1->getVertices()[tabIndVtx[1]]); + vertices.push_back(coface_0->getVertices()[tabIndVtx[2]]); + if (coface_0->getEdges().size() == 4){ + if (vertices.back() != coface_1->getVertices()[tabIndVtx[2]]) + vertices.push_back(coface_1->getVertices()[tabIndVtx[2]]); + vertices.push_back(coface_0->getVertices()[tabIndVtx[3]]); + if (vertices.back() != coface_1->getVertices()[tabIndVtx[3]]) + vertices.push_back(coface_1->getVertices()[tabIndVtx[3]]); } else // cas d'un bloc dégénéré - vertices.push_back(coface_1->getVertex(tabIndVtx[2])); + vertices.push_back(coface_1->getVertices()[tabIndVtx[2]]); #ifdef _DEBUG2 std::cout<<" vertices pour bloc:"; @@ -432,16 +415,16 @@ namespace Mgx3D { std::cout<getNbEdges(); i++){ + for (uint i=0; igetEdges().size(); i++){ - Edge* edge_0 = coface_0->getEdge(tabIndFace[i]); - Edge* edge_1 = coface_1->getEdge(tabIndFace[i]); + Edge* edge_0 = coface_0->getEdges()[tabIndFace[i]]; + Edge* edge_1 = coface_1->getEdges()[tabIndFace[i]]; std::vector face_vertices; - Vertex* vtx0 = edge_0->getVertex(0); - Vertex* vtx1 = edge_0->getVertex(1); - Vertex* vtx2 = edge_1->getVertex(1); - Vertex* vtx3 = edge_1->getVertex(0); + Vertex* vtx0 = edge_0->getVertices()[0]; + Vertex* vtx1 = edge_0->getVertices()[1]; + Vertex* vtx2 = edge_1->getVertices()[1]; + Vertex* vtx3 = edge_1->getVertices()[0]; if (vtx1!=vtx2){ face_vertices.push_back(vtx0); @@ -457,17 +440,11 @@ namespace Mgx3D { } std::vector face_cofaces; + std::vector coedges_0 = edge_0->getCoEdges(); - std::vector coedges_0; - edge_0->getCoEdges(coedges_0); - - for (std::vector::iterator iter3 = coedges_0.begin(); - iter3 != coedges_0.end(); ++iter3){ - std::vector& revol_cofaces = coedge2cofaces[*iter3]; - for (std::vector::iterator iter4 = revol_cofaces.begin(); - iter4 != revol_cofaces.end(); ++iter4) - face_cofaces.push_back(*iter4); - } + for (CoEdge* ce : coedges_0) + for (CoFace* cf : coedge2cofaces[ce]) + face_cofaces.push_back(cf); #ifdef _DEBUG2 std::cout<<" création d'une Face avec cofaces:"; for (uint j=0; j& cofaces_0 for (; iter1_0 != cofaces_0.end(); ++iter1_0, ++iter1_1){ - std::vector edges_0; - std::vector edges_1; - (*iter1_0)->getEdges(edges_0); - (*iter1_1)->getEdges(edges_1); + const std::vector& edges_0 = (*iter1_0)->getEdges(); + const std::vector& edges_1 = (*iter1_1)->getEdges(); if (edges_0.size() != edges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeCoEdges avec des nombres de Edge différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter2_0 = edges_0.begin(); - std::vector::iterator iter2_1 = edges_1.begin(); + auto iter2_0 = edges_0.begin(); + auto iter2_1 = edges_1.begin(); for (; iter2_0 != edges_0.end(); ++iter2_0, ++iter2_1){ - std::vector coedges_0; - std::vector coedges_1; - (*iter2_0)->getCoEdges(coedges_0); - (*iter2_1)->getCoEdges(coedges_1); + std::vector coedges_0 = (*iter2_0)->getCoEdges(); + std::vector coedges_1 = (*iter2_1)->getCoEdges(); if (coedges_0.size() != coedges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeCoEdges avec des nombres de CoEdge différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter3_0 = coedges_0.begin(); - std::vector::iterator iter3_1 = coedges_1.begin(); + auto iter3_0 = coedges_0.begin(); + auto iter3_1 = coedges_1.begin(); for (; iter3_0 != coedges_0.end(); ++iter3_0, ++iter3_1){ - std::vector vertices_0; - std::vector vertices_1; - (*iter3_0)->getVertices(vertices_0); - (*iter3_1)->getVertices(vertices_1); + const std::vector& vertices_0 = (*iter3_0)->getVertices(); + const std::vector& vertices_1 = (*iter3_1)->getVertices(); if (vertices_0.size() != vertices_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeCoEdges avec des nombres de Vertex différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter4_0 = vertices_0.begin(); - std::vector::iterator iter4_1 = vertices_1.begin(); + auto iter4_0 = vertices_0.begin(); + auto iter4_1 = vertices_1.begin(); for (; iter4_0 != vertices_0.end(); ++iter4_0, ++iter4_1){ Vertex* vtx0 = *iter4_0; @@ -246,29 +240,25 @@ void CommandExtrudeTopo::constructExtrudeFaces(std::vector& cofaces_0, for (; iter1_0 != cofaces_0.end(); ++iter1_0, ++iter1_1){ - std::vector edges_0; - std::vector edges_1; - (*iter1_0)->getEdges(edges_0); - (*iter1_1)->getEdges(edges_1); + const std::vector& edges_0 = (*iter1_0)->getEdges(); + const std::vector& edges_1 = (*iter1_1)->getEdges(); if (edges_0.size() != edges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeFaces avec des nombres de Edge différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter2_0 = edges_0.begin(); - std::vector::iterator iter2_1 = edges_1.begin(); + auto iter2_0 = edges_0.begin(); + auto iter2_1 = edges_1.begin(); for (; iter2_0 != edges_0.end(); ++iter2_0, ++iter2_1){ - std::vector coedges_0; - std::vector coedges_1; - (*iter2_0)->getCoEdges(coedges_0); - (*iter2_1)->getCoEdges(coedges_1); + std::vector coedges_0 = (*iter2_0)->getCoEdges(); + std::vector coedges_1 = (*iter2_1)->getCoEdges(); if (coedges_0.size() != coedges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeFaces avec des nombres de CoEdge différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter3_0 = coedges_0.begin(); - std::vector::iterator iter3_1 = coedges_1.begin(); + auto iter3_0 = coedges_0.begin(); + auto iter3_1 = coedges_1.begin(); for (; iter3_0 != coedges_0.end(); ++iter3_0, ++iter3_1){ CoEdge* coedge_0 = *iter3_0; @@ -277,10 +267,8 @@ void CommandExtrudeTopo::constructExtrudeFaces(std::vector& cofaces_0, if (filtre_vu[coedge_0] == 0){ filtre_vu[coedge_0] = 1; - std::vector vertices_0; - std::vector vertices_1; - (*iter3_0)->getVertices(vertices_0); - (*iter3_1)->getVertices(vertices_1); + const std::vector& vertices_0 = (*iter3_0)->getVertices(); + const std::vector& vertices_1 = (*iter3_1)->getVertices(); if (vertices_0.size() != vertices_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructExtrudeFaces avec des nombres de Vertex différents", TkUtil::Charset::UTF_8)); @@ -364,8 +352,8 @@ void CommandExtrudeTopo::constructExtrudeBlocks(std::vector& cofaces_0, getInfoCommand().addTopoInfoEntity(faces[0], Internal::InfoCommand::CREATED); getInfoCommand().addTopoInfoEntity(faces[1], Internal::InfoCommand::CREATED); - if (!((coface_0->getNbEdges() == 4 && coface_1->getNbEdges() == 4) - || (coface_0->getNbEdges() == 3 && coface_1->getNbEdges() == 3))) + if (!((coface_0->getEdges().size() == 4 && coface_1->getEdges().size() == 4) + || (coface_0->getEdges().size() == 3 && coface_1->getEdges().size() == 3))) { TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Erreur interne, la création d'un bloc ne peut se faire pour la face "<getName() @@ -378,21 +366,21 @@ void CommandExtrudeTopo::constructExtrudeBlocks(std::vector& cofaces_0, uint tabIndFace[4] = {0, 2, 1, 3}; // on ordonne les sommets pour être compatible avec l'ordre pour le Block - vertices.push_back(coface_0->getVertex(tabIndVtx[0])); - vertices.push_back(coface_1->getVertex(tabIndVtx[0])); - vertices.push_back(coface_0->getVertex(tabIndVtx[1])); - vertices.push_back(coface_1->getVertex(tabIndVtx[1])); - vertices.push_back(coface_0->getVertex(tabIndVtx[2])); - if (coface_0->getNbEdges() == 4){ - if (vertices.back() != coface_1->getVertex(tabIndVtx[2])) - vertices.push_back(coface_1->getVertex(tabIndVtx[2])); - vertices.push_back(coface_0->getVertex(tabIndVtx[3])); - if (vertices.back() != coface_1->getVertex(tabIndVtx[3])) - vertices.push_back(coface_1->getVertex(tabIndVtx[3])); + vertices.push_back(coface_0->getVertices()[tabIndVtx[0]]); + vertices.push_back(coface_1->getVertices()[tabIndVtx[0]]); + vertices.push_back(coface_0->getVertices()[tabIndVtx[1]]); + vertices.push_back(coface_1->getVertices()[tabIndVtx[1]]); + vertices.push_back(coface_0->getVertices()[tabIndVtx[2]]); + if (coface_0->getEdges().size() == 4){ + if (vertices.back() != coface_1->getVertices()[tabIndVtx[2]]) + vertices.push_back(coface_1->getVertices()[tabIndVtx[2]]); + vertices.push_back(coface_0->getVertices()[tabIndVtx[3]]); + if (vertices.back() != coface_1->getVertices()[tabIndVtx[3]]) + vertices.push_back(coface_1->getVertices()[tabIndVtx[3]]); } else // cas d'un bloc dégénéré - vertices.push_back(coface_1->getVertex(tabIndVtx[2])); + vertices.push_back(coface_1->getVertices()[tabIndVtx[2]]); #ifdef _DEBUG2 std::cout<<" vertices pour bloc:"; @@ -401,16 +389,16 @@ void CommandExtrudeTopo::constructExtrudeBlocks(std::vector& cofaces_0, std::cout<getNbEdges(); i++){ + for (uint i=0; igetEdges().size(); i++){ - Edge* edge_0 = coface_0->getEdge(tabIndFace[i]); - Edge* edge_1 = coface_1->getEdge(tabIndFace[i]); + Edge* edge_0 = coface_0->getEdges()[tabIndFace[i]]; + Edge* edge_1 = coface_1->getEdges()[tabIndFace[i]]; std::vector face_vertices; - Vertex* vtx0 = edge_0->getVertex(0); - Vertex* vtx1 = edge_0->getVertex(1); - Vertex* vtx2 = edge_1->getVertex(1); - Vertex* vtx3 = edge_1->getVertex(0); + Vertex* vtx0 = edge_0->getVertices()[0]; + Vertex* vtx1 = edge_0->getVertices()[1]; + Vertex* vtx2 = edge_1->getVertices()[1]; + Vertex* vtx3 = edge_1->getVertices()[0]; if (vtx1!=vtx2){ face_vertices.push_back(vtx0); @@ -426,17 +414,10 @@ void CommandExtrudeTopo::constructExtrudeBlocks(std::vector& cofaces_0, } std::vector face_cofaces; - - std::vector coedges_0; - edge_0->getCoEdges(coedges_0); - - for (std::vector::iterator iter3 = coedges_0.begin(); - iter3 != coedges_0.end(); ++iter3){ - std::vector& revol_cofaces = coedge2cofaces[*iter3]; - for (std::vector::iterator iter4 = revol_cofaces.begin(); - iter4 != revol_cofaces.end(); ++iter4) - face_cofaces.push_back(*iter4); - } + std::vector coedges_0 = edge_0->getCoEdges(); + for (CoEdge* ce : coedges_0) + for (CoFace* cf : coedge2cofaces[ce]) + face_cofaces.push_back(cf); #ifdef _DEBUG2 std::cout<<" création d'une Face avec cofaces:"; for (uint j=0; jisStructured() || !bl_B->isStructured()) throw TkUtil::Exception (TkUtil::UTF8String ("Le collage n'est possible qu'avec des blocs structurés", TkUtil::Charset::UTF_8)); - if (bl_A->getNbVertices()!=8 || bl_B->getNbVertices()!=8) + if (bl_A->getVertices().size()!=8 || bl_B->getVertices().size()!=8) throw TkUtil::Exception (TkUtil::UTF8String ("Le collage n'est possible qu'avec des blocs non dégénérés", TkUtil::Charset::UTF_8)); if (bl_A->getGeomAssociation() != bl_B->getGeomAssociation()) @@ -49,16 +49,14 @@ internalExecute() Face* faceA = getNearestFace(m_bl_A, m_bl_B->getBarycentre()); Face* faceB = getNearestFace(m_bl_B, m_bl_A->getBarycentre()); // vérification : les 2 faces doivent avoir les même sommets - std::vector verticesFA; - std::vector verticesFB; - faceA->getVertices(verticesFA); - faceB->getVertices(verticesFB); + std::vector verticesFA = faceA->getVertices(); + std::vector verticesFB = faceB->getVertices(); if (!TopoHelper::haveSame(verticesFA, verticesFB)) throw TkUtil::Exception (TkUtil::UTF8String ("On ne trouve pas de face en commun (avec les même sommets) pour les 2 blocs", TkUtil::Charset::UTF_8)); // recherche des 8 sommets pour le nouveau bloc - uint idA = m_bl_A->getIndex(faceA); // indice de la face dans le bloc A - uint idB = m_bl_B->getIndex(faceB); // indice de la face dans le bloc B + uint idA = Utils::getIndexOf(faceA, m_bl_A->getFaces()); // indice de la face dans le bloc A + uint idB = Utils::getIndexOf(faceB, m_bl_B->getFaces()); // indice de la face dans le bloc B uint idA_op = ((idA/2)*2+(idA%2+1)%2); // indice de la face opposée uint idB_op = ((idB/2)*2+(idB%2+1)%2); // indice de la face opposée @@ -120,10 +118,10 @@ internalExecute() loc_vtx.push_back(newVertices[id2]); loc_vtx.push_back(newVertices[4+id2]); loc_vtx.push_back(newVertices[4+id1]); - for (uint j=0; jgetNbCoFaces(); j++) - loc_cofaces.push_back(faces1[i]->getCoFace(j)); - for (uint j=0; jgetNbCoFaces(); j++) - loc_cofaces.push_back(faces2[i]->getCoFace(j)); + for (CoFace* cf : faces1[i]->getCoFaces()) + loc_cofaces.push_back(cf); + for (CoFace* cf : faces2[i]->getCoFaces()) + loc_cofaces.push_back(cf); newFaces.push_back(new Face(getContext(), loc_cofaces, loc_vtx, true)); getInfoCommand().addTopoInfoEntity(newFaces.back(), Internal::InfoCommand::CREATED); } @@ -153,11 +151,10 @@ internalExecute() newBlock->setGeomAssociation(m_bl_A->getGeomAssociation()); // destruction des faces et cofaces entre les 2 - std::vector loc_cofaces; - faceA->getCoFaces(loc_cofaces); + std::vector loc_cofaces = faceA->getCoFaces(); for (uint i=0; ifree(&getInfoCommand()); - faceB->getCoFaces(loc_cofaces); + loc_cofaces = faceB->getCoFaces(); for (uint i=0; ifree(&getInfoCommand()); @@ -199,16 +196,16 @@ postExecute(bool hasError) Face* CommandFuse2Blocks::getNearestFace(Block* bl, Utils::Math::Point pt) { uint id_best = 0; - double dist2 = bl->getFace(0)->getBarycentre().length2(pt); - uint nb_faces = bl->getNbFaces(); - for (uint i=1; igetFace(i)->getBarycentre().length2(pt); + const std::vector& faces = bl->getFaces(); + double dist2 = faces[0]->getBarycentre().length2(pt); + for (uint i=1; igetBarycentre().length2(pt); if (d2getFace(id_best); + return faces[id_best]; } /*----------------------------------------------------------------------------*/ void CommandFuse2Blocks::getPreviewRepresentation(Utils::DisplayRepresentation& dr) diff --git a/src/Core/Topo/CommandFuse2EdgeList.cpp b/src/Core/Topo/CommandFuse2EdgeList.cpp index 9b4b0367..3db6f69b 100644 --- a/src/Core/Topo/CommandFuse2EdgeList.cpp +++ b/src/Core/Topo/CommandFuse2EdgeList.cpp @@ -47,8 +47,7 @@ internalExecute() for (std::vector::iterator iter1 = m_coedges1.begin(); iter1 != m_coedges1.end(); ++iter1){ - std::vector vertices; - (*iter1)->getAllVertices(vertices); + std::vector vertices = (*iter1)->getAllVertices(); for (std::vector::iterator iter2 = vertices.begin(); iter2 != vertices.end(); ++iter2){ filtre_vtx[*iter2] = 1; @@ -57,8 +56,7 @@ internalExecute() for (std::vector::iterator iter1 = m_coedges2.begin(); iter1 != m_coedges2.end(); ++iter1){ - std::vector vertices; - (*iter1)->getAllVertices(vertices); + std::vector vertices = (*iter1)->getAllVertices(); for (std::vector::iterator iter2 = vertices.begin(); iter2 != vertices.end(); ++iter2){ if (1 == filtre_vtx[*iter2]) @@ -130,9 +128,8 @@ internalExecute() for (std::vector::iterator iter1 = m_coedges1.begin(); iter1 != m_coedges1.end(); ++iter1){ CoEdge* coedge1 = *iter1; - std::vector verticesA; + std::vector verticesA = coedge1->getAllVertices(); std::vector verticesB; - coedge1->getAllVertices(verticesA); #ifdef _DEBUG_GLUE std::cout<<"on observe l'arête commune "<getName(); for (uint i=0; i keep_coedges; std::map keep_cofaces; - for (uint i=0; igetNbVertices(); i++){ - Vertex* vtx = m_edge_A->getVertex(i); - if (!m_edge_B->find(vtx)){ - std::vector loc_coedges; - vtx->getCoEdges(loc_coedges); - for (uint j=0; jgetVertices()) + if (!Utils::contains(vtx, m_edge_B->getVertices())) + for (CoEdge* loc_coedge : vtx->getCoEdges()) + keep_coedges[loc_coedge] = 1; - std::vector loc_cofaces; - m_edge_A->getCoFaces(loc_cofaces); - for (uint i=0; igetCoFaces()) + keep_cofaces[loc_coface] = 1; // fusion avec recherche des sommets les plus proche possible m_edge_A->fuse(m_edge_B, &getInfoCommand()); - std::vector vertices; - m_edge_A->getVertices(vertices); + const std::vector& vertices = m_edge_A->getVertices(); // fusion des arêtes autour for (uint i=0; i filtre_vtx; - for (std::vector::iterator iter1 = m_cofaces1.begin(); - iter1 != m_cofaces1.end(); ++iter1){ - std::vector vertices; - (*iter1)->getAllVertices(vertices); - for (std::vector::iterator iter2 = vertices.begin(); - iter2 != vertices.end(); ++iter2){ - filtre_vtx[*iter2] = 1; - } // end for iter2 = vertices.begin() - } // end for iter1 = cofaces1.begin() + for (CoFace* cf : m_cofaces1){ + for (Vertex* v : cf->getAllVertices()){ + filtre_vtx[v] = 1; + } + } - for (std::vector::iterator iter1 = m_cofaces2.begin(); - iter1 != m_cofaces2.end(); ++iter1){ - std::vector vertices; - (*iter1)->getAllVertices(vertices); - for (std::vector::iterator iter2 = vertices.begin(); - iter2 != vertices.end(); ++iter2){ - if (1 == filtre_vtx[*iter2]) - filtre_vtx[*iter2] = 3; - else if (0 == filtre_vtx[*iter2]) - filtre_vtx[*iter2] = 2; - } // end for iter2 = vertices.begin() - } // end for iter1 = cofaces1.begin() + for (CoFace* cf : m_cofaces2){ + for (Vertex* v : cf->getAllVertices()){ + if (1 == filtre_vtx[v]) + filtre_vtx[v] = 3; + else if (0 == filtre_vtx[v]) + filtre_vtx[v] = 2; + } + } // constitution des 2 listes de sommets dont on cherche à trouver une relation de proximité std::vector vertices1; @@ -130,9 +122,9 @@ internalExecute() for (std::vector::iterator iter1 = m_cofaces1.begin(); iter1 != m_cofaces1.end(); ++iter1){ CoFace* coface1 = *iter1; - std::vector verticesA; + std::vector verticesA = coface1->getAllVertices(); std::vector verticesB; - coface1->getAllVertices(verticesA); + #ifdef _DEBUG_GLUE std::cout<<"on observe la face commune "<getName(); for (uint i=0; igetNbBlocks() == 2){ + if (face_A->getBlocks().size() == 2){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message <<"Fusion de 2 faces impossible avec "<getName()<<", cette face est déjà entre 2 blocs"; throw TkUtil::Exception(message); } - if (face_B->getNbBlocks() == 2){ + if (face_B->getBlocks().size() == 2){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message <<"Fusion de 2 faces impossible avec "<getName()<<", cette face est déjà entre 2 blocs"; throw TkUtil::Exception(message); diff --git a/src/Core/Topo/CommandFuse2Vertices.cpp b/src/Core/Topo/CommandFuse2Vertices.cpp index 4b44de11..8413a234 100644 --- a/src/Core/Topo/CommandFuse2Vertices.cpp +++ b/src/Core/Topo/CommandFuse2Vertices.cpp @@ -23,12 +23,9 @@ CommandFuse2Vertices(Internal::Context& c, Vertex* vtx_A, Vertex* vtx_B) // vérification qu'il n'y à pas une arête commune entre les 2 sommets // ce qui arrive lorsque l'on souhaite faire de la dégénérescence (snapVertices) CoEdge* coedge_between = 0; - std::vector loc_coedges; - vtx_A->getCoEdges(loc_coedges); - for (std::vector::iterator iter = loc_coedges.begin(); - iter != loc_coedges.end(); ++iter) - if (vtx_B == (*iter)->getOppositeVertex(vtx_A)) - coedge_between = *iter; + for (CoEdge* coedge : vtx_A->getCoEdges()) + if (vtx_B == coedge->getOppositeVertex(vtx_A)) + coedge_between = coedge; if (coedge_between){ throw TkUtil::Exception(TkUtil::UTF8String( "La fusion entre 2 sommets est prévue pour coller 2 topologies et pas pour effectuer une dégénescence d'un bloc", @@ -53,15 +50,11 @@ internalExecute() std::map keep_coedges; std::map keep_cofaces; - std::vector loc_coedges; - m_vtx_A->getCoEdges(loc_coedges); - for (uint j=0; jgetCoEdges()) + keep_coedges[loc_coedge] = 1; - std::vector loc_cofaces; - m_vtx_A->getCoFaces(loc_cofaces); - for (uint i=0; igetCoFaces()) + keep_cofaces[loc_coface] = 1; // fusion des 2 sommets m_vtx_A->merge(m_vtx_B, &getInfoCommand()); diff --git a/src/Core/Topo/CommandFuseCoEdges.cpp b/src/Core/Topo/CommandFuseCoEdges.cpp index e52ae208..e2b84e24 100644 --- a/src/Core/Topo/CommandFuseCoEdges.cpp +++ b/src/Core/Topo/CommandFuseCoEdges.cpp @@ -69,17 +69,15 @@ internalExecute() // Vérification qu'elles appartiennent aux mêmes arêtes std::map filtre_edges; - std::vector edges; - m_coedges[0]->getEdges(edges); + std::vector edges = m_coedges[0]->getEdges(); uint nb_edges = edges.size(); - for (std::vector::iterator iter2 = edges.begin(); - iter2 != edges.end(); ++iter2) + for (auto iter2 = edges.begin(); iter2 != edges.end(); ++iter2) filtre_edges[(*iter2)->getUniqueId()] = 1; for (std::vector::iterator iter1 = m_coedges.begin(); iter1 != m_coedges.end(); ++iter1){ - (*iter1)->getEdges(edges); + edges = (*iter1)->getEdges(); if (nb_edges != edges.size()) throw TkUtil::Exception (TkUtil::UTF8String ("La fusion d'arêtes communes ne peut se faire car elles ne sont pas toutes utilisées par le même nombre arêtes", TkUtil::Charset::UTF_8)); @@ -109,14 +107,15 @@ internalExecute() Topo::Vertex* vtx2 = 0; TopoHelper::getVerticesTip(m_coedges, vtx1, vtx2, true); - if (vtx1 == edge_modif->getVertex(0)) - edge_modif->replace(edge_modif->getVertex(1), vtx2, true, false, &getInfoCommand()); - else if (vtx1 == edge_modif->getVertex(1)) - edge_modif->replace(edge_modif->getVertex(0), vtx2, true, false, &getInfoCommand()); - else if (vtx2 == edge_modif->getVertex(0)) - edge_modif->replace(edge_modif->getVertex(1), vtx1, true, false, &getInfoCommand()); - else if (vtx2 == edge_modif->getVertex(1)) - edge_modif->replace(edge_modif->getVertex(0), vtx1, true, false, &getInfoCommand()); + const std::vector edge_modif_vertices = edge_modif->getVertices(); + if (vtx1 == edge_modif_vertices[0]) + edge_modif->replace(edge_modif_vertices[1], vtx2, true, false, &getInfoCommand()); + else if (vtx1 == edge_modif_vertices[1]) + edge_modif->replace(edge_modif_vertices[0], vtx2, true, false, &getInfoCommand()); + else if (vtx2 == edge_modif_vertices[0]) + edge_modif->replace(edge_modif_vertices[1], vtx1, true, false, &getInfoCommand()); + else if (vtx2 == edge_modif_vertices[1]) + edge_modif->replace(edge_modif_vertices[0], vtx1, true, false, &getInfoCommand()); else throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, CommandFuseCoEdges ne trouve pas de sommet extrémité pour l'arête à conserver", TkUtil::Charset::UTF_8)); @@ -124,8 +123,7 @@ internalExecute() m_coedges.pop_back(); for (std::vector::iterator iter1 = m_coedges.begin(); iter1 != m_coedges.end(); ++iter1){ - std::vector vertices; - (*iter1)->getVertices(vertices); + std::vector vertices = (*iter1)->getVertices(); for (std::vector::iterator iter2 = vertices.begin(); iter2 != vertices.end(); ++iter2) if (*iter2 != vtx1 && *iter2 != vtx2) diff --git a/src/Core/Topo/CommandGlue2Blocks.cpp b/src/Core/Topo/CommandGlue2Blocks.cpp index 12cc6e08..47022b91 100644 --- a/src/Core/Topo/CommandGlue2Blocks.cpp +++ b/src/Core/Topo/CommandGlue2Blocks.cpp @@ -38,11 +38,8 @@ internalExecute() Face* faceA = getNearestFace(m_bl_A, m_bl_B->getBarycentre()); Face* faceB = getNearestFace(m_bl_B, m_bl_A->getBarycentre()); - std::vector cofaces_A; - std::vector cofaces_B; - - faceA->getCoFaces(cofaces_A); - faceB->getCoFaces(cofaces_B); + std::vector cofaces_A = faceA->getCoFaces(); + std::vector cofaces_B = faceB->getCoFaces(); if (cofaces_A.size() > cofaces_B.size()){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); @@ -85,16 +82,16 @@ postExecute(bool hasError) Face* CommandGlue2Blocks::getNearestFace(Block* bl, Utils::Math::Point pt) { uint id_best = 0; - double dist2 = bl->getFace(0)->getBarycentre().length2(pt); - uint nb_faces = bl->getNbFaces(); - for (uint i=1; igetFace(i)->getBarycentre().length2(pt); + const std::vector& faces = bl->getFaces(); + double dist2 = faces[0]->getBarycentre().length2(pt); + for (uint i=1; igetBarycentre().length2(pt); if (d2getFace(id_best); + return faces[id_best]; } /*----------------------------------------------------------------------------*/ CoFace* CommandGlue2Blocks::getNearestCoFace(std::vector& cofaces, Utils::Math::Point pt) diff --git a/src/Core/Topo/CommandGlue2Topo.cpp b/src/Core/Topo/CommandGlue2Topo.cpp index d2987bcc..f1f830f6 100644 --- a/src/Core/Topo/CommandGlue2Topo.cpp +++ b/src/Core/Topo/CommandGlue2Topo.cpp @@ -57,7 +57,7 @@ internalExecute() Topo::TopoHelper::get(blocs, cofaces); for (Topo::CoFace* coface : cofaces) - if (coface->getNbBlocks() == 1) + if (coface->getBlocks().size() == 1) cofaces1.push_back(coface); #ifdef _DEBUG_GLUE std::cout<<"cofaces1: "; @@ -75,7 +75,7 @@ internalExecute() Topo::TopoHelper::get(blocs, cofaces); for (Topo::CoFace* coface : cofaces) - if (coface->getNbBlocks() == 1) + if (coface->getBlocks().size() == 1) cofaces2.push_back(coface); #ifdef _DEBUG_GLUE std::cout<<"cofaces2: "; @@ -91,28 +91,20 @@ internalExecute() // à 3 pour les sommets communs à cofaces1 et cofaces2 std::map filtre_vtx; - for (std::vector::iterator iter1 = cofaces1.begin(); - iter1 != cofaces1.end(); ++iter1){ - std::vector vertices; - (*iter1)->getAllVertices(vertices); - for (std::vector::iterator iter2 = vertices.begin(); - iter2 != vertices.end(); ++iter2){ - filtre_vtx[*iter2] = 1; - } // end for iter2 = vertices.begin() - } // end for iter1 = cofaces1.begin() + for (CoFace* cf : cofaces1){ + for (Vertex* v : cf->getAllVertices()){ + filtre_vtx[v] = 1; + } + } - for (std::vector::iterator iter1 = cofaces2.begin(); - iter1 != cofaces2.end(); ++iter1){ - std::vector vertices; - (*iter1)->getAllVertices(vertices); - for (std::vector::iterator iter2 = vertices.begin(); - iter2 != vertices.end(); ++iter2){ - if (1 == filtre_vtx[*iter2]) - filtre_vtx[*iter2] = 3; - else if (0 == filtre_vtx[*iter2]) - filtre_vtx[*iter2] = 2; - } // end for iter2 = vertices.begin() - } // end for iter1 = cofaces1.begin() + for (CoFace* cf : cofaces2){ + for (Vertex* v : cf->getAllVertices()){ + if (1 == filtre_vtx[v]) + filtre_vtx[v] = 3; + else if (0 == filtre_vtx[v]) + filtre_vtx[v] = 2; + } + } // constitution des 2 listes de sommets dont on cherche à trouver une relation de proximité std::vector vertices1; @@ -160,9 +152,9 @@ internalExecute() for (std::vector::iterator iter1 = cofaces1.begin(); iter1 != cofaces1.end(); ++iter1){ CoFace* coface1 = *iter1; - std::vector verticesA; + std::vector verticesA = coface1->getAllVertices(); std::vector verticesB; - coface1->getAllVertices(verticesA); + #ifdef _DEBUG_GLUE std::cout<<"on observe la face commune "<getName(); for (uint i=0; i::iterator iter_cf=m_cofaces.begin(); - iter_cf!=m_cofaces.end(); ++iter_cf){ - CoFace* coface = *iter_cf; - + for (CoFace* coface : m_cofaces){ // les cofaces sélectionnées sont à dupliquer m_filtre_coface[coface] = 4; - std::vector blocks; - coface->getBlocks(blocks); - + std::vector blocks = coface->getBlocks(); if (blocks.size() != 2){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message <<"Insertion d'un trou impossible avec face "<getName()<<", elle n'est pas entre 2 blocs"; @@ -119,14 +114,13 @@ duplicate() } // on marque tous les blocs à 1 dans un premier temps - for (std::vector::iterator iter_bl=blocks.begin(); - iter_bl!=blocks.end(); ++iter_bl){ - if (m_filtre_block[*iter_bl] == 0){ + for (Block* bl : blocks){ + if (m_filtre_block[bl] == 0){ nb_blocs_touches++; - m_filtre_block[*iter_bl] = 1; + m_filtre_block[bl] = 1; } } - } // end for iter_cf + } #ifdef _DEBUG_INSERTHOLE std::cout<<"nb_blocs_touches = "<::iterator iter_cf=m_cofaces.begin(); - iter_cf!=m_cofaces.end(); ++iter_cf){ - CoFace* coface = *iter_cf; - - std::vector coedges; - coface->getCoEdges(coedges, false); - - for (std::vector::iterator iter_ce=coedges.begin(); - iter_ce!=coedges.end(); ++iter_ce){ - CoEdge* coedge = *iter_ce; + for (CoFace* coface : m_cofaces){ + for (CoEdge* coedge : coface->getCoEdges()){ if (m_filtre_coedge[coedge] == 0){ - std::vector cofaces; - coedge->getCoFaces(cofaces); + std::vector cofaces = coedge->getCoFaces(); // on compte le nb de cofaces marqués à dupliquer uint nb_coface_marquees = 0; for (std::vector::iterator iter=cofaces.begin(); @@ -187,8 +172,7 @@ duplicate() if (m_filtre_coedge[coedge] == 4){ // on marque tous les blocs en contact à 1 - std::vector blocks; - coedge->getBlocks(blocks); + std::vector blocks = coedge->getBlocks(); for (std::vector::iterator iter_bl=blocks.begin(); iter_bl!=blocks.end(); ++iter_bl){ if (m_filtre_block[*iter_bl] == 0){ @@ -200,34 +184,20 @@ duplicate() } // end if (m_filtre_coedge[coedge] == 0) - } // end for iter_ce + } // end for coedge - } // end for iter_cf + } // end for coface // un sommet est dupliqué dès lors qu'il est relié à une arête à dupliquée et à aucune arête // commune non dupliquée std::vector duplicatedVertices; - for (std::vector::iterator iter_cf=m_cofaces.begin(); - iter_cf!=m_cofaces.end(); ++iter_cf){ - CoFace* coface = *iter_cf; - - std::vector vertices; - coface->getVertices(vertices); - - for (std::vector::iterator iter_vt=vertices.begin(); - iter_vt!=vertices.end(); ++iter_vt){ - Vertex* vertex = *iter_vt; + for (CoFace* coface : m_cofaces){ + for (Vertex* vertex : coface->getVertices()){ if (m_filtre_vertex[vertex] == 0){ - - std::vector coedges; - vertex->getCoEdges(coedges); - // a-t-on trouvé une arête marquée à 3 ? bool haveCoEdgeConservated = false; - for (std::vector::iterator iter_ce=coedges.begin(); - iter_ce!=coedges.end(); ++iter_ce){ - CoEdge* coedge = *iter_ce; + for (CoEdge* coedge : vertex->getCoEdges()){ if (m_filtre_coedge[coedge] == 3) haveCoEdgeConservated = true; } @@ -245,20 +215,17 @@ duplicate() duplicatedVertices.push_back(vertex); // on marque tous les blocs en contact à 1 - std::vector blocks; - vertex->getBlocks(blocks); - for (std::vector::iterator iter_bl=blocks.begin(); - iter_bl!=blocks.end(); ++iter_bl){ - if (m_filtre_block[*iter_bl] == 0){ + for (Block* bl : vertex->getBlocks()){ + if (m_filtre_block[bl] == 0){ nb_blocs_touches++; - m_filtre_block[*iter_bl] = 1; + m_filtre_block[bl] = 1; } } } } // end if (m_filtre_vertex[vertex] == 0 - } // end for iter_vt - } // end for iter_cf + } // end for vertex + } // end for coface // création de 2 groupes de blocs de part et d'autre de l'interface constituée des cofaces std::vector blocs1 = getConnectedBlocks(); @@ -296,12 +263,10 @@ duplicate() // va être dupliquée. Et cela sans dupliquer les sommets ni les arêtes, for (std::vector::iterator iter_cf=m_cofaces.begin(); iter_cf!=m_cofaces.end(); ++iter_cf){ - std::vector coedges; - (*iter_cf)->getCoEdges(coedges); + std::vector coedges = (*iter_cf)->getCoEdges(); for (std::vector::iterator iter_ce=coedges.begin(); iter_ce!= coedges.end(); ++iter_ce){ - std::vector edges; - (*iter_ce)->getEdges(edges); + std::vector edges = (*iter_ce)->getEdges(); for (std::vector::iterator iter_ed=edges.begin(); iter_ed!=edges.end(); ++iter_ed){ separate(*iter_ed); @@ -326,16 +291,14 @@ duplicate() CoFace* new_coface = duplicate(old_coface); // mise à jour dans les faces des blocs du côté marqué à 2 - std::vector faces; - old_coface->getFaces(faces); + std::vector faces = old_coface->getFaces(); if (faces.size()!=2) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne dans CommandInsertHole, face commune reliée à autre chose que 2 faces", TkUtil::Charset::UTF_8)); // recherche celle avec bloc dans groupe 2 Face* face = 0; for (uint i=0; i blocs; - faces[i]->getBlocks(blocs); + std::vector blocs = faces[i]->getBlocks(); if (blocs.size()!=1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne dans CommandInsertHole, face reliée à autre chose qu'un unique bloc", TkUtil::Charset::UTF_8)); if (m_filtre_block[blocs[0]] == 2) @@ -356,8 +319,7 @@ duplicate() for (std::vector::iterator iter_bl=blocs2.begin(); iter_bl!=blocs2.end(); ++iter_bl){ Block* bloc = *iter_bl; - std::vector coedges; - bloc->getCoEdges(coedges); + std::vector coedges = bloc->getCoEdges(); for (std::vector::iterator iter_ce=coedges.begin(); iter_ce!= coedges.end(); ++iter_ce){ @@ -377,12 +339,8 @@ duplicate() for (std::vector::iterator iter_bl=blocs2.begin(); iter_bl!=blocs2.end(); ++iter_bl){ Block* bloc = *iter_bl; - std::vector vertices; - bloc->getVertices(vertices); - for (std::vector::iterator iter_vtx=vertices.begin(); - iter_vtx!= vertices.end(); ++iter_vtx){ - Vertex* old_vtx = *iter_vtx; + for (Vertex* old_vtx : bloc->getVertices()){ Vertex* new_vtx = duplicate(old_vtx); if (old_vtx != new_vtx){ bloc->saveBlockTopoProperty(&getInfoCommand()); @@ -416,11 +374,9 @@ void CommandInsertHole::translate(Vertex* vtx) #endif // utilisation d'un vecteur entre le sommet et la moyenne des barycentres des blocs voisins du groupe 2 Utils::Math::Point bary_moy; - std::vector blocks; - vtx->getBlocks(blocks); - for (std::vector::iterator iter_bl=blocks.begin(); - iter_bl!=blocks.end(); ++iter_bl){ - bary_moy += (*iter_bl)->getBarycentre(); + std::vector blocks = vtx->getBlocks(); + for (Block* bl : blocks){ + bary_moy += bl->getBarycentre(); } if (blocks.size()==0) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur avec commande de création d'un trou, on ne trouve pas de blocs reliés à un sommet donné à déplacer", TkUtil::Charset::UTF_8)); @@ -454,21 +410,12 @@ std::vector CommandInsertHole::getConnectedBlocks() while(bl_dep) { m_filtre_block[bl_dep] = 3; // récupération des blocs voisins suivant voisinage par coface - - std::vector cofaces; - bl_dep->getCoFaces(cofaces); - - for (std::vector::iterator iter_cf=cofaces.begin(); - iter_cf!=cofaces.end();++iter_cf) - if (m_filtre_coface[*iter_cf] != 4){ - std::vector blocks_vois; - (*iter_cf)->getBlocks(blocks_vois); - - for (std::vector::iterator iter_bl=blocks_vois.begin(); - iter_bl!=blocks_vois.end(); ++iter_bl) - if (m_filtre_block[*iter_bl] == 1){ - blocs.push_back(*iter_bl); - m_filtre_block[*iter_bl] = 2; + for (CoFace* cf : bl_dep->getCoFaces()) + if (m_filtre_coface[cf] != 4){ + for (Block* bl : cf->getBlocks()) + if (m_filtre_block[bl] == 1){ + blocs.push_back(bl); + m_filtre_block[bl] = 2; } } @@ -533,8 +480,9 @@ duplicate(CoEdge* ce) CoEdge* new_coedge = m_corr_coedge[ce]; if (new_coedge == 0){ - Vertex* new_vtx1 = duplicate(ce->getVertex(0)); - Vertex* new_vtx2 = duplicate(ce->getVertex(1)); + auto vertices = ce->getVertices(); + Vertex* new_vtx1 = duplicate(vertices[0]); + Vertex* new_vtx2 = duplicate(vertices[1]); // pour le cas où le sommet n'est pas dupliqué, on va le modifier: lui ajouter une arête new_vtx1->saveVertexTopoProperty(&getInfoCommand()); @@ -557,14 +505,14 @@ duplicate(Edge* ed) if (new_edge == 0){ - if (ed->getNbCoFaces() > 1){ + if (ed->getCoFaces().size() > 1){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message <<"Erreur interne, dans CommandInsertHole::duplicate,"<getName()<<" appartient à plusieurs cofaces"; throw TkUtil::Exception(message); } - Vertex* new_vtx1 = duplicate(ed->getVertex(0)); - Vertex* new_vtx2 = duplicate(ed->getVertex(1)); + Vertex* new_vtx1 = duplicate(ed->getVertices()[0]); + Vertex* new_vtx2 = duplicate(ed->getVertices()[1]); const std::vector & coedges = ed->getCoEdges(); std::vector new_coedges; @@ -594,11 +542,10 @@ separate(Edge* ed) #ifdef _DEBUG_INSERTHOLE std::cout<<" separate pour "<getName()< cofaces; - ed->getCoFaces(cofaces); + std::vector cofaces = ed->getCoFaces(); - for (uint i=0; igetNbCoEdges(); i++) - ed->getCoEdge(i)->saveCoEdgeTopoProperty(&getInfoCommand()); + for (CoEdge* ce : ed->getCoEdges()) + ce->saveCoEdgeTopoProperty(&getInfoCommand()); for (uint i=1; i filtre_block; std::map filtre_coface; - std::vector cofaces; - std::vector blocks; - coedge->getCoFaces(cofaces); - coedge->getBlocks(blocks); - - for (std::vector::iterator iter=cofaces.begin(); iter != cofaces.end(); ++iter) - filtre_coface[*iter] = 1; + for (CoFace* cf : coedge->getCoFaces()) + filtre_coface[cf] = 1; - for (std::vector::iterator iter=blocks.begin(); iter != blocks.end(); ++iter) - filtre_block[*iter] = 1; + for (Block* bl : coedge->getBlocks()) + filtre_block[bl] = 1; // on s'interdit la coface filtre_coface[coface] = 2; - blocks.clear(); - coface->getBlocks(blocks); + std::vector blocks = coface->getBlocks(); if (blocks.size()!=2){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message << "CommandInsertHole::findCoFace_Block_relation pour " << coedge->getName() @@ -687,8 +628,7 @@ bool CommandInsertHole::findCoFace_Block_relation(CoEdge* coedge, CoFace* coface // une (unique il me semble) coface dans bl_dep et marquée à 1 CoFace* coface_suiv = 0; - cofaces.clear(); - bl_dep->getCoFaces(cofaces); + std::vector cofaces = bl_dep->getCoFaces(); for (std::vector::iterator iter=cofaces.begin(); iter != cofaces.end() && coface_suiv==0; ++iter) if (filtre_coface[*iter] == 1) @@ -702,7 +642,7 @@ bool CommandInsertHole::findCoFace_Block_relation(CoEdge* coedge, CoFace* coface // recherche du bloc suivant blocks.clear(); - coface_suiv->getBlocks(blocks); + blocks = coface_suiv->getBlocks(); Block* bl_suiv = 0; for (std::vector::iterator iter=blocks.begin(); iter != blocks.end(); ++iter) diff --git a/src/Core/Topo/CommandMakeBlocksByRevol.cpp b/src/Core/Topo/CommandMakeBlocksByRevol.cpp index a3228b7b..ad0ae79f 100644 --- a/src/Core/Topo/CommandMakeBlocksByRevol.cpp +++ b/src/Core/Topo/CommandMakeBlocksByRevol.cpp @@ -53,8 +53,8 @@ CommandMakeBlocksByRevol(Internal::Context& c, , m_ratio_ogrid(ratio_ogrid) { for (uint i=0; igetVertex(0)) && isOnAxis(coedge->getVertex(1))){ + auto vertices = coedges[i]->getVertices(); + if (isOnAxis(vertices[0]) && isOnAxis(vertices[1])){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message<<"Il n'est pas permis de démarrer avec une arête ayant les 2 extrémités sur l'axe\n"; message<<"NB: penser à découper les faces pour placer le tracé de l'o-grid"; @@ -464,23 +464,12 @@ computeFiltersWithAllFaces(std::map& filtre_vertex, std::vector cofaces; getContext().getTopoManager().getCoFaces(cofaces); - for (uint i=0; i coedges; - coface->getCoEdges(coedges, false); - - for (uint j=0; jgetCoEdges()){ filtre_coedge[coedge] = 3; - - std::vector vertices; - coedge->getVertices(vertices); - - for (uint k=0; kgetVertices()) + filtre_vertex[vtx] = 3; } } } @@ -507,7 +496,8 @@ computeOgridFilters(std::map& filtre_vertex, bool withOgrid = true; for (uint iar=0; iargetVertex(0)) && isOnAxis(m_coedges[iar]->getVertex(1))) + auto vertices = m_coedges[iar]->getVertices(); + if (isOnAxis(vertices[0]) && isOnAxis(vertices[1])) withOgrid = false; } @@ -535,8 +525,7 @@ computeOgridFilters(std::map& filtre_vertex, // on marque les arêtes et les sommets des 2 faces { // les 2 Faces communes - std::vector cofaces; - arete->getCoFaces(cofaces); + std::vector cofaces = arete->getCoFaces(); if (cofaces.size() != 2){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message<<"Erreur, il faut sélectionner une arête entre 2 faces pour rechercher le tracé de l'ogrid.\n"; @@ -563,20 +552,15 @@ computeOgridFilters(std::map& filtre_vertex, filtre_coface[coface] = marques[i]; - std::vector coedges; - coface->getCoEdges(coedges); - for (std::vector::iterator iter2 = coedges.begin(); - iter2 != coedges.end(); ++iter2){ - if (filtre_coedge[*iter2] == 0){ + for (CoEdge* coedge : coface->getCoEdges()){ + if (filtre_coedge[coedge] == 0){ //std::cout<<"arete "<<(*iter2)->getName()<<" marquée à "< & vertices = (*iter2)->getVertices(); - for (std::vector::const_iterator iter1 = vertices.begin(); - iter1 != vertices.end(); ++iter1) - if (filtre_vertex[*iter1] == 0) - filtre_vertex[*iter1] = marques[i]; + for (Vertex* vtx : coedge->getVertices()) + if (filtre_vertex[vtx] == 0) + filtre_vertex[vtx] = marques[i]; } } } @@ -584,9 +568,10 @@ computeOgridFilters(std::map& filtre_vertex, // on part d'un sommet de l'arête de départ (puis de l'autre) // on va de proche en proche pour sélectionner toutes les arêtes // qui vont constituer l'ogrid - for (uint i=0; igetNbVertices(); i++){ + auto ar_vertices = arete->getVertices(); + for (uint i=0; igetVertex(i); + Vertex* vtx_dep = ar_vertices[i]; do { #ifdef _DEBUG_REVOL @@ -595,8 +580,7 @@ computeOgridFilters(std::map& filtre_vertex, // recherche d'une arête suivante CoEdge* coedge_suiv = 0; - std::vector coedges; - vtx_dep->getCoEdges(coedges); + std::vector coedges = vtx_dep->getCoEdges(); #ifdef _DEBUG_REVOL std::cout<<" -> coedges :"; for (uint i2=0; i2& filtre_vertex, if (coedges.size() == 3){ // si le sommet est relié à 3 faces, on est certainement dans le cas d'un o-grid en 2D // sinon c'est terminé - std::vector cofaces_vtx; - vtx_dep->getCoFaces(cofaces_vtx); + std::vector cofaces_vtx = vtx_dep->getCoFaces(); #ifdef _DEBUG_REVOL std::cout<<" -> cofaces_vtx :"; for (uint i2=0; i2& filtre_vertex, for (std::vector::iterator iter2 = coedges.begin(); iter2 != coedges.end(); ++iter2) if (filtre_coedge[*iter2] == 3){ - std::vector cofaces_coedge; - (*iter2)->getCoFaces(cofaces_coedge); + std::vector cofaces_coedge = (*iter2)->getCoFaces(); if (cofaces_coedge.size() == 2 && ((filtre_coface[cofaces_coedge[0]] == 3 && filtre_coface[cofaces_coedge[1]] == 0) || @@ -795,11 +777,12 @@ computeOgridFilters(std::map& filtre_vertex, TopoHelper::getMarqued(filtre_coedge, 3, coedges); for (std::vector::iterator iter2 = coedges.begin(); iter2 != coedges.end(); ++iter2){ - if (isOnAxis((*iter2)->getVertex(0))) - filtre_vertex[(*iter2)->getVertex(0)] = 1; - if (isOnAxis((*iter2)->getVertex(1))) - filtre_vertex[(*iter2)->getVertex(1)] = 1; - if (filtre_vertex[(*iter2)->getVertex(0)] == 1 && filtre_vertex[(*iter2)->getVertex(1)] == 1) + auto vertices = (*iter2)->getVertices(); + if (isOnAxis(vertices[0])) + filtre_vertex[vertices[0]] = 1; + if (isOnAxis(vertices[1])) + filtre_vertex[vertices[1]] = 1; + if (filtre_vertex[vertices[0]] == 1 && filtre_vertex[vertices[1]] == 1) filtre_coedge[(*iter2)] = 1; } } @@ -821,11 +804,11 @@ computeAxisFilters(std::map& filtre_vertex, for (std::map::iterator iter = filtre_coedge.begin(); iter != filtre_coedge.end(); ++iter) if ((*iter).second) { - CoEdge* coedge = (*iter).first; - if (coedge->getNbVertices() != 2) + auto coedge_vertices = (*iter).first->getVertices(); + if (coedge_vertices.size() != 2) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, CommandMakeBlocksByRevol::computeAxisFilters trouve une arête avec autre chose que 2 sommets", TkUtil::Charset::UTF_8)); - Vertex* vtx1 = coedge->getVertex(0); - Vertex* vtx2 = coedge->getVertex(1); + Vertex* vtx1 = coedge_vertices[0]; + Vertex* vtx2 = coedge_vertices[1]; bool vtx1OnAxis = (filtre_vertex[vtx1]>=10); bool vtx2OnAxis = (filtre_vertex[vtx2]>=10); @@ -841,12 +824,9 @@ computeAxisFilters(std::map& filtre_vertex, iter != filtre_coface.end(); ++iter) if ((*iter).second) { CoFace* coface = (*iter).first; - std::vector coedges; - coface->getCoEdges(coedges); bool cofaceOnAxis = false; - for (std::vector::iterator iter2 = coedges.begin(); - iter2 != coedges.end(); ++iter2) - if (filtre_coedge[*iter2] >= 10) + for (CoEdge* coedge : coface->getCoEdges()) + if (filtre_coedge[coedge] >= 10) cofaceOnAxis = true; if (cofaceOnAxis) (*iter).second += 10; @@ -861,20 +841,16 @@ detectVerticesUnderOgrid(std::map& filtre_vertex) if (filtre_vertex[(*iter).first] == 2){ // on a trouvé un sommet entre l'axe et l'ogrid Vertex* vtx0 = (*iter).first; - - std::vector edges; - vtx0->getCoEdges(edges); CoEdge* coedgeAxe = 0; CoEdge* coedgeOgrid = 0; - for (std::vector::iterator iter=edges.begin(); - iter != edges.end(); ++iter){ - Vertex* vtxOpp = (*iter)->getOppositeVertex(vtx0); + for (CoEdge* vtx0_ce : vtx0->getCoEdges()){ + Vertex* vtxOpp = vtx0_ce->getOppositeVertex(vtx0); if (filtre_vertex[vtxOpp] == 1){ - coedgeOgrid = *iter; + coedgeOgrid = vtx0_ce; filtre_vertex[vtxOpp] = 6; } else if (filtre_vertex[vtxOpp] == 12) - coedgeAxe = *iter; + coedgeAxe = vtx0_ce; } if (0 == coedgeAxe){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -910,11 +886,12 @@ computeNi(std::map& filtre_vertex, iter != filtre_coedge.end(); ++iter) if ((*iter).second == 12) { CoEdge* coedge = (*iter).first; + auto coedge_vertices = coedge->getVertices(); uint ni_loc = 0; - if (coedge->getNbVertices() != 2) + if (coedge_vertices.size() != 2) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, CommandMakeBlocksByRevol::computeNi trouve une arête avec autre chose que 2 sommets", TkUtil::Charset::UTF_8)); - Vertex* vtx1 = coedge->getVertex(0); - Vertex* vtx2 = coedge->getVertex(1); + Vertex* vtx1 = coedge_vertices[0]; + Vertex* vtx2 = coedge_vertices[1]; // sommet sur l'ogrid Vertex* vtxo = 0; if (filtre_vertex[vtx1] == 1) @@ -926,15 +903,11 @@ computeNi(std::map& filtre_vertex, // on doit chercher l'arête reliée à l'ogrid Vertex* vtx0 = (filtre_vertex[vtx1] == 2 ? vtx1 : vtx2); vtxo = vtx0; - - std::vector edges; - vtx0->getCoEdges(edges); CoEdge* coedge2 = 0; - for (std::vector::iterator iter=edges.begin(); - iter != edges.end(); ++iter){ - Vertex* vtxOpp = (*iter)->getOppositeVertex(vtx0); + for (CoEdge* vtx0_ce : vtx0->getCoEdges()){ + Vertex* vtxOpp = vtx0_ce->getOppositeVertex(vtx0); if (filtre_vertex[vtxOpp] == 6) - coedge2 = *iter; + coedge2 = vtx0_ce; } if (0 == coedge2) @@ -997,8 +970,7 @@ computeNi(std::map& filtre_vertex, iter != filtre_coedge.end(); ++iter) if ((*iter).second == 1) { CoEdge* coedge = (*iter).first; - std::vector cofaces; - coedge->getCoFaces(cofaces); + std::vector cofaces = coedge->getCoFaces(); if (cofaces.size() == 2){ uint ni_loc = 0; @@ -1026,10 +998,8 @@ computeNi(std::map& filtre_vertex, // on prend le plus grand des ni des cofaces voisines uint ni_loc = 0; - std::vector cofaces; - vtx->getCoFaces(cofaces); - for (uint j=0; jgetCoFaces()){ + uint ni = ni_coface[vtx_cf]; if (ni > ni_loc) ni_loc = ni; } @@ -1050,8 +1020,7 @@ computeNi(std::map& filtre_vertex, // on prend le ni le plus grand entre ceux des cofaces autours uint ni = 0; CoEdge* coedge = iter->first; - std::vector cofaces; - coedge->getCoFaces(cofaces); + std::vector cofaces = coedge->getCoFaces(); for (uint i=0; i& ni_vtx, std::cout<<"ni_coface pour "<<(*iter2)->getName()<<" = "<getName()< coedges1; - std::vector coedges2; - (*iter1)->getCoEdges(coedges1, false); - (*iter2)->getCoEdges(coedges2, false); - - std::vector::const_iterator iter3 = coedges1.begin(); - std::vector::const_iterator iter4 = coedges2.begin(); + std::vector coedges1 = (*iter1)->getCoEdges(); + std::vector coedges2 = (*iter2)->getCoEdges(); + auto iter3 = coedges1.begin(); + auto iter4 = coedges2.begin(); for ( ; iter3 != coedges1.end(); ++iter3, ++iter4){ ni_coedge[*iter4] = ni_coedge[*iter3]; #ifdef _DEBUG_REVOL std::cout<<"ni_coedge pour "<<(*iter4)->getName()<<" = "<getName()< vertices1; - std::vector vertices2; - (*iter3)->getVertices(vertices1); - (*iter4)->getVertices(vertices2); - - std::vector::const_iterator iter5 = vertices1.begin(); - std::vector::const_iterator iter6 = vertices2.begin(); + const std::vector& vertices1 = (*iter3)->getVertices(); + const std::vector& vertices2 = (*iter4)->getVertices(); + auto iter5 = vertices1.begin(); + auto iter6 = vertices2.begin(); for ( ; iter5 != vertices1.end(); ++iter5, ++iter6){ ni_vtx[*iter6] = ni_vtx[*iter5]; #ifdef _DEBUG_REVOL @@ -1128,30 +1091,19 @@ marqueCoFaceCoEdgeVertices(CoEdge* coedge, const uint marque, std::map& filtre_coface) { //std::cout<<"marqueCoFaceCoEdgeVertices ..."< cofaces; - coedge->getCoFaces(cofaces); - - for (std::vector::iterator iter3 = cofaces.begin(); - iter3 != cofaces.end(); ++iter3) - if (filtre_coface[*iter3] == 0){ - filtre_coface[*iter3] = marque; - //std::cout<<"coface "<<(*iter3)->getName()<<" marquée à "< coedges; - (*iter3)->getCoEdges(coedges); - - for (std::vector::iterator iter2 = coedges.begin(); - iter2 != coedges.end(); ++iter2) - if (filtre_coedge[*iter2] == 0){ - filtre_coedge[*iter2] = marque; - //std::cout<<"coedge "<<(*iter2)->getName()<<" marquée à "< & vertices = (*iter2)->getVertices(); - - for (std::vector::const_iterator iter1 = vertices.begin(); - iter1 != vertices.end(); ++iter1) - if (filtre_vertex[*iter1] == 0){ - filtre_vertex[*iter1] = marque; + for (CoFace* cf : coedge->getCoFaces()) + if (filtre_coface[cf] == 0){ + filtre_coface[cf] = marque; + //std::cout<<"coface "<<(cf)->getName()<<" marquée à "<getCoEdges()) + if (filtre_coedge[ce] == 0){ + filtre_coedge[ce] = marque; + //std::cout<<"coedge "<getName()<<" marquée à "<getVertices()) + if (filtre_vertex[vtx] == 0){ + filtre_vertex[vtx] = marque; } } } @@ -1375,20 +1327,17 @@ freeUnused(std::vector& cofaces, if (filtre_coface[*iter1]%10 == 2){ CoFace* coface = *iter1; - std::vector edges; - (*iter1)->getEdges(edges); - + std::vector edges = (*iter1)->getEdges(); for (std::vector::iterator iter2 = edges.begin(); iter2 != edges.end(); ++iter2){ - std::vector coedges; - (*iter2)->getCoEdges(coedges); + std::vector coedges = (*iter2)->getCoEdges(); for (std::vector::iterator iter3 = coedges.begin(); iter3 != coedges.end(); ++iter3) if ((filtre_coedge[*iter3] == 2 || filtre_coedge[*iter3] == 12) - && (filtre_vertex[(*iter3)->getVertex(0)] != 2 - || filtre_vertex[(*iter3)->getVertex(1)] != 2)){ + && (filtre_vertex[(*iter3)->getVertices()[0]] != 2 + || filtre_vertex[(*iter3)->getVertices()[1]] != 2)){ // supprime les arêtes sous l'ogrid sauf celles sur l'axe et celles // à l'axe (*iter3)->setDestroyed(true); @@ -1399,10 +1348,8 @@ freeUnused(std::vector& cofaces, else if (m_portion == Utils::Portion::ENTIER && filtre_coedge[*iter3] == 22) { // cas d'une arête sur l'axe // on supprime égallement ses sommets - std::vector vertices; - (*iter3)->getVertices(vertices); - for (std::vector::iterator iter4 = vertices.begin(); - iter4 != vertices.end(); ++iter4) + const std::vector& vertices = (*iter3)->getVertices(); + for (auto iter4 = vertices.begin(); iter4 != vertices.end(); ++iter4) // on ne détruit pas un sommet sur l'ogrid (cas de l'ogrid qui passe par l'axe) if (filtre_vertex[*iter4] == 12){ (*iter4)->setDestroyed(true); @@ -1433,7 +1380,7 @@ freeUnused(std::vector& cofaces, // on fait le ménage parmi les Edge qui ne sont plus référencées par aucune CoFace for (std::vector::iterator iter2 = edges.begin(); iter2 != edges.end(); ++iter2){ - if ((*iter2)->getNbCoFaces() == 0){ + if ((*iter2)->getCoFaces().size() == 0){ (*iter2)->setDestroyed(true); getInfoCommand().addTopoInfoEntity(*iter2,Internal::InfoCommand::DELETED); (*iter2)->free(&getInfoCommand()); @@ -1456,17 +1403,13 @@ updateInterpolate(std::vector& cofaces, if (filtre_coface[*iter1] == 3){ CoFace* coface = *iter1; - std::vector edges; - coface->getEdges(edges); - - std::vector coface_coedges; - coface->getCoEdges(coface_coedges, false); + auto edges = coface->getEdges(); + auto coface_coedges = coface->getCoEdges(); for (std::vector::iterator iter2 = edges.begin(); iter2 != edges.end(); ++iter2){ - std::vector coedges; - (*iter2)->getCoEdges(coedges); + std::vector coedges = (*iter2)->getCoEdges(); for (std::vector::iterator iter3 = coedges.begin(); iter3 != coedges.end(); ++iter3) @@ -1536,10 +1479,8 @@ constructRevolCoEdges(std::vector& cofaces_0, for (; iter1_0 != cofaces_0.end(); ++iter1_0, ++iter1_1){ - std::vector edges_0; - std::vector edges_1; - (*iter1_0)->getEdges(edges_0); - (*iter1_1)->getEdges(edges_1); + std::vector edges_0 = (*iter1_0)->getEdges(); + std::vector edges_1 = (*iter1_1)->getEdges(); if (edges_0.size() != edges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructRevolCoEdges avec des nombres de Edge différents", TkUtil::Charset::UTF_8)); @@ -1549,29 +1490,25 @@ constructRevolCoEdges(std::vector& cofaces_0, for (; iter2_0 != edges_0.end(); ++iter2_0, ++iter2_1){ - std::vector coedges_0; - std::vector coedges_1; - (*iter2_0)->getCoEdges(coedges_0); - (*iter2_1)->getCoEdges(coedges_1); + std::vector coedges_0 = (*iter2_0)->getCoEdges(); + std::vector coedges_1 = (*iter2_1)->getCoEdges(); if (coedges_0.size() != coedges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructRevolCoEdges avec des nombres de CoEdge différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter3_0 = coedges_0.begin(); - std::vector::iterator iter3_1 = coedges_1.begin(); + auto iter3_0 = coedges_0.begin(); + auto iter3_1 = coedges_1.begin(); for (; iter3_0 != coedges_0.end(); ++iter3_0, ++iter3_1){ - std::vector vertices_0; - std::vector vertices_1; - (*iter3_0)->getVertices(vertices_0); - (*iter3_1)->getVertices(vertices_1); + const std::vector& vertices_0 = (*iter3_0)->getVertices(); + const std::vector& vertices_1 = (*iter3_1)->getVertices(); if (vertices_0.size() != vertices_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructRevolCoEdges avec des nombres de Vertex différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter4_0 = vertices_0.begin(); - std::vector::iterator iter4_1 = vertices_1.begin(); + auto iter4_0 = vertices_0.begin(); + auto iter4_1 = vertices_1.begin(); for (; iter4_0 != vertices_0.end(); ++iter4_0, ++iter4_1){ Vertex* vtx0 = *iter4_0; @@ -1592,14 +1529,11 @@ constructRevolCoEdges(std::vector& cofaces_0, uint nbBrasVersAxe = 0; // pour cela on recherche les arêtes reliées à l'axe { - std::vector edges; - vtx0->getCoEdges(edges); CoEdge* coedgeAxe = 0; - for (std::vector::iterator iter=edges.begin(); - iter != edges.end(); ++iter){ - Vertex* vtxOpp = (*iter)->getOppositeVertex(vtx0); + for (CoEdge* vtx0_ce : vtx0->getCoEdges()){ + Vertex* vtxOpp = vtx0_ce->getOppositeVertex(vtx0); if (filtre_vertex[vtxOpp] == 12) - coedgeAxe = *iter; + coedgeAxe = vtx0_ce; } if (0 == coedgeAxe){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -1628,8 +1562,7 @@ constructRevolCoEdges(std::vector& cofaces_0, // recherche du nombre de bras entre ce sommet et le sommet vers l'axe uint nbBrasVersOgrid = 0; { - std::vector edges; - vtx0->getCoEdges(edges); + std::vector edges = vtx0->getCoEdges(); CoEdge* coedgeAxe = 0; for (std::vector::iterator iter=edges.begin(); iter != edges.end(); ++iter){ @@ -1827,10 +1760,8 @@ constructRevolFaces(std::vector& cofaces_0, for (; iter1_0 != cofaces_0.end(); ++iter1_0, ++iter1_1){ - std::vector edges_0; - std::vector edges_1; - (*iter1_0)->getEdges(edges_0); - (*iter1_1)->getEdges(edges_1); + std::vector edges_0 = (*iter1_0)->getEdges(); + std::vector edges_1 = (*iter1_1)->getEdges(); if (edges_0.size() != edges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructRevolFaces avec des nombres de Edge différents", TkUtil::Charset::UTF_8)); @@ -1840,16 +1771,14 @@ constructRevolFaces(std::vector& cofaces_0, for (; iter2_0 != edges_0.end(); ++iter2_0, ++iter2_1){ - std::vector coedges_0; - std::vector coedges_1; - (*iter2_0)->getCoEdges(coedges_0); - (*iter2_1)->getCoEdges(coedges_1); + std::vector coedges_0 = (*iter2_0)->getCoEdges(); + std::vector coedges_1 = (*iter2_1)->getCoEdges(); if (coedges_0.size() != coedges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructRevolFaces avec des nombres de CoEdge différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter3_0 = coedges_0.begin(); - std::vector::iterator iter3_1 = coedges_1.begin(); + auto iter3_0 = coedges_0.begin(); + auto iter3_1 = coedges_1.begin(); for (; iter3_0 != coedges_0.end(); ++iter3_0, ++iter3_1){ CoEdge* coedge_0 = *iter3_0; @@ -1862,10 +1791,8 @@ constructRevolFaces(std::vector& cofaces_0, if (ni_loc_coedge == 0) ni_loc_coedge = m_ni*facteur_ni; - std::vector vertices_0; - std::vector vertices_1; - (*iter3_0)->getVertices(vertices_0); - (*iter3_1)->getVertices(vertices_1); + const std::vector& vertices_0 = (*iter3_0)->getVertices(); + const std::vector& vertices_1 = (*iter3_1)->getVertices(); if (vertices_0.size() != vertices_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructRevolFaces avec des nombres de Vertex différents", TkUtil::Charset::UTF_8)); @@ -2045,10 +1972,8 @@ constructRevolFacesInnerOgrid(std::vector& cofaces_0, for (; iter1_0 != cofaces_0.end(); ++iter1_0, ++iter1_1){ - std::vector edges_0; - std::vector edges_1; - (*iter1_0)->getEdges(edges_0); - (*iter1_1)->getEdges(edges_1); + std::vector edges_0 = (*iter1_0)->getEdges(); + std::vector edges_1 = (*iter1_1)->getEdges(); if (edges_0.size() != edges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructRevolFacesInnerOgrid avec des nombres de Edge différents", TkUtil::Charset::UTF_8)); @@ -2060,16 +1985,14 @@ constructRevolFacesInnerOgrid(std::vector& cofaces_0, for (; iter2_0 != edges_0.end(); ++iter2_0, ++iter2_1){ - std::vector coedges_0; - std::vector coedges_1; - (*iter2_0)->getCoEdges(coedges_0); - (*iter2_1)->getCoEdges(coedges_1); + std::vector coedges_0 = (*iter2_0)->getCoEdges(); + std::vector coedges_1 = (*iter2_1)->getCoEdges(); if (coedges_0.size() != coedges_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructRevolFacesInnerOgrid avec des nombres de CoEdge différents", TkUtil::Charset::UTF_8)); - std::vector::iterator iter3_0 = coedges_0.begin(); - std::vector::iterator iter3_1 = coedges_1.begin(); + auto iter3_0 = coedges_0.begin(); + auto iter3_1 = coedges_1.begin(); for (; iter3_0 != coedges_0.end(); ++iter3_0, ++iter3_1){ CoEdge* coedge_0 = *iter3_0; @@ -2078,10 +2001,8 @@ constructRevolFacesInnerOgrid(std::vector& cofaces_0, if (filtre_vu[coedge_0] == 0 && filtre_coedge[coedge_0] != 22){ filtre_vu[coedge_0] = 1; - std::vector vertices_0; - std::vector vertices_1; - (*iter3_0)->getVertices(vertices_0); - (*iter3_1)->getVertices(vertices_1); + std::vector vertices_0 = (*iter3_0)->getVertices(); + std::vector vertices_1 = (*iter3_1)->getVertices(); if (vertices_0.size() != vertices_1.size()) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructRevolFacesInnerOgrid avec des nombres de Vertex différents", TkUtil::Charset::UTF_8)); @@ -2640,11 +2561,11 @@ constructRevolBlocks(std::vector& cofaces_0, #ifdef _DEBUG_REVOL // std::cout<<" coface_0 : "<<*coface_0<getNbEdges() = "<getNbEdges()<getNbEdges() = "<getNbEdges()<getEdges().size() = "<getEdges().size()<getEdges().size() = "<getEdges().size()<getNbEdges() == 4 && coface_1->getNbEdges() == 4) - || (coface_0->getNbEdges() == 3 && coface_1->getNbEdges() == 3))) + if (!((coface_0->getEdges().size() == 4 && coface_1->getEdges().size() == 4) + || (coface_0->getEdges().size() == 3 && coface_1->getEdges().size() == 3))) { TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Erreur interne, la création d'un bloc ne peut se faire pour la face "<getName() @@ -2655,9 +2576,10 @@ constructRevolBlocks(std::vector& cofaces_0, // si l'une des arêtes est sur l'axe de symétrie, // alors il faudra adapter la création du bloc à la dégénérecence (la mettre en k_max) uint indDeg = 3; // cas dit normal, indice de l'arête qui porte la dég... s'il y a lieu - for (uint i=0; igetNbEdges(); i++){ - Edge* edge_0 = coface_0->getEdge(i); - if (isOnAxis(edge_0->getVertex(0)) && isOnAxis(edge_0->getVertex(1))) + const std::vector& cf0_edges = coface_0->getEdges(); + for (uint i=0; igetVertices()[0]) && isOnAxis(edge_0->getVertices()[1])) indDeg = i; } uint tabIndVtx[4] = {1, 2, 0, 3}; @@ -2699,21 +2621,21 @@ constructRevolBlocks(std::vector& cofaces_0, #endif // on ordonne les sommets pour être compatible avec l'ordre pour le Block - vertices.push_back(coface_0->getVertex(tabIndVtx[0])); - vertices.push_back(coface_1->getVertex(tabIndVtx[0])); - vertices.push_back(coface_0->getVertex(tabIndVtx[1])); - vertices.push_back(coface_1->getVertex(tabIndVtx[1])); - vertices.push_back(coface_0->getVertex(tabIndVtx[2])); - if (coface_0->getNbEdges() == 4){ - if (vertices.back() != coface_1->getVertex(tabIndVtx[2])) - vertices.push_back(coface_1->getVertex(tabIndVtx[2])); - vertices.push_back(coface_0->getVertex(tabIndVtx[3])); - if (vertices.back() != coface_1->getVertex(tabIndVtx[3])) - vertices.push_back(coface_1->getVertex(tabIndVtx[3])); + vertices.push_back(coface_0->getVertices()[tabIndVtx[0]]); + vertices.push_back(coface_1->getVertices()[tabIndVtx[0]]); + vertices.push_back(coface_0->getVertices()[tabIndVtx[1]]); + vertices.push_back(coface_1->getVertices()[tabIndVtx[1]]); + vertices.push_back(coface_0->getVertices()[tabIndVtx[2]]); + if (coface_0->getEdges().size() == 4){ + if (vertices.back() != coface_1->getVertices()[tabIndVtx[2]]) + vertices.push_back(coface_1->getVertices()[tabIndVtx[2]]); + vertices.push_back(coface_0->getVertices()[tabIndVtx[3]]); + if (vertices.back() != coface_1->getVertices()[tabIndVtx[3]]) + vertices.push_back(coface_1->getVertices()[tabIndVtx[3]]); } - else if (filtre_vertex[coface_1->getVertex(tabIndVtx[2])] != 11) + else if (filtre_vertex[coface_1->getVertices()[tabIndVtx[2]]] != 11) // cas d'un bloc dégénéré qui n'est pas sur l'axe - vertices.push_back(coface_1->getVertex(tabIndVtx[2])); + vertices.push_back(coface_1->getVertices()[tabIndVtx[2]]); #ifdef _DEBUG_REVOL std::cout<<" vertices pour bloc:"; @@ -2723,16 +2645,16 @@ constructRevolBlocks(std::vector& cofaces_0, #endif - for (uint i=0; igetNbEdges(); i++){ + for (uint i=0; igetEdges().size(); i++){ - Edge* edge_0 = coface_0->getEdge(tabIndFace[i]); - Edge* edge_1 = coface_1->getEdge(tabIndFace[i]); + Edge* edge_0 = coface_0->getEdges()[tabIndFace[i]]; + Edge* edge_1 = coface_1->getEdges()[tabIndFace[i]]; std::vector face_vertices; - Vertex* vtx0 = edge_0->getVertex(0); - Vertex* vtx1 = edge_0->getVertex(1); - Vertex* vtx2 = edge_1->getVertex(1); - Vertex* vtx3 = edge_1->getVertex(0); + Vertex* vtx0 = edge_0->getVertices()[0]; + Vertex* vtx1 = edge_0->getVertices()[1]; + Vertex* vtx2 = edge_1->getVertices()[1]; + Vertex* vtx3 = edge_1->getVertices()[0]; if (vtx1!=vtx2){ face_vertices.push_back(vtx0); @@ -2749,9 +2671,7 @@ constructRevolBlocks(std::vector& cofaces_0, std::vector face_cofaces; - std::vector coedges_0; - edge_0->getCoEdges(coedges_0); - + std::vector coedges_0 = edge_0->getCoEdges(); for (std::vector::iterator iter3 = coedges_0.begin(); iter3 != coedges_0.end(); ++iter3){ std::vector& revol_cofaces = coedge2cofaces[*iter3]; @@ -2793,7 +2713,7 @@ constructRevolBlocks(std::vector& cofaces_0, } // end if (!face_cofaces.empty()) - } // end for igetNbEdges() + } // end for igetEdges().size() Block* newBlock = new Topo::Block(getContext(), faces, vertices, true); getInfoCommand().addTopoInfoEntity(newBlock, Internal::InfoCommand::CREATED); @@ -2872,15 +2792,15 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, std::vector faces; std::vector vertices; - if (coface_0->getNbEdges() == 4) + if (coface_0->getEdges().size() == 4) faces.resize(6); else faces.resize(5); // recherche de l'indice de l'arête sur l'axe dans la coface, uint indEdgeNearAxe = 0; - for (uint i=0; igetNbEdges(); i++) - if (filtre_coedge[coface_0->getEdge(i)->getCoEdge(0)] >= 20) + for (uint i=0; igetEdges().size(); i++) + if (filtre_coedge[coface_0->getEdges()[i]->getCoEdges()[0]] >= 20) indEdgeNearAxe = i; faces[0] = new Topo::Face(getContext(), coface_0); @@ -2893,22 +2813,19 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, getInfoCommand().addTopoInfoEntity(faces[0], Internal::InfoCommand::CREATED); getInfoCommand().addTopoInfoEntity(faces[2], Internal::InfoCommand::CREATED); - if (((coface_0->getNbEdges() == 4 && coface_45->getNbEdges() == 4 && coface_90->getNbEdges() == 4)) - || (coface_0->getNbEdges() == 3 && coface_45->getNbEdges() == 3 && coface_90->getNbEdges() == 3)) { + if (((coface_0->getEdges().size() == 4 && coface_45->getEdges().size() == 4 && coface_90->getEdges().size() == 4)) + || (coface_0->getEdges().size() == 3 && coface_45->getEdges().size() == 3 && coface_90->getEdges().size() == 3)) { // on ordonne les Edges pour être compatible avec l'ordre des Face pour le Block - for (uint i=0; igetNbEdges(); i++){ + for (uint i=0; igetEdges().size(); i++){ - Edge* edge_0 = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][i]); - Edge* edge_45 = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][i]); - Edge* edge_90 = coface_90->getEdge(tabIndArFace[indEdgeNearAxe][i]); + Edge* edge_0 = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][i]]; + Edge* edge_45 = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][i]]; + Edge* edge_90 = coface_90->getEdges()[tabIndArFace[indEdgeNearAxe][i]]; - std::vector coedges_0; - std::vector coedges_45; - std::vector coedges_90; - edge_0->getCoEdges(coedges_0); - edge_45->getCoEdges(coedges_45); - edge_90->getCoEdges(coedges_90); + std::vector coedges_0 = edge_0->getCoEdges(); + std::vector coedges_45 = edge_45->getCoEdges(); + std::vector coedges_90 = edge_90->getCoEdges(); // pour la construction d'une face à partir d'une arête qui pointe sur plusieurs CoEdge // cas de la face qui suit la révol, dans le cas d'un deto @@ -2937,8 +2854,8 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, else if (filtre_coedge[*iter3_0] == 11) nbFacesCreated = 2; else if (filtre_coedge[*iter3_0] == 2){ - if (filtre_vertex[(*iter3_0)->getVertex(0)] == 6 - || filtre_vertex[(*iter3_0)->getVertex(1)] == 6) + if (filtre_vertex[(*iter3_0)->getVertices()[0]] == 6 + || filtre_vertex[(*iter3_0)->getVertices()[1]] == 6) nbFacesCreated = 3; else nbFacesCreated = 2; @@ -2987,19 +2904,19 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, else { std::vector face_vertices; - face_vertices.push_back(edge_0->getVertex(0)); - face_vertices.push_back(edge_0->getVertex(1)); - face_vertices.push_back(edge_45->getVertex(1)); - face_vertices.push_back(edge_45->getVertex(0)); + face_vertices.push_back(edge_0->getVertices()[0]); + face_vertices.push_back(edge_0->getVertices()[1]); + face_vertices.push_back(edge_45->getVertices()[1]); + face_vertices.push_back(edge_45->getVertices()[0]); faces[3] = new Topo::Face(getContext(), revol_cofaces_0, face_vertices, true); #ifdef _DEBUG_REVOL std::cout<<"Construction de la faces[3] "<getName()<getVertex(0)); - face_vertices.push_back(edge_45->getVertex(1)); - face_vertices.push_back(edge_90->getVertex(1)); - face_vertices.push_back(edge_90->getVertex(0)); + face_vertices.push_back(edge_45->getVertices()[0]); + face_vertices.push_back(edge_45->getVertices()[1]); + face_vertices.push_back(edge_90->getVertices()[1]); + face_vertices.push_back(edge_90->getVertices()[0]); faces[1] = new Topo::Face(getContext(), revol_cofaces_45, face_vertices, true); #ifdef _DEBUG_REVOL @@ -3035,19 +2952,19 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, // recherche de l'indice du sommet sur l'ogrid uint indSomOnOgrid = 0; - if (filtre_vertex[edge_0->getVertex(0)]%5 == 1) + if (filtre_vertex[edge_0->getVertices()[0]]%5 == 1) indSomOnOgrid = 0; - else if (filtre_vertex[edge_0->getVertex(1)]%5 == 1) { + else if (filtre_vertex[edge_0->getVertices()[1]]%5 == 1) { indSomOnOgrid = 1; } else { std::cerr<<"Recherche sur le filtre pour l'arête "<<*edge_0<getVertex(indSomOnOgrid)); - face_vertices.push_back(edge_45->getVertex(indSomOnOgrid)); - face_vertices.push_back(edge_90->getVertex(indSomOnOgrid)); - face_vertices.push_back(edge_0->getVertex((indSomOnOgrid+1)%2)); + face_vertices.push_back(edge_0->getVertices()[indSomOnOgrid]); + face_vertices.push_back(edge_45->getVertices()[indSomOnOgrid]); + face_vertices.push_back(edge_90->getVertices()[indSomOnOgrid]); + face_vertices.push_back(edge_0->getVertices()[(indSomOnOgrid+1)%2]); faces[tabIndArToFace[i]] = new Topo::Face(getContext(), face_cofaces, face_vertices, true); getInfoCommand().addTopoInfoEntity(faces[tabIndArToFace[i]], Internal::InfoCommand::CREATED); @@ -3057,23 +2974,23 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, } // end else / if (coedges_0.size() == 1) - } // end for igetNbEdges() + } // end for igetEdges().size() // on ordonne les sommets pour être compatible avec l'ordre pour le Block - vertices.push_back(coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][0])); - vertices.push_back(coface_90->getVertex(tabIndSomFace[indEdgeNearAxe][1])); - vertices.push_back(coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][1])); - vertices.push_back(coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][1])); + vertices.push_back(coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][0]]); + vertices.push_back(coface_90->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); + vertices.push_back(coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); + vertices.push_back(coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); - if (coface_0->getNbEdges() == 3){ + if (coface_0->getEdges().size() == 3){ // cas dégénéré (indEdgeNearAxe vaut 0 ou 2) - vertices.push_back(coface_0->getVertex(tabIndSomFaceDeg[indEdgeNearAxe][2])); + vertices.push_back(coface_0->getVertices()[tabIndSomFaceDeg[indEdgeNearAxe][2]]); } else { - vertices.push_back(coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][2])); - vertices.push_back(coface_90->getVertex(tabIndSomFace[indEdgeNearAxe][3])); - vertices.push_back(coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][3])); - vertices.push_back(coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][3])); + vertices.push_back(coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][2]]); + vertices.push_back(coface_90->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); + vertices.push_back(coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); + vertices.push_back(coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); } Block* newBlock = new Topo::Block(getContext(), faces, vertices, true); @@ -3095,20 +3012,22 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, std::vector faces; std::vector vertices; - if (coface_0->getNbEdges() == 4) + if (coface_0->getEdges().size() == 4) faces.resize(6); else faces.resize(5); // recherche de l'indice de l'arête // et la plus proche dans le cas de la zone sous ogrid ne touchant pas l'axe (cas deto) uint indEdgeNearAxe = 0; - for (uint i=0; igetNbEdges(); i++) - if (filtre_vertex[coface_0->getEdge(i)->getCoEdge(0)->getVertex(0)] == 2 - && filtre_vertex[coface_0->getEdge(i)->getCoEdge(0)->getVertex(1)] == 2){ - // if (coface_0->getNbEdges() == 3 && i == 2 && filtre_vertex[coface_0->getVertex(0)] == 11) + for (uint i=0; igetEdges().size(); i++) { + auto ce_vertices = coface_0->getEdges()[i]->getCoEdges()[0]->getVertices(); + if (filtre_vertex[ce_vertices[0]] == 2 + && filtre_vertex[ce_vertices[1]] == 2){ + // if (coface_0->getEdges().size() == 3 && i == 2 && filtre_vertex[coface_0->getVertices()[0]] == 11) // invVertexOrder = true; indEdgeNearAxe = i; } + } #ifdef _DEBUG_REVOL std::cout<<"indEdgeNearAxe = "<& cofaces_0, // le 1er bloc { - vtx0 = coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][0]); - vtx2 = coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][1]); - vtx4 = coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][2]); - vtx6 = coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][3]); - vtx1 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][0]); - vtx5 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][2]); + vtx0 = coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][0]]; + vtx2 = coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]; + vtx4 = coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][2]]; + vtx6 = coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]; + vtx1 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][0]]; + vtx5 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][2]]; #ifdef _DEBUG_REVOL std::cout<<"vtx0 = "<getName()<& cofaces_0, // récupération au passage des Edges pour la construction de la nouvelle face commune std::vector edges_newcoface; for (uint i=0; i<4; i++){ - CoEdge* coedge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][i])->getCoEdge(0); + CoEdge* coedge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][i]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; faces[tabIndArToFace[i]] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[tabIndArToFace[i]], Internal::InfoCommand::CREATED); @@ -3178,7 +3097,8 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, #ifdef _DEBUG_REVOL std::cout<<"Recherche de l'arête "<getName() << " dans la face "<<*coface<getEdge((coface->getIndex(edge)+2)%4)); + uint edge_index = Utils::getIndexOf(edge, coface->getEdges()); + edges_newcoface.push_back(coface->getEdges()[(edge_index+2)%4]); } newCoface = new Topo::CoFace(getContext(), edges_newcoface[0], edges_newcoface[2], edges_newcoface[1], edges_newcoface[3]); @@ -3203,9 +3123,9 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, // le deuxième bloc { vtx6 = vtx7; - vtx7 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][3]); + vtx7 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]; vtx2 = vtx3; - vtx3 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][1]); + vtx3 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]; vtx4 = vtx5; vtx0 = vtx1; @@ -3251,7 +3171,7 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, // les faces 3 4 et 5 for (uint i=1; i<4; i++){ - CoEdge* coedge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][i])->getCoEdge(0); + CoEdge* coedge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][i]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][1]; faces[tabIndArToFace[i]] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[tabIndArToFace[i]], Internal::InfoCommand::CREATED); @@ -3263,7 +3183,7 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, // la face 1 { - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][1])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][1]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; faces[1] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[1], Internal::InfoCommand::CREATED); @@ -3273,7 +3193,8 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, #ifdef _DEBUG_REVOL std::cout<<"Recherche de l'arête "<getName() << " dans la face "<<*coface<getEdge((coface->getIndex(edge)+2)%4)); + uint edge_index = Utils::getIndexOf(edge, coface->getEdges()); + edges_newcoface.push_back(coface->getEdges()[(edge_index+2)%4]); } // la face 2 @@ -3302,10 +3223,10 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, vtx3 = vtx1; vtx2 = vtx0; - vtx0 = coface_90->getVertex(tabIndSomFace[indEdgeNearAxe][0]); - vtx1 = coface_90->getVertex(tabIndSomFace[indEdgeNearAxe][1]); - vtx4 = coface_90->getVertex(tabIndSomFace[indEdgeNearAxe][2]); - vtx5 = coface_90->getVertex(tabIndSomFace[indEdgeNearAxe][3]); + vtx0 = coface_90->getVertices()[tabIndSomFace[indEdgeNearAxe][0]]; + vtx1 = coface_90->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]; + vtx4 = coface_90->getVertices()[tabIndSomFace[indEdgeNearAxe][2]]; + vtx5 = coface_90->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]; #ifdef _DEBUG_REVOL std::cout<<"vtx0 = "<getName()<& cofaces_0, // la face 0 { - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][0])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][0]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; faces[0] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[0], Internal::InfoCommand::CREATED); } // la face 1 { - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][1])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][1]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][1]; faces[1] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[1], Internal::InfoCommand::CREATED); @@ -3353,7 +3274,7 @@ constructRevolBlocksInnerOgrid_4(std::vector& cofaces_0, } // les faces 4 et 5 for (uint i=2; i<4; i++){ - CoEdge* coedge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][i])->getCoEdge(0); + CoEdge* coedge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][i]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][2]; faces[tabIndArToFace[i]] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[tabIndArToFace[i]], Internal::InfoCommand::CREATED); @@ -3441,15 +3362,15 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, std::vector faces; std::vector vertices; - if (coface_0->getNbEdges() == 4) + if (coface_0->getEdges().size() == 4) faces.resize(6); else faces.resize(5); // recherche de l'indice de l'arête sur l'axe dans la coface, uint indEdgeNearAxe = 0; - for (uint i=0; igetNbEdges(); i++) - if (filtre_coedge[coface_0->getEdge(i)->getCoEdge(0)] >= 20) + for (uint i=0; igetEdges().size(); i++) + if (filtre_coedge[coface_0->getEdges()[i]->getCoEdges()[0]] >= 20) indEdgeNearAxe = i; #ifdef _DEBUG_REVOL std::cout<<"indEdgeNearAxe = "<& cofaces_0, std::vector face_cofaces; face_cofaces.push_back(coface_0); face_cofaces.push_back(coface_180); - if (coface_0->getNbEdges() == 4){ - face_vertices.push_back(coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][1])); - face_vertices.push_back(coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][3])); - face_vertices.push_back(coface_180->getVertex(tabIndSomFace[indEdgeNearAxe][3])); - face_vertices.push_back(coface_180->getVertex(tabIndSomFace[indEdgeNearAxe][1])); + if (coface_0->getEdges().size() == 4){ + face_vertices.push_back(coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); + face_vertices.push_back(coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); + face_vertices.push_back(coface_180->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); + face_vertices.push_back(coface_180->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); } else { - face_vertices.push_back(coface_0->getVertex(tabIndSomFaceDeg[indEdgeNearAxe][2])); - face_vertices.push_back(coface_0->getVertex(tabIndSomFaceDeg[indEdgeNearAxe][1])); - face_vertices.push_back(coface_180->getVertex(tabIndSomFaceDeg[indEdgeNearAxe][1])); + face_vertices.push_back(coface_0->getVertices()[tabIndSomFaceDeg[indEdgeNearAxe][2]]); + face_vertices.push_back(coface_0->getVertices()[tabIndSomFaceDeg[indEdgeNearAxe][1]]); + face_vertices.push_back(coface_180->getVertices()[tabIndSomFaceDeg[indEdgeNearAxe][1]]); } faces[0] = new Topo::Face(getContext(), face_cofaces, face_vertices, true); #ifdef _DEBUG_REVOL @@ -3480,16 +3401,16 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, } // Face 1 à 3 - faces[1] = constructFaceWith1RevolCoFace(coface_45->getEdge(tabIndArFace[indEdgeNearAxe][1]), + faces[1] = constructFaceWith1RevolCoFace(coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][1]], coedge2cofaces); - faces[2] = constructFaceWith1RevolCoFace(coface_135->getEdge(tabIndArFace[indEdgeNearAxe][1]), + faces[2] = constructFaceWith1RevolCoFace(coface_135->getEdges()[tabIndArFace[indEdgeNearAxe][1]], coedge2cofaces); - faces[3] = constructFaceWith1RevolCoFace(coface_0->getEdge(tabIndArFace[indEdgeNearAxe][1]), + faces[3] = constructFaceWith1RevolCoFace(coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][1]], coedge2cofaces); // Face 4 { - Edge* edge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][2]); - if (edge->getNbCoEdges() == 1){ + Edge* edge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][2]]; + if (edge->getCoEdges().size() == 1){ faces[4] = constructFaceWith1RevolCoFace(edge, coedge2cofaces); // prise en compte de la semi-conformité computeFaceRatio(faces[4] , 0, ni_loc_coface); @@ -3497,16 +3418,16 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, } else faces[4] = constructFaceWithRevolCoFaces(edge, coedge2cofaces, - coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][1]), - coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][1]), - coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][1]), - coface_180->getVertex(tabIndSomFace[indEdgeNearAxe][1])); + coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][1]], + coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][1]], + coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][1]], + coface_180->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); } // Face 5 - if (coface_0->getNbEdges() == 4) { - Edge* edge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][3]); - if (edge->getNbCoEdges() == 1){ + if (coface_0->getEdges().size() == 4) { + Edge* edge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][3]]; + if (edge->getCoEdges().size() == 1){ faces[5] = constructFaceWith1RevolCoFace(edge, coedge2cofaces); // prise en compte de la semi-conformité computeFaceRatio(faces[5] , 0, ni_loc_coface); @@ -3514,27 +3435,27 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, } else faces[5] = constructFaceWithRevolCoFaces(edge, coedge2cofaces, - coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][3]), - coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][3]), - coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][3]), - coface_180->getVertex(tabIndSomFace[indEdgeNearAxe][3])); + coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][3]], + coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][3]], + coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][3]], + coface_180->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); } // Sommets ordonnés pour être compatible avec l'ordre pour le Block - vertices.push_back(coface_180->getVertex(tabIndSomFace[indEdgeNearAxe][1])); - vertices.push_back(coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][1])); - vertices.push_back(coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][1])); - vertices.push_back(coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][1])); + vertices.push_back(coface_180->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); + vertices.push_back(coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); + vertices.push_back(coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); + vertices.push_back(coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); - if (coface_0->getNbEdges() == 4){ - vertices.push_back(coface_180->getVertex(tabIndSomFace[indEdgeNearAxe][3])); - vertices.push_back(coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][3])); - vertices.push_back(coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][3])); - vertices.push_back(coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][3])); + if (coface_0->getEdges().size() == 4){ + vertices.push_back(coface_180->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); + vertices.push_back(coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); + vertices.push_back(coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); + vertices.push_back(coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); } else{ - vertices.push_back(coface_0->getVertex(tabIndSomFaceDeg[indEdgeNearAxe][2])); + vertices.push_back(coface_0->getVertices()[tabIndSomFaceDeg[indEdgeNearAxe][2]]); } // Block (unique) @@ -3553,17 +3474,17 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, std::vector faces; std::vector vertices; - if (coface_0->getNbEdges() == 4) + if (coface_0->getEdges().size() == 4) faces.resize(6); else faces.resize(5); // recherche de l'indice de l'arête // et la plus proche dans le cas de la zone sous ogrid ne touchant pas l'axe (cas deto) uint indEdgeNearAxe = 0; - for (uint i=0; igetNbEdges(); i++) - if (filtre_vertex[coface_0->getEdge(i)->getCoEdge(0)->getVertex(0)] == 2 - && filtre_vertex[coface_0->getEdge(i)->getCoEdge(0)->getVertex(1)] == 2){ - // if (coface_0->getNbEdges() == 3 && i == 2 && filtre_vertex[coface_0->getVertex(0)] == 11) + for (uint i=0; igetEdges().size(); i++) + if (filtre_vertex[coface_0->getEdges()[i]->getCoEdges()[0]->getVertices()[0]] == 2 + && filtre_vertex[coface_0->getEdges()[i]->getCoEdges()[0]->getVertices()[1]] == 2){ + // if (coface_0->getEdges().size() == 3 && i == 2 && filtre_vertex[coface_0->getVertices()[0]] == 11) // invVertexOrder = true; indEdgeNearAxe = i; } @@ -3581,12 +3502,12 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, // le 1er bloc { - vtx0 = coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][0]); - vtx2 = coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][1]); - vtx4 = coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][2]); - vtx6 = coface_0->getVertex(tabIndSomFace[indEdgeNearAxe][3]); - vtx1 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][0]); - vtx5 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][2]); + vtx0 = coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][0]]; + vtx2 = coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]; + vtx4 = coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][2]]; + vtx6 = coface_0->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]; + vtx1 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][0]]; + vtx5 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][2]]; #ifdef _DEBUG_REVOL std::cout<<"vtx0 = "<getName()<& cofaces_0, // récupération au passage des Edges pour la construction de la nouvelle face commune std::vector edges_newcoface; for (uint i=0; i<4; i++){ - CoEdge* coedge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][i])->getCoEdge(0); + CoEdge* coedge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][i]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; faces[tabIndArToFace[i]] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[tabIndArToFace[i]], Internal::InfoCommand::CREATED); @@ -3636,7 +3557,8 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, #ifdef _DEBUG_REVOL std::cout<<"Recherche de l'arête "<getName() << " dans la face "<<*coface<getEdge((coface->getIndex(edge)+2)%4)); + uint edge_index = Utils::getIndexOf(edge, coface->getEdges()); + edges_newcoface.push_back(coface->getEdges()[(edge_index+2)%4]); } newCoface = new Topo::CoFace(getContext(), edges_newcoface[0], edges_newcoface[2], edges_newcoface[1], edges_newcoface[3]); @@ -3661,9 +3583,9 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, // le deuxième bloc { vtx6 = vtx7; - vtx7 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][3]); + vtx7 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]; vtx2 = vtx3; - vtx3 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][1]); + vtx3 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]; vtx4 = vtx5; vtx0 = vtx1; @@ -3712,7 +3634,7 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, // les faces 3 4 et 5 for (uint i=1; i<4; i++){ - CoEdge* coedge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][i])->getCoEdge(0); + CoEdge* coedge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][i]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][1]; faces[tabIndArToFace[i]] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[tabIndArToFace[i]], Internal::InfoCommand::CREATED); @@ -3724,7 +3646,7 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, // la face 1 { - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][1])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][1]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; faces[1] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[1], Internal::InfoCommand::CREATED); @@ -3734,7 +3656,8 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, #ifdef _DEBUG_REVOL std::cout<<"Recherche de l'arête "<getName() << " dans la face "<<*coface<getEdge((coface->getIndex(edge)+2)%4)); + uint edge_index = Utils::getIndexOf(edge, coface->getEdges()); + edges_newcoface.push_back(coface->getEdges()[(edge_index+2)%4]); } // la face 2 @@ -3768,8 +3691,8 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, vtx3 = vtx1; vtx2 = vtx0; - vtx0 = coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][0]); - vtx4 = coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][2]); + vtx0 = coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][0]]; + vtx4 = coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][2]]; std::vector &coedges0 = vtx2coedges[vtx3B2]; if (coedges0.size() != 3) @@ -3803,14 +3726,14 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, // la face 0 { - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][0])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][0]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; faces[0] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[0], Internal::InfoCommand::CREATED); } // la face 1 { - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][1])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][1]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][1]; faces[1] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[1], Internal::InfoCommand::CREATED); @@ -3822,7 +3745,7 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, } // les faces 4 et 5 for (uint i=2; i<4; i++){ - CoEdge* coedge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][i])->getCoEdge(0); + CoEdge* coedge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][i]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][2]; faces[tabIndArToFace[i]] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[tabIndArToFace[i]], Internal::InfoCommand::CREATED); @@ -3860,8 +3783,8 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, vtx3 = vtx1; vtx2 = vtx0; - vtx1 = coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][1]); - vtx5 = coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][3]); + vtx1 = coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]; + vtx5 = coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]; std::vector &coedges0 = vtx2coedges[vtx1]; if (coedges0.size() != 2) @@ -3899,14 +3822,14 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, // la face 1 { - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][1])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][1]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][2]; faces[1] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[1], Internal::InfoCommand::CREATED); } // la face 2 { - CoEdge* coedge = coface_135->getEdge(tabIndArFace[indEdgeNearAxe][1])->getCoEdge(0); + CoEdge* coedge = coface_135->getEdges()[tabIndArFace[indEdgeNearAxe][1]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; faces[2] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[2], Internal::InfoCommand::CREATED); @@ -3918,7 +3841,7 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, } // les faces 4 et 5 for (uint i=2; i<4; i++){ - CoEdge* coedge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][i])->getCoEdge(0); + CoEdge* coedge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][i]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][3]; faces[tabIndArToFace[i]] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[tabIndArToFace[i]], Internal::InfoCommand::CREATED); @@ -3956,10 +3879,10 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, vtx1 = vtx0; vtx5 = vtx4; - vtx0 = coface_180->getVertex(tabIndSomFace[indEdgeNearAxe][1]); - vtx2 = coface_180->getVertex(tabIndSomFace[indEdgeNearAxe][0]); - vtx4 = coface_180->getVertex(tabIndSomFace[indEdgeNearAxe][3]); - vtx6 = coface_180->getVertex(tabIndSomFace[indEdgeNearAxe][2]); + vtx0 = coface_180->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]; + vtx2 = coface_180->getVertices()[tabIndSomFace[indEdgeNearAxe][0]]; + vtx4 = coface_180->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]; + vtx6 = coface_180->getVertices()[tabIndSomFace[indEdgeNearAxe][2]]; #ifdef _DEBUG_REVOL std::cout<<"vtx0 = "<getName()<& cofaces_0, } // la face 2 { - CoEdge* coedge = coface_135->getEdge(tabIndArFace[indEdgeNearAxe][1])->getCoEdge(0); + CoEdge* coedge = coface_135->getEdges()[tabIndArFace[indEdgeNearAxe][1]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][1]; faces[2] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[2], Internal::InfoCommand::CREATED); } // la face 3 { - CoEdge* coedge = coface_135->getEdge(tabIndArFace[indEdgeNearAxe][0])->getCoEdge(0); + CoEdge* coedge = coface_135->getEdges()[tabIndArFace[indEdgeNearAxe][0]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; faces[3] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[3], Internal::InfoCommand::CREATED); @@ -4010,7 +3933,7 @@ constructRevolBlocksInnerOgrid_2(std::vector& cofaces_0, // les faces 4 et 5 for (uint i=2; i<4; i++){ - CoEdge* coedge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][i])->getCoEdge(0); + CoEdge* coedge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][i]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][4]; faces[tabIndArToFace[i]] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[tabIndArToFace[i]], Internal::InfoCommand::CREATED); @@ -4099,74 +4022,74 @@ constructRevolBlocksInnerOgrid_1(std::vector& cofaces_45, std::vector faces; std::vector vertices; - if (coface_45->getNbEdges() == 4) + if (coface_45->getEdges().size() == 4) faces.resize(6); else faces.resize(5); // recherche de l'indice de l'arête sur l'axe dans la coface, uint indEdgeNearAxe = 0; - for (uint i=0; igetNbEdges(); i++) - if (filtre_coedge[coface_45->getEdge(i)->getCoEdge(0)] >= 20) + for (uint i=0; igetEdges().size(); i++) + if (filtre_coedge[coface_45->getEdges()[i]->getCoEdges()[0]] >= 20) indEdgeNearAxe = i; #ifdef _DEBUG_REVOL std::cout<<"indEdgeNearAxe = "<getEdge(tabIndArFace[indEdgeNearAxe][1]), + faces[0] = constructFaceWith1RevolCoFace(coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][1]], coedge2cofaces); - faces[3] = constructFaceWith1RevolCoFace(coface_135->getEdge(tabIndArFace[indEdgeNearAxe][1]), + faces[3] = constructFaceWith1RevolCoFace(coface_135->getEdges()[tabIndArFace[indEdgeNearAxe][1]], coedge2cofaces); - faces[1] = constructFaceWith1RevolCoFace(coface_225->getEdge(tabIndArFace[indEdgeNearAxe][1]), + faces[1] = constructFaceWith1RevolCoFace(coface_225->getEdges()[tabIndArFace[indEdgeNearAxe][1]], coedge2cofaces); - faces[2] = constructFaceWith1RevolCoFace(coface_315->getEdge(tabIndArFace[indEdgeNearAxe][1]), + faces[2] = constructFaceWith1RevolCoFace(coface_315->getEdges()[tabIndArFace[indEdgeNearAxe][1]], coedge2cofaces); // Face 4 { - Edge* edge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][2]); - if (edge->getNbCoEdges() == 1){ + Edge* edge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][2]]; + if (edge->getCoEdges().size() == 1){ faces[4] = constructFaceWith1RevolCoFace(edge, coedge2cofaces); // prise en compte de la semi-conformité computeFaceRatio(faces[4] , 2, ni_loc_coface*2); } else faces[4] = constructFaceWithRevolCoFaces(edge, coedge2cofaces, - coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][1]), - coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][1]), - coface_225->getVertex(tabIndSomFace[indEdgeNearAxe][1]), - coface_315->getVertex(tabIndSomFace[indEdgeNearAxe][1])); + coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][1]], + coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][1]], + coface_225->getVertices()[tabIndSomFace[indEdgeNearAxe][1]], + coface_315->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); } // Face 5 - if (coface_45->getNbEdges() == 4) { - Edge* edge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][3]); - if (edge->getNbCoEdges() == 1){ + if (coface_45->getEdges().size() == 4) { + Edge* edge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][3]]; + if (edge->getCoEdges().size() == 1){ faces[5] = constructFaceWith1RevolCoFace(edge, coedge2cofaces); // prise en compte de la semi-conformité computeFaceRatio(faces[5] , 2, ni_loc_coface*2); } else faces[5] = constructFaceWithRevolCoFaces(edge, coedge2cofaces, - coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][3]), - coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][3]), - coface_225->getVertex(tabIndSomFace[indEdgeNearAxe][3]), - coface_315->getVertex(tabIndSomFace[indEdgeNearAxe][3])); + coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][3]], + coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][3]], + coface_225->getVertices()[tabIndSomFace[indEdgeNearAxe][3]], + coface_315->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); } // Sommets ordonnés pour être compatible avec l'ordre pour le Block - vertices.push_back(coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][1])); - vertices.push_back(coface_315->getVertex(tabIndSomFace[indEdgeNearAxe][1])); - vertices.push_back(coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][1])); - vertices.push_back(coface_225->getVertex(tabIndSomFace[indEdgeNearAxe][1])); - if (coface_45->getNbEdges() == 4){ - vertices.push_back(coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][3])); - vertices.push_back(coface_315->getVertex(tabIndSomFace[indEdgeNearAxe][3])); - vertices.push_back(coface_135->getVertex(tabIndSomFace[indEdgeNearAxe][3])); - vertices.push_back(coface_225->getVertex(tabIndSomFace[indEdgeNearAxe][3])); + vertices.push_back(coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); + vertices.push_back(coface_315->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); + vertices.push_back(coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); + vertices.push_back(coface_225->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]); + if (coface_45->getEdges().size() == 4){ + vertices.push_back(coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); + vertices.push_back(coface_315->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); + vertices.push_back(coface_135->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); + vertices.push_back(coface_225->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]); } else - vertices.push_back(coface_45->getVertex(tabIndSomFaceDeg[indEdgeNearAxe][2])); + vertices.push_back(coface_45->getVertices()[tabIndSomFaceDeg[indEdgeNearAxe][2]]); // Block (unique) Block* newBlock = new Topo::Block(getContext(), faces, vertices, true); @@ -4184,18 +4107,20 @@ constructRevolBlocksInnerOgrid_1(std::vector& cofaces_45, std::vector faces; std::vector vertices; - if (coface_45->getNbEdges() == 4) + if (coface_45->getEdges().size() == 4) faces.resize(6); else faces.resize(5); // recherche de l'indice de l'arête // et la plus proche dans le cas de la zone sous ogrid ne touchant pas l'axe (cas deto) uint indEdgeNearAxe = 0; - for (uint i=0; igetNbEdges(); i++) - if (filtre_vertex[coface_45->getEdge(i)->getCoEdge(0)->getVertex(0)] == 2 - && filtre_vertex[coface_45->getEdge(i)->getCoEdge(0)->getVertex(1)] == 2){ + for (uint i=0; igetEdges().size(); i++) { + auto vertices = coface_45->getEdges()[i]->getCoEdges()[0]->getVertices(); + if (filtre_vertex[vertices[0]] == 2 + && filtre_vertex[vertices[1]] == 2){ indEdgeNearAxe = i; } + } #ifdef _DEBUG_REVOL std::cout<<"indEdgeNearAxe = "<& cofaces_45, // inuitialisation de vtx 1 4 5 3 et 7 // création d'une première newCoface (à mettre de côté) { - vtx7 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][3]); - vtx3 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][1]); - vtx4 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][2]); - vtx0 = coface_45->getVertex(tabIndSomFace[indEdgeNearAxe][0]); + vtx7 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]; + vtx3 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]; + vtx4 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][2]]; + vtx0 = coface_45->getVertices()[tabIndSomFace[indEdgeNearAxe][0]]; vtx6 = 0; vtx2 = 0; @@ -4232,20 +4157,20 @@ constructRevolBlocksInnerOgrid_1(std::vector& cofaces_45, // récupération des Edges pour la construction de la nouvelle face commune std::vector edges_newcoface; - edges_newcoface.push_back(coface_45->getEdge(tabIndArFace[indEdgeNearAxe][0])); + edges_newcoface.push_back(coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][0]]); { - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][1])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][1]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; edges_newcoface.push_back(coface->getEdge(vtx1, vtx5)); } { - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][2])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][2]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; edges_newcoface.push_back(coface->getEdge(vtx0, vtx1)); } { - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][3])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][3]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; edges_newcoface.push_back(coface->getEdge(vtx4, vtx5)); } @@ -4293,8 +4218,8 @@ constructRevolBlocksInnerOgrid_1(std::vector& cofaces_45, throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructRevolBlocksInnerOgrid_1 avec autre chose que 3 arêtes pour vtx7B0 ", TkUtil::Charset::UTF_8)); vtx7 = coedges1[1]->getOppositeVertex(vtx6); - vtx1 = coface_1->getVertex(tabIndSomFace[indEdgeNearAxe][0]); - vtx5 = coface_1->getVertex(tabIndSomFace[indEdgeNearAxe][2]); + vtx1 = coface_1->getVertices()[tabIndSomFace[indEdgeNearAxe][0]]; + vtx5 = coface_1->getVertices()[tabIndSomFace[indEdgeNearAxe][2]]; #ifdef _DEBUG_REVOL std::cout<<"vtx0 = "<getName()<& cofaces_45, } // la face 2 { - CoEdge* coedge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][0])->getCoEdge(0); + CoEdge* coedge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][0]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; faces[2] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[2], Internal::InfoCommand::CREATED); } // la face 3 { - CoEdge* coedge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][1])->getCoEdge(0); + CoEdge* coedge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][1]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][1]; faces[3] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[3], Internal::InfoCommand::CREATED); } // les faces 4 et 5 for (uint i=2; i<4; i++){ - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][i])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][i]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][j*2]; faces[tabIndArToFace[i]] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[tabIndArToFace[i]], Internal::InfoCommand::CREATED); @@ -4371,9 +4296,9 @@ constructRevolBlocksInnerOgrid_1(std::vector& cofaces_45, // Création du deuxième bloc { vtx6 = vtx7; - vtx7 = coface_1->getVertex(tabIndSomFace[indEdgeNearAxe][3]); + vtx7 = coface_1->getVertices()[tabIndSomFace[indEdgeNearAxe][3]]; vtx2 = vtx3; - vtx3 = coface_1->getVertex(tabIndSomFace[indEdgeNearAxe][1]); + vtx3 = coface_1->getVertices()[tabIndSomFace[indEdgeNearAxe][1]]; vtx4 = vtx5; vtx0 = vtx1; @@ -4414,21 +4339,21 @@ constructRevolBlocksInnerOgrid_1(std::vector& cofaces_45, } // la face 1 { - CoEdge* coedge = coface_1->getEdge(tabIndArFace[indEdgeNearAxe][1])->getCoEdge(0); + CoEdge* coedge = coface_1->getEdges()[tabIndArFace[indEdgeNearAxe][1]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][0]; faces[1] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[1], Internal::InfoCommand::CREATED); } // la face 3 { - CoEdge* coedge = coface_0->getEdge(tabIndArFace[indEdgeNearAxe][1])->getCoEdge(0); + CoEdge* coedge = coface_0->getEdges()[tabIndArFace[indEdgeNearAxe][1]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][2]; faces[3] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[3], Internal::InfoCommand::CREATED); } // les faces 4 et 5 for (uint i=2; i<4; i++){ - CoEdge* coedge = coface_45->getEdge(tabIndArFace[indEdgeNearAxe][i])->getCoEdge(0); + CoEdge* coedge = coface_45->getEdges()[tabIndArFace[indEdgeNearAxe][i]]->getCoEdges()[0]; CoFace* coface = coedge2cofaces[coedge][j*2+1]; faces[tabIndArToFace[i]] = new Topo::Face(getContext(), coface); getInfoCommand().addTopoInfoEntity(faces[tabIndArToFace[i]], Internal::InfoCommand::CREATED); @@ -4548,8 +4473,7 @@ updateGeomAssociationOGrid(std::vector& vertices, if (filtre_vertex[vtx] != 11){ - std::vector coedges; - vtx->getCoEdges(coedges); + std::vector coedges = vtx->getCoEdges(); Geom::Curve* crv_ogrid = 0; for (std::vector::iterator iter3 = coedges.begin(); @@ -4594,9 +4518,9 @@ Face* CommandMakeBlocksByRevol:: constructFaceWith1RevolCoFace(Edge* edge, std::map >& coedge2cofaces) { - if (edge->getNbCoEdges() != 1) + if (edge->getCoEdges().size() != 1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, constructFaceWith1RevolCoFace avec une arête composée", TkUtil::Charset::UTF_8)); - CoEdge* coedge = edge->getCoEdge(0); + CoEdge* coedge = edge->getCoEdges()[0]; std::vector& revol_cofaces = coedge2cofaces[coedge]; if (revol_cofaces.size() != 1){ std::cerr<<"coedge : "<getName()< coedges; - edge->getCoEdges(coedges); + std::vector coedges = edge->getCoEdges(); std::vector face_vertices; std::vector face_cofaces; for (std::vector::iterator iter3 = coedges.begin(); @@ -4661,8 +4584,8 @@ computeFaceRatio(Face* face, uint dir, uint ni_loc_coface) if (dir == 2 || dir == 0){ uint ratio = nbI/ni_loc_coface; if (ratio != 1) - for (uint i=0; igetNbCoFaces(); i++){ - face->setRatio(face->getCoFace(i), ratio, 0); + for (CoFace* cf : face->getCoFaces()){ + face->setRatio(cf, ratio, 0); #ifdef _DEBUG_REVOL std::cout<<" ratio pour "<getCoFace(i)->getName() <<" => "<getRatio(face->getCoFace(i), 0) @@ -4673,8 +4596,8 @@ computeFaceRatio(Face* face, uint dir, uint ni_loc_coface) if (dir == 2 || dir == 1){ uint ratio = nbJ/ni_loc_coface; if (ratio != 1) - for (uint i=0; igetNbCoFaces(); i++){ - face->setRatio(face->getCoFace(i), ratio, 1); + for (CoFace* cf : face->getCoFaces()){ + face->setRatio(cf, ratio, 1); #ifdef _DEBUG_REVOL std::cout<<" ratio pour "<getCoFace(i)->getName() <<" => "<getRatio(face->getCoFace(i), 1) diff --git a/src/Core/Topo/CommandModificationTopo.cpp b/src/Core/Topo/CommandModificationTopo.cpp index f5421c78..4da56d19 100644 --- a/src/Core/Topo/CommandModificationTopo.cpp +++ b/src/Core/Topo/CommandModificationTopo.cpp @@ -259,9 +259,8 @@ void CommandModificationTopo::MAJCoEdges() std::cout<<"Vertex::merge, "<getName()<<" est remplacé par "<getName()< coedges_loc1, coedges_loc2; - vtx0->getCoEdges(coedges_loc1); - vtx0new->getCoEdges(coedges_loc2); + std::vector coedges_loc1 = vtx0->getCoEdges(); + std::vector coedges_loc2 = vtx0new->getCoEdges(); // fusion des sommets vtx0new->merge(vtx0, &getInfoCommand()); @@ -274,7 +273,7 @@ void CommandModificationTopo::MAJCoEdges() // recherche d'une arête dans coedges_loc2 qui possède également vtx1 Topo::CoEdge* co2 = 0; for (uint k=0; kfind(vtx1)) + if (Utils::contains(vtx1, coedges_loc2[k]->getVertices())) co2 = coedges_loc2[k]; if (co2){ @@ -448,13 +447,12 @@ void CommandModificationTopo::MAJCoEdges() // tri des coedges dans les edges std::set all_edges; - std::vector edges; for (uint i=0; igetEdges(edges); + std::vector edges = coedges1sorted[i]->getEdges(); all_edges.insert(edges.begin(), edges.end()); } for (uint i=0; igetEdges(edges); + std::vector edges = coedges2sorted[i]->getEdges(); all_edges.insert(edges.begin(), edges.end()); } @@ -519,14 +517,12 @@ void CommandModificationTopo::updateGeomAssociation(std::vector& coface coface[i]->setGeomAssociation(newGE); // on fait de même avec les arêtes et sommets internes - std::vector coedges; - coface[i]->getCoEdges(coedges); + std::vector coedges = coface[i]->getCoEdges(); for (uint j=0; j vertices; - coedges[j]->getVertices(vertices); + const std::vector& vertices = coedges[j]->getVertices(); for (uint k=0; kgetGeomAssociation() == oldGE){ getInfoCommand().addTopoInfoEntity(vertices[k], Internal::InfoCommand::DISPMODIFIED); @@ -633,15 +629,16 @@ void CommandModificationTopo::MAJCoFaces() #ifdef _DEBUG_MAJTOPO std::cout<<" cas non structuré, on remplace cette face par celles en face"<getFace(0); + Face* face2 = coface2[0]->getFaces()[0]; CHECK_NULL_PTR_ERROR(face2); // suprime la coface et les relations coface2[0]->free(&getInfoCommand()); - face2->addCoFaces(coface1); - for (uint i=0; iaddCoFace(coface1[i]); coface1[i]->addFace(face2); + } updateGeomAssociation(coface1, 0, newEntities[0]); @@ -851,8 +848,7 @@ MAJInternalsCoFaces() if (iter->first->getDim() == 2 && iter->second == Internal::InfoCommand::DISPMODIFIED){ Topo::CoFace* ob = dynamic_cast(iter->first); if (ob && !ob->isStructured() && ob->getGeomAssociation() == 0){ - std::vector blocks; - ob->getBlocks(blocks); + std::vector blocks = ob->getBlocks(); if (blocks.size() ==2 && blocks[0]->getGeomAssociation() == blocks[1]->getGeomAssociation()) { // std::cout << "coface trouvée : " << ob->getName() << std::endl; // std::cout << " blocks[0]->getGeomAssociation():"<<(blocks[0]->getGeomAssociation()?blocks[0]->getGeomAssociation()->getName():"vide")< l_faces; for (uint i=0; i faces; - v_blocks[i]->getFaces(faces); + const std::vector& faces = v_blocks[i]->getFaces(); for (uint j=0; j cofaces; - faces[j]->getCoFaces(cofaces); + std::vector cofaces = faces[j]->getCoFaces(); if (cofaces.size() != 1){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message << "Une face ("<getName() @@ -923,12 +917,10 @@ MAJInternalsCoFaces() std::map filtre_vertices; for (uint i=0; isaveFaceTopoProperty(&getInfoCommand()); - std::vector vertices; - v_faces[i]->getVertices(vertices); - for (uint j=0; jgetVertices()) + if (filtre_vertices[vtx] == 0){ + v_vertices.push_back(vtx); + filtre_vertices[vtx] = 1; } } @@ -943,8 +935,7 @@ MAJInternalsCoFaces() // destruction des cofaces et des faces for (uint i=0; i faces; - coface->getFaces(faces); + std::vector faces = coface->getFaces(); for (uint j=0; jfree(&getInfoCommand()); coface->free(&getInfoCommand()); @@ -1240,8 +1231,7 @@ fuseInternalCoEdgesAndVertices(Geom::GeomEntity* ge, std::vectorgetDim()==2){ CoFace* coface = dynamic_cast(topos[i]); CHECK_NULL_PTR_ERROR(coface); - std::vector coedges; - coface->getCoEdges(coedges); + std::vector coedges = coface->getCoEdges(); for (std::vector::iterator iter1 = coedges.begin(); iter1 != coedges.end(); ++iter1){ @@ -1249,10 +1239,8 @@ fuseInternalCoEdgesAndVertices(Geom::GeomEntity* ge, std::vectorgetName()<<" en relation avec "<<((*iter1)->getGeomAssociation() == 0?"rien":(*iter1)->getGeomAssociation()->getName())<getGeomAssociation() == ge?1:2); - std::vector vertices; - (*iter1)->getVertices(vertices); - for (std::vector::iterator iter2 = vertices.begin(); - iter2 != vertices.end(); ++iter2){ + const std::vector& vertices = (*iter1)->getVertices(); + for (auto iter2 = vertices.begin(); iter2 != vertices.end(); ++iter2){ #ifdef _DEBUG_MAJTOPO2 std::cout<<" "<<(*iter2)->getName()<<" en relation avec "<<((*iter2)->getGeomAssociation() == 0?"rien":(*iter2)->getGeomAssociation()->getName())<(topos[i]); CHECK_NULL_PTR_ERROR(coedge); filtre_coedges[coedge] = (coedge->getGeomAssociation() == ge?1:2); - std::vector vertices; - coedge->getVertices(vertices); - for (std::vector::iterator iter2 = vertices.begin(); - iter2 != vertices.end(); ++iter2){ + const std::vector& vertices = coedge->getVertices(); + for (auto iter2 = vertices.begin(); iter2 != vertices.end(); ++iter2){ #ifdef _DEBUG_MAJTOPO2 std::cout<<" "<<(*iter2)->getName()<<" en relation avec "<<((*iter2)->getGeomAssociation() == 0?"rien":(*iter2)->getGeomAssociation()->getName())<getNbVertices() == 2 - && ((filtre_vertices[coedge->getVertex(0)] == 1 && filtre_vertices[coedge->getVertex(1)] == 2) - || (filtre_vertices[coedge->getVertex(0)] == 2 && filtre_vertices[coedge->getVertex(1)] == 1))){ + auto coedge_vertices = coedge->getVertices(); + if (filtre_coedges[coedge] == 1 && coedge_vertices.size() == 2 + && ((filtre_vertices[coedge_vertices[0]] == 1 && filtre_vertices[coedge_vertices[1]] == 2) + || (filtre_vertices[coedge_vertices[0]] == 2 && filtre_vertices[coedge_vertices[1]] == 1))){ Vertex* vtx1; Vertex* vtxBord; - if (filtre_vertices[coedge->getVertex(0)] == 1 && filtre_vertices[coedge->getVertex(1)] == 2){ - vtx1 = coedge->getVertex(0); - vtxBord = coedge->getVertex(1); + if (filtre_vertices[coedge_vertices[0]] == 1 && filtre_vertices[coedge_vertices[1]] == 2){ + vtx1 = coedge_vertices[0]; + vtxBord = coedge_vertices[1]; } else { - vtx1 = coedge->getVertex(1); - vtxBord = coedge->getVertex(0); + vtx1 = coedge_vertices[1]; + vtxBord = coedge_vertices[0]; } // pour ne pas reprendre cette arête filtre_coedges[coedge] = 2; @@ -1449,10 +1436,10 @@ fuseInternalCoEdgesAndVertices(Geom::GeomEntity* ge, std::vectorgetVertex(0)->getGeomAssociation()) - vtx1 = dynamic_cast(internalCoedges[i]->getVertex(0)->getGeomAssociation()); - if (internalCoedges[i]->getVertex(1)->getGeomAssociation()) - vtx2 = dynamic_cast(internalCoedges[i]->getVertex(1)->getGeomAssociation()); + if (internalCoedges[i]->getVertices()[0]->getGeomAssociation()) + vtx1 = dynamic_cast(internalCoedges[i]->getVertices()[0]->getGeomAssociation()); + if (internalCoedges[i]->getVertices()[1]->getGeomAssociation()) + vtx2 = dynamic_cast(internalCoedges[i]->getVertices()[1]->getGeomAssociation()); if (vertices.size() == 2 && ((vertices[0] == vtx1 && vertices[1] == vtx2) || (vertices[0] == vtx2 && vertices[1] == vtx1))){ @@ -1507,10 +1494,7 @@ getSameCoEdges(Topo::CoEdge* coedge) std::map filtre_vertices; - std::vector vertices; - - coedge->getVertices(vertices); - + std::vector vertices = coedge->getVertices(); for (uint i=0; i coedges; - vertices[0]->getCoEdges(coedges); - - for (uint i=0; igetVertices(vertices); + for (CoEdge* v0_ce : vertices[0]->getCoEdges()){ + vertices = v0_ce->getVertices(); uint nbVertexMarques = 0; for (uint j=0; j filtre_coedges; - std::vector coedges; - - coface->getCoEdges(coedges); + std::vector coedges = coface->getCoEdges(); for (uint i=0; i cofaces; - coedges[0]->getCoFaces(cofaces); + std::vector cofaces = coedges[0]->getCoFaces(); #ifdef _DEBUG_MAJTOPO std::cout<<"coedges[0] = "<getName()<getCoEdges(coedges); + coedges = cofaces[i]->getCoEdges(); uint nbCoedgesMarques = 0; for (uint j=0; j& coedges1, // cas du découpage // sens normal dans la coedge2 ? - bool sens2 = (vtx_prec2 == coedges2[idx2]->getVertex(0)); + bool sens2 = (vtx_prec2 == coedges2[idx2]->getVertices()[0]); uint nbMeshingEdges = (sens2 ? nb_bras1 - nb_bras2 :coedges2[idx2]->getNbMeshingEdges()*coeff2 - nb_bras1 + nb_bras2)/coeff2; @@ -1862,8 +1840,7 @@ getInnerCoFaces(std::vector& cofaces, std::vector& coedg //std::cout<<"coface = "<getName()< loc_coedges; - coface->getCoEdges(loc_coedges); + std::vector loc_coedges = coface->getCoEdges(); for (uint j=0; j& cofaces, std::vector& coedg if (filtre_coedges[innerCoEdges[k]] == 2){ //std::cout<<"innerCoEdges[k] (marque à 2) = "<getName()< loc_cofaces; - innerCoEdges[k]->getCoFaces(loc_cofaces); - + std::vector loc_cofaces = innerCoEdges[k]->getCoFaces(); for (uint l=0; l& cofaces, std::vector& coedg filtre_cofaces[coface] = 2; // analyse des arêtes de la face: au bord ou interne - std::vector loc_coedges; - coface->getCoEdges(loc_coedges); + std::vector loc_coedges = coface->getCoEdges(); for (uint j=0; j CommandModificationTopo::getInnerBlocks(std::vectorgetCoFaces().size() != 1) + throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, il n'est pas prévu de faire appel à getEdge(ind) pour une face composée", TkUtil::Charset::UTF_8)); + + return f->getCoFaces()[0]->getEdges()[ind]; +} +/*----------------------------------------------------------------------------*/ void CommandNewTopoOGridOnGeometry::validGeomEntity() { CommandCreateTopo::validGeomEntity(); @@ -247,21 +257,24 @@ createCylinderTopo1BlockPlein(Geom::PropertyCylinder* propertyCyl) } // on considère que la première surface est celle qui enveloppe - b1->getFace(Block::i_min)->setGeomAssociation(surfaces[0]); - b1->getFace(Block::i_max)->setGeomAssociation(surfaces[0]); - b1->getFace(Block::j_min)->setGeomAssociation(surfaces[0]); - b1->getFace(Block::j_max)->setGeomAssociation(surfaces[0]); - b1->getFace(Block::i_min)->getEdge(Face::j_min)->setGeomAssociation(surfaces[0]); - b1->getFace(Block::i_min)->getEdge(Face::j_max)->setGeomAssociation(surfaces[0]); - b1->getFace(Block::i_max)->getEdge(Face::j_min)->setGeomAssociation(surfaces[0]); - b1->getFace(Block::i_max)->getEdge(Face::j_max)->setGeomAssociation(surfaces[0]); + const std::vector& b1_faces = b1->getFaces(); + + b1_faces[Block::i_min]->setGeomAssociation(surfaces[0]); + b1_faces[Block::i_max]->setGeomAssociation(surfaces[0]); + b1_faces[Block::j_min]->setGeomAssociation(surfaces[0]); + b1_faces[Block::j_max]->setGeomAssociation(surfaces[0]); + + getEdge(b1_faces[Block::i_min], Face::j_min)->setGeomAssociation(surfaces[0]); + getEdge(b1_faces[Block::i_min], Face::j_max)->setGeomAssociation(surfaces[0]); + getEdge(b1_faces[Block::i_max], Face::j_min)->setGeomAssociation(surfaces[0]); + getEdge(b1_faces[Block::i_max], Face::j_max)->setGeomAssociation(surfaces[0]); // la deuxième est au sommet du cylindre - b1->getFace(Block::k_max)->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_max]->setGeomAssociation(surfaces[1]); // la dernière surface est à la base du cylindre - b1->getFace(Block::k_min)->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_min]->setGeomAssociation(surfaces[2]); std::vector curves (v.getCurves().begin(), v.getCurves().end()); if (curves.size() != 3){ @@ -272,26 +285,26 @@ createCylinderTopo1BlockPlein(Geom::PropertyCylinder* propertyCyl) } // on considère que la 3ème courbe est celle qui est à la base du cylindre - b1->getFace(Block::k_min)->getEdge(Face::i_min)->setGeomAssociation(curves[2]); - b1->getFace(Block::k_min)->getEdge(Face::i_max)->setGeomAssociation(curves[2]); - b1->getFace(Block::k_min)->getEdge(Face::j_min)->setGeomAssociation(curves[2]); - b1->getFace(Block::k_min)->getEdge(Face::j_max)->setGeomAssociation(curves[2]); + getEdge(b1_faces[Block::k_min], Face::i_min)->setGeomAssociation(curves[2]); + getEdge(b1_faces[Block::k_min], Face::i_max)->setGeomAssociation(curves[2]); + getEdge(b1_faces[Block::k_min], Face::j_min)->setGeomAssociation(curves[2]); + getEdge(b1_faces[Block::k_min], Face::j_max)->setGeomAssociation(curves[2]); - b1->getFace(Block::k_min)->getVertex(0)->setGeomAssociation(curves[2]); - b1->getFace(Block::k_min)->getVertex(1)->setGeomAssociation(curves[2]); - b1->getFace(Block::k_min)->getVertex(2)->setGeomAssociation(curves[2]); - b1->getFace(Block::k_min)->getVertex(3)->setGeomAssociation(curves[2]); + b1_faces[Block::k_min]->getVertices()[0]->setGeomAssociation(curves[2]); + b1_faces[Block::k_min]->getVertices()[1]->setGeomAssociation(curves[2]); + b1_faces[Block::k_min]->getVertices()[2]->setGeomAssociation(curves[2]); + b1_faces[Block::k_min]->getVertices()[3]->setGeomAssociation(curves[2]); // on considère que la première courbe est celle qui est en z max - b1->getFace(Block::k_max)->getEdge(Face::i_min)->setGeomAssociation(curves[0]); - b1->getFace(Block::k_max)->getEdge(Face::i_max)->setGeomAssociation(curves[0]); - b1->getFace(Block::k_max)->getEdge(Face::j_min)->setGeomAssociation(curves[0]); - b1->getFace(Block::k_max)->getEdge(Face::j_max)->setGeomAssociation(curves[0]); - - b1->getFace(Block::k_max)->getVertex(0)->setGeomAssociation(curves[0]); - b1->getFace(Block::k_max)->getVertex(1)->setGeomAssociation(curves[0]); - b1->getFace(Block::k_max)->getVertex(2)->setGeomAssociation(curves[0]); - b1->getFace(Block::k_max)->getVertex(3)->setGeomAssociation(curves[0]); + getEdge(b1_faces[Block::k_max], Face::i_min)->setGeomAssociation(curves[0]); + getEdge(b1_faces[Block::k_max], Face::i_max)->setGeomAssociation(curves[0]); + getEdge(b1_faces[Block::k_max], Face::j_min)->setGeomAssociation(curves[0]); + getEdge(b1_faces[Block::k_max], Face::j_max)->setGeomAssociation(curves[0]); + + b1_faces[Block::k_max]->getVertices()[0]->setGeomAssociation(curves[0]); + b1_faces[Block::k_max]->getVertices()[1]->setGeomAssociation(curves[0]); + b1_faces[Block::k_max]->getVertices()[2]->setGeomAssociation(curves[0]); + b1_faces[Block::k_max]->getVertices()[3]->setGeomAssociation(curves[0]); } /*----------------------------------------------------------------------------*/ void CommandNewTopoOGridOnGeometry:: @@ -349,85 +362,87 @@ createCylinderTopo1BlockDemi(Geom::PropertyCylinder* propertyCyl) curves[2]->getPoint(param1+(param2-param1)/4, p2); curves[2]->getPoint(param1+(param2-param1)*3/4, p3); - b1->getVertex(0)->setCoord(vertices[1]->getCoord()); - b1->getVertex(1)->setCoord(vertices[0]->getCoord()); - b1->getVertex(2)->setCoord(p1); - b1->getVertex(3)->setCoord(p0); + const std::vector& b1_vertices = b1->getVertices(); + b1_vertices[0]->setCoord(vertices[1]->getCoord()); + b1_vertices[1]->setCoord(vertices[0]->getCoord()); + b1_vertices[2]->setCoord(p1); + b1_vertices[3]->setCoord(p0); - b1->getVertex(4)->setCoord(vertices[3]->getCoord()); - b1->getVertex(5)->setCoord(vertices[2]->getCoord()); - b1->getVertex(6)->setCoord(p3); - b1->getVertex(7)->setCoord(p2); + b1_vertices[4]->setCoord(vertices[3]->getCoord()); + b1_vertices[5]->setCoord(vertices[2]->getCoord()); + b1_vertices[6]->setCoord(p3); + b1_vertices[7]->setCoord(p2); // on coupe la face du bloc b1 pour qu'une arête soit sur la courbe 8 std::vector splitingEdges; std::vector cofaces; - cofaces.push_back(b1->getFace(Block::j_min)->getCoFace(0)); + const std::vector& b1_faces = b1->getFaces(); + cofaces.push_back(b1_faces[Block::j_min]->getCoFaces()[0]); TopoHelper::splitFaces(cofaces, - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->getCoEdge(0), + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->getCoEdges()[0], 0.5, 0.0, false, false, splitingEdges, &getInfoCommand()); - Vertex* v0 = TopoHelper::getCommonVertex(splitingEdges[0]->getCoEdge(0), - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->getCoEdge(0)); - Vertex* v1 = TopoHelper::getCommonVertex(splitingEdges[0]->getCoEdge(0), - b1->getFace(Block::k_max)->getEdge(b1->getVertex(4), b1->getVertex(5))->getCoEdge(0)); + Vertex* v0 = TopoHelper::getCommonVertex(splitingEdges[0]->getCoEdges()[0], + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->getCoEdges()[0]); + Vertex* v1 = TopoHelper::getCommonVertex(splitingEdges[0]->getCoEdges()[0], + b1_faces[Block::k_max]->getEdge(b1_vertices[4], b1_vertices[5])->getCoEdges()[0]); v0->setCoord(vertices[4]->getCoord()); v1->setCoord(vertices[5]->getCoord()); - splitingEdges[0]->getCoEdge(0)->setGeomAssociation(curves[8]); + splitingEdges[0]->getCoEdges()[0]->setGeomAssociation(curves[8]); // on considère que la première surface est celle qui enveloppe - b1->getFace(Block::i_max)->setGeomAssociation(surfaces[0]); - b1->getFace(Block::j_max)->setGeomAssociation(surfaces[0]); - b1->getFace(Block::i_min)->setGeomAssociation(surfaces[0]); + b1_faces[Block::i_max]->setGeomAssociation(surfaces[0]); + b1_faces[Block::j_max]->setGeomAssociation(surfaces[0]); + b1_faces[Block::i_min]->setGeomAssociation(surfaces[0]); // la deuxième est au sommet du cylindre - b1->getFace(Block::k_min)->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_min]->setGeomAssociation(surfaces[1]); // la troisième est à la base du cylindre - b1->getFace(Block::k_max)->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_max]->setGeomAssociation(surfaces[2]); - CoFace* coface0 = b1->getFace(Block::j_min)->getCoFace(0); - if (coface0->find(b1->getVertex(1))){ - b1->getFace(Block::j_min)->getCoFace(0)->setGeomAssociation(surfaces[4]); - b1->getFace(Block::j_min)->getCoFace(1)->setGeomAssociation(surfaces[3]); + CoFace* coface0 = b1_faces[Block::j_min]->getCoFaces()[0]; + if (Utils::contains(b1_vertices[1], coface0->getVertices())){ + b1_faces[Block::j_min]->getCoFaces()[0]->setGeomAssociation(surfaces[4]); + b1_faces[Block::j_min]->getCoFaces()[1]->setGeomAssociation(surfaces[3]); } else { - b1->getFace(Block::j_min)->getCoFace(1)->setGeomAssociation(surfaces[4]); - b1->getFace(Block::j_min)->getCoFace(0)->setGeomAssociation(surfaces[3]); + b1_faces[Block::j_min]->getCoFaces()[1]->setGeomAssociation(surfaces[4]); + b1_faces[Block::j_min]->getCoFaces()[0]->setGeomAssociation(surfaces[3]); } // on considère que la courbe 0 est celle qui est à au sommet du cylindre - b1->getFace(Block::k_min)->getEdge(b1->getVertex(1), b1->getVertex(3))->setGeomAssociation(curves[0]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(2), b1->getVertex(3))->setGeomAssociation(curves[0]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(2), b1->getVertex(0))->setGeomAssociation(curves[0]); - b1->getVertex(3)->setGeomAssociation(curves[0]); - b1->getVertex(2)->setGeomAssociation(curves[0]); + b1_faces[Block::k_min]->getEdge(b1_vertices[1], b1_vertices[3])->setGeomAssociation(curves[0]); + b1_faces[Block::k_min]->getEdge(b1_vertices[2], b1_vertices[3])->setGeomAssociation(curves[0]); + b1_faces[Block::k_min]->getEdge(b1_vertices[2], b1_vertices[0])->setGeomAssociation(curves[0]); + b1_vertices[3]->setGeomAssociation(curves[0]); + b1_vertices[2]->setGeomAssociation(curves[0]); // on considère que la courbe 2 est celle qui est à la base du cylindre - b1->getFace(Block::k_max)->getEdge(b1->getVertex(5), b1->getVertex(7))->setGeomAssociation(curves[2]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(6), b1->getVertex(7))->setGeomAssociation(curves[2]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(6), b1->getVertex(4))->setGeomAssociation(curves[2]); - b1->getVertex(7)->setGeomAssociation(curves[2]); - b1->getVertex(6)->setGeomAssociation(curves[2]); - - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->getCoEdge(v0, b1->getVertex(1))->setGeomAssociation(curves[5]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->getCoEdge(b1->getVertex(0), v0)->setGeomAssociation(curves[4]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(4), b1->getVertex(5))->getCoEdge(v1, b1->getVertex(5))->setGeomAssociation(curves[6]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(4), b1->getVertex(5))->getCoEdge(b1->getVertex(4), v1)->setGeomAssociation(curves[7]); - - b1->getFace(Block::i_max)->getEdge(b1->getVertex(1), b1->getVertex(5))->setGeomAssociation(curves[1]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(0), b1->getVertex(4))->setGeomAssociation(curves[3]); - b1->getFace(Block::j_max)->getEdge(b1->getVertex(3), b1->getVertex(7))->setGeomAssociation(surfaces[0]); - b1->getFace(Block::j_max)->getEdge(b1->getVertex(2), b1->getVertex(6))->setGeomAssociation(surfaces[0]); - - b1->getVertex(0)->setGeomAssociation(vertices[1]); - b1->getVertex(1)->setGeomAssociation(vertices[0]); - b1->getVertex(4)->setGeomAssociation(vertices[3]); - b1->getVertex(5)->setGeomAssociation(vertices[2]); + b1_faces[Block::k_max]->getEdge(b1_vertices[5], b1_vertices[7])->setGeomAssociation(curves[2]); + b1_faces[Block::k_max]->getEdge(b1_vertices[6], b1_vertices[7])->setGeomAssociation(curves[2]); + b1_faces[Block::k_max]->getEdge(b1_vertices[6], b1_vertices[4])->setGeomAssociation(curves[2]); + b1_vertices[7]->setGeomAssociation(curves[2]); + b1_vertices[6]->setGeomAssociation(curves[2]); + + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->getCoEdge(v0, b1_vertices[1])->setGeomAssociation(curves[5]); + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->getCoEdge(b1_vertices[0], v0)->setGeomAssociation(curves[4]); + b1_faces[Block::k_max]->getEdge(b1_vertices[4], b1_vertices[5])->getCoEdge(v1, b1_vertices[5])->setGeomAssociation(curves[6]); + b1_faces[Block::k_max]->getEdge(b1_vertices[4], b1_vertices[5])->getCoEdge(b1_vertices[4], v1)->setGeomAssociation(curves[7]); + + b1_faces[Block::i_max]->getEdge(b1_vertices[1], b1_vertices[5])->setGeomAssociation(curves[1]); + b1_faces[Block::i_min]->getEdge(b1_vertices[0], b1_vertices[4])->setGeomAssociation(curves[3]); + b1_faces[Block::j_max]->getEdge(b1_vertices[3], b1_vertices[7])->setGeomAssociation(surfaces[0]); + b1_faces[Block::j_max]->getEdge(b1_vertices[2], b1_vertices[6])->setGeomAssociation(surfaces[0]); + + b1_vertices[0]->setGeomAssociation(vertices[1]); + b1_vertices[1]->setGeomAssociation(vertices[0]); + b1_vertices[4]->setGeomAssociation(vertices[3]); + b1_vertices[5]->setGeomAssociation(vertices[2]); v0->setGeomAssociation(vertices[4]); v1->setGeomAssociation(vertices[5]); @@ -486,57 +501,59 @@ createCylinderTopo1BlockQuart(Geom::PropertyCylinder* propertyCyl) curves[2]->getPoint((param1+param2)/2, p2); - b1->getVertex(0)->setCoord(vertices[4]->getCoord()); - b1->getVertex(1)->setCoord(vertices[0]->getCoord()); - b1->getVertex(2)->setCoord(vertices[1]->getCoord()); - b1->getVertex(3)->setCoord(p0); + const std::vector& b1_vertices = b1->getVertices(); + b1_vertices[0]->setCoord(vertices[4]->getCoord()); + b1_vertices[1]->setCoord(vertices[0]->getCoord()); + b1_vertices[2]->setCoord(vertices[1]->getCoord()); + b1_vertices[3]->setCoord(p0); - b1->getVertex(4)->setCoord(vertices[5]->getCoord()); - b1->getVertex(5)->setCoord(vertices[2]->getCoord()); - b1->getVertex(6)->setCoord(vertices[3]->getCoord()); - b1->getVertex(7)->setCoord(p2); + b1_vertices[4]->setCoord(vertices[5]->getCoord()); + b1_vertices[5]->setCoord(vertices[2]->getCoord()); + b1_vertices[6]->setCoord(vertices[3]->getCoord()); + b1_vertices[7]->setCoord(p2); // on considère que la première surface est celle qui enveloppe - b1->getFace(Block::i_max)->setGeomAssociation(surfaces[0]); - b1->getFace(Block::j_max)->setGeomAssociation(surfaces[0]); + const std::vector& b1_faces = b1->getFaces(); + b1_faces[Block::i_max]->setGeomAssociation(surfaces[0]); + b1_faces[Block::j_max]->setGeomAssociation(surfaces[0]); // la deuxième est au sommet du cylindre - b1->getFace(Block::k_min)->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_min]->setGeomAssociation(surfaces[1]); // la troisième est à la base du cylindre - b1->getFace(Block::k_max)->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_max]->setGeomAssociation(surfaces[2]); - b1->getFace(Block::j_min)->getCoFace(0)->setGeomAssociation(surfaces[4]); - b1->getFace(Block::i_min)->getCoFace(0)->setGeomAssociation(surfaces[3]); + b1_faces[Block::j_min]->getCoFaces()[0]->setGeomAssociation(surfaces[4]); + b1_faces[Block::i_min]->getCoFaces()[0]->setGeomAssociation(surfaces[3]); // on considère que la courbe 0 est celle qui est à au sommet du cylindre - b1->getFace(Block::k_min)->getEdge(b1->getVertex(1), b1->getVertex(3))->setGeomAssociation(curves[0]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(2), b1->getVertex(3))->setGeomAssociation(curves[0]); - b1->getVertex(3)->setGeomAssociation(curves[0]); + b1_faces[Block::k_min]->getEdge(b1_vertices[1], b1_vertices[3])->setGeomAssociation(curves[0]); + b1_faces[Block::k_min]->getEdge(b1_vertices[2], b1_vertices[3])->setGeomAssociation(curves[0]); + b1_vertices[3]->setGeomAssociation(curves[0]); // on considère que la courbe 2 est celle qui est à la base du cylindre - b1->getFace(Block::k_max)->getEdge(b1->getVertex(5), b1->getVertex(7))->setGeomAssociation(curves[2]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(6), b1->getVertex(7))->setGeomAssociation(curves[2]); - b1->getVertex(7)->setGeomAssociation(curves[2]); - - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->setGeomAssociation(curves[5]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(2))->setGeomAssociation(curves[4]); - - b1->getFace(Block::k_max)->getEdge(b1->getVertex(4), b1->getVertex(5))->setGeomAssociation(curves[6]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(4), b1->getVertex(6))->setGeomAssociation(curves[7]); - - b1->getFace(Block::i_max)->getEdge(b1->getVertex(1), b1->getVertex(5))->setGeomAssociation(curves[1]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(0), b1->getVertex(4))->setGeomAssociation(curves[8]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(2), b1->getVertex(6))->setGeomAssociation(curves[3]); - b1->getFace(Block::i_max)->getEdge(b1->getVertex(3), b1->getVertex(7))->setGeomAssociation(surfaces[0]); - - b1->getVertex(0)->setGeomAssociation(vertices[4]); - b1->getVertex(1)->setGeomAssociation(vertices[0]); - b1->getVertex(2)->setGeomAssociation(vertices[1]); - b1->getVertex(4)->setGeomAssociation(vertices[5]); - b1->getVertex(5)->setGeomAssociation(vertices[2]); - b1->getVertex(6)->setGeomAssociation(vertices[3]); + b1_faces[Block::k_max]->getEdge(b1_vertices[5], b1_vertices[7])->setGeomAssociation(curves[2]); + b1_faces[Block::k_max]->getEdge(b1_vertices[6], b1_vertices[7])->setGeomAssociation(curves[2]); + b1_vertices[7]->setGeomAssociation(curves[2]); + + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->setGeomAssociation(curves[5]); + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[2])->setGeomAssociation(curves[4]); + + b1_faces[Block::k_max]->getEdge(b1_vertices[4], b1_vertices[5])->setGeomAssociation(curves[6]); + b1_faces[Block::k_max]->getEdge(b1_vertices[4], b1_vertices[6])->setGeomAssociation(curves[7]); + + b1_faces[Block::i_max]->getEdge(b1_vertices[1], b1_vertices[5])->setGeomAssociation(curves[1]); + b1_faces[Block::i_min]->getEdge(b1_vertices[0], b1_vertices[4])->setGeomAssociation(curves[8]); + b1_faces[Block::i_min]->getEdge(b1_vertices[2], b1_vertices[6])->setGeomAssociation(curves[3]); + b1_faces[Block::i_max]->getEdge(b1_vertices[3], b1_vertices[7])->setGeomAssociation(surfaces[0]); + + b1_vertices[0]->setGeomAssociation(vertices[4]); + b1_vertices[1]->setGeomAssociation(vertices[0]); + b1_vertices[2]->setGeomAssociation(vertices[1]); + b1_vertices[4]->setGeomAssociation(vertices[5]); + b1_vertices[5]->setGeomAssociation(vertices[2]); + b1_vertices[6]->setGeomAssociation(vertices[3]); } /*----------------------------------------------------------------------------*/ void CommandNewTopoOGridOnGeometry:: @@ -700,16 +717,21 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridPleinNonDeg(Geom::Pro } // end for niv // fusion des faces avec l'ogrid - b1->getFace(Block::i_max)->fuse(b5->getFace(Block::i_min), &getInfoCommand()); - b2->getFace(Block::j_min)->fuse(b5->getFace(Block::j_max), &getInfoCommand()); - b3->getFace(Block::i_min)->fuse(b5->getFace(Block::i_max), &getInfoCommand()); - b4->getFace(Block::j_max)->fuse(b5->getFace(Block::j_min), &getInfoCommand()); + const std::vector& b1_faces = b1->getFaces(); + const std::vector& b2_faces = b2->getFaces(); + const std::vector& b3_faces = b3->getFaces(); + const std::vector& b4_faces = b4->getFaces(); + const std::vector& b5_faces = b5->getFaces(); + b1_faces[Block::i_max]->fuse(b5_faces[Block::i_min], &getInfoCommand()); + b2_faces[Block::j_min]->fuse(b5_faces[Block::j_max], &getInfoCommand()); + b3_faces[Block::i_min]->fuse(b5_faces[Block::i_max], &getInfoCommand()); + b4_faces[Block::j_max]->fuse(b5_faces[Block::j_min], &getInfoCommand()); // fusion des faces autour de l'ogrid - b1->getFace(Block::j_max)->fuse(b2->getFace(Block::i_min), &getInfoCommand()); - b2->getFace(Block::i_max)->fuse(b3->getFace(Block::j_max), &getInfoCommand()); - b3->getFace(Block::j_min)->fuse(b4->getFace(Block::i_max), &getInfoCommand()); - b4->getFace(Block::i_min)->fuse(b1->getFace(Block::j_min), &getInfoCommand()); + b1_faces[Block::j_max]->fuse(b2_faces[Block::i_min], &getInfoCommand()); + b2_faces[Block::i_max]->fuse(b3_faces[Block::j_max], &getInfoCommand()); + b3_faces[Block::j_min]->fuse(b4_faces[Block::i_max], &getInfoCommand()); + b4_faces[Block::i_min]->fuse(b1_faces[Block::j_min], &getInfoCommand()); // les projections sur la géométrie Geom::GetDownIncidentGeomEntitiesVisitor v; @@ -725,42 +747,42 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridPleinNonDeg(Geom::Pro } // on considère que la première surface est celle qui enveloppe - b1->getFace(Block::i_min)->setGeomAssociation(surfaces[0]); - b2->getFace(Block::j_max)->setGeomAssociation(surfaces[0]); - b3->getFace(Block::i_max)->setGeomAssociation(surfaces[0]); - b4->getFace(Block::j_min)->setGeomAssociation(surfaces[0]); + b1_faces[Block::i_min]->setGeomAssociation(surfaces[0]); + b2_faces[Block::j_max]->setGeomAssociation(surfaces[0]); + b3_faces[Block::i_max]->setGeomAssociation(surfaces[0]); + b4_faces[Block::j_min]->setGeomAssociation(surfaces[0]); - b1->getFace(Block::i_min)->getEdge(Face::j_min)->setGeomAssociation(surfaces[0]); - b1->getFace(Block::i_min)->getEdge(Face::j_max)->setGeomAssociation(surfaces[0]); - b3->getFace(Block::i_max)->getEdge(Face::j_min)->setGeomAssociation(surfaces[0]); - b3->getFace(Block::i_max)->getEdge(Face::j_max)->setGeomAssociation(surfaces[0]); + getEdge(b1_faces[Block::i_min], Face::j_min)->setGeomAssociation(surfaces[0]); + getEdge(b1_faces[Block::i_min], Face::j_max)->setGeomAssociation(surfaces[0]); + getEdge(b3_faces[Block::i_max], Face::j_min)->setGeomAssociation(surfaces[0]); + getEdge(b3_faces[Block::i_max], Face::j_max)->setGeomAssociation(surfaces[0]); // la deuxième est au sommet du cylindre - b1->getFace(Block::k_max)->setGeomAssociation(surfaces[1]); - b2->getFace(Block::k_max)->setGeomAssociation(surfaces[1]); - b3->getFace(Block::k_max)->setGeomAssociation(surfaces[1]); - b4->getFace(Block::k_max)->setGeomAssociation(surfaces[1]); - b5->getFace(Block::k_max)->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_max]->setGeomAssociation(surfaces[1]); + b2_faces[Block::k_max]->setGeomAssociation(surfaces[1]); + b3_faces[Block::k_max]->setGeomAssociation(surfaces[1]); + b4_faces[Block::k_max]->setGeomAssociation(surfaces[1]); + b5_faces[Block::k_max]->setGeomAssociation(surfaces[1]); for (uint i=0; i<4; i++){ - b1->getFace(Block::k_max)->getEdge(i)->setGeomAssociation(surfaces[1]); - b3->getFace(Block::k_max)->getEdge(i)->setGeomAssociation(surfaces[1]); - b5->getFace(Block::k_max)->getEdge(i)->setGeomAssociation(surfaces[1]); - b5->getFace(Block::k_max)->getVertex(i)->setGeomAssociation(surfaces[1]); + getEdge(b1_faces[Block::k_max], i)->setGeomAssociation(surfaces[1]); + getEdge(b3_faces[Block::k_max], i)->setGeomAssociation(surfaces[1]); + getEdge(b5_faces[Block::k_max], i)->setGeomAssociation(surfaces[1]); + b5_faces[Block::k_max]->getVertices()[i]->setGeomAssociation(surfaces[1]); } // la dernière surface est à la base du cylindre - b1->getFace(Block::k_min)->setGeomAssociation(surfaces[2]); - b2->getFace(Block::k_min)->setGeomAssociation(surfaces[2]); - b3->getFace(Block::k_min)->setGeomAssociation(surfaces[2]); - b4->getFace(Block::k_min)->setGeomAssociation(surfaces[2]); - b5->getFace(Block::k_min)->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_min]->setGeomAssociation(surfaces[2]); + b2_faces[Block::k_min]->setGeomAssociation(surfaces[2]); + b3_faces[Block::k_min]->setGeomAssociation(surfaces[2]); + b4_faces[Block::k_min]->setGeomAssociation(surfaces[2]); + b5_faces[Block::k_min]->setGeomAssociation(surfaces[2]); for (uint i=0; i<4; i++){ - b1->getFace(Block::k_min)->getEdge(i)->setGeomAssociation(surfaces[2]); - b3->getFace(Block::k_min)->getEdge(i)->setGeomAssociation(surfaces[2]); - b5->getFace(Block::k_min)->getEdge(i)->setGeomAssociation(surfaces[2]); - b5->getFace(Block::k_min)->getVertex(i)->setGeomAssociation(surfaces[2]); + getEdge(b1_faces[Block::k_min], i)->setGeomAssociation(surfaces[2]); + getEdge(b3_faces[Block::k_min], i)->setGeomAssociation(surfaces[2]); + getEdge(b5_faces[Block::k_min], i)->setGeomAssociation(surfaces[2]); + b5_faces[Block::k_min]->getVertices()[i]->setGeomAssociation(surfaces[2]); } if (curves.size() != 3){ @@ -771,26 +793,26 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridPleinNonDeg(Geom::Pro } // on considère que la 3ème courbe est celle qui est à la base du cylindre - b1->getFace(Block::i_min)->getEdge(Face::i_min)->setGeomAssociation(curves[2]); - b2->getFace(Block::j_max)->getEdge(Face::i_min)->setGeomAssociation(curves[2]); - b3->getFace(Block::i_max)->getEdge(Face::i_min)->setGeomAssociation(curves[2]); - b4->getFace(Block::j_min)->getEdge(Face::i_min)->setGeomAssociation(curves[2]); + getEdge(b1_faces[Block::i_min], Face::i_min)->setGeomAssociation(curves[2]); + getEdge(b2_faces[Block::j_max], Face::i_min)->setGeomAssociation(curves[2]); + getEdge(b3_faces[Block::i_max], Face::i_min)->setGeomAssociation(curves[2]); + getEdge(b4_faces[Block::j_min], Face::i_min)->setGeomAssociation(curves[2]); - b1->getFace(Block::i_min)->getEdge(Face::i_min)->getVertex(0)->setGeomAssociation(curves[2]); - b1->getFace(Block::i_min)->getEdge(Face::i_min)->getVertex(1)->setGeomAssociation(curves[2]); - b3->getFace(Block::i_max)->getEdge(Face::i_min)->getVertex(0)->setGeomAssociation(curves[2]); - b3->getFace(Block::i_max)->getEdge(Face::i_min)->getVertex(1)->setGeomAssociation(curves[2]); + getEdge(b1_faces[Block::i_min], Face::i_min)->getVertices()[0]->setGeomAssociation(curves[2]); + getEdge(b1_faces[Block::i_min], Face::i_min)->getVertices()[1]->setGeomAssociation(curves[2]); + getEdge(b3_faces[Block::i_max], Face::i_min)->getVertices()[0]->setGeomAssociation(curves[2]); + getEdge(b3_faces[Block::i_max], Face::i_min)->getVertices()[1]->setGeomAssociation(curves[2]); // on considère que la première courbe est celle qui est en z max - b1->getFace(Block::i_min)->getEdge(Face::i_max)->setGeomAssociation(curves[0]); - b2->getFace(Block::j_max)->getEdge(Face::i_max)->setGeomAssociation(curves[0]); - b3->getFace(Block::i_max)->getEdge(Face::i_max)->setGeomAssociation(curves[0]); - b4->getFace(Block::j_min)->getEdge(Face::i_max)->setGeomAssociation(curves[0]); + getEdge(b1_faces[Block::i_min], Face::i_max)->setGeomAssociation(curves[0]); + getEdge(b2_faces[Block::j_max], Face::i_max)->setGeomAssociation(curves[0]); + getEdge(b3_faces[Block::i_max], Face::i_max)->setGeomAssociation(curves[0]); + getEdge(b4_faces[Block::j_min], Face::i_max)->setGeomAssociation(curves[0]); - b1->getFace(Block::i_min)->getEdge(Face::i_max)->getVertex(0)->setGeomAssociation(curves[0]); - b1->getFace(Block::i_min)->getEdge(Face::i_max)->getVertex(1)->setGeomAssociation(curves[0]); - b3->getFace(Block::i_max)->getEdge(Face::i_max)->getVertex(0)->setGeomAssociation(curves[0]); - b3->getFace(Block::i_max)->getEdge(Face::i_max)->getVertex(1)->setGeomAssociation(curves[0]); + getEdge(b1_faces[Block::i_min], Face::i_max)->getVertices()[0]->setGeomAssociation(curves[0]); + getEdge(b1_faces[Block::i_min], Face::i_max)->getVertices()[1]->setGeomAssociation(curves[0]); + getEdge(b3_faces[Block::i_max], Face::i_max)->getVertices()[0]->setGeomAssociation(curves[0]); + getEdge(b3_faces[Block::i_max], Face::i_max)->getVertices()[1]->setGeomAssociation(curves[0]); } // createCylinderTopoOGridPleinNonDeg @@ -893,16 +915,24 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridPleinDeg(Geom::Proper } // end for niv // dégénéréscence des blocs - b1->degenerateFaceInEdge(Block::k_max, b1->getVertex(4), b1->getVertex(5), &getInfoCommand()); - b2->degenerateFaceInEdge(Block::k_max, b2->getVertex(4), b2->getVertex(5), &getInfoCommand()); - b3->degenerateFaceInEdge(Block::k_max, b3->getVertex(4), b3->getVertex(5), &getInfoCommand()); - b4->degenerateFaceInEdge(Block::k_max, b4->getVertex(4), b4->getVertex(5), &getInfoCommand()); + const std::vector& b1_vertices = b1->getVertices(); + const std::vector& b2_vertices = b2->getVertices(); + const std::vector& b3_vertices = b3->getVertices(); + const std::vector& b4_vertices = b4->getVertices(); + b1->degenerateFaceInEdge(Block::k_max, b1_vertices[4], b1_vertices[5], &getInfoCommand()); + b2->degenerateFaceInEdge(Block::k_max, b2_vertices[4], b2_vertices[5], &getInfoCommand()); + b3->degenerateFaceInEdge(Block::k_max, b3_vertices[4], b3_vertices[5], &getInfoCommand()); + b4->degenerateFaceInEdge(Block::k_max, b4_vertices[4], b4_vertices[5], &getInfoCommand()); // fusion des faces autour de l'ogrid - b1->getFace(Block::i_max)->fuse(b2->getFace(Block::i_min), &getInfoCommand()); - b2->getFace(Block::i_max)->fuse(b3->getFace(Block::i_min), &getInfoCommand()); - b3->getFace(Block::i_max)->fuse(b4->getFace(Block::i_min), &getInfoCommand()); - b4->getFace(Block::i_max)->fuse(b1->getFace(Block::i_min), &getInfoCommand()); + const std::vector& b1_faces = b1->getFaces(); + const std::vector& b2_faces = b2->getFaces(); + const std::vector& b3_faces = b3->getFaces(); + const std::vector& b4_faces = b4->getFaces(); + b1_faces[Block::i_max]->fuse(b2_faces[Block::i_min], &getInfoCommand()); + b2_faces[Block::i_max]->fuse(b3_faces[Block::i_min], &getInfoCommand()); + b3_faces[Block::i_max]->fuse(b4_faces[Block::i_min], &getInfoCommand()); + b4_faces[Block::i_max]->fuse(b1_faces[Block::i_min], &getInfoCommand()); // les projections sur la géométrie @@ -919,39 +949,39 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridPleinDeg(Geom::Proper } // on considère que la première surface est celle qui enveloppe - b1->getFace(Block::k_min)->setGeomAssociation(surfaces[0]); - b2->getFace(Block::k_min)->setGeomAssociation(surfaces[0]); - b3->getFace(Block::k_min)->setGeomAssociation(surfaces[0]); - b4->getFace(Block::k_min)->setGeomAssociation(surfaces[0]); + b1_faces[Block::k_min]->setGeomAssociation(surfaces[0]); + b2_faces[Block::k_min]->setGeomAssociation(surfaces[0]); + b3_faces[Block::k_min]->setGeomAssociation(surfaces[0]); + b4_faces[Block::k_min]->setGeomAssociation(surfaces[0]); for (uint i=0; i<4; i++){ - b1->getFace(Block::k_min)->getEdge(i)->setGeomAssociation(surfaces[0]); - b3->getFace(Block::k_min)->getEdge(i)->setGeomAssociation(surfaces[0]); + getEdge(b1_faces[Block::k_min], i)->setGeomAssociation(surfaces[0]); + getEdge(b3_faces[Block::k_min], i)->setGeomAssociation(surfaces[0]); } // la deuxième est au sommet du cylindre - b1->getFace(Block::j_max)->setGeomAssociation(surfaces[1]); - b2->getFace(Block::j_max)->setGeomAssociation(surfaces[1]); - b3->getFace(Block::j_max)->setGeomAssociation(surfaces[1]); - b4->getFace(Block::j_max)->setGeomAssociation(surfaces[1]); + b1_faces[Block::j_max]->setGeomAssociation(surfaces[1]); + b2_faces[Block::j_max]->setGeomAssociation(surfaces[1]); + b3_faces[Block::j_max]->setGeomAssociation(surfaces[1]); + b4_faces[Block::j_max]->setGeomAssociation(surfaces[1]); for (uint i=0; i<3; i++){ - b1->getFace(Block::j_max)->getEdge(i)->setGeomAssociation(surfaces[1]); - b3->getFace(Block::j_max)->getEdge(i)->setGeomAssociation(surfaces[1]); + getEdge(b1_faces[Block::j_max], i)->setGeomAssociation(surfaces[1]); + getEdge(b3_faces[Block::j_max], i)->setGeomAssociation(surfaces[1]); } - b1->getVertex(5)->setGeomAssociation(surfaces[1]); + b1_vertices[5]->setGeomAssociation(surfaces[1]); // la dernière surface est à la base du cylindre - b1->getFace(Block::j_min)->setGeomAssociation(surfaces[2]); - b2->getFace(Block::j_min)->setGeomAssociation(surfaces[2]); - b3->getFace(Block::j_min)->setGeomAssociation(surfaces[2]); - b4->getFace(Block::j_min)->setGeomAssociation(surfaces[2]); + b1_faces[Block::j_min]->setGeomAssociation(surfaces[2]); + b2_faces[Block::j_min]->setGeomAssociation(surfaces[2]); + b3_faces[Block::j_min]->setGeomAssociation(surfaces[2]); + b4_faces[Block::j_min]->setGeomAssociation(surfaces[2]); for (uint i=0; i<3; i++){ - b1->getFace(Block::j_min)->getEdge(i)->setGeomAssociation(surfaces[2]); - b3->getFace(Block::j_min)->getEdge(i)->setGeomAssociation(surfaces[2]); + getEdge(b1_faces[Block::j_min], i)->setGeomAssociation(surfaces[2]); + getEdge(b3_faces[Block::j_min], i)->setGeomAssociation(surfaces[2]); } - b1->getVertex(4)->setGeomAssociation(surfaces[2]); + b1_vertices[4]->setGeomAssociation(surfaces[2]); if (curves.size() != 3){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); @@ -961,26 +991,26 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridPleinDeg(Geom::Proper } // on considère que la première courbe est celle qui est en j max - b1->getFace(Block::k_min)->getEdge(b1->getVertex(2), b1->getVertex(3))->setGeomAssociation(curves[0]); - b2->getFace(Block::k_min)->getEdge(b2->getVertex(2), b2->getVertex(3))->setGeomAssociation(curves[0]); - b3->getFace(Block::k_min)->getEdge(b3->getVertex(2), b3->getVertex(3))->setGeomAssociation(curves[0]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(2), b4->getVertex(3))->setGeomAssociation(curves[0]); + b1_faces[Block::k_min]->getEdge(b1_vertices[2], b1_vertices[3])->setGeomAssociation(curves[0]); + b2_faces[Block::k_min]->getEdge(b2_vertices[2], b2_vertices[3])->setGeomAssociation(curves[0]); + b3_faces[Block::k_min]->getEdge(b3_vertices[2], b3_vertices[3])->setGeomAssociation(curves[0]); + b4_faces[Block::k_min]->getEdge(b4_vertices[2], b4_vertices[3])->setGeomAssociation(curves[0]); - b1->getVertex(2)->setGeomAssociation(curves[0]); - b1->getVertex(3)->setGeomAssociation(curves[0]); - b3->getVertex(2)->setGeomAssociation(curves[0]); - b3->getVertex(3)->setGeomAssociation(curves[0]); + b1_vertices[2]->setGeomAssociation(curves[0]); + b1_vertices[3]->setGeomAssociation(curves[0]); + b3_vertices[2]->setGeomAssociation(curves[0]); + b3_vertices[3]->setGeomAssociation(curves[0]); // on considère que la 3ème courbe est celle qui est à la base du cylindre - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->setGeomAssociation(curves[2]); - b2->getFace(Block::k_min)->getEdge(b2->getVertex(0), b2->getVertex(1))->setGeomAssociation(curves[2]); - b3->getFace(Block::k_min)->getEdge(b3->getVertex(0), b3->getVertex(1))->setGeomAssociation(curves[2]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(0), b4->getVertex(1))->setGeomAssociation(curves[2]); + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->setGeomAssociation(curves[2]); + b2_faces[Block::k_min]->getEdge(b2_vertices[0], b2_vertices[1])->setGeomAssociation(curves[2]); + b3_faces[Block::k_min]->getEdge(b3_vertices[0], b3_vertices[1])->setGeomAssociation(curves[2]); + b4_faces[Block::k_min]->getEdge(b4_vertices[0], b4_vertices[1])->setGeomAssociation(curves[2]); - b1->getVertex(0)->setGeomAssociation(curves[2]); - b1->getVertex(1)->setGeomAssociation(curves[2]); - b3->getVertex(0)->setGeomAssociation(curves[2]); - b3->getVertex(1)->setGeomAssociation(curves[2]); + b1_vertices[0]->setGeomAssociation(curves[2]); + b1_vertices[1]->setGeomAssociation(curves[2]); + b3_vertices[0]->setGeomAssociation(curves[2]); + b3_vertices[1]->setGeomAssociation(curves[2]); } // createCylinderTopoOGridPleinDeg /*----------------------------------------------------------------------------*/ @@ -1027,7 +1057,8 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridQuartDeg(Geom::Proper b1->getVertex(true ,true ,true )->setCoord(vertices[4]->getCoord()); // dégénéréscence des blocs - b1->degenerateFaceInEdge(Block::k_max, b1->getVertex(4), b1->getVertex(5), &getInfoCommand()); + const std::vector& b1_vertices = b1->getVertices(); + b1->degenerateFaceInEdge(Block::k_max, b1_vertices[4], b1_vertices[5], &getInfoCommand()); // les projections sur la géométrie if (surfaces.size() != 5){ @@ -1037,17 +1068,19 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridQuartDeg(Geom::Proper throw TkUtil::Exception(message); } + const std::vector& b1_faces = b1->getFaces(); + // on considère que la première surface est celle qui enveloppe - b1->getFace(Block::k_min)->setGeomAssociation(surfaces[0]); + b1_faces[Block::k_min]->setGeomAssociation(surfaces[0]); // la deuxième est au sommet du cylindre - b1->getFace(Block::j_max)->setGeomAssociation(surfaces[1]); + b1_faces[Block::j_max]->setGeomAssociation(surfaces[1]); // la troisième surface est à la base du cylindre - b1->getFace(Block::j_min)->setGeomAssociation(surfaces[2]); + b1_faces[Block::j_min]->setGeomAssociation(surfaces[2]); - b1->getFace(Block::i_min)->setGeomAssociation(surfaces[3]); - b1->getFace(Block::i_max)->setGeomAssociation(surfaces[4]); + b1_faces[Block::i_min]->setGeomAssociation(surfaces[3]); + b1_faces[Block::i_max]->setGeomAssociation(surfaces[4]); if (curves.size() != 9){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); @@ -1057,31 +1090,31 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridQuartDeg(Geom::Proper } // on considère que la première courbe est celle qui est en j max - b1->getFace(Block::k_min)->getEdge(b1->getVertex(2), b1->getVertex(3))->setGeomAssociation(curves[0]); + b1_faces[Block::k_min]->getEdge(b1_vertices[2], b1_vertices[3])->setGeomAssociation(curves[0]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(2), b1->getVertex(0))->setGeomAssociation(curves[3]); + b1_faces[Block::k_min]->getEdge(b1_vertices[2], b1_vertices[0])->setGeomAssociation(curves[3]); // on considère que la 3ème courbe est celle qui est à la base du cylindre - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->setGeomAssociation(curves[2]); + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->setGeomAssociation(curves[2]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(3), b1->getVertex(1))->setGeomAssociation(curves[1]); + b1_faces[Block::k_min]->getEdge(b1_vertices[3], b1_vertices[1])->setGeomAssociation(curves[1]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(0), b1->getVertex(4))->setGeomAssociation(curves[7]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(1), b1->getVertex(4))->setGeomAssociation(curves[6]); + b1_faces[Block::j_min]->getEdge(b1_vertices[0], b1_vertices[4])->setGeomAssociation(curves[7]); + b1_faces[Block::j_min]->getEdge(b1_vertices[1], b1_vertices[4])->setGeomAssociation(curves[6]); - b1->getFace(Block::j_max)->getEdge(b1->getVertex(2), b1->getVertex(5))->setGeomAssociation(curves[4]); - b1->getFace(Block::j_max)->getEdge(b1->getVertex(3), b1->getVertex(5))->setGeomAssociation(curves[5]); + b1_faces[Block::j_max]->getEdge(b1_vertices[2], b1_vertices[5])->setGeomAssociation(curves[4]); + b1_faces[Block::j_max]->getEdge(b1_vertices[3], b1_vertices[5])->setGeomAssociation(curves[5]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(4), b1->getVertex(5))->setGeomAssociation(curves[8]); + b1_faces[Block::i_min]->getEdge(b1_vertices[4], b1_vertices[5])->setGeomAssociation(curves[8]); - b1->getVertex(0)->setGeomAssociation(vertices[3]); - b1->getVertex(1)->setGeomAssociation(vertices[2]); - b1->getVertex(2)->setGeomAssociation(vertices[1]); - b1->getVertex(3)->setGeomAssociation(vertices[0]); - b1->getVertex(4)->setGeomAssociation(vertices[5]); - b1->getVertex(5)->setGeomAssociation(vertices[4]); + b1_vertices[0]->setGeomAssociation(vertices[3]); + b1_vertices[1]->setGeomAssociation(vertices[2]); + b1_vertices[2]->setGeomAssociation(vertices[1]); + b1_vertices[3]->setGeomAssociation(vertices[0]); + b1_vertices[4]->setGeomAssociation(vertices[5]); + b1_vertices[5]->setGeomAssociation(vertices[4]); } // createCylinderTopoOGridQuartDeg /*----------------------------------------------------------------------------*/ @@ -1161,117 +1194,123 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridQuartNonDeg(Geom::Pro p1 = p5+p4-vertices[4]->getCoord(); p3 = p6+p7-vertices[5]->getCoord(); - b1->getVertex(0)->setCoord(vertices[4]->getCoord()); - b1->getVertex(1)->setCoord(p5); - b1->getVertex(2)->setCoord(p4); - b1->getVertex(3)->setCoord(p1); - b1->getVertex(4)->setCoord(vertices[5]->getCoord()); - b1->getVertex(5)->setCoord(p6); - b1->getVertex(6)->setCoord(p7); - b1->getVertex(7)->setCoord(p3); - - b2->getVertex(0)->setCoord(p5); - b2->getVertex(1)->setCoord(vertices[0]->getCoord()); - b2->getVertex(2)->setCoord(p1); - b2->getVertex(3)->setCoord(p0); - b2->getVertex(4)->setCoord(p6); - b2->getVertex(5)->setCoord(vertices[2]->getCoord()); - b2->getVertex(6)->setCoord(p3); - b2->getVertex(7)->setCoord(p2); - - b3->getVertex(0)->setCoord(p4); - b3->getVertex(1)->setCoord(p1); - b3->getVertex(2)->setCoord(vertices[1]->getCoord()); - b3->getVertex(3)->setCoord(p0); - b3->getVertex(4)->setCoord(p7); - b3->getVertex(5)->setCoord(p3); - b3->getVertex(6)->setCoord(vertices[3]->getCoord()); - b3->getVertex(7)->setCoord(p2); + const std::vector& b1_vertices = b1->getVertices(); + const std::vector& b2_vertices = b2->getVertices(); + const std::vector& b3_vertices = b3->getVertices(); + b1_vertices[0]->setCoord(vertices[4]->getCoord()); + b1_vertices[1]->setCoord(p5); + b1_vertices[2]->setCoord(p4); + b1_vertices[3]->setCoord(p1); + b1_vertices[4]->setCoord(vertices[5]->getCoord()); + b1_vertices[5]->setCoord(p6); + b1_vertices[6]->setCoord(p7); + b1_vertices[7]->setCoord(p3); + + b2_vertices[0]->setCoord(p5); + b2_vertices[1]->setCoord(vertices[0]->getCoord()); + b2_vertices[2]->setCoord(p1); + b2_vertices[3]->setCoord(p0); + b2_vertices[4]->setCoord(p6); + b2_vertices[5]->setCoord(vertices[2]->getCoord()); + b2_vertices[6]->setCoord(p3); + b2_vertices[7]->setCoord(p2); + + b3_vertices[0]->setCoord(p4); + b3_vertices[1]->setCoord(p1); + b3_vertices[2]->setCoord(vertices[1]->getCoord()); + b3_vertices[3]->setCoord(p0); + b3_vertices[4]->setCoord(p7); + b3_vertices[5]->setCoord(p3); + b3_vertices[6]->setCoord(vertices[3]->getCoord()); + b3_vertices[7]->setCoord(p2); // fusion des faces - b1->getFace(Block::i_max)->fuse(b2->getFace(Block::i_min), &getInfoCommand()); - b1->getFace(Block::j_max)->fuse(b3->getFace(Block::j_min), &getInfoCommand()); - b2->getFace(Block::j_max)->fuse(b3->getFace(Block::i_max), &getInfoCommand()); + const std::vector& b1_faces = b1->getFaces(); + const std::vector& b2_faces = b2->getFaces(); + const std::vector& b3_faces = b3->getFaces(); + b1_faces[Block::i_max]->fuse(b2_faces[Block::i_min], &getInfoCommand()); + b1_faces[Block::j_max]->fuse(b3_faces[Block::j_min], &getInfoCommand()); + b2_faces[Block::j_max]->fuse(b3_faces[Block::i_max], &getInfoCommand()); // on considère que la première surface est celle qui enveloppe - b2->getFace(Block::i_max)->setGeomAssociation(surfaces[0]); - b3->getFace(Block::j_max)->setGeomAssociation(surfaces[0]); + b2_faces[Block::i_max]->setGeomAssociation(surfaces[0]); + b3_faces[Block::j_max]->setGeomAssociation(surfaces[0]); // la deuxième est au sommet du cylindre - b1->getFace(Block::k_min)->setGeomAssociation(surfaces[1]); - b2->getFace(Block::k_min)->setGeomAssociation(surfaces[1]); - b3->getFace(Block::k_min)->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_min]->setGeomAssociation(surfaces[1]); + b2_faces[Block::k_min]->setGeomAssociation(surfaces[1]); + b3_faces[Block::k_min]->setGeomAssociation(surfaces[1]); // la troisième est à la base du cylindre - b1->getFace(Block::k_max)->setGeomAssociation(surfaces[2]); - b2->getFace(Block::k_max)->setGeomAssociation(surfaces[2]); - b3->getFace(Block::k_max)->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_max]->setGeomAssociation(surfaces[2]); + b2_faces[Block::k_max]->setGeomAssociation(surfaces[2]); + b3_faces[Block::k_max]->setGeomAssociation(surfaces[2]); - b1->getFace(Block::j_min)->setGeomAssociation(surfaces[4]); - b2->getFace(Block::j_min)->setGeomAssociation(surfaces[4]); + b1_faces[Block::j_min]->setGeomAssociation(surfaces[4]); + b2_faces[Block::j_min]->setGeomAssociation(surfaces[4]); - b1->getFace(Block::i_min)->setGeomAssociation(surfaces[3]); - b3->getFace(Block::i_min)->setGeomAssociation(surfaces[3]); + b1_faces[Block::i_min]->setGeomAssociation(surfaces[3]); + b3_faces[Block::i_min]->setGeomAssociation(surfaces[3]); // on considère que la courbe 0 est celle qui est à au sommet du cylindre - b2->getFace(Block::k_min)->getEdge(b2->getVertex(1), b2->getVertex(3))->setGeomAssociation(curves[0]); - b3->getFace(Block::k_min)->getEdge(b3->getVertex(2), b3->getVertex(3))->setGeomAssociation(curves[0]); - b2->getVertex(3)->setGeomAssociation(curves[0]); + b2_faces[Block::k_min]->getEdge(b2_vertices[1], b2_vertices[3])->setGeomAssociation(curves[0]); + b3_faces[Block::k_min]->getEdge(b3_vertices[2], b3_vertices[3])->setGeomAssociation(curves[0]); + b2_vertices[3]->setGeomAssociation(curves[0]); // on considère que la courbe 2 est celle qui est à la base du cylindre - b2->getFace(Block::k_max)->getEdge(b2->getVertex(5), b2->getVertex(7))->setGeomAssociation(curves[2]); - b3->getFace(Block::k_max)->getEdge(b3->getVertex(6), b3->getVertex(7))->setGeomAssociation(curves[2]); - b2->getVertex(7)->setGeomAssociation(curves[2]); + b2_faces[Block::k_max]->getEdge(b2_vertices[5], b2_vertices[7])->setGeomAssociation(curves[2]); + b3_faces[Block::k_max]->getEdge(b3_vertices[6], b3_vertices[7])->setGeomAssociation(curves[2]); + b2_vertices[7]->setGeomAssociation(curves[2]); - b2->getFace(Block::k_min)->getEdge(b2->getVertex(0), b2->getVertex(1))->setGeomAssociation(curves[5]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->setGeomAssociation(curves[5]); - b1->getVertex(1)->setGeomAssociation(curves[5]); + b2_faces[Block::k_min]->getEdge(b2_vertices[0], b2_vertices[1])->setGeomAssociation(curves[5]); + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->setGeomAssociation(curves[5]); + b1_vertices[1]->setGeomAssociation(curves[5]); - b3->getFace(Block::k_min)->getEdge(b3->getVertex(0), b3->getVertex(2))->setGeomAssociation(curves[4]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(2))->setGeomAssociation(curves[4]); - b1->getVertex(2)->setGeomAssociation(curves[4]); + b3_faces[Block::k_min]->getEdge(b3_vertices[0], b3_vertices[2])->setGeomAssociation(curves[4]); + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[2])->setGeomAssociation(curves[4]); + b1_vertices[2]->setGeomAssociation(curves[4]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(1), b1->getVertex(3))->setGeomAssociation(surfaces[1]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(2), b1->getVertex(3))->setGeomAssociation(surfaces[1]); - b2->getFace(Block::k_min)->getEdge(b2->getVertex(2), b2->getVertex(3))->setGeomAssociation(surfaces[1]); - b1->getVertex(3)->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_min]->getEdge(b1_vertices[1], b1_vertices[3])->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_min]->getEdge(b1_vertices[2], b1_vertices[3])->setGeomAssociation(surfaces[1]); + b2_faces[Block::k_min]->getEdge(b2_vertices[2], b2_vertices[3])->setGeomAssociation(surfaces[1]); + b1_vertices[3]->setGeomAssociation(surfaces[1]); - b2->getFace(Block::k_max)->getEdge(b2->getVertex(4), b2->getVertex(5))->setGeomAssociation(curves[6]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(4), b1->getVertex(5))->setGeomAssociation(curves[6]); - b1->getVertex(5)->setGeomAssociation(curves[6]); + b2_faces[Block::k_max]->getEdge(b2_vertices[4], b2_vertices[5])->setGeomAssociation(curves[6]); + b1_faces[Block::k_max]->getEdge(b1_vertices[4], b1_vertices[5])->setGeomAssociation(curves[6]); + b1_vertices[5]->setGeomAssociation(curves[6]); - b3->getFace(Block::k_max)->getEdge(b3->getVertex(4), b3->getVertex(6))->setGeomAssociation(curves[7]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(4), b1->getVertex(6))->setGeomAssociation(curves[7]); - b1->getVertex(6)->setGeomAssociation(curves[7]); + b3_faces[Block::k_max]->getEdge(b3_vertices[4], b3_vertices[6])->setGeomAssociation(curves[7]); + b1_faces[Block::k_max]->getEdge(b1_vertices[4], b1_vertices[6])->setGeomAssociation(curves[7]); + b1_vertices[6]->setGeomAssociation(curves[7]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(5), b1->getVertex(7))->setGeomAssociation(surfaces[2]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(6), b1->getVertex(7))->setGeomAssociation(surfaces[2]); - b2->getFace(Block::k_max)->getEdge(b2->getVertex(6), b2->getVertex(7))->setGeomAssociation(surfaces[2]); - b1->getVertex(7)->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_max]->getEdge(b1_vertices[5], b1_vertices[7])->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_max]->getEdge(b1_vertices[6], b1_vertices[7])->setGeomAssociation(surfaces[2]); + b2_faces[Block::k_max]->getEdge(b2_vertices[6], b2_vertices[7])->setGeomAssociation(surfaces[2]); + b1_vertices[7]->setGeomAssociation(surfaces[2]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(0), b1->getVertex(4))->setGeomAssociation(curves[8]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(1), b1->getVertex(5))->setGeomAssociation(surfaces[4]); - b2->getFace(Block::j_min)->getEdge(b2->getVertex(1), b2->getVertex(5))->setGeomAssociation(curves[1]); + b1_faces[Block::j_min]->getEdge(b1_vertices[0], b1_vertices[4])->setGeomAssociation(curves[8]); + b1_faces[Block::j_min]->getEdge(b1_vertices[1], b1_vertices[5])->setGeomAssociation(surfaces[4]); + b2_faces[Block::j_min]->getEdge(b2_vertices[1], b2_vertices[5])->setGeomAssociation(curves[1]); - b3->getFace(Block::i_min)->getEdge(b3->getVertex(0), b3->getVertex(4))->setGeomAssociation(surfaces[3]); - b3->getFace(Block::i_min)->getEdge(b3->getVertex(2), b3->getVertex(6))->setGeomAssociation(curves[3]); + b3_faces[Block::i_min]->getEdge(b3_vertices[0], b3_vertices[4])->setGeomAssociation(surfaces[3]); + b3_faces[Block::i_min]->getEdge(b3_vertices[2], b3_vertices[6])->setGeomAssociation(curves[3]); - b3->getFace(Block::i_max)->getEdge(b3->getVertex(3), b3->getVertex(7))->setGeomAssociation(surfaces[0]); + b3_faces[Block::i_max]->getEdge(b3_vertices[3], b3_vertices[7])->setGeomAssociation(surfaces[0]); - b1->getVertex(0)->setGeomAssociation(vertices[4]); - b1->getVertex(4)->setGeomAssociation(vertices[5]); - b2->getVertex(1)->setGeomAssociation(vertices[0]); - b2->getVertex(5)->setGeomAssociation(vertices[2]); - b3->getVertex(2)->setGeomAssociation(vertices[1]); - b3->getVertex(6)->setGeomAssociation(vertices[3]); + b1_vertices[0]->setGeomAssociation(vertices[4]); + b1_vertices[4]->setGeomAssociation(vertices[5]); + b2_vertices[1]->setGeomAssociation(vertices[0]); + b2_vertices[5]->setGeomAssociation(vertices[2]); + b3_vertices[2]->setGeomAssociation(vertices[1]); + b3_vertices[6]->setGeomAssociation(vertices[3]); } // createCylinderTopoOGridQuartNonDeg /*----------------------------------------------------------------------------*/ @@ -1349,6 +1388,10 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridDemiNonDeg(Geom::Prop curves[2]->getPoint(param1+(param2-param1)*3/4, p3); double ratio = m_ratio/std::sqrt(2); + const std::vector& b1_vertices = b1->getVertices(); + const std::vector& b2_vertices = b2->getVertices(); + const std::vector& b3_vertices = b3->getVertices(); + const std::vector& b4_vertices = b4->getVertices(); p5 = vertices[4]->getCoord()+(vertices[0]->getCoord()-vertices[4]->getCoord())*ratio; p4 = vertices[4]->getCoord()+(vertices[1]->getCoord()-vertices[4]->getCoord())*ratio; @@ -1363,162 +1406,166 @@ void CommandNewTopoOGridOnGeometry::createCylinderTopoOGridDemiNonDeg(Geom::Prop p11 = vertices[5]->getCoord()+(p3-vertices[5]->getCoord())*m_ratio; - b1->getVertex(0)->setCoord(p4); - b1->getVertex(1)->setCoord(p5); - b1->getVertex(2)->setCoord(p9); - b1->getVertex(3)->setCoord(p8); - b1->getVertex(4)->setCoord(p7); - b1->getVertex(5)->setCoord(p6); - b1->getVertex(6)->setCoord(p11); - b1->getVertex(7)->setCoord(p10); - - b2->getVertex(0)->setCoord(p5); - b2->getVertex(1)->setCoord(vertices[0]->getCoord()); - b2->getVertex(2)->setCoord(p8); - b2->getVertex(3)->setCoord(p0); - b2->getVertex(4)->setCoord(p6); - b2->getVertex(5)->setCoord(vertices[2]->getCoord()); - b2->getVertex(6)->setCoord(p10); - b2->getVertex(7)->setCoord(p2); - - b3->getVertex(0)->setCoord(p9); - b3->getVertex(1)->setCoord(p8); - b3->getVertex(2)->setCoord(p1); - b3->getVertex(3)->setCoord(p0); - b3->getVertex(4)->setCoord(p11); - b3->getVertex(5)->setCoord(p10); - b3->getVertex(6)->setCoord(p3); - b3->getVertex(7)->setCoord(p2); - - b4->getVertex(0)->setCoord(vertices[1]->getCoord()); - b4->getVertex(1)->setCoord(p4); - b4->getVertex(2)->setCoord(p1); - b4->getVertex(3)->setCoord(p9); - b4->getVertex(4)->setCoord(vertices[3]->getCoord()); - b4->getVertex(5)->setCoord(p7); - b4->getVertex(6)->setCoord(p3); - b4->getVertex(7)->setCoord(p11); + b1_vertices[0]->setCoord(p4); + b1_vertices[1]->setCoord(p5); + b1_vertices[2]->setCoord(p9); + b1_vertices[3]->setCoord(p8); + b1_vertices[4]->setCoord(p7); + b1_vertices[5]->setCoord(p6); + b1_vertices[6]->setCoord(p11); + b1_vertices[7]->setCoord(p10); + + b2_vertices[0]->setCoord(p5); + b2_vertices[1]->setCoord(vertices[0]->getCoord()); + b2_vertices[2]->setCoord(p8); + b2_vertices[3]->setCoord(p0); + b2_vertices[4]->setCoord(p6); + b2_vertices[5]->setCoord(vertices[2]->getCoord()); + b2_vertices[6]->setCoord(p10); + b2_vertices[7]->setCoord(p2); + + b3_vertices[0]->setCoord(p9); + b3_vertices[1]->setCoord(p8); + b3_vertices[2]->setCoord(p1); + b3_vertices[3]->setCoord(p0); + b3_vertices[4]->setCoord(p11); + b3_vertices[5]->setCoord(p10); + b3_vertices[6]->setCoord(p3); + b3_vertices[7]->setCoord(p2); + + b4_vertices[0]->setCoord(vertices[1]->getCoord()); + b4_vertices[1]->setCoord(p4); + b4_vertices[2]->setCoord(p1); + b4_vertices[3]->setCoord(p9); + b4_vertices[4]->setCoord(vertices[3]->getCoord()); + b4_vertices[5]->setCoord(p7); + b4_vertices[6]->setCoord(p3); + b4_vertices[7]->setCoord(p11); // fusion des faces - b1->getFace(Block::i_max)->fuse(b2->getFace(Block::i_min), &getInfoCommand()); - b1->getFace(Block::j_max)->fuse(b3->getFace(Block::j_min), &getInfoCommand()); - b1->getFace(Block::i_min)->fuse(b4->getFace(Block::i_max), &getInfoCommand()); - b2->getFace(Block::j_max)->fuse(b3->getFace(Block::i_max), &getInfoCommand()); - b3->getFace(Block::i_min)->fuse(b4->getFace(Block::j_max), &getInfoCommand()); + const std::vector& b1_faces = b1->getFaces(); + const std::vector& b2_faces = b2->getFaces(); + const std::vector& b3_faces = b3->getFaces(); + const std::vector& b4_faces = b4->getFaces(); + b1_faces[Block::i_max]->fuse(b2_faces[Block::i_min], &getInfoCommand()); + b1_faces[Block::j_max]->fuse(b3_faces[Block::j_min], &getInfoCommand()); + b1_faces[Block::i_min]->fuse(b4_faces[Block::i_max], &getInfoCommand()); + b2_faces[Block::j_max]->fuse(b3_faces[Block::i_max], &getInfoCommand()); + b3_faces[Block::i_min]->fuse(b4_faces[Block::j_max], &getInfoCommand()); // on coupe la face du bloc b1 pour qu'une arête soit sur la courbe 8 std::vector splitingEdges; std::vector cofaces; - cofaces.push_back(b1->getFace(Block::j_min)->getCoFace(0)); + cofaces.push_back(b1_faces[Block::j_min]->getCoFaces()[0]); TopoHelper::splitFaces(cofaces, - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->getCoEdge(0), + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->getCoEdges()[0], 0.5, 0.0, false, false, splitingEdges, &getInfoCommand()); - Vertex* v0 = TopoHelper::getCommonVertex(splitingEdges[0]->getCoEdge(0), - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->getCoEdge(0)); - Vertex* v1 = TopoHelper::getCommonVertex(splitingEdges[0]->getCoEdge(0), - b1->getFace(Block::k_max)->getEdge(b1->getVertex(4), b1->getVertex(5))->getCoEdge(0)); + Vertex* v0 = TopoHelper::getCommonVertex(splitingEdges[0]->getCoEdges()[0], + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->getCoEdges()[0]); + Vertex* v1 = TopoHelper::getCommonVertex(splitingEdges[0]->getCoEdges()[0], + b1_faces[Block::k_max]->getEdge(b1_vertices[4], b1_vertices[5])->getCoEdges()[0]); v0->setCoord(vertices[4]->getCoord()); v1->setCoord(vertices[5]->getCoord()); - splitingEdges[0]->getCoEdge(0)->setGeomAssociation(curves[8]); + splitingEdges[0]->getCoEdges()[0]->setGeomAssociation(curves[8]); // on considère que la première surface est celle qui enveloppe - b2->getFace(Block::i_max)->setGeomAssociation(surfaces[0]); - b3->getFace(Block::j_max)->setGeomAssociation(surfaces[0]); - b4->getFace(Block::i_min)->setGeomAssociation(surfaces[0]); + b2_faces[Block::i_max]->setGeomAssociation(surfaces[0]); + b3_faces[Block::j_max]->setGeomAssociation(surfaces[0]); + b4_faces[Block::i_min]->setGeomAssociation(surfaces[0]); // la deuxième est au sommet du cylindre - b1->getFace(Block::k_min)->setGeomAssociation(surfaces[1]); - b2->getFace(Block::k_min)->setGeomAssociation(surfaces[1]); - b3->getFace(Block::k_min)->setGeomAssociation(surfaces[1]); - b4->getFace(Block::k_min)->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_min]->setGeomAssociation(surfaces[1]); + b2_faces[Block::k_min]->setGeomAssociation(surfaces[1]); + b3_faces[Block::k_min]->setGeomAssociation(surfaces[1]); + b4_faces[Block::k_min]->setGeomAssociation(surfaces[1]); // la troisième est à la base du cylindre - b1->getFace(Block::k_max)->setGeomAssociation(surfaces[2]); - b2->getFace(Block::k_max)->setGeomAssociation(surfaces[2]); - b3->getFace(Block::k_max)->setGeomAssociation(surfaces[2]); - b4->getFace(Block::k_max)->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_max]->setGeomAssociation(surfaces[2]); + b2_faces[Block::k_max]->setGeomAssociation(surfaces[2]); + b3_faces[Block::k_max]->setGeomAssociation(surfaces[2]); + b4_faces[Block::k_max]->setGeomAssociation(surfaces[2]); - b2->getFace(Block::j_min)->setGeomAssociation(surfaces[4]); + b2_faces[Block::j_min]->setGeomAssociation(surfaces[4]); - b4->getFace(Block::j_min)->setGeomAssociation(surfaces[3]); + b4_faces[Block::j_min]->setGeomAssociation(surfaces[3]); - CoFace* coface0 = b1->getFace(Block::j_min)->getCoFace(0); - if (coface0->find(b1->getVertex(1))){ - b1->getFace(Block::j_min)->getCoFace(0)->setGeomAssociation(surfaces[4]); - b1->getFace(Block::j_min)->getCoFace(1)->setGeomAssociation(surfaces[3]); + CoFace* coface0 = b1_faces[Block::j_min]->getCoFaces()[0]; + if (Utils::contains(b1_vertices[1], coface0->getVertices())){ + b1_faces[Block::j_min]->getCoFaces()[0]->setGeomAssociation(surfaces[4]); + b1_faces[Block::j_min]->getCoFaces()[1]->setGeomAssociation(surfaces[3]); } else { - b1->getFace(Block::j_min)->getCoFace(1)->setGeomAssociation(surfaces[4]); - b1->getFace(Block::j_min)->getCoFace(0)->setGeomAssociation(surfaces[3]); + b1_faces[Block::j_min]->getCoFaces()[1]->setGeomAssociation(surfaces[4]); + b1_faces[Block::j_min]->getCoFaces()[0]->setGeomAssociation(surfaces[3]); } // on considère que la courbe 0 est celle qui est à au sommet du cylindre - b2->getFace(Block::k_min)->getEdge(b2->getVertex(1), b2->getVertex(3))->setGeomAssociation(curves[0]); - b3->getFace(Block::k_min)->getEdge(b3->getVertex(2), b3->getVertex(3))->setGeomAssociation(curves[0]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(2), b4->getVertex(0))->setGeomAssociation(curves[0]); - b2->getVertex(3)->setGeomAssociation(curves[0]); - b3->getVertex(2)->setGeomAssociation(curves[0]); + b2_faces[Block::k_min]->getEdge(b2_vertices[1], b2_vertices[3])->setGeomAssociation(curves[0]); + b3_faces[Block::k_min]->getEdge(b3_vertices[2], b3_vertices[3])->setGeomAssociation(curves[0]); + b4_faces[Block::k_min]->getEdge(b4_vertices[2], b4_vertices[0])->setGeomAssociation(curves[0]); + b2_vertices[3]->setGeomAssociation(curves[0]); + b3_vertices[2]->setGeomAssociation(curves[0]); // on considère que la courbe 2 est celle qui est à la base du cylindre - b2->getFace(Block::k_max)->getEdge(b2->getVertex(5), b2->getVertex(7))->setGeomAssociation(curves[2]); - b3->getFace(Block::k_max)->getEdge(b3->getVertex(6), b3->getVertex(7))->setGeomAssociation(curves[2]); - b4->getFace(Block::k_max)->getEdge(b4->getVertex(6), b4->getVertex(4))->setGeomAssociation(curves[2]); - b2->getVertex(7)->setGeomAssociation(curves[2]); - b3->getVertex(6)->setGeomAssociation(curves[2]); + b2_faces[Block::k_max]->getEdge(b2_vertices[5], b2_vertices[7])->setGeomAssociation(curves[2]); + b3_faces[Block::k_max]->getEdge(b3_vertices[6], b3_vertices[7])->setGeomAssociation(curves[2]); + b4_faces[Block::k_max]->getEdge(b4_vertices[6], b4_vertices[4])->setGeomAssociation(curves[2]); + b2_vertices[7]->setGeomAssociation(curves[2]); + b3_vertices[6]->setGeomAssociation(curves[2]); - b2->getFace(Block::k_min)->getEdge(b2->getVertex(0), b2->getVertex(1))->setGeomAssociation(curves[5]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->getCoEdge(v0, b1->getVertex(1))->setGeomAssociation(curves[5]); - b1->getVertex(1)->setGeomAssociation(curves[5]); + b2_faces[Block::k_min]->getEdge(b2_vertices[0], b2_vertices[1])->setGeomAssociation(curves[5]); + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->getCoEdge(v0, b1_vertices[1])->setGeomAssociation(curves[5]); + b1_vertices[1]->setGeomAssociation(curves[5]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(0), b4->getVertex(1))->setGeomAssociation(curves[4]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->getCoEdge(b1->getVertex(0), v0)->setGeomAssociation(curves[4]); - b1->getVertex(0)->setGeomAssociation(curves[4]); + b4_faces[Block::k_min]->getEdge(b4_vertices[0], b4_vertices[1])->setGeomAssociation(curves[4]); + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->getCoEdge(b1_vertices[0], v0)->setGeomAssociation(curves[4]); + b1_vertices[0]->setGeomAssociation(curves[4]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(1), b1->getVertex(3))->setGeomAssociation(surfaces[1]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(2), b1->getVertex(3))->setGeomAssociation(surfaces[1]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(2), b1->getVertex(0))->setGeomAssociation(surfaces[1]); - b2->getFace(Block::k_min)->getEdge(b2->getVertex(2), b2->getVertex(3))->setGeomAssociation(surfaces[1]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(2), b4->getVertex(3))->setGeomAssociation(surfaces[1]); - b1->getVertex(3)->setGeomAssociation(surfaces[1]); - b1->getVertex(2)->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_min]->getEdge(b1_vertices[1], b1_vertices[3])->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_min]->getEdge(b1_vertices[2], b1_vertices[3])->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_min]->getEdge(b1_vertices[2], b1_vertices[0])->setGeomAssociation(surfaces[1]); + b2_faces[Block::k_min]->getEdge(b2_vertices[2], b2_vertices[3])->setGeomAssociation(surfaces[1]); + b4_faces[Block::k_min]->getEdge(b4_vertices[2], b4_vertices[3])->setGeomAssociation(surfaces[1]); + b1_vertices[3]->setGeomAssociation(surfaces[1]); + b1_vertices[2]->setGeomAssociation(surfaces[1]); - b2->getFace(Block::k_max)->getEdge(b2->getVertex(4), b2->getVertex(5))->setGeomAssociation(curves[6]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(4), b1->getVertex(5))->getCoEdge(v1, b1->getVertex(5))->setGeomAssociation(curves[6]); - b1->getVertex(5)->setGeomAssociation(curves[6]); + b2_faces[Block::k_max]->getEdge(b2_vertices[4], b2_vertices[5])->setGeomAssociation(curves[6]); + b1_faces[Block::k_max]->getEdge(b1_vertices[4], b1_vertices[5])->getCoEdge(v1, b1_vertices[5])->setGeomAssociation(curves[6]); + b1_vertices[5]->setGeomAssociation(curves[6]); - b4->getFace(Block::k_max)->getEdge(b4->getVertex(4), b4->getVertex(5))->setGeomAssociation(curves[7]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(4), b1->getVertex(5))->getCoEdge(b1->getVertex(4), v1)->setGeomAssociation(curves[7]); - b1->getVertex(4)->setGeomAssociation(curves[7]); + b4_faces[Block::k_max]->getEdge(b4_vertices[4], b4_vertices[5])->setGeomAssociation(curves[7]); + b1_faces[Block::k_max]->getEdge(b1_vertices[4], b1_vertices[5])->getCoEdge(b1_vertices[4], v1)->setGeomAssociation(curves[7]); + b1_vertices[4]->setGeomAssociation(curves[7]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(5), b1->getVertex(7))->setGeomAssociation(surfaces[2]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(6), b1->getVertex(7))->setGeomAssociation(surfaces[2]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(6), b1->getVertex(4))->setGeomAssociation(surfaces[2]); - b2->getFace(Block::k_max)->getEdge(b2->getVertex(6), b2->getVertex(7))->setGeomAssociation(surfaces[2]); - b4->getFace(Block::k_max)->getEdge(b4->getVertex(6), b4->getVertex(7))->setGeomAssociation(surfaces[2]); - b1->getVertex(7)->setGeomAssociation(surfaces[2]); - b1->getVertex(6)->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_max]->getEdge(b1_vertices[5], b1_vertices[7])->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_max]->getEdge(b1_vertices[6], b1_vertices[7])->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_max]->getEdge(b1_vertices[6], b1_vertices[4])->setGeomAssociation(surfaces[2]); + b2_faces[Block::k_max]->getEdge(b2_vertices[6], b2_vertices[7])->setGeomAssociation(surfaces[2]); + b4_faces[Block::k_max]->getEdge(b4_vertices[6], b4_vertices[7])->setGeomAssociation(surfaces[2]); + b1_vertices[7]->setGeomAssociation(surfaces[2]); + b1_vertices[6]->setGeomAssociation(surfaces[2]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(1), b1->getVertex(5))->setGeomAssociation(surfaces[4]); - b2->getFace(Block::j_min)->getEdge(b2->getVertex(1), b2->getVertex(5))->setGeomAssociation(curves[1]); + b1_faces[Block::j_min]->getEdge(b1_vertices[1], b1_vertices[5])->setGeomAssociation(surfaces[4]); + b2_faces[Block::j_min]->getEdge(b2_vertices[1], b2_vertices[5])->setGeomAssociation(curves[1]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(0), b1->getVertex(4))->setGeomAssociation(surfaces[3]); - b4->getFace(Block::i_min)->getEdge(b4->getVertex(0), b4->getVertex(4))->setGeomAssociation(curves[3]); + b1_faces[Block::j_min]->getEdge(b1_vertices[0], b1_vertices[4])->setGeomAssociation(surfaces[3]); + b4_faces[Block::i_min]->getEdge(b4_vertices[0], b4_vertices[4])->setGeomAssociation(curves[3]); - b3->getFace(Block::j_max)->getEdge(b3->getVertex(3), b3->getVertex(7))->setGeomAssociation(surfaces[0]); - b3->getFace(Block::j_max)->getEdge(b3->getVertex(2), b3->getVertex(6))->setGeomAssociation(surfaces[0]); + b3_faces[Block::j_max]->getEdge(b3_vertices[3], b3_vertices[7])->setGeomAssociation(surfaces[0]); + b3_faces[Block::j_max]->getEdge(b3_vertices[2], b3_vertices[6])->setGeomAssociation(surfaces[0]); - b2->getVertex(1)->setGeomAssociation(vertices[0]); - b2->getVertex(5)->setGeomAssociation(vertices[2]); - b4->getVertex(0)->setGeomAssociation(vertices[1]); - b4->getVertex(4)->setGeomAssociation(vertices[3]); + b2_vertices[1]->setGeomAssociation(vertices[0]); + b2_vertices[5]->setGeomAssociation(vertices[2]); + b4_vertices[0]->setGeomAssociation(vertices[1]); + b4_vertices[4]->setGeomAssociation(vertices[3]); v0->setGeomAssociation(vertices[4]); v1->setGeomAssociation(vertices[5]); @@ -1618,15 +1665,17 @@ createSphereTopo1BlockPlein(Geom::PropertySphere* propertySph) throw TkUtil::Exception(message); } + const std::vector& b1_faces = b1->getFaces(); for (uint i=0; i<6; i++){ - Topo::Face* face = b1->getFace(i); + Topo::Face* face = b1_faces[i]; face->setGeomAssociation(surfaces[0]); for (uint j=0; j<4; j++) - face->getEdge(j)->setGeomAssociation(surfaces[0]); + getEdge(face, j)->setGeomAssociation(surfaces[0]); } + const std::vector& b1_vertices = b1->getVertices(); for (uint i=0; i<8; i++) - b1->getVertex(i)->setGeomAssociation(surfaces[0]); + b1_vertices[i]->setGeomAssociation(surfaces[0]); } /*----------------------------------------------------------------------------*/ void CommandNewTopoOGridOnGeometry:: @@ -1661,9 +1710,11 @@ createSphereTopo1BlockDemi(Geom::PropertySphere* propertySph) // on coupe la face du bloc b1 pour qu'une arête soit sur la courbe 2 std::vector splitingEdges; std::vector cofaces; - cofaces.push_back(b1->getFace(Block::j_min)->getCoFace(0)); + const std::vector& b1_faces = b1->getFaces(); + cofaces.push_back(b1_faces[Block::j_min]->getCoFaces()[0]); + const std::vector& b1_vertices = b1->getVertices(); TopoHelper::splitFaces(cofaces, - b1->getFace(Block::j_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->getCoEdge(0), + b1_faces[Block::j_min]->getEdge(b1_vertices[0], b1_vertices[1])->getCoEdges()[0], 0.5, 0.0, false, false, splitingEdges, &getInfoCommand()); @@ -1685,20 +1736,20 @@ createSphereTopo1BlockDemi(Geom::PropertySphere* propertySph) for (uint i=0; i<6; i++){ if (i==2) continue; - Topo::Face* face = b1->getFace(i); + Topo::Face* face = b1_faces[i]; face->setGeomAssociation(surfaces[0]); for (uint j=0; j<4; j++) - face->getEdge(j)->setGeomAssociation(surfaces[0]); + getEdge(face, j)->setGeomAssociation(surfaces[0]); } for (uint i=0; i<8; i++) - b1->getVertex(i)->setGeomAssociation(surfaces[0]); + b1_vertices[i]->setGeomAssociation(surfaces[0]); - b1->getFace(Block::j_min)->getCoFaces(cofaces); - if (cofaces[0]->find(b1->getVertex(0))){ + cofaces = b1_faces[Block::j_min]->getCoFaces(); + if (Utils::contains(b1_vertices[0], cofaces[0]->getVertices())){ cofaces[0]->setGeomAssociation(surfaces[2]); cofaces[1]->setGeomAssociation(surfaces[1]); - } else if (cofaces[0]->find(b1->getVertex(1))){ + } else if (Utils::contains(b1_vertices[1], cofaces[0]->getVertices())){ cofaces[0]->setGeomAssociation(surfaces[1]); cofaces[1]->setGeomAssociation(surfaces[2]); } else @@ -1716,7 +1767,7 @@ createSphereTopo1BlockDemi(Geom::PropertySphere* propertySph) Vertex* v1 = 0; std::vector coedges; for (uint i=0; igetCoEdge(0)); + coedges.push_back(splitingEdges[i]->getCoEdges()[0]); TopoHelper::getVerticesTip(coedges, v0, v1, false); // on met v0 en z max sur la sphère @@ -1738,25 +1789,23 @@ createSphereTopo1BlockDemi(Geom::PropertySphere* propertySph) } - for (uint i=0; igetFace(Block::j_min)->getNbCoFaces(); i++){ - CoFace* coface = b1->getFace(Block::j_min)->getCoFace(i); - for (uint j=0; jgetNbEdges(); j++) - coface->getEdge(j)->setGeomAssociation(coface->getGeomAssociation()); - } + for (CoFace* cf : b1_faces[Block::j_min]->getCoFaces()) + for (Edge* e : cf->getEdges()) + e->setGeomAssociation(cf->getGeomAssociation()); - b1->getFace(Block::j_min)->getEdge(v1, b1->getVertex(1))->setGeomAssociation(curves[1]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(1), b1->getVertex(5))->setGeomAssociation(curves[1]); - b1->getFace(Block::j_min)->getEdge(v0, b1->getVertex(5))->setGeomAssociation(curves[1]); + b1_faces[Block::j_min]->getEdge(v1, b1_vertices[1])->setGeomAssociation(curves[1]); + b1_faces[Block::j_min]->getEdge(b1_vertices[1], b1_vertices[5])->setGeomAssociation(curves[1]); + b1_faces[Block::j_min]->getEdge(v0, b1_vertices[5])->setGeomAssociation(curves[1]); - b1->getFace(Block::j_min)->getEdge(v1, b1->getVertex(0))->setGeomAssociation(curves[0]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(0), b1->getVertex(4))->setGeomAssociation(curves[0]); - b1->getFace(Block::j_min)->getEdge(v0, b1->getVertex(4))->setGeomAssociation(curves[0]); + b1_faces[Block::j_min]->getEdge(v1, b1_vertices[0])->setGeomAssociation(curves[0]); + b1_faces[Block::j_min]->getEdge(b1_vertices[0], b1_vertices[4])->setGeomAssociation(curves[0]); + b1_faces[Block::j_min]->getEdge(v0, b1_vertices[4])->setGeomAssociation(curves[0]); - b1->getVertex(1)->setGeomAssociation(curves[1]); - b1->getVertex(5)->setGeomAssociation(curves[1]); + b1_vertices[1]->setGeomAssociation(curves[1]); + b1_vertices[5]->setGeomAssociation(curves[1]); - b1->getVertex(0)->setGeomAssociation(curves[0]); - b1->getVertex(4)->setGeomAssociation(curves[0]); + b1_vertices[0]->setGeomAssociation(curves[0]); + b1_vertices[4]->setGeomAssociation(curves[0]); // sur l'axe des Z @@ -1807,20 +1856,22 @@ createSphereTopo1BlockQuart(Geom::PropertySphere* propertySph) throw TkUtil::Exception(message); } + const std::vector& b1_faces = b1->getFaces(); for (uint i=0; i<6; i++){ if (i==2 || i==0) continue; - Topo::Face* face = b1->getFace(i); + Topo::Face* face = b1_faces[i]; face->setGeomAssociation(surfaces[0]); for (uint j=0; j<4; j++) - face->getEdge(j)->setGeomAssociation(surfaces[0]); + getEdge(face, j)->setGeomAssociation(surfaces[0]); } + const std::vector& b1_vertices = b1->getVertices(); for (uint i=0; i<8; i++) - b1->getVertex(i)->setGeomAssociation(surfaces[0]); + b1_vertices[i]->setGeomAssociation(surfaces[0]); - b1->getFace(Block::i_min)->setGeomAssociation(surfaces[2]); - b1->getFace(Block::j_min)->setGeomAssociation(surfaces[1]); + b1_faces[Block::i_min]->setGeomAssociation(surfaces[2]); + b1_faces[Block::j_min]->setGeomAssociation(surfaces[1]); // les sommets géométriques if (vertices.size() != 2){ @@ -1830,8 +1881,8 @@ createSphereTopo1BlockQuart(Geom::PropertySphere* propertySph) throw TkUtil::Exception(message); } - Vertex* v0 = b1->getVertex(4); - Vertex* v1 = b1->getVertex(0); + Vertex* v0 = b1_vertices[4]; + Vertex* v1 = b1_vertices[0]; v0->setGeomAssociation(vertices[0]); v1->setGeomAssociation(vertices[1]); v0->setCoord(vertices[0]->getCoord()); @@ -1844,21 +1895,21 @@ createSphereTopo1BlockQuart(Geom::PropertySphere* propertySph) throw TkUtil::Exception(message); } - b1->getFace(Block::i_min)->getEdge(b1->getVertex(0), b1->getVertex(2))->setGeomAssociation(curves[0]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(2), b1->getVertex(6))->setGeomAssociation(curves[0]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(6), b1->getVertex(4))->setGeomAssociation(curves[0]); + b1_faces[Block::i_min]->getEdge(b1_vertices[0], b1_vertices[2])->setGeomAssociation(curves[0]); + b1_faces[Block::i_min]->getEdge(b1_vertices[2], b1_vertices[6])->setGeomAssociation(curves[0]); + b1_faces[Block::i_min]->getEdge(b1_vertices[6], b1_vertices[4])->setGeomAssociation(curves[0]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->setGeomAssociation(curves[1]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(1), b1->getVertex(5))->setGeomAssociation(curves[1]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(5), b1->getVertex(4))->setGeomAssociation(curves[1]); + b1_faces[Block::j_min]->getEdge(b1_vertices[0], b1_vertices[1])->setGeomAssociation(curves[1]); + b1_faces[Block::j_min]->getEdge(b1_vertices[1], b1_vertices[5])->setGeomAssociation(curves[1]); + b1_faces[Block::j_min]->getEdge(b1_vertices[5], b1_vertices[4])->setGeomAssociation(curves[1]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(0), b1->getVertex(4))->setGeomAssociation(curves[2]); + b1_faces[Block::i_min]->getEdge(b1_vertices[0], b1_vertices[4])->setGeomAssociation(curves[2]); - b1->getVertex(2)->setGeomAssociation(curves[0]); - b1->getVertex(6)->setGeomAssociation(curves[0]); + b1_vertices[2]->setGeomAssociation(curves[0]); + b1_vertices[6]->setGeomAssociation(curves[0]); - b1->getVertex(1)->setGeomAssociation(curves[1]); - b1->getVertex(5)->setGeomAssociation(curves[1]); + b1_vertices[1]->setGeomAssociation(curves[1]); + b1_vertices[5]->setGeomAssociation(curves[1]); } /*----------------------------------------------------------------------------*/ @@ -1917,20 +1968,22 @@ createSphereTopo1BlockHuitieme(Geom::PropertySphere* propertySph) throw TkUtil::Exception(message); } + const std::vector& b1_faces = b1->getFaces(); for (uint i=0; i<6; i++){ if (i==0 || i==2 || i==4) continue; - Topo::Face* face = b1->getFace(i); + Topo::Face* face = b1_faces[i]; face->setGeomAssociation(surfaces[0]); for (uint j=0; j<4; j++) - face->getEdge(j)->setGeomAssociation(surfaces[0]); + getEdge(face, j)->setGeomAssociation(surfaces[0]); } - b1->getVertex(7)->setGeomAssociation(surfaces[0]); + const std::vector& b1_vertices = b1->getVertices(); + b1_vertices[7]->setGeomAssociation(surfaces[0]); - b1->getFace(Block::i_min)->setGeomAssociation(surfaces[3]); - b1->getFace(Block::j_min)->setGeomAssociation(surfaces[2]); - b1->getFace(Block::k_min)->setGeomAssociation(surfaces[1]); + b1_faces[Block::i_min]->setGeomAssociation(surfaces[3]); + b1_faces[Block::j_min]->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_min]->setGeomAssociation(surfaces[1]); if (curves.size() != 6){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); @@ -1939,19 +1992,19 @@ createSphereTopo1BlockHuitieme(Geom::PropertySphere* propertySph) throw TkUtil::Exception(message); } - b1->getFace(Block::k_min)->getEdge(b1->getVertex(0), b1->getVertex(1))->setGeomAssociation(curves[4]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(2), b1->getVertex(3))->setGeomAssociation(curves[1]); - b1->getFace(Block::k_min)->getEdge(b1->getVertex(1), b1->getVertex(3))->setGeomAssociation(curves[1]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(1), b1->getVertex(5))->setGeomAssociation(curves[2]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(4), b1->getVertex(5))->setGeomAssociation(curves[2]); - b1->getFace(Block::j_min)->getEdge(b1->getVertex(4), b1->getVertex(0))->setGeomAssociation(curves[5]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(2), b1->getVertex(6))->setGeomAssociation(curves[0]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(4), b1->getVertex(6))->setGeomAssociation(curves[0]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(2), b1->getVertex(0))->setGeomAssociation(curves[3]); + b1_faces[Block::k_min]->getEdge(b1_vertices[0], b1_vertices[1])->setGeomAssociation(curves[4]); + b1_faces[Block::k_min]->getEdge(b1_vertices[2], b1_vertices[3])->setGeomAssociation(curves[1]); + b1_faces[Block::k_min]->getEdge(b1_vertices[1], b1_vertices[3])->setGeomAssociation(curves[1]); + b1_faces[Block::j_min]->getEdge(b1_vertices[1], b1_vertices[5])->setGeomAssociation(curves[2]); + b1_faces[Block::j_min]->getEdge(b1_vertices[4], b1_vertices[5])->setGeomAssociation(curves[2]); + b1_faces[Block::j_min]->getEdge(b1_vertices[4], b1_vertices[0])->setGeomAssociation(curves[5]); + b1_faces[Block::i_min]->getEdge(b1_vertices[2], b1_vertices[6])->setGeomAssociation(curves[0]); + b1_faces[Block::i_min]->getEdge(b1_vertices[4], b1_vertices[6])->setGeomAssociation(curves[0]); + b1_faces[Block::i_min]->getEdge(b1_vertices[2], b1_vertices[0])->setGeomAssociation(curves[3]); - b1->getVertex(3)->setGeomAssociation(curves[1]); - b1->getVertex(6)->setGeomAssociation(curves[0]); - b1->getVertex(5)->setGeomAssociation(curves[2]); + b1_vertices[3]->setGeomAssociation(curves[1]); + b1_vertices[6]->setGeomAssociation(curves[0]); + b1_vertices[5]->setGeomAssociation(curves[2]); } /*----------------------------------------------------------------------------*/ void CommandNewTopoOGridOnGeometry:: @@ -2003,8 +2056,8 @@ createSphereTopoOGridPleinDeg(Geom::PropertySphere* propertySph) // on place les sommets for (uint j=0; j<6; j++) for (uint i=0; i<4; i++){ - blocs[j]->getVertex(i)->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); - blocs[j]->getVertex(i+4)->setCoord(centre); + blocs[j]->getVertices()[i]->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); + blocs[j]->getVertices()[i+4]->setCoord(centre); } // dégénéréscence des blocs @@ -2012,18 +2065,24 @@ createSphereTopoOGridPleinDeg(Geom::PropertySphere* propertySph) blocs[j]->degenerateFaceInVertex(Block::k_max, &getInfoCommand()); // on fusionne les blocs - b2->getFace(Block::j_min)->fuse(b4->getFace(Block::j_max), &getInfoCommand()); - b2->getFace(Block::i_min)->fuse(b7->getFace(Block::j_max), &getInfoCommand()); - b2->getFace(Block::i_max)->fuse(b6->getFace(Block::j_min), &getInfoCommand()); - b4->getFace(Block::i_min)->fuse(b7->getFace(Block::i_max), &getInfoCommand()); - b4->getFace(Block::i_max)->fuse(b6->getFace(Block::i_max), &getInfoCommand()); - b3->getFace(Block::j_max)->fuse(b4->getFace(Block::j_min), &getInfoCommand()); - b3->getFace(Block::i_min)->fuse(b7->getFace(Block::j_min), &getInfoCommand()); - b3->getFace(Block::i_max)->fuse(b6->getFace(Block::j_max), &getInfoCommand()); - b5->getFace(Block::i_min)->fuse(b7->getFace(Block::i_min), &getInfoCommand()); - b3->getFace(Block::j_min)->fuse(b5->getFace(Block::j_max), &getInfoCommand()); - b5->getFace(Block::i_max)->fuse(b6->getFace(Block::i_min), &getInfoCommand()); - b2->getFace(Block::j_max)->fuse(b5->getFace(Block::j_min), &getInfoCommand()); + const std::vector& b2_faces = b2->getFaces(); + const std::vector& b3_faces = b3->getFaces(); + const std::vector& b4_faces = b4->getFaces(); + const std::vector& b5_faces = b5->getFaces(); + const std::vector& b6_faces = b6->getFaces(); + const std::vector& b7_faces = b7->getFaces(); + b2_faces[Block::j_min]->fuse(b4_faces[Block::j_max], &getInfoCommand()); + b2_faces[Block::i_min]->fuse(b7_faces[Block::j_max], &getInfoCommand()); + b2_faces[Block::i_max]->fuse(b6_faces[Block::j_min], &getInfoCommand()); + b4_faces[Block::i_min]->fuse(b7_faces[Block::i_max], &getInfoCommand()); + b4_faces[Block::i_max]->fuse(b6_faces[Block::i_max], &getInfoCommand()); + b3_faces[Block::j_max]->fuse(b4_faces[Block::j_min], &getInfoCommand()); + b3_faces[Block::i_min]->fuse(b7_faces[Block::j_min], &getInfoCommand()); + b3_faces[Block::i_max]->fuse(b6_faces[Block::j_max], &getInfoCommand()); + b5_faces[Block::i_min]->fuse(b7_faces[Block::i_min], &getInfoCommand()); + b3_faces[Block::j_min]->fuse(b5_faces[Block::j_max], &getInfoCommand()); + b5_faces[Block::i_max]->fuse(b6_faces[Block::i_min], &getInfoCommand()); + b2_faces[Block::j_max]->fuse(b5_faces[Block::j_min], &getInfoCommand()); // les projections sur la géométrie auto surfaces = dynamic_cast(getGeomEntity())->getSurfaces(); @@ -2036,12 +2095,12 @@ createSphereTopoOGridPleinDeg(Geom::PropertySphere* propertySph) // les projections for (uint j=0; j<6; j++){ - Face* face = blocs[j]->getFace(Block::k_min); + Face* face = blocs[j]->getFaces()[Block::k_min]; face->setGeomAssociation(surfaces[0]); for (uint i=0; i<4; i++){ - face->getEdge(i)->setGeomAssociation(surfaces[0]); - face->getVertex(i)->setGeomAssociation(surfaces[0]); + getEdge(face, i)->setGeomAssociation(surfaces[0]); + face->getVertices()[i]->setGeomAssociation(surfaces[0]); } } } @@ -2111,31 +2170,40 @@ createSphereTopoOGridPleinNonDeg(Geom::PropertySphere* propertySph) // on place les sommets // le bloc au centre (b1) + const std::vector& b1_vertices = b1->getVertices(); for (uint i=0; i<8; i++) - b1->getVertex(i)->setCoord(pts_int[i]); + b1_vertices[i]->setCoord(pts_int[i]); for (uint j=0; j<6; j++) for (uint i=0; i<4; i++){ - blocs[j]->getVertex(i)->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); - blocs[j]->getVertex(i+4)->setCoord(pts_int[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); + blocs[j]->getVertices()[i]->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); + blocs[j]->getVertices()[i+4]->setCoord(pts_int[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); } + const std::vector& b1_faces = b1->getFaces(); + const std::vector& b2_faces = b2->getFaces(); + const std::vector& b3_faces = b3->getFaces(); + const std::vector& b4_faces = b4->getFaces(); + const std::vector& b5_faces = b5->getFaces(); + const std::vector& b6_faces = b6->getFaces(); + const std::vector& b7_faces = b7->getFaces(); + // on fusionne les blocs for (uint j=0; j<6; j++) - b1->getFace(j)->fuse(blocs[j]->getFace(Block::k_max), &getInfoCommand()); - - b2->getFace(Block::j_min)->fuse(b4->getFace(Block::j_max), &getInfoCommand()); - b2->getFace(Block::i_min)->fuse(b7->getFace(Block::j_max), &getInfoCommand()); - b2->getFace(Block::i_max)->fuse(b6->getFace(Block::j_min), &getInfoCommand()); - b4->getFace(Block::i_min)->fuse(b7->getFace(Block::i_max), &getInfoCommand()); - b4->getFace(Block::i_max)->fuse(b6->getFace(Block::i_max), &getInfoCommand()); - b3->getFace(Block::j_max)->fuse(b4->getFace(Block::j_min), &getInfoCommand()); - b3->getFace(Block::i_min)->fuse(b7->getFace(Block::j_min), &getInfoCommand()); - b3->getFace(Block::i_max)->fuse(b6->getFace(Block::j_max), &getInfoCommand()); - b5->getFace(Block::i_min)->fuse(b7->getFace(Block::i_min), &getInfoCommand()); - b3->getFace(Block::j_min)->fuse(b5->getFace(Block::j_max), &getInfoCommand()); - b5->getFace(Block::i_max)->fuse(b6->getFace(Block::i_min), &getInfoCommand()); - b2->getFace(Block::j_max)->fuse(b5->getFace(Block::j_min), &getInfoCommand()); + b1_faces[j]->fuse(blocs[j]->getFaces()[Block::k_max], &getInfoCommand()); + + b2_faces[Block::j_min]->fuse(b4_faces[Block::j_max], &getInfoCommand()); + b2_faces[Block::i_min]->fuse(b7_faces[Block::j_max], &getInfoCommand()); + b2_faces[Block::i_max]->fuse(b6_faces[Block::j_min], &getInfoCommand()); + b4_faces[Block::i_min]->fuse(b7_faces[Block::i_max], &getInfoCommand()); + b4_faces[Block::i_max]->fuse(b6_faces[Block::i_max], &getInfoCommand()); + b3_faces[Block::j_max]->fuse(b4_faces[Block::j_min], &getInfoCommand()); + b3_faces[Block::i_min]->fuse(b7_faces[Block::j_min], &getInfoCommand()); + b3_faces[Block::i_max]->fuse(b6_faces[Block::j_max], &getInfoCommand()); + b5_faces[Block::i_min]->fuse(b7_faces[Block::i_min], &getInfoCommand()); + b3_faces[Block::j_min]->fuse(b5_faces[Block::j_max], &getInfoCommand()); + b5_faces[Block::i_max]->fuse(b6_faces[Block::i_min], &getInfoCommand()); + b2_faces[Block::j_max]->fuse(b5_faces[Block::j_min], &getInfoCommand()); // std::cout<getInfoBlock() // <<" fuse avec "<getInfoBlock()<getFace(Block::k_min); + Face* face = blocs[j]->getFaces()[Block::k_min]; face->setGeomAssociation(surfaces[0]); for (uint i=0; i<4; i++){ - face->getEdge(i)->setGeomAssociation(surfaces[0]); - face->getVertex(i)->setGeomAssociation(surfaces[0]); + getEdge(face, i)->setGeomAssociation(surfaces[0]); + face->getVertices()[i]->setGeomAssociation(surfaces[0]); } } @@ -2214,8 +2282,8 @@ createSphereTopoOGridDemiDeg(Geom::PropertySphere* propertySph) // on place les sommets for (uint j=0; j<5; j++) for (uint i=0; i<4; i++){ - blocs[j]->getVertex(i)->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); - blocs[j]->getVertex(i+4)->setCoord(centre); + blocs[j]->getVertices()[i]->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); + blocs[j]->getVertices()[i+4]->setCoord(centre); } // dégénéréscence des blocs @@ -2223,35 +2291,46 @@ createSphereTopoOGridDemiDeg(Geom::PropertySphere* propertySph) blocs[j]->degenerateFaceInVertex(Block::k_max, &getInfoCommand()); // on fusionne les blocs - b2->getFace(Block::j_min)->fuse(b4->getFace(Block::j_max), &getInfoCommand()); - b2->getFace(Block::i_max)->fuse(b6->getFace(Block::j_min), &getInfoCommand()); - b4->getFace(Block::i_max)->fuse(b6->getFace(Block::i_max), &getInfoCommand()); - b3->getFace(Block::j_max)->fuse(b4->getFace(Block::j_min), &getInfoCommand()); - b3->getFace(Block::i_max)->fuse(b6->getFace(Block::j_max), &getInfoCommand()); - b3->getFace(Block::j_min)->fuse(b5->getFace(Block::j_max), &getInfoCommand()); - b5->getFace(Block::i_max)->fuse(b6->getFace(Block::i_min), &getInfoCommand()); - b2->getFace(Block::j_max)->fuse(b5->getFace(Block::j_min), &getInfoCommand()); + const std::vector& b2_faces = b2->getFaces(); + const std::vector& b3_faces = b3->getFaces(); + const std::vector& b4_faces = b4->getFaces(); + const std::vector& b5_faces = b5->getFaces(); + const std::vector& b6_faces = b6->getFaces(); + b2_faces[Block::j_min]->fuse(b4_faces[Block::j_max], &getInfoCommand()); + b2_faces[Block::i_max]->fuse(b6_faces[Block::j_min], &getInfoCommand()); + b4_faces[Block::i_max]->fuse(b6_faces[Block::i_max], &getInfoCommand()); + b3_faces[Block::j_max]->fuse(b4_faces[Block::j_min], &getInfoCommand()); + b3_faces[Block::i_max]->fuse(b6_faces[Block::j_max], &getInfoCommand()); + b3_faces[Block::j_min]->fuse(b5_faces[Block::j_max], &getInfoCommand()); + b5_faces[Block::i_max]->fuse(b6_faces[Block::i_min], &getInfoCommand()); + b2_faces[Block::j_max]->fuse(b5_faces[Block::j_min], &getInfoCommand()); // on coupe les faces des blocs b4 et b5 pour qu'une arête soit sur la courbe 2 std::vector splitingEdges; std::vector coedges; std::vector cofaces; - cofaces.push_back(b4->getFace(Block::i_min)->getCoFace(0)); + const std::vector& b2_vertices = b2->getVertices(); + const std::vector& b3_vertices = b3->getVertices(); + const std::vector& b4_vertices = b4->getVertices(); + const std::vector& b5_vertices = b5->getVertices(); + const std::vector& b6_vertices = b6->getVertices(); + + cofaces.push_back(b4_faces[Block::i_min]->getCoFaces()[0]); TopoHelper::splitFaces(cofaces, - b4->getFace(Block::i_min)->getEdge(b4->getVertex(0), b4->getVertex(2))->getCoEdge(0), + b4_faces[Block::i_min]->getEdge(b4_vertices[0], b4_vertices[2])->getCoEdges()[0], 0.5, 0.0, false, false, splitingEdges, &getInfoCommand()); - coedges.push_back(splitingEdges[0]->getCoEdge(0)); + coedges.push_back(splitingEdges[0]->getCoEdges()[0]); cofaces.clear(); - cofaces.push_back(b5->getFace(Block::i_min)->getCoFace(0)); + cofaces.push_back(b5_faces[Block::i_min]->getCoFaces()[0]); TopoHelper::splitFaces(cofaces, - b5->getFace(Block::i_min)->getEdge(b5->getVertex(0), b5->getVertex(2))->getCoEdge(0), + b5_faces[Block::i_min]->getEdge(b5_vertices[0], b5_vertices[2])->getCoEdges()[0], 0.5, 0.0, false, false, splitingEdges, &getInfoCommand()); - coedges.push_back(splitingEdges[0]->getCoEdge(0)); + coedges.push_back(splitingEdges[0]->getCoEdges()[0]); // les projections sur la géométrie @@ -2270,38 +2349,39 @@ createSphereTopoOGridDemiDeg(Geom::PropertySphere* propertySph) // les projections for (uint j=0; j<5; j++){ - Face* face = blocs[j]->getFace(Block::k_min); + Face* face = blocs[j]->getFaces()[Block::k_min]; face->setGeomAssociation(surfaces[0]); for (uint i=0; i<4; i++){ - face->getEdge(i)->setGeomAssociation(surfaces[0]); - face->getVertex(i)->setGeomAssociation(surfaces[0]); + getEdge(face, i)->setGeomAssociation(surfaces[0]); + face->getVertices()[i]->setGeomAssociation(surfaces[0]); } } - b3->getFace(Block::i_min)->setGeomAssociation(surfaces[1]); - b2->getFace(Block::i_min)->setGeomAssociation(surfaces[2]); + b3_faces[Block::i_min]->setGeomAssociation(surfaces[1]); + b2_faces[Block::i_min]->setGeomAssociation(surfaces[2]); - Vertex* v0 = b4->getVertex(2); - Vertex* v1 = b4->getVertex(0); - Vertex* v2 = b5->getVertex(0); - Vertex* v3 = b5->getVertex(2); + Vertex* v0 = b4_vertices[2]; + Vertex* v1 = b4_vertices[0]; + Vertex* v2 = b5_vertices[0]; + Vertex* v3 = b5_vertices[2]; - b4->getFace(Block::i_min)->getCoFaces(cofaces); - if (cofaces[0]->find(v0)){ + cofaces = b4_faces[Block::i_min]->getCoFaces(); + const std::vector& cf0_vertices = cofaces[0]->getVertices(); + if (Utils::contains(v0, cf0_vertices)){ cofaces[0]->setGeomAssociation(surfaces[2]); cofaces[1]->setGeomAssociation(surfaces[1]); - } else if (cofaces[0]->find(v1)){ + } else if (Utils::contains(v1, cf0_vertices)){ cofaces[0]->setGeomAssociation(surfaces[1]); cofaces[1]->setGeomAssociation(surfaces[2]); } else throw TkUtil::Exception (TkUtil::UTF8String ("Echec pour projeter les CoFaces issues de la coupe de b4", TkUtil::Charset::UTF_8)); - b5->getFace(Block::i_min)->getCoFaces(cofaces); - if (cofaces[0]->find(v2)){ + cofaces = b5_faces[Block::i_min]->getCoFaces(); + if (Utils::contains(v2, cf0_vertices)){ cofaces[0]->setGeomAssociation(surfaces[2]); cofaces[1]->setGeomAssociation(surfaces[1]); - } else if (cofaces[0]->find(v3)){ + } else if (Utils::contains(v3, cf0_vertices)){ cofaces[0]->setGeomAssociation(surfaces[1]); cofaces[1]->setGeomAssociation(surfaces[2]); } else @@ -2336,32 +2416,32 @@ createSphereTopoOGridDemiDeg(Geom::PropertySphere* propertySph) } - b3->getFace(Block::k_min)->getEdge(b3->getVertex(0), b3->getVertex(2))->setGeomAssociation(curves[1]); - b3->getVertex(0)->setGeomAssociation(curves[1]); - b3->getVertex(2)->setGeomAssociation(curves[1]); + b3_faces[Block::k_min]->getEdge(b3_vertices[0], b3_vertices[2])->setGeomAssociation(curves[1]); + b3_vertices[0]->setGeomAssociation(curves[1]); + b3_vertices[2]->setGeomAssociation(curves[1]); - b5->getFace(Block::k_min)->getEdge(b5->getVertex(0), b5->getVertex(2))->getCoEdge(v0, b5->getVertex(2))->setGeomAssociation(curves[1]); - b5->getFace(Block::k_min)->getEdge(b5->getVertex(0), b5->getVertex(2))->getCoEdge(b5->getVertex(0), v0)->setGeomAssociation(curves[0]); + b5_faces[Block::k_min]->getEdge(b5_vertices[0], b5_vertices[2])->getCoEdge(v0, b5_vertices[2])->setGeomAssociation(curves[1]); + b5_faces[Block::k_min]->getEdge(b5_vertices[0], b5_vertices[2])->getCoEdge(b5_vertices[0], v0)->setGeomAssociation(curves[0]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(0), b4->getVertex(2))->getCoEdge(b4->getVertex(0), v1)->setGeomAssociation(curves[1]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(0), b4->getVertex(2))->getCoEdge(b4->getVertex(2), v1)->setGeomAssociation(curves[0]); + b4_faces[Block::k_min]->getEdge(b4_vertices[0], b4_vertices[2])->getCoEdge(b4_vertices[0], v1)->setGeomAssociation(curves[1]); + b4_faces[Block::k_min]->getEdge(b4_vertices[0], b4_vertices[2])->getCoEdge(b4_vertices[2], v1)->setGeomAssociation(curves[0]); - b2->getFace(Block::k_min)->getEdge(b2->getVertex(0), b2->getVertex(2))->setGeomAssociation(curves[0]); - b2->getVertex(0)->setGeomAssociation(curves[0]); - b2->getVertex(2)->setGeomAssociation(curves[0]); + b2_faces[Block::k_min]->getEdge(b2_vertices[0], b2_vertices[2])->setGeomAssociation(curves[0]); + b2_vertices[0]->setGeomAssociation(curves[0]); + b2_vertices[2]->setGeomAssociation(curves[0]); - b3->getFace(Block::i_min)->getEdge(b3->getVertex(0), b3->getVertex(4))->setGeomAssociation(surfaces[1]); - b3->getFace(Block::i_min)->getEdge(b3->getVertex(2), b3->getVertex(4))->setGeomAssociation(surfaces[1]); + b3_faces[Block::i_min]->getEdge(b3_vertices[0], b3_vertices[4])->setGeomAssociation(surfaces[1]); + b3_faces[Block::i_min]->getEdge(b3_vertices[2], b3_vertices[4])->setGeomAssociation(surfaces[1]); - b2->getFace(Block::i_min)->getEdge(b2->getVertex(0), b2->getVertex(4))->setGeomAssociation(surfaces[2]); - b2->getFace(Block::i_min)->getEdge(b2->getVertex(2), b2->getVertex(4))->setGeomAssociation(surfaces[2]); + b2_faces[Block::i_min]->getEdge(b2_vertices[0], b2_vertices[4])->setGeomAssociation(surfaces[2]); + b2_faces[Block::i_min]->getEdge(b2_vertices[2], b2_vertices[4])->setGeomAssociation(surfaces[2]); // sur l'axe des Z - for (uint i=0; isetGeomAssociation(curves[2]); - for (uint j=0; jgetNbVertices(); j++) - splitingEdges[i]->getVertex(j)->setGeomAssociation(curves[2]); + for (Edge* e : splitingEdges){ + e->setGeomAssociation(curves[2]); + for (Topo::Vertex* ve : e->getVertices()) + ve->setGeomAssociation(curves[2]); } v0->setGeomAssociation(vertices[0]); v1->setGeomAssociation(vertices[1]); @@ -2435,37 +2515,50 @@ createSphereTopoOGridDemiNonDeg(Geom::PropertySphere* propertySph) // on place les sommets // le bloc au centre (b1) + const std::vector& b1_vertices = b1->getVertices(); + const std::vector& b2_vertices = b2->getVertices(); + const std::vector& b3_vertices = b3->getVertices(); + const std::vector& b4_vertices = b4->getVertices(); + const std::vector& b5_vertices = b5->getVertices(); + const std::vector& b6_vertices = b6->getVertices(); for (uint i=0; i<8; i++) - b1->getVertex(i)->setCoord(pts_int[i]); + b1_vertices[i]->setCoord(pts_int[i]); for (uint j=0; j<5; j++) for (uint i=0; i<4; i++){ - blocs[j]->getVertex(i)->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); - blocs[j]->getVertex(i+4)->setCoord(pts_int[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); + blocs[j]->getVertices()[i]->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); + blocs[j]->getVertices()[i+4]->setCoord(pts_int[TopoHelper::tab2IndVtxByFaceOnBlock[j][i]]); } + const std::vector& b1_faces = b1->getFaces(); + const std::vector& b2_faces = b2->getFaces(); + const std::vector& b3_faces = b3->getFaces(); + const std::vector& b4_faces = b4->getFaces(); + const std::vector& b5_faces = b5->getFaces(); + const std::vector& b6_faces = b6->getFaces(); + // on fusionne les blocs for (uint j=0; j<5; j++) - b1->getFace(j)->fuse(blocs[j]->getFace(Block::k_max), &getInfoCommand()); + b1_faces[j]->fuse(blocs[j]->getFaces()[Block::k_max], &getInfoCommand()); - b2->getFace(Block::j_min)->fuse(b4->getFace(Block::j_max), &getInfoCommand()); - b2->getFace(Block::i_max)->fuse(b6->getFace(Block::j_min), &getInfoCommand()); - b4->getFace(Block::i_max)->fuse(b6->getFace(Block::i_max), &getInfoCommand()); - b3->getFace(Block::j_max)->fuse(b4->getFace(Block::j_min), &getInfoCommand()); - b3->getFace(Block::i_max)->fuse(b6->getFace(Block::j_max), &getInfoCommand()); - b3->getFace(Block::j_min)->fuse(b5->getFace(Block::j_max), &getInfoCommand()); - b5->getFace(Block::i_max)->fuse(b6->getFace(Block::i_min), &getInfoCommand()); - b2->getFace(Block::j_max)->fuse(b5->getFace(Block::j_min), &getInfoCommand()); + b2_faces[Block::j_min]->fuse(b4_faces[Block::j_max], &getInfoCommand()); + b2_faces[Block::i_max]->fuse(b6_faces[Block::j_min], &getInfoCommand()); + b4_faces[Block::i_max]->fuse(b6_faces[Block::i_max], &getInfoCommand()); + b3_faces[Block::j_max]->fuse(b4_faces[Block::j_min], &getInfoCommand()); + b3_faces[Block::i_max]->fuse(b6_faces[Block::j_max], &getInfoCommand()); + b3_faces[Block::j_min]->fuse(b5_faces[Block::j_max], &getInfoCommand()); + b5_faces[Block::i_max]->fuse(b6_faces[Block::i_min], &getInfoCommand()); + b2_faces[Block::j_max]->fuse(b5_faces[Block::j_min], &getInfoCommand()); // on coupe la face du bloc b1 pour qu'une arête soit sur la courbe 2 // et les faces des blocs b4 et b5 std::vector splitingEdges; std::vector cofaces; - cofaces.push_back(b1->getFace(Block::k_max)->getCoFace(0)); - cofaces.push_back(b4->getFace(Block::i_min)->getCoFace(0)); - cofaces.push_back(b5->getFace(Block::i_min)->getCoFace(0)); + cofaces.push_back(b1_faces[Block::k_max]->getCoFaces()[0]); + cofaces.push_back(b4_faces[Block::i_min]->getCoFaces()[0]); + cofaces.push_back(b5_faces[Block::i_min]->getCoFaces()[0]); TopoHelper::splitFaces(cofaces, - b4->getFace(Block::i_min)->getEdge(b4->getVertex(0), b4->getVertex(2))->getCoEdge(0), + b4_faces[Block::i_min]->getEdge(b4_vertices[0], b4_vertices[2])->getCoEdges()[0], 0.5, 0.0, false, false, splitingEdges, &getInfoCommand()); @@ -2488,48 +2581,49 @@ createSphereTopoOGridDemiNonDeg(Geom::PropertySphere* propertySph) // les projections for (uint j=0; j<5; j++){ - Face* face = blocs[j]->getFace(Block::k_min); + Face* face = blocs[j]->getFaces()[Block::k_min]; face->setGeomAssociation(surfaces[0]); for (uint i=0; i<4; i++){ - face->getEdge(i)->setGeomAssociation(surfaces[0]); - face->getVertex(i)->setGeomAssociation(surfaces[0]); + getEdge(face, i)->setGeomAssociation(surfaces[0]); + face->getVertices()[i]->setGeomAssociation(surfaces[0]); } } - b3->getFace(Block::i_min)->setGeomAssociation(surfaces[1]); - b2->getFace(Block::i_min)->setGeomAssociation(surfaces[2]); + b3_faces[Block::i_min]->setGeomAssociation(surfaces[1]); + b2_faces[Block::i_min]->setGeomAssociation(surfaces[2]); - Vertex* v4 = b1->getVertex(4); - Vertex* v5 = b1->getVertex(5); - Vertex* v6 = b1->getVertex(6); - Vertex* v7 = b1->getVertex(7); + Vertex* v4 = b1_vertices[4]; + Vertex* v5 = b1_vertices[5]; + Vertex* v6 = b1_vertices[6]; + Vertex* v7 = b1_vertices[7]; - b1->getFace(Block::k_max)->getCoFaces(cofaces); - if (cofaces[0]->find(v4) || cofaces[0]->find(v6)){ + cofaces = b1_faces[Block::k_max]->getCoFaces(); + const std::vector& cf0_vertices = cofaces[0]->getVertices(); + if (Utils::contains(v4, cf0_vertices) || Utils::contains(v6, cf0_vertices)){ cofaces[0]->setGeomAssociation(surfaces[2]); cofaces[1]->setGeomAssociation(surfaces[1]); - } else if (cofaces[0]->find(v5) || cofaces[0]->find(v7)){ + } else if (Utils::contains(v5, cf0_vertices) || Utils::contains(v7, cf0_vertices)){ cofaces[0]->setGeomAssociation(surfaces[1]); cofaces[1]->setGeomAssociation(surfaces[2]); } else throw TkUtil::Exception (TkUtil::UTF8String ("Echec pour projeter les CoFaces issues de la coupe de b1", TkUtil::Charset::UTF_8)); - b4->getFace(Block::i_min)->getCoFaces(cofaces); - if (cofaces[0]->find(v4) || cofaces[0]->find(v6)){ + cofaces = b4_faces[Block::i_min]->getCoFaces(); + if (Utils::contains(v4, cf0_vertices) || Utils::contains(v6, cf0_vertices)){ cofaces[0]->setGeomAssociation(surfaces[2]); cofaces[1]->setGeomAssociation(surfaces[1]); - } else if (cofaces[0]->find(v5) || cofaces[0]->find(v7)){ + } else if (Utils::contains(v5, cf0_vertices) || Utils::contains(v7, cf0_vertices)){ cofaces[0]->setGeomAssociation(surfaces[1]); cofaces[1]->setGeomAssociation(surfaces[2]); } else throw TkUtil::Exception (TkUtil::UTF8String ("Echec pour projeter les CoFaces issues de la coupe de b4", TkUtil::Charset::UTF_8)); - b5->getFace(Block::i_min)->getCoFaces(cofaces); - if (cofaces[0]->find(v4) || cofaces[0]->find(v6)){ + cofaces = b5_faces[Block::i_min]->getCoFaces(); + if (Utils::contains(v4, cf0_vertices) || Utils::contains(v6, cf0_vertices)){ cofaces[0]->setGeomAssociation(surfaces[2]); cofaces[1]->setGeomAssociation(surfaces[1]); - } else if (cofaces[0]->find(v5) || cofaces[0]->find(v7)){ + } else if (Utils::contains(v5, cf0_vertices) || Utils::contains(v7, cf0_vertices)){ cofaces[0]->setGeomAssociation(surfaces[1]); cofaces[1]->setGeomAssociation(surfaces[2]); } else @@ -2547,7 +2641,7 @@ createSphereTopoOGridDemiNonDeg(Geom::PropertySphere* propertySph) Vertex* v1 = 0; std::vector coedges; for (uint i=0; igetCoEdge(0)); + coedges.push_back(splitingEdges[i]->getCoEdges()[0]); TopoHelper::getVerticesTip(coedges, v0, v1, false); // on met v0 en z max sur la sphère @@ -2567,43 +2661,41 @@ createSphereTopoOGridDemiNonDeg(Geom::PropertySphere* propertySph) } - b3->getFace(Block::k_min)->getEdge(b3->getVertex(0), b3->getVertex(2))->setGeomAssociation(curves[1]); - b3->getVertex(0)->setGeomAssociation(curves[1]); - b3->getVertex(2)->setGeomAssociation(curves[1]); + b3_faces[Block::k_min]->getEdge(b3_vertices[0], b3_vertices[2])->setGeomAssociation(curves[1]); + b3_vertices[0]->setGeomAssociation(curves[1]); + b3_vertices[2]->setGeomAssociation(curves[1]); - b5->getFace(Block::k_min)->getEdge(b5->getVertex(0), b5->getVertex(2))->getCoEdge(v0, b5->getVertex(2))->setGeomAssociation(curves[1]); - b5->getFace(Block::k_min)->getEdge(b5->getVertex(0), b5->getVertex(2))->getCoEdge(b5->getVertex(0), v0)->setGeomAssociation(curves[0]); + b5_faces[Block::k_min]->getEdge(b5_vertices[0], b5_vertices[2])->getCoEdge(v0, b5_vertices[2])->setGeomAssociation(curves[1]); + b5_faces[Block::k_min]->getEdge(b5_vertices[0], b5_vertices[2])->getCoEdge(b5_vertices[0], v0)->setGeomAssociation(curves[0]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(0), b4->getVertex(2))->getCoEdge(b4->getVertex(0), v1)->setGeomAssociation(curves[1]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(0), b4->getVertex(2))->getCoEdge(b4->getVertex(2), v1)->setGeomAssociation(curves[0]); + b4_faces[Block::k_min]->getEdge(b4_vertices[0], b4_vertices[2])->getCoEdge(b4_vertices[0], v1)->setGeomAssociation(curves[1]); + b4_faces[Block::k_min]->getEdge(b4_vertices[0], b4_vertices[2])->getCoEdge(b4_vertices[2], v1)->setGeomAssociation(curves[0]); - b2->getFace(Block::k_min)->getEdge(b2->getVertex(0), b2->getVertex(2))->setGeomAssociation(curves[0]); - b2->getVertex(0)->setGeomAssociation(curves[0]); - b2->getVertex(2)->setGeomAssociation(curves[0]); + b2_faces[Block::k_min]->getEdge(b2_vertices[0], b2_vertices[2])->setGeomAssociation(curves[0]); + b2_vertices[0]->setGeomAssociation(curves[0]); + b2_vertices[2]->setGeomAssociation(curves[0]); - b3->getFace(Block::i_min)->getEdge(b3->getVertex(0), b3->getVertex(4))->setGeomAssociation(surfaces[1]); - b3->getFace(Block::i_min)->getEdge(b3->getVertex(2), b3->getVertex(6))->setGeomAssociation(surfaces[1]); + b3_faces[Block::i_min]->getEdge(b3_vertices[0], b3_vertices[4])->setGeomAssociation(surfaces[1]); + b3_faces[Block::i_min]->getEdge(b3_vertices[2], b3_vertices[6])->setGeomAssociation(surfaces[1]); - b2->getFace(Block::i_min)->getEdge(b2->getVertex(0), b2->getVertex(4))->setGeomAssociation(surfaces[2]); - b2->getFace(Block::i_min)->getEdge(b2->getVertex(2), b2->getVertex(6))->setGeomAssociation(surfaces[2]); + b2_faces[Block::i_min]->getEdge(b2_vertices[0], b2_vertices[4])->setGeomAssociation(surfaces[2]); + b2_faces[Block::i_min]->getEdge(b2_vertices[2], b2_vertices[6])->setGeomAssociation(surfaces[2]); - b1->getVertex(5)->setGeomAssociation(surfaces[1]); - b1->getVertex(7)->setGeomAssociation(surfaces[1]); - b1->getVertex(4)->setGeomAssociation(surfaces[2]); - b1->getVertex(6)->setGeomAssociation(surfaces[2]); + b1_vertices[5]->setGeomAssociation(surfaces[1]); + b1_vertices[7]->setGeomAssociation(surfaces[1]); + b1_vertices[4]->setGeomAssociation(surfaces[2]); + b1_vertices[6]->setGeomAssociation(surfaces[2]); - for (uint i=0; igetFace(Block::k_max)->getNbCoFaces(); i++){ - CoFace* coface = b1->getFace(Block::k_max)->getCoFace(i); - for (uint j=0; jgetNbEdges(); j++) - coface->getEdge(j)->setGeomAssociation(coface->getGeomAssociation()); - } + for (CoFace* cf : b1_faces[Block::k_max]->getCoFaces()) + for (Edge* e : cf->getEdges()) + e->setGeomAssociation(cf->getGeomAssociation()); // sur l'axe des Z - for (uint i=0; isetGeomAssociation(curves[2]); - for (uint j=0; jgetNbVertices(); j++) - splitingEdges[i]->getVertex(j)->setGeomAssociation(curves[2]); + for (Edge* e : splitingEdges){ + e->setGeomAssociation(curves[2]); + for (Topo::Vertex* ve : e->getVertices()) + ve->setGeomAssociation(curves[2]); } v0->setGeomAssociation(vertices[0]); v1->setGeomAssociation(vertices[1]); @@ -2656,8 +2748,8 @@ createSphereTopoOGridQuartDeg(Geom::PropertySphere* propertySph) // on place les sommets for (uint j=0; j<4; j++) for (uint i=0; i<4; i++){ - blocs[j]->getVertex(i)->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j+1][i]]); - blocs[j]->getVertex(i+4)->setCoord(centre); + blocs[j]->getVertices()[i]->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j+1][i]]); + blocs[j]->getVertices()[i+4]->setCoord(centre); } // dégénéréscence des blocs @@ -2665,11 +2757,15 @@ createSphereTopoOGridQuartDeg(Geom::PropertySphere* propertySph) blocs[j]->degenerateFaceInVertex(Block::k_max, &getInfoCommand()); // on fusionne les blocs - b4->getFace(Block::i_max)->fuse(b6->getFace(Block::i_max), &getInfoCommand()); - b3->getFace(Block::j_max)->fuse(b4->getFace(Block::j_min), &getInfoCommand()); - b3->getFace(Block::i_max)->fuse(b6->getFace(Block::j_max), &getInfoCommand()); - b3->getFace(Block::j_min)->fuse(b5->getFace(Block::j_max), &getInfoCommand()); - b5->getFace(Block::i_max)->fuse(b6->getFace(Block::i_min), &getInfoCommand()); + const std::vector& b3_faces = b3->getFaces(); + const std::vector& b4_faces = b4->getFaces(); + const std::vector& b5_faces = b5->getFaces(); + const std::vector& b6_faces = b6->getFaces(); + b4_faces[Block::i_max]->fuse(b6_faces[Block::i_max], &getInfoCommand()); + b3_faces[Block::j_max]->fuse(b4_faces[Block::j_min], &getInfoCommand()); + b3_faces[Block::i_max]->fuse(b6_faces[Block::j_max], &getInfoCommand()); + b3_faces[Block::j_min]->fuse(b5_faces[Block::j_max], &getInfoCommand()); + b5_faces[Block::i_max]->fuse(b6_faces[Block::i_min], &getInfoCommand()); // les projections sur la géométrie Geom::GetDownIncidentGeomEntitiesVisitor v; @@ -2687,22 +2783,22 @@ createSphereTopoOGridQuartDeg(Geom::PropertySphere* propertySph) // les projections for (uint j=0; j<4; j++){ - Face* face = blocs[j]->getFace(Block::k_min); + Face* face = blocs[j]->getFaces()[Block::k_min]; face->setGeomAssociation(surfaces[0]); for (uint i=0; i<4; i++){ - face->getEdge(i)->setGeomAssociation(surfaces[0]); - face->getVertex(i)->setGeomAssociation(surfaces[0]); + getEdge(face, i)->setGeomAssociation(surfaces[0]); + face->getVertices()[i]->setGeomAssociation(surfaces[0]); } } - b3->getFace(Block::i_min)->setGeomAssociation(surfaces[1]); - b4->getFace(Block::i_min)->setGeomAssociation(surfaces[1]); - b5->getFace(Block::i_min)->setGeomAssociation(surfaces[1]); + b3_faces[Block::i_min]->setGeomAssociation(surfaces[1]); + b4_faces[Block::i_min]->setGeomAssociation(surfaces[1]); + b5_faces[Block::i_min]->setGeomAssociation(surfaces[1]); - b4->getFace(Block::j_max)->setGeomAssociation(surfaces[2]); - b5->getFace(Block::j_min)->setGeomAssociation(surfaces[2]); - b6->getFace(Block::j_min)->setGeomAssociation(surfaces[2]); + b4_faces[Block::j_max]->setGeomAssociation(surfaces[2]); + b5_faces[Block::j_min]->setGeomAssociation(surfaces[2]); + b6_faces[Block::j_min]->setGeomAssociation(surfaces[2]); // les sommets géométriques @@ -2713,8 +2809,12 @@ createSphereTopoOGridQuartDeg(Geom::PropertySphere* propertySph) throw TkUtil::Exception(message); } - Vertex* v0 = b5->getVertex(0); - Vertex* v1 = b4->getVertex(2); + const std::vector& b3_vertices = b3->getVertices(); + const std::vector& b4_vertices = b4->getVertices(); + const std::vector& b5_vertices = b5->getVertices(); + const std::vector& b6_vertices = b6->getVertices(); + Vertex* v0 = b5_vertices[0]; + Vertex* v1 = b4_vertices[2]; v0->setGeomAssociation(vertices[0]); v1->setGeomAssociation(vertices[1]); v0->setCoord(vertices[0]->getCoord()); @@ -2728,32 +2828,32 @@ createSphereTopoOGridQuartDeg(Geom::PropertySphere* propertySph) } - b3->getFace(Block::k_min)->getEdge(b3->getVertex(0), b3->getVertex(2))->setGeomAssociation(curves[1]); + b3_faces[Block::k_min]->getEdge(b3_vertices[0], b3_vertices[2])->setGeomAssociation(curves[1]); - b5->getFace(Block::k_min)->getEdge(b5->getVertex(0), b5->getVertex(2))->setGeomAssociation(curves[1]); - b5->getFace(Block::k_min)->getEdge(b5->getVertex(0), b5->getVertex(1))->setGeomAssociation(curves[0]); + b5_faces[Block::k_min]->getEdge(b5_vertices[0], b5_vertices[2])->setGeomAssociation(curves[1]); + b5_faces[Block::k_min]->getEdge(b5_vertices[0], b5_vertices[1])->setGeomAssociation(curves[0]); - b6->getFace(Block::k_min)->getEdge(b6->getVertex(0), b6->getVertex(1))->setGeomAssociation(curves[0]); + b6_faces[Block::k_min]->getEdge(b6_vertices[0], b6_vertices[1])->setGeomAssociation(curves[0]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(0), b4->getVertex(2))->setGeomAssociation(curves[1]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(2), b4->getVertex(3))->setGeomAssociation(curves[0]); + b4_faces[Block::k_min]->getEdge(b4_vertices[0], b4_vertices[2])->setGeomAssociation(curves[1]); + b4_faces[Block::k_min]->getEdge(b4_vertices[2], b4_vertices[3])->setGeomAssociation(curves[0]); - b5->getVertex(2)->setGeomAssociation(curves[1]); - b5->getVertex(1)->setGeomAssociation(curves[0]); - b4->getVertex(0)->setGeomAssociation(curves[1]); - b4->getVertex(3)->setGeomAssociation(curves[0]); + b5_vertices[2]->setGeomAssociation(curves[1]); + b5_vertices[1]->setGeomAssociation(curves[0]); + b4_vertices[0]->setGeomAssociation(curves[1]); + b4_vertices[3]->setGeomAssociation(curves[0]); - b3->getFace(Block::i_min)->getEdge(b3->getVertex(0), b3->getVertex(4))->setGeomAssociation(surfaces[1]); - b3->getFace(Block::i_min)->getEdge(b3->getVertex(2), b3->getVertex(4))->setGeomAssociation(surfaces[1]); + b3_faces[Block::i_min]->getEdge(b3_vertices[0], b3_vertices[4])->setGeomAssociation(surfaces[1]); + b3_faces[Block::i_min]->getEdge(b3_vertices[2], b3_vertices[4])->setGeomAssociation(surfaces[1]); - b6->getFace(Block::j_min)->getEdge(b6->getVertex(0), b6->getVertex(4))->setGeomAssociation(surfaces[2]); - b6->getFace(Block::j_min)->getEdge(b6->getVertex(1), b6->getVertex(4))->setGeomAssociation(surfaces[2]); + b6_faces[Block::j_min]->getEdge(b6_vertices[0], b6_vertices[4])->setGeomAssociation(surfaces[2]); + b6_faces[Block::j_min]->getEdge(b6_vertices[1], b6_vertices[4])->setGeomAssociation(surfaces[2]); // sur l'axe des Z - b4->getFace(Block::j_max)->getEdge(b4->getVertex(2), b4->getVertex(4))->setGeomAssociation(curves[2]); - b5->getFace(Block::j_min)->getEdge(b5->getVertex(0), b5->getVertex(4))->setGeomAssociation(curves[2]); - b5->getVertex(4)->setGeomAssociation(curves[2]); + b4_faces[Block::j_max]->getEdge(b4_vertices[2], b4_vertices[4])->setGeomAssociation(curves[2]); + b5_faces[Block::j_min]->getEdge(b5_vertices[0], b5_vertices[4])->setGeomAssociation(curves[2]); + b5_vertices[4]->setGeomAssociation(curves[2]); } /*----------------------------------------------------------------------------*/ void CommandNewTopoOGridOnGeometry:: @@ -2818,24 +2918,35 @@ createSphereTopoOGridQuartNonDeg(Geom::PropertySphere* propertySph) split(); // split à faire avant les modifications // le bloc au centre (b1) + const std::vector& b1_vertices = b1->getVertices(); + const std::vector& b3_vertices = b3->getVertices(); + const std::vector& b4_vertices = b4->getVertices(); + const std::vector& b5_vertices = b5->getVertices(); + const std::vector& b6_vertices = b6->getVertices(); for (uint i=0; i<8; i++) - b1->getVertex(i)->setCoord(pts_int[i]); + b1_vertices[i]->setCoord(pts_int[i]); for (uint j=0; j<4; j++) for (uint i=0; i<4; i++){ - blocs[j]->getVertex(i)->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j+1][i]]); - blocs[j]->getVertex(i+4)->setCoord(pts_int[TopoHelper::tab2IndVtxByFaceOnBlock[j+1][i]]); + blocs[j]->getVertices()[i]->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[j+1][i]]); + blocs[j]->getVertices()[i+4]->setCoord(pts_int[TopoHelper::tab2IndVtxByFaceOnBlock[j+1][i]]); } + const std::vector& b1_faces = b1->getFaces(); + const std::vector& b3_faces = b3->getFaces(); + const std::vector& b4_faces = b4->getFaces(); + const std::vector& b5_faces = b5->getFaces(); + const std::vector& b6_faces = b6->getFaces(); + // on fusionne les blocs for (uint j=0; j<4; j++) - b1->getFace(j+1)->fuse(blocs[j]->getFace(Block::k_max), &getInfoCommand()); + b1_faces[j+1]->fuse(blocs[j]->getFaces()[Block::k_max], &getInfoCommand()); - b4->getFace(Block::i_max)->fuse(b6->getFace(Block::i_max), &getInfoCommand()); - b3->getFace(Block::j_max)->fuse(b4->getFace(Block::j_min), &getInfoCommand()); - b3->getFace(Block::i_max)->fuse(b6->getFace(Block::j_max), &getInfoCommand()); - b3->getFace(Block::j_min)->fuse(b5->getFace(Block::j_max), &getInfoCommand()); - b5->getFace(Block::i_max)->fuse(b6->getFace(Block::i_min), &getInfoCommand()); + b4_faces[Block::i_max]->fuse(b6_faces[Block::i_max], &getInfoCommand()); + b3_faces[Block::j_max]->fuse(b4_faces[Block::j_min], &getInfoCommand()); + b3_faces[Block::i_max]->fuse(b6_faces[Block::j_max], &getInfoCommand()); + b3_faces[Block::j_min]->fuse(b5_faces[Block::j_max], &getInfoCommand()); + b5_faces[Block::i_max]->fuse(b6_faces[Block::i_min], &getInfoCommand()); // les projections sur la géométrie Geom::GetDownIncidentGeomEntitiesVisitor v; @@ -2853,24 +2964,24 @@ createSphereTopoOGridQuartNonDeg(Geom::PropertySphere* propertySph) // les projections for (uint j=0; j<4; j++){ - Face* face = blocs[j]->getFace(Block::k_min); + Face* face = blocs[j]->getFaces()[Block::k_min]; face->setGeomAssociation(surfaces[0]); for (uint i=0; i<4; i++){ - face->getEdge(i)->setGeomAssociation(surfaces[0]); - face->getVertex(i)->setGeomAssociation(surfaces[0]); + getEdge(face, i)->setGeomAssociation(surfaces[0]); + face->getVertices()[i]->setGeomAssociation(surfaces[0]); } } - b1->getFace(Block::k_max)->setGeomAssociation(surfaces[1]); - b3->getFace(Block::i_min)->setGeomAssociation(surfaces[1]); - b4->getFace(Block::i_min)->setGeomAssociation(surfaces[1]); - b5->getFace(Block::i_min)->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_max]->setGeomAssociation(surfaces[1]); + b3_faces[Block::i_min]->setGeomAssociation(surfaces[1]); + b4_faces[Block::i_min]->setGeomAssociation(surfaces[1]); + b5_faces[Block::i_min]->setGeomAssociation(surfaces[1]); - b1->getFace(Block::i_min)->setGeomAssociation(surfaces[2]); - b4->getFace(Block::j_max)->setGeomAssociation(surfaces[2]); - b5->getFace(Block::j_min)->setGeomAssociation(surfaces[2]); - b6->getFace(Block::j_min)->setGeomAssociation(surfaces[2]); + b1_faces[Block::i_min]->setGeomAssociation(surfaces[2]); + b4_faces[Block::j_max]->setGeomAssociation(surfaces[2]); + b5_faces[Block::j_min]->setGeomAssociation(surfaces[2]); + b6_faces[Block::j_min]->setGeomAssociation(surfaces[2]); // les sommets géométriques @@ -2881,8 +2992,8 @@ createSphereTopoOGridQuartNonDeg(Geom::PropertySphere* propertySph) throw TkUtil::Exception(message); } - Vertex* v0 = b5->getVertex(0); - Vertex* v1 = b4->getVertex(2); + Vertex* v0 = b5_vertices[0]; + Vertex* v1 = b4_vertices[2]; v0->setGeomAssociation(vertices[0]); v1->setGeomAssociation(vertices[1]); v0->setCoord(vertices[0]->getCoord()); @@ -2895,48 +3006,48 @@ createSphereTopoOGridQuartNonDeg(Geom::PropertySphere* propertySph) throw TkUtil::Exception(message); } - b3->getFace(Block::k_min)->getEdge(b3->getVertex(0), b3->getVertex(2))->setGeomAssociation(curves[1]); + b3_faces[Block::k_min]->getEdge(b3_vertices[0], b3_vertices[2])->setGeomAssociation(curves[1]); - b5->getFace(Block::k_min)->getEdge(b5->getVertex(0), b5->getVertex(2))->setGeomAssociation(curves[1]); - b5->getFace(Block::k_min)->getEdge(b5->getVertex(0), b5->getVertex(1))->setGeomAssociation(curves[0]); + b5_faces[Block::k_min]->getEdge(b5_vertices[0], b5_vertices[2])->setGeomAssociation(curves[1]); + b5_faces[Block::k_min]->getEdge(b5_vertices[0], b5_vertices[1])->setGeomAssociation(curves[0]); - b6->getFace(Block::k_min)->getEdge(b6->getVertex(0), b6->getVertex(1))->setGeomAssociation(curves[0]); + b6_faces[Block::k_min]->getEdge(b6_vertices[0], b6_vertices[1])->setGeomAssociation(curves[0]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(0), b4->getVertex(2))->setGeomAssociation(curves[1]); - b4->getFace(Block::k_min)->getEdge(b4->getVertex(2), b4->getVertex(3))->setGeomAssociation(curves[0]); + b4_faces[Block::k_min]->getEdge(b4_vertices[0], b4_vertices[2])->setGeomAssociation(curves[1]); + b4_faces[Block::k_min]->getEdge(b4_vertices[2], b4_vertices[3])->setGeomAssociation(curves[0]); - b5->getVertex(2)->setGeomAssociation(curves[1]); - b5->getVertex(1)->setGeomAssociation(curves[0]); - b4->getVertex(0)->setGeomAssociation(curves[1]); - b4->getVertex(3)->setGeomAssociation(curves[0]); + b5_vertices[2]->setGeomAssociation(curves[1]); + b5_vertices[1]->setGeomAssociation(curves[0]); + b4_vertices[0]->setGeomAssociation(curves[1]); + b4_vertices[3]->setGeomAssociation(curves[0]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(0), b1->getVertex(2))->setGeomAssociation(surfaces[2]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(6), b1->getVertex(2))->setGeomAssociation(surfaces[2]); - b1->getFace(Block::i_min)->getEdge(b1->getVertex(0), b1->getVertex(4))->setGeomAssociation(surfaces[2]); + b1_faces[Block::i_min]->getEdge(b1_vertices[0], b1_vertices[2])->setGeomAssociation(surfaces[2]); + b1_faces[Block::i_min]->getEdge(b1_vertices[6], b1_vertices[2])->setGeomAssociation(surfaces[2]); + b1_faces[Block::i_min]->getEdge(b1_vertices[0], b1_vertices[4])->setGeomAssociation(surfaces[2]); - b1->getVertex(0)->setGeomAssociation(surfaces[2]); - b1->getVertex(2)->setGeomAssociation(surfaces[2]); + b1_vertices[0]->setGeomAssociation(surfaces[2]); + b1_vertices[2]->setGeomAssociation(surfaces[2]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(4), b1->getVertex(5))->setGeomAssociation(surfaces[1]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(5), b1->getVertex(7))->setGeomAssociation(surfaces[1]); - b1->getFace(Block::k_max)->getEdge(b1->getVertex(7), b1->getVertex(6))->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_max]->getEdge(b1_vertices[4], b1_vertices[5])->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_max]->getEdge(b1_vertices[5], b1_vertices[7])->setGeomAssociation(surfaces[1]); + b1_faces[Block::k_max]->getEdge(b1_vertices[7], b1_vertices[6])->setGeomAssociation(surfaces[1]); - b1->getVertex(5)->setGeomAssociation(surfaces[1]); - b1->getVertex(7)->setGeomAssociation(surfaces[1]); + b1_vertices[5]->setGeomAssociation(surfaces[1]); + b1_vertices[7]->setGeomAssociation(surfaces[1]); - b3->getFace(Block::i_min)->getEdge(b3->getVertex(0), b3->getVertex(4))->setGeomAssociation(surfaces[1]); - b3->getFace(Block::i_min)->getEdge(b3->getVertex(2), b3->getVertex(6))->setGeomAssociation(surfaces[1]); + b3_faces[Block::i_min]->getEdge(b3_vertices[0], b3_vertices[4])->setGeomAssociation(surfaces[1]); + b3_faces[Block::i_min]->getEdge(b3_vertices[2], b3_vertices[6])->setGeomAssociation(surfaces[1]); - b6->getFace(Block::j_min)->getEdge(b6->getVertex(0), b6->getVertex(4))->setGeomAssociation(surfaces[2]); - b6->getFace(Block::j_min)->getEdge(b6->getVertex(1), b6->getVertex(5))->setGeomAssociation(surfaces[2]); + b6_faces[Block::j_min]->getEdge(b6_vertices[0], b6_vertices[4])->setGeomAssociation(surfaces[2]); + b6_faces[Block::j_min]->getEdge(b6_vertices[1], b6_vertices[5])->setGeomAssociation(surfaces[2]); // sur l'axe des Z - b1->getFace(Block::i_min)->getEdge(b1->getVertex(4), b1->getVertex(6))->setGeomAssociation(curves[2]); - b4->getFace(Block::j_max)->getEdge(b4->getVertex(2), b4->getVertex(6))->setGeomAssociation(curves[2]); - b5->getFace(Block::j_min)->getEdge(b5->getVertex(0), b5->getVertex(4))->setGeomAssociation(curves[2]); - b1->getVertex(4)->setGeomAssociation(curves[2]); - b1->getVertex(6)->setGeomAssociation(curves[2]); + b1_faces[Block::i_min]->getEdge(b1_vertices[4], b1_vertices[6])->setGeomAssociation(curves[2]); + b4_faces[Block::j_max]->getEdge(b4_vertices[2], b4_vertices[6])->setGeomAssociation(curves[2]); + b5_faces[Block::j_min]->getEdge(b5_vertices[0], b5_vertices[4])->setGeomAssociation(curves[2]); + b1_vertices[4]->setGeomAssociation(curves[2]); + b1_vertices[6]->setGeomAssociation(curves[2]); } /*----------------------------------------------------------------------------*/ @@ -2991,8 +3102,8 @@ createSphereTopoOGridHuitiemeDeg(Geom::PropertySphere* propertySph) k=3; else if (j==2) k=4; - blocs[j]->getVertex(i)->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[k][i]]); - blocs[j]->getVertex(i+4)->setCoord(centre); + blocs[j]->getVertices()[i]->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[k][i]]); + blocs[j]->getVertices()[i+4]->setCoord(centre); } // dégénéréscence des blocs @@ -3000,9 +3111,12 @@ createSphereTopoOGridHuitiemeDeg(Geom::PropertySphere* propertySph) blocs[j]->degenerateFaceInVertex(Block::k_max, &getInfoCommand()); // on fusionne les blocs - b3->getFace(Block::i_max)->fuse(b6->getFace(Block::j_max), &getInfoCommand()); - b3->getFace(Block::j_min)->fuse(b5->getFace(Block::j_max), &getInfoCommand()); - b5->getFace(Block::i_max)->fuse(b6->getFace(Block::i_min), &getInfoCommand()); + const std::vector& b3_faces = b3->getFaces(); + const std::vector& b5_faces = b5->getFaces(); + const std::vector& b6_faces = b6->getFaces(); + b3_faces[Block::i_max]->fuse(b6_faces[Block::j_max], &getInfoCommand()); + b3_faces[Block::j_min]->fuse(b5_faces[Block::j_max], &getInfoCommand()); + b5_faces[Block::i_max]->fuse(b6_faces[Block::i_min], &getInfoCommand()); // les projections sur la géométrie Geom::GetDownIncidentGeomEntitiesVisitor v; @@ -3020,23 +3134,27 @@ createSphereTopoOGridHuitiemeDeg(Geom::PropertySphere* propertySph) // les projections for (uint j=0; j<3; j++){ - Face* face = blocs[j]->getFace(Block::k_min); + Face* face = blocs[j]->getFaces()[Block::k_min]; face->setGeomAssociation(surfaces[0]); for (uint i=0; i<4; i++){ - face->getEdge(i)->setGeomAssociation(surfaces[0]); - face->getVertex(i)->setGeomAssociation(surfaces[0]); + getEdge(face, i)->setGeomAssociation(surfaces[0]); + face->getVertices()[i]->setGeomAssociation(surfaces[0]); } } - b3->getFace(Block::j_max)->setGeomAssociation(surfaces[1]); - b6->getFace(Block::i_max)->setGeomAssociation(surfaces[1]); + const std::vector& b3_vertices = b3->getVertices(); + const std::vector& b5_vertices = b5->getVertices(); + const std::vector& b6_vertices = b6->getVertices(); - b3->getFace(Block::i_min)->setGeomAssociation(surfaces[2]); - b5->getFace(Block::i_min)->setGeomAssociation(surfaces[2]); + b3_faces[Block::j_max]->setGeomAssociation(surfaces[1]); + b6_faces[Block::i_max]->setGeomAssociation(surfaces[1]); - b5->getFace(Block::j_min)->setGeomAssociation(surfaces[3]); - b6->getFace(Block::j_min)->setGeomAssociation(surfaces[3]); + b3_faces[Block::i_min]->setGeomAssociation(surfaces[2]); + b5_faces[Block::i_min]->setGeomAssociation(surfaces[2]); + + b5_faces[Block::j_min]->setGeomAssociation(surfaces[3]); + b6_faces[Block::j_min]->setGeomAssociation(surfaces[3]); // les sommets géométriques @@ -3047,10 +3165,10 @@ createSphereTopoOGridHuitiemeDeg(Geom::PropertySphere* propertySph) throw TkUtil::Exception(message); } - Vertex* v0 = b5->getVertex(0); - Vertex* v1 = b6->getVertex(1); - Vertex* v2 = b3->getVertex(2); - Vertex* v3 = b3->getVertex(4); + Vertex* v0 = b5_vertices[0]; + Vertex* v1 = b6_vertices[1]; + Vertex* v2 = b3_vertices[2]; + Vertex* v3 = b3_vertices[4]; v0->setGeomAssociation(vertices[0]); v1->setGeomAssociation(vertices[1]); @@ -3069,26 +3187,26 @@ createSphereTopoOGridHuitiemeDeg(Geom::PropertySphere* propertySph) } - b3->getFace(Block::k_min)->getEdge(b3->getVertex(2), b3->getVertex(3))->setGeomAssociation(curves[1]); - b3->getFace(Block::k_min)->getEdge(b3->getVertex(0), b3->getVertex(2))->setGeomAssociation(curves[2]); + b3_faces[Block::k_min]->getEdge(b3_vertices[2], b3_vertices[3])->setGeomAssociation(curves[1]); + b3_faces[Block::k_min]->getEdge(b3_vertices[0], b3_vertices[2])->setGeomAssociation(curves[2]); - b5->getFace(Block::k_min)->getEdge(b5->getVertex(0), b5->getVertex(2))->setGeomAssociation(curves[2]); - b5->getFace(Block::k_min)->getEdge(b5->getVertex(0), b5->getVertex(1))->setGeomAssociation(curves[0]); + b5_faces[Block::k_min]->getEdge(b5_vertices[0], b5_vertices[2])->setGeomAssociation(curves[2]); + b5_faces[Block::k_min]->getEdge(b5_vertices[0], b5_vertices[1])->setGeomAssociation(curves[0]); - b6->getFace(Block::k_min)->getEdge(b6->getVertex(1), b6->getVertex(3))->setGeomAssociation(curves[1]); - b6->getFace(Block::k_min)->getEdge(b6->getVertex(0), b6->getVertex(1))->setGeomAssociation(curves[0]); + b6_faces[Block::k_min]->getEdge(b6_vertices[1], b6_vertices[3])->setGeomAssociation(curves[1]); + b6_faces[Block::k_min]->getEdge(b6_vertices[0], b6_vertices[1])->setGeomAssociation(curves[0]); - b3->getVertex(3)->setGeomAssociation(curves[1]); - b5->getVertex(2)->setGeomAssociation(curves[2]); - b6->getVertex(0)->setGeomAssociation(curves[0]); + b3_vertices[3]->setGeomAssociation(curves[1]); + b5_vertices[2]->setGeomAssociation(curves[2]); + b6_vertices[0]->setGeomAssociation(curves[0]); - b3->getFace(Block::j_max)->getEdge(b3->getVertex(4), b3->getVertex(3))->setGeomAssociation(surfaces[1]); - b3->getFace(Block::i_min)->getEdge(b3->getVertex(0), b3->getVertex(4))->setGeomAssociation(surfaces[2]); - b5->getFace(Block::j_min)->getEdge(b5->getVertex(1), b5->getVertex(4))->setGeomAssociation(surfaces[3]); + b3_faces[Block::j_max]->getEdge(b3_vertices[4], b3_vertices[3])->setGeomAssociation(surfaces[1]); + b3_faces[Block::i_min]->getEdge(b3_vertices[0], b3_vertices[4])->setGeomAssociation(surfaces[2]); + b5_faces[Block::j_min]->getEdge(b5_vertices[1], b5_vertices[4])->setGeomAssociation(surfaces[3]); - b3->getFace(Block::j_max)->getEdge(b3->getVertex(2), b3->getVertex(4))->setGeomAssociation(curves[4]); - b5->getFace(Block::j_min)->getEdge(b5->getVertex(0), b5->getVertex(4))->setGeomAssociation(curves[5]); - b6->getFace(Block::i_max)->getEdge(b6->getVertex(1), b6->getVertex(4))->setGeomAssociation(curves[3]); + b3_faces[Block::j_max]->getEdge(b3_vertices[2], b3_vertices[4])->setGeomAssociation(curves[4]); + b5_faces[Block::j_min]->getEdge(b5_vertices[0], b5_vertices[4])->setGeomAssociation(curves[5]); + b6_faces[Block::i_max]->getEdge(b6_vertices[1], b6_vertices[4])->setGeomAssociation(curves[3]); } /*----------------------------------------------------------------------------*/ @@ -3152,8 +3270,12 @@ createSphereTopoOGridHuitiemeNonDeg(Geom::PropertySphere* propertySph) // le bloc au centre (b1) + const std::vector& b1_vertices = b1->getVertices(); + const std::vector& b3_vertices = b3->getVertices(); + const std::vector& b5_vertices = b5->getVertices(); + const std::vector& b6_vertices = b6->getVertices(); for (uint i=0; i<8; i++) - b1->getVertex(i)->setCoord(pts_int[i]); + b1_vertices[i]->setCoord(pts_int[i]); for (uint j=0; j<3; j++) for (uint i=0; i<4; i++){ @@ -3164,12 +3286,16 @@ createSphereTopoOGridHuitiemeNonDeg(Geom::PropertySphere* propertySph) k=3; else if (j==2) k=4; - blocs[j]->getVertex(i)->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[k][i]]); - blocs[j]->getVertex(i+4)->setCoord(pts_int[TopoHelper::tab2IndVtxByFaceOnBlock[k][i]]); + blocs[j]->getVertices()[i]->setCoord(pts_ext[TopoHelper::tab2IndVtxByFaceOnBlock[k][i]]); + blocs[j]->getVertices()[i+4]->setCoord(pts_int[TopoHelper::tab2IndVtxByFaceOnBlock[k][i]]); } // on fusionne les blocs + const std::vector& b1_faces = b1->getFaces(); + const std::vector& b3_faces = b3->getFaces(); + const std::vector& b5_faces = b5->getFaces(); + const std::vector& b6_faces = b6->getFaces(); for (uint j=0; j<3; j++){ uint k = 0; if (j==0) @@ -3178,13 +3304,12 @@ createSphereTopoOGridHuitiemeNonDeg(Geom::PropertySphere* propertySph) k=3; else if (j==2) k=4; - b1->getFace(k)->fuse(blocs[j]->getFace(Block::k_max), &getInfoCommand()); + b1_faces[k]->fuse(blocs[j]->getFaces()[Block::k_max], &getInfoCommand()); } - b3->getFace(Block::i_max)->fuse(b6->getFace(Block::j_max), &getInfoCommand()); - b3->getFace(Block::j_min)->fuse(b5->getFace(Block::j_max), &getInfoCommand()); - b5->getFace(Block::i_max)->fuse(b6->getFace(Block::i_min), &getInfoCommand()); - + b3_faces[Block::i_max]->fuse(b6_faces[Block::j_max], &getInfoCommand()); + b3_faces[Block::j_min]->fuse(b5_faces[Block::j_max], &getInfoCommand()); + b5_faces[Block::i_max]->fuse(b6_faces[Block::i_min], &getInfoCommand()); // les projections sur la géométrie Geom::GetDownIncidentGeomEntitiesVisitor v; @@ -3202,26 +3327,26 @@ createSphereTopoOGridHuitiemeNonDeg(Geom::PropertySphere* propertySph) // les projections for (uint j=0; j<3; j++){ - Face* face = blocs[j]->getFace(Block::k_min); + Face* face = blocs[j]->getFaces()[Block::k_min]; face->setGeomAssociation(surfaces[0]); for (uint i=0; i<4; i++){ - face->getEdge(i)->setGeomAssociation(surfaces[0]); - face->getVertex(i)->setGeomAssociation(surfaces[0]); + getEdge(face, i)->setGeomAssociation(surfaces[0]); + face->getVertices()[i]->setGeomAssociation(surfaces[0]); } } - b1->getFace(Block::j_min)->setGeomAssociation(surfaces[1]); - b3->getFace(Block::j_max)->setGeomAssociation(surfaces[1]); - b6->getFace(Block::i_max)->setGeomAssociation(surfaces[1]); + b1_faces[Block::j_min]->setGeomAssociation(surfaces[1]); + b3_faces[Block::j_max]->setGeomAssociation(surfaces[1]); + b6_faces[Block::i_max]->setGeomAssociation(surfaces[1]); - b1->getFace(Block::k_max)->setGeomAssociation(surfaces[2]); - b3->getFace(Block::i_min)->setGeomAssociation(surfaces[2]); - b5->getFace(Block::i_min)->setGeomAssociation(surfaces[2]); + b1_faces[Block::k_max]->setGeomAssociation(surfaces[2]); + b3_faces[Block::i_min]->setGeomAssociation(surfaces[2]); + b5_faces[Block::i_min]->setGeomAssociation(surfaces[2]); - b1->getFace(Block::i_min)->setGeomAssociation(surfaces[3]); - b5->getFace(Block::j_min)->setGeomAssociation(surfaces[3]); - b6->getFace(Block::j_min)->setGeomAssociation(surfaces[3]); + b1_faces[Block::i_min]->setGeomAssociation(surfaces[3]); + b5_faces[Block::j_min]->setGeomAssociation(surfaces[3]); + b6_faces[Block::j_min]->setGeomAssociation(surfaces[3]); // les sommets géométriques @@ -3232,11 +3357,10 @@ createSphereTopoOGridHuitiemeNonDeg(Geom::PropertySphere* propertySph) throw TkUtil::Exception(message); } - Vertex* v0 = b5->getVertex(0); - Vertex* v1 = b6->getVertex(1); - Vertex* v2 = b3->getVertex(2); - Vertex* v3 = b1->getVertex(4); - + Vertex* v0 = b5_vertices[0]; + Vertex* v1 = b6_vertices[1]; + Vertex* v2 = b3_vertices[2]; + Vertex* v3 = b1_vertices[4]; v0->setGeomAssociation(vertices[0]); v1->setGeomAssociation(vertices[1]); v2->setGeomAssociation(vertices[2]); @@ -3259,47 +3383,47 @@ createSphereTopoOGridHuitiemeNonDeg(Geom::PropertySphere* propertySph) // for (uint i=0; i& cf_vertices = cf->getVertices(); if (std::fabs(pmin.getZ()-pmax.getZ())getVertex(0)->setCoord(Utils::Math::Point(pmin.getX(), pmax.getY(), pmin.getZ())); - cf->getVertex(1)->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmin.getZ())); - cf->getVertex(2)->setCoord(Utils::Math::Point(pmax.getX(), pmin.getY(), pmin.getZ())); - cf->getVertex(3)->setCoord(Utils::Math::Point(pmax.getX(), pmax.getY(), pmin.getZ())); + cf_vertices[0]->setCoord(Utils::Math::Point(pmin.getX(), pmax.getY(), pmin.getZ())); + cf_vertices[1]->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmin.getZ())); + cf_vertices[2]->setCoord(Utils::Math::Point(pmax.getX(), pmin.getY(), pmin.getZ())); + cf_vertices[3]->setCoord(Utils::Math::Point(pmax.getX(), pmax.getY(), pmin.getZ())); } else if (std::fabs(pmin.getY()-pmax.getY())getVertex(0)->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmax.getZ())); - cf->getVertex(1)->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmin.getZ())); - cf->getVertex(2)->setCoord(Utils::Math::Point(pmax.getX(), pmin.getY(), pmin.getZ())); - cf->getVertex(3)->setCoord(Utils::Math::Point(pmax.getX(), pmin.getY(), pmax.getZ())); + cf_vertices[0]->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmax.getZ())); + cf_vertices[1]->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmin.getZ())); + cf_vertices[2]->setCoord(Utils::Math::Point(pmax.getX(), pmin.getY(), pmin.getZ())); + cf_vertices[3]->setCoord(Utils::Math::Point(pmax.getX(), pmin.getY(), pmax.getZ())); } else if (std::fabs(pmin.getX()-pmax.getX())getVertex(0)->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmax.getZ())); - cf->getVertex(1)->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmin.getZ())); - cf->getVertex(2)->setCoord(Utils::Math::Point(pmin.getX(), pmax.getY(), pmin.getZ())); - cf->getVertex(3)->setCoord(Utils::Math::Point(pmin.getX(), pmax.getY(), pmax.getZ())); + cf_vertices[0]->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmax.getZ())); + cf_vertices[1]->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmin.getZ())); + cf_vertices[2]->setCoord(Utils::Math::Point(pmin.getX(), pmax.getY(), pmin.getZ())); + cf_vertices[3]->setCoord(Utils::Math::Point(pmin.getX(), pmax.getY(), pmax.getZ())); } else { - cf->getVertex(0)->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmax.getZ())); - cf->getVertex(1)->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmin.getZ())); - cf->getVertex(2)->setCoord(Utils::Math::Point(pmax.getX(), pmax.getY(), pmin.getZ())); - cf->getVertex(3)->setCoord(Utils::Math::Point(pmax.getX(), pmax.getY(), pmax.getZ())); + cf_vertices[0]->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmax.getZ())); + cf_vertices[1]->setCoord(Utils::Math::Point(pmin.getX(), pmin.getY(), pmin.getZ())); + cf_vertices[2]->setCoord(Utils::Math::Point(pmax.getX(), pmax.getY(), pmin.getZ())); + cf_vertices[3]->setCoord(Utils::Math::Point(pmax.getX(), pmax.getY(), pmax.getZ())); } } } @@ -443,33 +444,35 @@ void CommandNewTopoOnGeometry::createSpherePartBlock() std::vector curves (v.getCurves().begin(), v.getCurves().end()); std::vector vertices (v.getVertices().begin(), v.getVertices().end()); + const std::vector& bloc_vertices = bloc->getVertices(); for (uint i=0; i<5; i++) - bloc->getVertex(i)->setCoord(vertices[i]->getCoord()); + bloc_vertices[i]->setCoord(vertices[i]->getCoord()); for (uint i=5; i<8; i++) - bloc->getVertex(i)->setCoord(vertices[4]->getCoord()); + bloc_vertices[i]->setCoord(vertices[4]->getCoord()); bloc->degenerateFaceInVertex(Block::k_max, &getInfoCommand()); // les associations bloc->setGeomAssociation(getGeomEntity()); - bloc->getFace(Block::k_min)->getEdge(bloc->getVertex(0), bloc->getVertex(1))->setGeomAssociation(curves[0]); - bloc->getFace(Block::k_min)->getEdge(bloc->getVertex(0), bloc->getVertex(2))->setGeomAssociation(curves[1]); - bloc->getFace(Block::k_min)->getEdge(bloc->getVertex(3), bloc->getVertex(2))->setGeomAssociation(curves[2]); - bloc->getFace(Block::k_min)->getEdge(bloc->getVertex(3), bloc->getVertex(1))->setGeomAssociation(curves[3]); - bloc->getFace(Block::i_min)->getEdge(bloc->getVertex(0), bloc->getVertex(4))->setGeomAssociation(curves[4]); - bloc->getFace(Block::i_min)->getEdge(bloc->getVertex(2), bloc->getVertex(4))->setGeomAssociation(curves[6]); - bloc->getFace(Block::i_max)->getEdge(bloc->getVertex(1), bloc->getVertex(4))->setGeomAssociation(curves[5]); - bloc->getFace(Block::i_max)->getEdge(bloc->getVertex(3), bloc->getVertex(4))->setGeomAssociation(curves[7]); - - bloc->getFace(Block::k_min)->setGeomAssociation(surfaces[0]); - bloc->getFace(Block::i_min)->setGeomAssociation(surfaces[2]); - bloc->getFace(Block::i_max)->setGeomAssociation(surfaces[4]); - bloc->getFace(Block::j_min)->setGeomAssociation(surfaces[1]); - bloc->getFace(Block::j_max)->setGeomAssociation(surfaces[3]); + const std::vector& bloc_faces = bloc->getFaces(); + bloc_faces[Block::k_min]->getEdge(bloc_vertices[0], bloc_vertices[1])->setGeomAssociation(curves[0]); + bloc_faces[Block::k_min]->getEdge(bloc_vertices[0], bloc_vertices[2])->setGeomAssociation(curves[1]); + bloc_faces[Block::k_min]->getEdge(bloc_vertices[3], bloc_vertices[2])->setGeomAssociation(curves[2]); + bloc_faces[Block::k_min]->getEdge(bloc_vertices[3], bloc_vertices[1])->setGeomAssociation(curves[3]); + bloc_faces[Block::i_min]->getEdge(bloc_vertices[0], bloc_vertices[4])->setGeomAssociation(curves[4]); + bloc_faces[Block::i_min]->getEdge(bloc_vertices[2], bloc_vertices[4])->setGeomAssociation(curves[6]); + bloc_faces[Block::i_max]->getEdge(bloc_vertices[1], bloc_vertices[4])->setGeomAssociation(curves[5]); + bloc_faces[Block::i_max]->getEdge(bloc_vertices[3], bloc_vertices[4])->setGeomAssociation(curves[7]); + + bloc_faces[Block::k_min]->setGeomAssociation(surfaces[0]); + bloc_faces[Block::i_min]->setGeomAssociation(surfaces[2]); + bloc_faces[Block::i_max]->setGeomAssociation(surfaces[4]); + bloc_faces[Block::j_min]->setGeomAssociation(surfaces[1]); + bloc_faces[Block::j_max]->setGeomAssociation(surfaces[3]); for (uint i=0; i<5; i++) - bloc->getVertex(i)->setGeomAssociation(vertices[i]); + bloc_vertices[i]->setGeomAssociation(vertices[i]); } /*----------------------------------------------------------------------------*/ void CommandNewTopoOnGeometry::createHollowSpherePartBlock() @@ -486,34 +489,36 @@ void CommandNewTopoOnGeometry::createHollowSpherePartBlock() std::vector curves (v.getCurves().begin(), v.getCurves().end()); std::vector vertices (v.getVertices().begin(), v.getVertices().end()); + const std::vector& bloc_vertices = bloc->getVertices(); for (uint i=0; i<8; i++) - bloc->getVertex(i)->setCoord(vertices[i]->getCoord()); + bloc_vertices[i]->setCoord(vertices[i]->getCoord()); // les associations bloc->setGeomAssociation(getGeomEntity()); - bloc->getFace(Block::k_min)->getEdge(bloc->getVertex(0), bloc->getVertex(1))->setGeomAssociation(curves[0]); - bloc->getFace(Block::k_min)->getEdge(bloc->getVertex(0), bloc->getVertex(2))->setGeomAssociation(curves[1]); - bloc->getFace(Block::k_min)->getEdge(bloc->getVertex(3), bloc->getVertex(2))->setGeomAssociation(curves[2]); - bloc->getFace(Block::k_min)->getEdge(bloc->getVertex(3), bloc->getVertex(1))->setGeomAssociation(curves[3]); - bloc->getFace(Block::i_min)->getEdge(bloc->getVertex(0), bloc->getVertex(4))->setGeomAssociation(curves[4]); - bloc->getFace(Block::i_max)->getEdge(bloc->getVertex(5), bloc->getVertex(1))->setGeomAssociation(curves[6]); - bloc->getFace(Block::i_max)->getEdge(bloc->getVertex(3), bloc->getVertex(7))->setGeomAssociation(curves[10]); - bloc->getFace(Block::i_min)->getEdge(bloc->getVertex(2), bloc->getVertex(6))->setGeomAssociation(curves[8]); - bloc->getFace(Block::k_max)->getEdge(bloc->getVertex(4), bloc->getVertex(5))->setGeomAssociation(curves[5]); - bloc->getFace(Block::k_max)->getEdge(bloc->getVertex(6), bloc->getVertex(7))->setGeomAssociation(curves[9]); - bloc->getFace(Block::k_max)->getEdge(bloc->getVertex(4), bloc->getVertex(6))->setGeomAssociation(curves[7]); - bloc->getFace(Block::k_max)->getEdge(bloc->getVertex(5), bloc->getVertex(7))->setGeomAssociation(curves[11]); - - bloc->getFace(Block::k_min)->setGeomAssociation(surfaces[0]); - bloc->getFace(Block::i_min)->setGeomAssociation(surfaces[2]); - bloc->getFace(Block::i_max)->setGeomAssociation(surfaces[4]); - bloc->getFace(Block::j_min)->setGeomAssociation(surfaces[1]); - bloc->getFace(Block::j_max)->setGeomAssociation(surfaces[3]); - bloc->getFace(Block::k_max)->setGeomAssociation(surfaces[5]); + const std::vector& bloc_faces = bloc->getFaces(); + bloc_faces[Block::k_min]->getEdge(bloc_vertices[0], bloc_vertices[1])->setGeomAssociation(curves[0]); + bloc_faces[Block::k_min]->getEdge(bloc_vertices[0], bloc_vertices[2])->setGeomAssociation(curves[1]); + bloc_faces[Block::k_min]->getEdge(bloc_vertices[3], bloc_vertices[2])->setGeomAssociation(curves[2]); + bloc_faces[Block::k_min]->getEdge(bloc_vertices[3], bloc_vertices[1])->setGeomAssociation(curves[3]); + bloc_faces[Block::i_min]->getEdge(bloc_vertices[0], bloc_vertices[4])->setGeomAssociation(curves[4]); + bloc_faces[Block::i_max]->getEdge(bloc_vertices[5], bloc_vertices[1])->setGeomAssociation(curves[6]); + bloc_faces[Block::i_max]->getEdge(bloc_vertices[3], bloc_vertices[7])->setGeomAssociation(curves[10]); + bloc_faces[Block::i_min]->getEdge(bloc_vertices[2], bloc_vertices[6])->setGeomAssociation(curves[8]); + bloc_faces[Block::k_max]->getEdge(bloc_vertices[4], bloc_vertices[5])->setGeomAssociation(curves[5]); + bloc_faces[Block::k_max]->getEdge(bloc_vertices[6], bloc_vertices[7])->setGeomAssociation(curves[9]); + bloc_faces[Block::k_max]->getEdge(bloc_vertices[4], bloc_vertices[6])->setGeomAssociation(curves[7]); + bloc_faces[Block::k_max]->getEdge(bloc_vertices[5], bloc_vertices[7])->setGeomAssociation(curves[11]); + + bloc_faces[Block::k_min]->setGeomAssociation(surfaces[0]); + bloc_faces[Block::i_min]->setGeomAssociation(surfaces[2]); + bloc_faces[Block::i_max]->setGeomAssociation(surfaces[4]); + bloc_faces[Block::j_min]->setGeomAssociation(surfaces[1]); + bloc_faces[Block::j_max]->setGeomAssociation(surfaces[3]); + bloc_faces[Block::k_max]->setGeomAssociation(surfaces[5]); for (uint i=0; i<8; i++) - bloc->getVertex(i)->setGeomAssociation(vertices[i]); + bloc_vertices[i]->setGeomAssociation(vertices[i]); } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Topo/CommandProjectEdgesOnCurves.cpp b/src/Core/Topo/CommandProjectEdgesOnCurves.cpp index 9ac4121d..02509822 100644 --- a/src/Core/Topo/CommandProjectEdgesOnCurves.cpp +++ b/src/Core/Topo/CommandProjectEdgesOnCurves.cpp @@ -70,11 +70,11 @@ internalExecute() // recherche des courbes associées au premier sommet topo std::vector curves1; - Internal::EntitiesHelper::getAssociatedCurves(coedge->getVertex(0), curves1); + Internal::EntitiesHelper::getAssociatedCurves(coedge->getVertices()[0], curves1); // idem avec le 2ème sommet std::vector curves2; - Internal::EntitiesHelper::getAssociatedCurves(coedge->getVertex(1), curves2); + Internal::EntitiesHelper::getAssociatedCurves(coedge->getVertices()[1], curves2); // recherche de la courbe commune entre les deux groupes Geom::GeomEntity* ge = Geom::GeomHelper::getCommonCurve(curves1, curves2); @@ -83,11 +83,11 @@ internalExecute() // on tente avec une surface // recherche des surfaces associées au premier sommet topo std::vector surf1; - Internal::EntitiesHelper::getAssociatedSurfaces(coedge->getVertex(0), surf1); + Internal::EntitiesHelper::getAssociatedSurfaces(coedge->getVertices()[0], surf1); // idem avec le 2ème sommet std::vector surf2; - Internal::EntitiesHelper::getAssociatedSurfaces(coedge->getVertex(1), surf2); + Internal::EntitiesHelper::getAssociatedSurfaces(coedge->getVertices()[1], surf2); // recherche de la surface commune entre les deux groupes ge = Geom::GeomHelper::getCommonSurface(surf1, surf2); diff --git a/src/Core/Topo/CommandSetBlockMeshingProperty.cpp b/src/Core/Topo/CommandSetBlockMeshingProperty.cpp index 0c9d995c..d441ef45 100644 --- a/src/Core/Topo/CommandSetBlockMeshingProperty.cpp +++ b/src/Core/Topo/CommandSetBlockMeshingProperty.cpp @@ -61,9 +61,7 @@ internalExecute() if (!(*iter)->isStructured() && m_prop->isStructured()) { // vérification que les faces sont structurées - std::vector cofaces; - (*iter)->getCoFaces(cofaces); - + std::vector cofaces = (*iter)->getCoFaces(); for (uint i=0; iisStructured()){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -77,40 +75,37 @@ internalExecute() (*iter)->saveBlockMeshingProperty(&getInfoCommand()); Face* face_base = 0; - if ((*iter)->getNbFaces()==4 || (*iter)->getNbFaces()==5){ + const std::vector& faces = (*iter)->getFaces(); + if (faces.size()==4 || faces.size()==5){ // recherche d'une face à l'opposé de la dégénérence // filtre pour marquer à 1 les sommets qui sont à la dégénérence d'une face std::map filtre_sommets; - for (uint i=0; i<(*iter)->getNbFaces(); i++){ - Face* face=(*iter)->getFace(i); - if (face->getNbVertices()==3) - filtre_sommets[face->getVertex(0)] = 1; + for (Face* face : faces){ + if (face->getVertices().size()==3) + filtre_sommets[face->getVertices()[0]] = 1; } // recherche une face dont aucun sommet n'est marqué - for (uint i=0; i<(*iter)->getNbFaces(); i++){ - Face* face=(*iter)->getFace(i); - std::vector face_vertices; - face->getVertices(face_vertices); + for (Face* face : faces){ bool acceptable = true; - for (uint j=0; jgetVertices()) + if (filtre_sommets[vtx] == 1 ) acceptable = false; if (acceptable) face_base = face; } } - else if ((*iter)->getNbFaces()==6){ + else if (faces.size()==6){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Il n'est pas possible de rendre le bloc "<<(*iter)->getName() - << " structuré car il a " <<(short)(*iter)->getNbFaces() + << " structuré car il a " <<(short)faces.size() <<" faces et non 6 (voir 4 ou 5 pour cas dégénérés)"; throw TkUtil::Exception(messErr); } else { // cas à 6 faces, on prend la première venue - face_base = (*iter)->getFace(0); + face_base = faces[0]; } if (face_base == 0){ @@ -125,10 +120,10 @@ internalExecute() std::vector sorted_vertices; // les sommets pour bloc hexaédrique (certains peuvent apparaitrent 2 fois ou plus) std::vector hexa_vertices; - sorted_vertices.push_back(face_base->getVertex(0)); - sorted_vertices.push_back(face_base->getVertex(1)); - sorted_vertices.push_back(face_base->getVertex(3)); - sorted_vertices.push_back(face_base->getVertex(2)); + sorted_vertices.push_back(face_base->getVertices()[0]); + sorted_vertices.push_back(face_base->getVertices()[1]); + sorted_vertices.push_back(face_base->getVertices()[3]); + sorted_vertices.push_back(face_base->getVertices()[2]); hexa_vertices.insert(hexa_vertices.end(), sorted_vertices.begin(), sorted_vertices.end()); // marque à 2 les sommets vus (ceux de la face de base) @@ -141,8 +136,8 @@ internalExecute() // recherche le sommet suivant pour une face dans un bloc avec 2 sommets non marqués à 2 for (uint i=0; i<4; i++){ Vertex* vtx_suiv = getNextVertex(*iter, - face_base->getVertex((i+1)%4), - face_base->getVertex(i), + face_base->getVertices()[(i+1)%4], + face_base->getVertices()[i], filtre_sommets); if (vtx_suiv){ @@ -183,23 +178,23 @@ internalExecute() throw TkUtil::Exception(messErr); } - if ((*iter)->getNbVertices() != sorted_vertices.size()){ + const std::vector& vertices = (*iter)->getVertices(); + if (vertices.size() != sorted_vertices.size()){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Erreur interne pour le bloc "<<(*iter)->getName() << ", le nombre de sommets a changé (" <<(short)sorted_vertices.size() <<" trouvés au lieu de " - <<(short)(*iter)->getNbVertices()<<")"; + <<(short)vertices.size()<<")"; throw TkUtil::Exception(messErr); } // change l'ordre des sommets - (*iter)->m_topo_property->getVertexContainer().clear(); - (*iter)->m_topo_property->getVertexContainer().add(sorted_vertices); + (*iter)->m_topo_property->getVertexContainer() = sorted_vertices; // réordonne les faces en fonction des sommets std::vector sorted_faces; - for (uint i=0; i<(*iter)->getNbFaces(); i++){ + for (uint i=0; igetFace( hexa_vertices[TopoHelper::tabIndVtxByFaceOnBlock[i][0]], hexa_vertices[TopoHelper::tabIndVtxByFaceOnBlock[i][1]], @@ -208,8 +203,7 @@ internalExecute() } - (*iter)->m_topo_property->getFaceContainer().clear(); - (*iter)->m_topo_property->getFaceContainer().add(sorted_faces); + (*iter)->m_topo_property->getFaceContainer() = sorted_faces; } // end if (!(*iter)->isStructured() && m_prop->isStructured()) @@ -238,17 +232,15 @@ getNextVertex(Block* bloc, Vertex* vtx1, Vertex* vtx2, std::mapgetNbFaces(); i++){ - Face* face=bloc->getFace(i); + const std::vector& faces = bloc->getFaces(); + for (Face* face : faces){ //std::cout<<"face : "<getName()< face_vertices; - face->getVertices(face_vertices); uint nb2 = 0; // sommets dans la face de base (autre que les 2 de départ) uint nb3 = 0; // sommets qui valide la face avec 2 des sommets sélectionnés - for (uint j=0; jgetVertices()) + if (filtre_sommets[vtx] == 3) nb3 += 1; - else if (filtre_sommets[face_vertices[j]] == 2) + else if (filtre_sommets[vtx] == 2) nb2 += 2; if (nb3 == 2 && nb2 == 0) face_select = face; @@ -256,16 +248,17 @@ getNextVertex(Block* bloc, Vertex* vtx1, Vertex* vtx2, std::mapgetIndex(vtx1); - uint ind2 = face_select->getIndex(vtx2); + auto fs_vertices = face_select->getVertices(); + uint ind1 = Utils::getIndexOf(vtx1, fs_vertices); + uint ind2 = Utils::getIndexOf(vtx2, fs_vertices); uint ind3; - uint nbVtx = face_select->getNbVertices(); + uint nbVtx = fs_vertices.size(); if (ind2==((ind1+1)%nbVtx)) ind3 = (ind2+1)%nbVtx; else ind3 = (ind2-1+nbVtx)%nbVtx; //std::cout<<"ind1 = "<getName() // <<", vtx_suiv : "<< vtx_suiv->getName()< cofaces; - coedge_dep->getCoFaces(cofaces); - + std::vector cofaces = coedge_dep->getCoFaces(); for (uint i=0; isaveTopoProperty(); coface->setGeomAssociation(m_geom_entity); - std::vector coedges; - coface->getCoEdges(coedges); + std::vector coedges = coface->getCoEdges(); // on passe en mode transfini dès lors que l'on change l'association if (coface->getMeshLaw() < Topo::CoFaceMeshingProperty::transfinite){ @@ -217,13 +216,14 @@ void CommandSetGeomAssociation::project(CoFace* coface) project(coedge); // on cherche à projeter les arêtes sur les courbes de la surface autant que possible - if (coedge->getNbVertices() == 2){ - if (coedge->getVertex(0)->getGeomAssociation() && coedge->getVertex(0)->getGeomAssociation()->getDim()==0 - && coedge->getVertex(1)->getGeomAssociation() && coedge->getVertex(1)->getGeomAssociation()->getDim()==0){ + const std::vector coedge_vertices = coedge->getVertices(); + if (coedge_vertices.size() == 2){ + if (coedge_vertices[0]->getGeomAssociation() && coedge_vertices[0]->getGeomAssociation()->getDim()==0 + && coedge_vertices[1]->getGeomAssociation() && coedge_vertices[1]->getGeomAssociation()->getDim()==0){ // recherche s'il y a une courbe entre ces 2 sommets - Geom::Vertex* vtx1 = dynamic_cast(coedge->getVertex(0)->getGeomAssociation()); - Geom::Vertex* vtx2 = dynamic_cast(coedge->getVertex(1)->getGeomAssociation()); + Geom::Vertex* vtx1 = dynamic_cast(coedge_vertices[0]->getGeomAssociation()); + Geom::Vertex* vtx2 = dynamic_cast(coedge_vertices[1]->getGeomAssociation()); CHECK_NULL_PTR_ERROR(vtx1); CHECK_NULL_PTR_ERROR(vtx2); @@ -253,11 +253,8 @@ void CommandSetGeomAssociation::project(CoEdge* coedge) coedge->saveTopoProperty(); coedge->setGeomAssociation(m_geom_entity); - std::vector vertices; - coedge->getVertices(vertices); - - for (std::vector::iterator iter = vertices.begin(); - iter != vertices.end(); ++iter){ + const std::vector& vertices = coedge->getVertices(); + for (auto iter = vertices.begin(); iter != vertices.end(); ++iter){ Vertex* vtx = *iter; // on propage si on projète sur une entité de dimension inférieure à la projection précédente diff --git a/src/Core/Topo/CommandSnapVertices.cpp b/src/Core/Topo/CommandSnapVertices.cpp index efc10aaf..38cdeac0 100644 --- a/src/Core/Topo/CommandSnapVertices.cpp +++ b/src/Core/Topo/CommandSnapVertices.cpp @@ -45,57 +45,31 @@ CommandSnapVertices(Internal::Context& c, uint marque = vertices1.size() + vertices2.size(); std::map filtre_block; - for (std::vector::iterator iter1 = vertices1.begin(); - iter1 != vertices1.end(); ++iter1){ - std::vector blocks; - (*iter1)->getBlocks(blocks); - - for (std::vector::iterator iter5 = blocks.begin(); - iter5 != blocks.end(); ++iter5){ - filtre_block[*iter5] += 1; - } - } - - for (std::vector::iterator iter1 = vertices2.begin(); - iter1 != vertices2.end(); ++iter1){ - std::vector blocks; - (*iter1)->getBlocks(blocks); - - for (std::vector::iterator iter5 = blocks.begin(); - iter5 != blocks.end(); ++iter5){ - filtre_block[*iter5] += 1; - if (filtre_block[*iter5] == marque) - m_common_block = *iter5; + for (Topo::Vertex* vtx : vertices1) + for (Topo::Block* vtx_bl : vtx->getBlocks()) + filtre_block[vtx_bl] += 1; + + for (Topo::Vertex* vtx : vertices2) + for (Topo::Block* vtx_bl : vtx->getBlocks()) { + filtre_block[vtx_bl] += 1; + if (filtre_block[vtx_bl] == marque) + m_common_block = vtx_bl; } - } if (m_common_block == 0){ // on cherche une coface std::map filtre_coface; - for (std::vector::iterator iter1 = vertices1.begin(); - iter1 != vertices1.end(); ++iter1){ - std::vector cofaces; - (*iter1)->getCoFaces(cofaces); - - for (std::vector::iterator iter5 = cofaces.begin(); - iter5 != cofaces.end(); ++iter5){ - filtre_coface[*iter5] += 1; - } - } + for (Topo::Vertex* vtx : vertices1) + for (CoFace* vtx_cf : vtx->getCoFaces()) + filtre_coface[vtx_cf] += 1; - for (std::vector::iterator iter1 = vertices2.begin(); - iter1 != vertices2.end(); ++iter1){ - std::vector cofaces; - (*iter1)->getCoFaces(cofaces); - - for (std::vector::iterator iter5 = cofaces.begin(); - iter5 != cofaces.end(); ++iter5){ - filtre_coface[*iter5] += 1; - if (filtre_coface[*iter5] == marque) - m_common_coface = *iter5; + for (Topo::Vertex* vtx : vertices2) + for (CoFace* vtx_cf : vtx->getCoFaces()) { + filtre_coface[vtx_cf] += 1; + if (filtre_coface[vtx_cf] == marque) + m_common_coface = vtx_cf; } - } } if (m_common_coface == 0 && m_common_block == 0) @@ -124,8 +98,7 @@ CommandSnapVertices(Internal::Context& c, Block::eDirOnBlock dir_bl = Block::unknown; // les 8 sommets du bloc (en dupliquant si bloc dégénéré) - std::vector vertices; - m_common_block->getHexaVertices(vertices); + std::vector vertices = m_common_block->getHexaVertices(); #ifdef _DEBUG_SNAP std::cout<<"getHexaVertices => "; @@ -272,22 +245,19 @@ internalExecute() Vertex* som1 = *iter1; Vertex* som2 = *iter2; - std::vector l_blocks; - std::vector l_cofaces; - // le som2 bouge, il est fusionné avec le som1 - som2->getBlocks(l_blocks); + std::vector l_blocks = som2->getBlocks(); blocks.insert(blocks.end(), l_blocks.begin(), l_blocks.end()); - som2->getCoFaces(l_cofaces); + std::vector l_cofaces = som2->getCoFaces(); cofaces.insert(cofaces.end(), l_cofaces.begin(), l_cofaces.end()); // cas où le som1 bouge if (!m_project_on_first){ - som1->getBlocks(l_blocks); + l_blocks = som1->getBlocks(); blocks.insert(blocks.end(), l_blocks.begin(), l_blocks.end()); - som1->getCoFaces(l_cofaces); + l_cofaces = som1->getCoFaces(); cofaces.insert(cofaces.end(), l_cofaces.begin(), l_cofaces.end()); } } @@ -305,9 +275,9 @@ internalExecute() std::vector coedges; if (m_common_block) - m_common_block->getCoEdges(coedges); + coedges = m_common_block->getCoEdges(); else if (m_common_coface) - m_common_coface->getCoEdges(coedges); + coedges = m_common_coface->getCoEdges(); // on marque les arêtes dans le bloc std::map filtre_coedge; @@ -334,12 +304,9 @@ internalExecute() // recherche d'une arête entre 2 sommets fusionnés CoEdge* coedge_between = 0; - std::vector loc_coedges; - som1->getCoEdges(loc_coedges); - for (std::vector::iterator iter = loc_coedges.begin(); - iter != loc_coedges.end(); ++iter) - if (filtre_coedge[*iter] == 1 && som2 == (*iter)->getOppositeVertex(som1)) - coedge_between = *iter; + for (CoEdge* som1_ce : som1->getCoEdges()) + if (filtre_coedge[som1_ce] == 1 && som2 == som1_ce->getOppositeVertex(som1)) + coedge_between = som1_ce; // on ne trouve pas d'arête, peut-être parce qu'elle est composée if(0 == coedge_between) @@ -350,13 +317,10 @@ internalExecute() // on met de côtés les faces communes touchées // ainsi que les blocs touchés - std::vector loc_cofaces; - coedge_between->getCoFaces(loc_cofaces); - for (std::vector::iterator iter2 = loc_cofaces.begin(); - iter2 != loc_cofaces.end(); ++iter2){ + std::vector loc_cofaces = coedge_between->getCoFaces(); + for (auto iter2 = loc_cofaces.begin(); iter2 != loc_cofaces.end(); ++iter2){ cofaces_degenerated.push_back(*iter2); - std::vector loc_blocs; - (*iter2)->getBlocks(loc_blocs); + std::vector loc_blocs = (*iter2)->getBlocks(); blocks_degenerated.insert(blocks_degenerated.end(), loc_blocs.begin(), loc_blocs.end()); } @@ -389,33 +353,29 @@ internalExecute() Block* bloc = *iter; // remplissage de filtre_block - for (uint i=0; igetNbVertices(); i++) - if (filtre_vertex[bloc->getVertex(i)] == 1) + const std::vector& vertices = bloc->getVertices(); + for (uint i=0; i loc_cofaces; - bloc->getCoFaces(loc_cofaces); - for (std::vector::iterator iter2 = loc_cofaces.begin(); - iter2 != loc_cofaces.end(); ++iter2){ - CoFace* coface = *iter2; - for (uint i=0; igetNbVertices(); i++) - if (filtre_vertex[coface->getVertex(i)] == 1) + for (CoFace* coface : bloc->getCoFaces()) + for (Vertex* vtx : coface->getVertices()) + if (filtre_vertex[vtx] == 1) filtre_coface[coface] += 1; - } // réorientation du bloc - if (bloc->isStructured() && bloc->getNbFaces() == 6){ + const std::vector& faces = bloc->getFaces(); + if (bloc->isStructured() && faces.size() == 6){ // recherche d'une Face Face* face = 0; uint nb_vtx_max = 0; - for (uint i=0; igetNbFaces(); i++){ + for (Face* loc_face : faces){ uint nb_vtx = 0; - Face* loc_face = bloc->getFace(i); - for (uint j=0; jgetNbVertices(); j++) - if (filtre_vertex[loc_face->getVertex(j)] != 0) + for (Vertex* vtx : loc_face->getVertices()) + if (filtre_vertex[vtx] != 0) nb_vtx+=1; if (nb_vtx>nb_vtx_max){ #ifdef _DEBUG_SNAP @@ -425,7 +385,7 @@ internalExecute() nb_vtx_max = nb_vtx; } else if (nb_vtx>0 && nb_vtx==nb_vtx_max - && face->getNbVertices()>loc_face->getNbVertices()){ + && face->getVertices().size()>loc_face->getVertices().size()){ // on privilégie la face la plus dégénérée face = loc_face; } @@ -437,16 +397,16 @@ internalExecute() <<" et pour Face "<getName()<saveBlockTopoProperty(&getInfoCommand()); - bloc->permuteToKmaxFace(bloc->getIndex(face), &getInfoCommand()); + bloc->permuteToKmaxFace(Utils::getIndexOf(face, faces), &getInfoCommand()); } } // end if bloc->isStructured() && getNbFaces() == 6 - if (!bloc->isStructured() && bloc->getNbVertices() == 7 && filtre_block[bloc] == 1){ + if (!bloc->isStructured() && vertices.size() == 7 && filtre_block[bloc] == 1){ // si c'est l'un des 4 premiers sommets qui est pris dans la fusion, // alors on symétrise ce bloc / arête opposée au 7ème sommet bool symNeeded = false; for (uint i=0;i<4; i++) - if (1 == filtre_vertex[bloc->getVertex(i)]) + if (1 == filtre_vertex[vertices[i]]) symNeeded = true; if (symNeeded) { #ifdef _DEBUG_SNAP @@ -473,15 +433,10 @@ internalExecute() CoEdge* coedge_between = *iter3; // marque les arêtes - std::vector edges; - som1->getEdges(edges); - for (std::vector::iterator iter4 = edges.begin(); - iter4 != edges.end(); ++iter4) - filtre_edge[*iter4] = 1; - som2->getEdges(edges); - for (std::vector::iterator iter4 = edges.begin(); - iter4 != edges.end(); ++iter4) - filtre_edge[*iter4] = 2; + for (Topo::Edge* som1_edge : som1->getEdges()) + filtre_edge[som1_edge] = 1; + for (Topo::Edge* som2_edge : som2->getEdges()) + filtre_edge[som2_edge] = 2; #ifdef _DEBUG_SNAP std::cout<<" merge de "<getName()<<" avec "<getName() @@ -511,49 +466,48 @@ internalExecute() for (std::list::iterator iter = cofaces_degenerated.begin(); iter != cofaces_degenerated.end(); ++iter){ CoFace* coface = *iter; - if (coface->getNbVertices() == 1){ + if (coface->getVertices().size() == 1){ #ifdef _DEBUG_SNAP std::cout<<" cofaces dégénérée avec 1 seul sommet "<getName()<free(&getInfoCommand()); MGX_NOT_YET_IMPLEMENTED("CommandSnapVertices avec face commune dégénérée en 1 seul sommet") - } else if (coface->getNbVertices() == 2){ + } else if (coface->getVertices().size() == 2){ #ifdef _DEBUG_SNAP std::cout<<" cofaces dégénérée avec 2 sommets "<getName()<getEdge(0); - Edge* a3 = coface->getEdge(1); + Edge* a1 = coface->getEdges()[0]; + Edge* a3 = coface->getEdges()[1]; #ifdef _DEBUG_SNAP std::cout<<" merge entre les arêtes "<getName()<<" et " <getName()<getNbCoEdges() > 1 || a3->getNbCoEdges() > 1) + if (a1->getCoEdges().size() > 1 || a3->getCoEdges().size() > 1) throw TkUtil::Exception (TkUtil::UTF8String ("CommandSnapVertices, merge d'une arête composée non prévu", TkUtil::Charset::UTF_8)); // la fusion se fait sur les arêtes internes if (filtre_edge[a1] == 1 && filtre_edge[a3] == 2) - a1->getCoEdge(0)->merge(a3->getCoEdge(0), &getInfoCommand()); + a1->getCoEdges()[0]->merge(a3->getCoEdges()[0], &getInfoCommand()); else if (filtre_edge[a1] == 2 && filtre_edge[a3] == 1) - a3->getCoEdge(0)->merge(a1->getCoEdge(0), &getInfoCommand()); + a3->getCoEdges()[0]->merge(a1->getCoEdges()[0], &getInfoCommand()); else throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, CommandSnapVertices, le filtre_edge ne nous apprend rien", TkUtil::Charset::UTF_8)); // il faut supprimer les Faces des blocs - std::vector loc_faces; - coface->getFaces(loc_faces); + std::vector loc_faces = coface->getFaces(); for (std::vector::iterator iter2 = loc_faces.begin(); iter2 != loc_faces.end(); ++iter2){ Face* face = *iter2; #ifdef _DEBUG_SNAP std::cout<<" face impactée "<getName()<getNbBlocks()!=1) + if (face->getBlocks().size()!=1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, CommandSnapVertices, une Face n'a pas un unique Block", TkUtil::Charset::UTF_8)); - Block* bloc = face->getBlock(0); + Block* bloc = face->getBlocks()[0]; bloc->saveBlockTopoProperty(&getInfoCommand()); - bloc->getBlockTopoProperty()->getFaceContainer().remove(face, true); + Utils::remove(face, bloc->getBlockTopoProperty()->getFaceContainer()); face->free(&getInfoCommand()); } @@ -565,17 +519,19 @@ internalExecute() for (std::list::iterator iter = blocks_degenerated.begin(); iter != blocks_degenerated.end(); ++iter){ Block* bloc = *iter; - if (bloc->getNbFaces() == 2){ + const std::vector& loc_vertices = bloc->getVertices(); + const std::vector& loc_faces = bloc->getFaces(); + if (loc_faces.size() == 2){ #ifdef _DEBUG_SNAP std::cout<<" bloc "<getName() <<" avec plus que 2 faces"<getFace(0)->getNbCoFaces() != 1 || bloc->getFace(1)->getNbCoFaces() != 1) + if (loc_faces[0]->getCoFaces().size() != 1 || loc_faces[1]->getCoFaces().size() != 1) throw TkUtil::Exception (TkUtil::UTF8String ("CommandSnapVertices, cas avec plusieurs faces communes non prévu pour le moment", TkUtil::Charset::UTF_8)); else { - CoFace* cf1 = bloc->getFace(0)->getCoFace(0); - CoFace* cf2 = bloc->getFace(1)->getCoFace(0); + CoFace* cf1 = loc_faces[0]->getCoFaces()[0]; + CoFace* cf2 = loc_faces[1]->getCoFaces()[0]; if (filtre_coface[cf1] > filtre_coface[cf2]) cf1->merge(cf2, &getInfoCommand()); @@ -584,23 +540,19 @@ internalExecute() } // suppression des faces - std::vector loc_faces; - bloc->getFaces(loc_faces); - for (std::vector::iterator iter2 = loc_faces.begin(); - iter2 != loc_faces.end(); ++iter2) - (*iter2)->free(&getInfoCommand()); + for (Face* f : loc_faces) f->free(&getInfoCommand()); // suppression du bloc bloc->free(&getInfoCommand()); } - else if (bloc->isStructured() && bloc->getNbVertices() == 8 && filtre_block[bloc] == 2){ + else if (bloc->isStructured() && loc_vertices.size() == 8 && filtre_block[bloc] == 2){ #ifdef _DEBUG_SNAP std::cout<<" bloc "<getName() <<" avec dégénérescence en prisme [cas structuré]"<getVertex(4) == bloc->getVertex(5)) - bloc->getBlockTopoProperty()->getVertexContainer().set(5, bloc->getVertex(6)); + if (loc_vertices[4] == loc_vertices[5]) + bloc->getBlockTopoProperty()->getVertexContainer()[5] = loc_vertices[6]; bloc->getBlockTopoProperty()->getVertexContainer().resize(6); } else { @@ -619,8 +571,9 @@ internalExecute() bloc->saveBlockTopoProperty(&getInfoCommand()); std::vector loc_vtx; - for (uint i=0;igetNbVertices(); i++){ - Vertex* vtx = bloc->getVertex(i); + const std::vector& vertices = bloc->getVertices(); + for (uint i=0;igetName()<<" , filtre_vertex: "<getBlockTopoProperty()->getVertexContainer().clear(); - bloc->getBlockTopoProperty()->getVertexContainer().add(loc_vtx); - + bloc->getBlockTopoProperty()->getVertexContainer() = loc_vtx; // on remet le filtre à l'état d'avant pour le prochain bloc for (uint i=0;i &nb_coedges_by_vertex) { // stocke pour chacun des sommets le nombre d'arêtes auxquelles il est relié - std::vector all_vertices; - m_bloc->getAllVertices(all_vertices); - for (uint i=0; igetNbCoEdges(); + for (Topo::Vertex* vtx : m_bloc->getAllVertices()) + nb_coedges_by_vertex[vtx] = vtx->getCoEdges().size(); } /*----------------------------------------------------------------------------*/ void CommandSplitBlock::getPreviewRepresentation(Utils::DisplayRepresentation& dr) diff --git a/src/Core/Topo/CommandSplitBlocks.cpp b/src/Core/Topo/CommandSplitBlocks.cpp index 3345a847..00250db6 100644 --- a/src/Core/Topo/CommandSplitBlocks.cpp +++ b/src/Core/Topo/CommandSplitBlocks.cpp @@ -218,8 +218,7 @@ findBlockUnmarkedWithCoEdgeMarked(std::set& filtre_blocs, Block* bl = *iter1; //std::cout<<" pas encore vu, on recherche une arête ..."< coedges; - bl->getCoEdges(coedges); + std::vector coedges = bl->getCoEdges(); for (std::vector::iterator iter2 = coedges.begin(); iter2 != coedges.end(); ++iter2){ if (filtre_coedges.find(*iter2) != filtre_coedges.end()){ arete = *iter2; @@ -236,14 +235,9 @@ void CommandSplitBlocks:: countNbCoEdgesByVertices(std::map &nb_coedges_by_vertex) { // stocke pour chacun des sommets le nombre d'arêtes auxquelles il est relié - for (std::vector::iterator iter1 = m_blocs.begin(); - iter1 != m_blocs.end(); ++iter1){ - Block* bloc = *iter1; - std::vector all_vertices; - bloc->getAllVertices(all_vertices); - for (uint i=0; igetNbCoEdges(); - } + for (Block* b : m_blocs) + for (Vertex* vtx : b->getAllVertices()) + nb_coedges_by_vertex[vtx] = vtx->getCoEdges().size(); } /*----------------------------------------------------------------------------*/ void CommandSplitBlocks::getPreviewRepresentation(Utils::DisplayRepresentation& dr) diff --git a/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp b/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp index 46774417..65e794c3 100644 --- a/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp +++ b/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp @@ -53,7 +53,7 @@ CommandSplitBlocksWithOgrid(Internal::Context& c, for (std::vector::iterator iter = blocs.begin(); iter != blocs.end(); ++iter){ Topo::Block* hb = *iter; - if (hb->isStructured() && hb->getNbVertices() == 8) + if (hb->isStructured() && hb->getVertices().size() == 8) m_blocs.push_back(hb); else{ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); @@ -187,20 +187,17 @@ computeFilters(std::map & filtre_vertex, filtre_bloc[bloc] = 2; // les sommets - std::vector vertices; - bloc->getAllVertices(vertices); + std::vector vertices = bloc->getAllVertices(); for (uint i=0; i coedges; - bloc->getCoEdges(coedges); + std::vector coedges = bloc->getCoEdges(); for (uint i=0; i cofaces; - bloc->getCoFaces(cofaces); + std::vector cofaces = bloc->getCoFaces(); for (uint i=0; i & filtre_vertex, bool erreur = false; if (m_propagate_neighbor_block){ - std::vector blocs; - coface->getBlocks(blocs); + std::vector blocs = coface->getBlocks(); if (blocs.size() == 2){ uint nb_blocsAjoutes = 0; // dans se cas on ajoute simplement le bloc voisin @@ -261,20 +257,17 @@ computeFilters(std::map & filtre_vertex, filtre_bloc[bloc] = 2; // les sommets - std::vector vertices; - bloc->getAllVertices(vertices); + std::vector vertices = bloc->getAllVertices(); for (uint i=0; i coedges; - bloc->getCoEdges(coedges); + std::vector coedges = bloc->getCoEdges(); for (uint i=0; i cofaces; - bloc->getCoFaces(cofaces); + std::vector cofaces = bloc->getCoFaces(); for (uint i=0; i & filtre_vertex, iter1 != m_blocs.end(); ++iter1){ Block* bloc = *iter1; - std::vector cofaces; - bloc->getCoFaces(cofaces); + std::vector cofaces = bloc->getCoFaces(); for (uint i=0; i & filtre_vertex, #endif // les arêtes communes au bord - std::vector coedges; - coface->getCoEdges(coedges); + std::vector coedges = coface->getCoEdges(); for (uint i=0; i & filtre_vertex, // les sommets des cofaces au bord de la sélection // [EB le 19/12/13] désormais on marque les sommets qui ne sont pas référencés directement par un bloc // puisque l'on utilise getAllVertices ... - std::vector vertices; - coface->getAllVertices(vertices); + std::vector vertices = coface->getAllVertices(); for (uint i=0; i blocs; - coface->getBlocks(blocs); + std::vector blocs = coface->getBlocks(); for (uint i=0; i & filtre_vertex, #endif // les arêtes communes - std::vector coedges; - bloc->getCoEdges(coedges); + std::vector coedges = bloc->getCoEdges(); for (uint i=0; i cofaces; - bloc->getCoFaces(cofaces); + std::vector cofaces = bloc->getCoFaces(); for (uint i=0; i & filtre_vertex, } // filtre pour les faces - for (std::vector::iterator iter1 = m_blocs.begin(); - iter1 != m_blocs.end(); ++iter1){ - - Block* bloc = *iter1; - - std::vector faces; - bloc->getFaces(faces); - - for (std::vector::iterator iter2 = faces.begin(); - iter2 != faces.end(); ++iter2){ - - Face* face = *iter2; + for (Block* bloc : m_blocs){ + for (Face* face : bloc->getFaces()){ // recherche des nombres de faces communes internes et externes dans cette face uint nb_face_int = 0; uint nb_face_ext = 0; - - std::vector cofaces; - face->getCoFaces(cofaces); - - for (std::vector::iterator iter3 = cofaces.begin(); - iter3 != cofaces.end(); ++iter3) - if (filtre_coface[*iter3] == 1) + for (CoFace* coface : face->getCoFaces()) + if (filtre_coface[coface] == 1) nb_face_ext += 1; - else if (filtre_coface[*iter3] == 2) + else if (filtre_coface[coface] == 2) nb_face_int += 1; #ifdef _DEBUG_SPLIT_OGRID std::cout<<"Face : "<getName()<<", nb_face_ext: "< & filtre_vertex, if (nb_face_int == 0){ // || nb_face_ext == 0 filtre_face[face] = 1; if (!m_create_internal_vertices){ - std::vector vertices; - face->getVertices(vertices); - for (uint i=0; igetVertices()) + filtre_vertex[vtx] = 1; } } else { filtre_face[face] = 2; // pour ces faces particulières, on marques tous les noeuds des cofaces au bord - for (std::vector::iterator iter3 = cofaces.begin(); - iter3 != cofaces.end(); ++iter3){ - CoFace* coface = *iter3; - if (filtre_coface[coface] == 1){ - std::vector vertices; - coface->getVertices(vertices); - for (uint i=0; igetCoFaces()) + if (filtre_coface[coface] == 1) + for (Vertex * vtx : coface->getVertices()) + filtre_vertex[vtx] = 1; } } } @@ -426,14 +390,12 @@ computeFilters(std::map & filtre_vertex, #endif // les arêtes communes - std::vector coedges; - bloc->getCoEdges(coedges); + std::vector coedges = bloc->getCoEdges(); for (uint i=0; i cofaces; - bloc->getCoFaces(cofaces); + std::vector cofaces = bloc->getCoFaces(); for (uint i=0; i & filtre_vertex, iter1 != m_blocs.end(); ++iter1){ Block* bloc = *iter1; - std::vector faces; - bloc->getFaces(faces); + const std::vector& faces = bloc->getFaces(); for (uint i=0; i & filtre_vertex, // pour les faces au bord, on marque les sommets, // à 1 (au bord) - for (std::vector::iterator iter3 = facesAuBord.begin(); - iter3 != facesAuBord.end(); ++iter3){ - Face* face = *iter3; - - std::vector vertices; - face->getVertices(vertices); - for (uint i=0; igetVertices()) + if (filtre_vertex[vtx] == 2) + filtre_vertex[vtx] = 1; - face->getAllVertices(vertices); - for (uint i=0; igetAllVertices()) + if (filtre_vertex[vtx] == 2){ // par défaut ce sommet est à ignorer - filtre_vertex[vertices[i]] = 5; + filtre_vertex[vtx] = 5; // recherche si ce sommet est relié à une arête interne (filtre à 2) // si oui, alors on le considère au bord - std::vector coedges; - vertices[i]->getCoEdges(coedges); - for (uint j=0; jgetCoEdges()) + if (filtre_coedge[ce] == 2) + filtre_vertex[vtx] = 1; } } @@ -486,8 +439,8 @@ computeFilters(std::map & filtre_vertex, for (std::map::iterator iter_ce=filtre_coedge.begin(); iter_ce!=filtre_coedge.end(); ++iter_ce) if (iter_ce->second == 2 - && filtre_vertex[iter_ce->first->getVertex(0)] == 2 - && filtre_vertex[iter_ce->first->getVertex(1)] == 2) + && filtre_vertex[iter_ce->first->getVertices()[0]] == 2 + && filtre_vertex[iter_ce->first->getVertices()[1]] == 2) iter_ce->second = 3; @@ -533,22 +486,18 @@ void CommandSplitBlocksWithOgrid::saveTopoProperty(std::map & fil if (filtre_bloc[bloc] == 1){ // les sommets - std::vector vertices; - bloc->getVertices(vertices); + const std::vector& vertices = bloc->getVertices(); for (uint i=0; isaveVertexTopoProperty(&getInfoCommand()); - std::vector faces; - bloc->getFaces(faces); + const std::vector& faces = bloc->getFaces(); - for (std::vector::iterator iter2 = faces.begin(); - iter2 != faces.end(); ++iter2){ + for (auto iter2 = faces.begin(); iter2 != faces.end(); ++iter2){ Face* face = *iter2; face->saveFaceTopoProperty(&getInfoCommand()); - std::vector cofaces; - face->getCoFaces(cofaces); + std::vector cofaces = face->getCoFaces(); for (std::vector::iterator iter3 = cofaces.begin(); iter3 != cofaces.end(); ++iter3){ CoFace* coface = *iter3; @@ -559,24 +508,20 @@ void CommandSplitBlocksWithOgrid::saveTopoProperty(std::map & fil if (!m_propagate_neighbor_block){ // propage aux faces reliées - std::vector otherFaces; - coface->getFaces(otherFaces); - + std::vector otherFaces = coface->getFaces(); for (std::vector::iterator iter6 = otherFaces.begin(); iter6 != otherFaces.end(); ++iter6) (*iter6)->saveFaceTopoProperty(&getInfoCommand()); } - std::vector edges; - coface->getEdges(edges); + std::vector edges = coface->getEdges(); for (std::vector::iterator iter4 = edges.begin(); iter4 != edges.end(); ++iter4){ Edge* edge = *iter4; edge->saveEdgeTopoProperty(&getInfoCommand()); - std::vector coedges; - edge->getCoEdges(coedges); + std::vector coedges = edge->getCoEdges(); for (std::vector::iterator iter5 = coedges.begin(); iter5 != coedges.end(); ++iter5){ CoEdge* coedge = *iter5; @@ -588,11 +533,8 @@ void CommandSplitBlocksWithOgrid::saveTopoProperty(std::map & fil if (!m_propagate_neighbor_block){ // propage aux arêtes reliées - std::vector otherEdges; - coedge->getEdges(otherEdges); - - for (std::vector::iterator iter6 = otherEdges.begin(); - iter6 != otherEdges.end(); ++iter6) + const std::vector& otherEdges = coedge->getEdges(); + for (auto iter6 = otherEdges.begin(); iter6 != otherEdges.end(); ++iter6) (*iter6)->saveEdgeTopoProperty(&getInfoCommand()); } @@ -622,20 +564,18 @@ createVertices(std::map & filtre_vertex, Block* bloc = *iter1; // les sommets extrémités du bloc - std::vector vertices; - bloc->getVertices(vertices); + const std::vector& bl_vertices = bloc->getVertices(); // recherche du barycentre du bloc Utils::Math::Point barycentre_blk; - for (uint i=0; igetCoord(); - barycentre_blk /= (double)vertices.size(); + for (uint i=0; igetCoord(); + barycentre_blk /= (double)bl_vertices.size(); - bloc->getAllVertices(vertices); + std::vector all_bl_vertices = bloc->getAllVertices(); // création des sommets pour le bloc central - for (std::vector::iterator iter6 = vertices.begin(); - iter6 != vertices.end(); ++iter6){ + for (auto iter6 = all_bl_vertices.begin(); iter6 != all_bl_vertices.end(); ++iter6){ Vertex* sommet = *iter6; Vertex* newVtx = corr_vertex[sommet]; @@ -655,18 +595,14 @@ createVertices(std::map & filtre_vertex, // on conserve les cofaces internes std::vector cofaces_int; - std::vector cofaces; - sommet->getCoFaces(cofaces); - - for (std::vector::iterator iter3 = cofaces.begin(); - iter3 != cofaces.end(); ++iter3){ + for (CoFace* sommet_cf : sommet->getCoFaces()){ #ifdef _DEBUG_SPLIT_OGRID - std::cout<<" coface = "<<(*iter3)->getName()<<", filtre à "< & filtre_vertex, // ce cas n'est valide que si le sommet n'est relié qu'à un seul bloc sélectionné // pas valide en cas de sommet commun à 2 blocs sans arête commune // => récupération des blocs du sommet pour compter le nombre de blocs candidats à l'ogrid - std::vector blocks; - sommet->getBlocks(blocks); int nb_selected = 0; - for (auto b1 : blocks) { + for (auto b1 : sommet->getBlocks()) { for (auto b2 : m_blocs) { if (b1 == b2) nb_selected++; } @@ -723,12 +657,10 @@ createVertices(std::map & filtre_vertex, #ifdef _DEBUG_SPLIT_OGRID std::cout<<"vtx_prec : "<getName()< coedges; - vtx_prec->getCoEdges(coedges); CoEdge* coedge = 0; - for (uint i=0; igetCoEdges()) + if (filtre_vu[vtx_prec_ce] == 0 && filtre_coedge[vtx_prec_ce] == 2) + coedge = vtx_prec_ce; if (0 == coedge) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne dans CommandSplitBlocksWithOgrid::createVertices, on ne trouve pas de sommet opposé au sommet marqué à 4", TkUtil::Charset::UTF_8)); @@ -770,8 +702,7 @@ createVertices(std::map & filtre_vertex, CoFace* coface = cofaces_int[0]; // calcul le barycentre de la CoFace - std::vector vertices_cf; - coface->getVertices(vertices_cf); + std::vector vertices_cf = coface->getVertices(); Utils::Math::Point barycentre_cf; for (uint i=0; igetCoord(); @@ -790,24 +721,18 @@ createVertices(std::map & filtre_vertex, Block* bloc_commun = 0; std::map filtre_vu; - std::vector blocs; - cofaces_int[0]->getBlocks(blocs); - for (std::vector::iterator iter11 = blocs.begin(); - iter11 != blocs.end(); ++iter11) - filtre_vu[*iter11] = 1; + for (Block* bl : cofaces_int[0]->getBlocks()) + filtre_vu[bl] = 1; - cofaces_int[1]->getBlocks(blocs); - for (std::vector::iterator iter11 = blocs.begin(); - iter11 != blocs.end(); ++iter11) - if (filtre_vu[*iter11] == 1) - bloc_commun = *iter11; + for (Block* bl : cofaces_int[1]->getBlocks()) + if (filtre_vu[bl] == 1) + bloc_commun = bl; if (0 == bloc_commun) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne dans CommandSplitBlocksWithOgrid::createVertices, on ne trouve pas de bloc commun aux 2 cofaces internes", TkUtil::Charset::UTF_8)); Utils::Math::Point barycentre_blk2; - std::vector vertices2; - bloc_commun->getVertices(vertices2); + const std::vector& vertices2 = bloc_commun->getVertices(); for (uint i=0; igetCoord(); @@ -843,8 +768,7 @@ createCoEdges(std::map & filtre_vertex, Block* bloc = *iter1; - std::vector vertices; - bloc->getAllVertices(vertices); + std::vector vertices = bloc->getAllVertices(); for (std::vector::iterator iter6 = vertices.begin(); iter6 != vertices.end(); ++iter6){ @@ -901,11 +825,8 @@ createCoEdgeAndFace(std::map & filtre_vertex, // on procède par Face // et si cette Face est composée de Face commune interne et externe // alors on procède par face commune - std::vector faces; - bloc->getFaces(faces); - - for (std::vector::iterator iter2 = faces.begin(); - iter2 != faces.end(); ++iter2){ + const std::vector& faces = bloc->getFaces(); + for (auto iter2 = faces.begin(); iter2 != faces.end(); ++iter2){ Face* face = *iter2; #ifdef _DEBUG_SPLIT_OGRID @@ -921,8 +842,8 @@ createCoEdgeAndFace(std::map & filtre_vertex, for (uint i=0; i<4; i++){ // couple de sommets qui déterminent une arête du bloc - Vertex* vtx0 = face->getVertex(TopoHelper::tabIndVtxByEdgeOnFace[i][0]); - Vertex* vtx1 = face->getVertex(TopoHelper::tabIndVtxByEdgeOnFace[i][1]); + Vertex* vtx0 = face->getVertices()[TopoHelper::tabIndVtxByEdgeOnFace[i][0]]; + Vertex* vtx1 = face->getVertices()[TopoHelper::tabIndVtxByEdgeOnFace[i][1]]; // groupsName pour la face (on prend ceux de la première coface, si elle est entre 2 blocs) std::vector groupsName; @@ -937,8 +858,7 @@ createCoEdgeAndFace(std::map & filtre_vertex, } // end for i<4 } // end if (filtre_face[face] == 1) else { - std::vector cofaces; - face->getCoFaces(cofaces); + std::vector cofaces = face->getCoFaces(); // boucle sur les CoFaces for (std::vector::iterator iter3 = cofaces.begin(); @@ -961,8 +881,8 @@ createCoEdgeAndFace(std::map & filtre_vertex, for (uint i=0; i<4; i++){ // couple de sommets qui déterminent une arête du bloc - Vertex* vtx0 = coface->getVertex(TopoHelper::tabIndVtxByEdgeOnFace[i][0]); - Vertex* vtx1 = coface->getVertex(TopoHelper::tabIndVtxByEdgeOnFace[i][1]); + Vertex* vtx0 = coface->getVertices()[TopoHelper::tabIndVtxByEdgeOnFace[i][0]]; + Vertex* vtx1 = coface->getVertices()[TopoHelper::tabIndVtxByEdgeOnFace[i][1]]; // Création des arêtes et coface en fonction d'un couple de sommets createCoEdgeAndFace(vtx0, vtx1, @@ -1010,13 +930,11 @@ getSelectedVertices(Vertex* vtx0, do { // recherche de l'arête marquée à 1 parmis celles liées au sommet vtx_prec - std::vector coedge_vois; - vtx_prec->getCoEdges(coedge_vois); CoEdge* coedge = 0; - for (uint i=0; igetCoEdges()) + if (filtre_vu[coedge_vois] == 1) + coedge = coedge_vois; if (0 == coedge) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne dans CommandSplitBlocksWithOgrid::getSelectedVertices, aucune arête voisine de vtx_prec", TkUtil::Charset::UTF_8)); @@ -1219,11 +1137,8 @@ createCoFace(std::map & filtre_vertex, if (filtre_bloc[bloc] == 2) continue; - std::vector faces; - bloc->getFaces(faces); - - for (std::vector::iterator iter2 = faces.begin(); - iter2 != faces.end(); ++iter2){ + const std::vector& faces = bloc->getFaces(); + for (auto iter2 = faces.begin(); iter2 != faces.end(); ++iter2){ Face* face = *iter2; #ifdef _DEBUG_SPLIT_OGRID std::cout<<"face: "<getName()< & filtre_vertex, std::vector jCoedges; face->getOrientedCoEdges(iCoedges, jCoedges); - if (face->getNbCoFaces() == 1){ + if (face->getCoFaces().size() == 1){ - CoFace* coface = face->getCoFace(0); + CoFace* coface = face->getCoFaces()[0]; #ifdef _DEBUG_SPLIT_OGRID std::cout<<"coface (unique pour la face): "<getName()< & filtre_vertex, for (uint i=0; i<4; i++){ Edge* newEdge; - Vertex* som0 = coface->getVertex(i); - Vertex* som1 = coface->getVertex((i+1)%4); + Vertex* som0 = coface->getVertices()[i]; + Vertex* som1 = coface->getVertices()[(i+1)%4]; if (filtre_vertex[som0] == 2 && filtre_vertex[som1] == 2) // on conserve l'arête lorsqu'elle est interne - newEdge = coface->getEdge(i); + newEdge = coface->getEdges()[i]; else newEdge = createEdge( som0, @@ -1282,8 +1197,7 @@ createCoFace(std::map & filtre_vertex, else { // cas où chaques cofaces est associée à une autre coface if (filtre_face[face] == 2){ - std::vector cofaces; - face->getCoFaces(cofaces); + std::vector cofaces = face->getCoFaces(); for (std::vector::iterator iter3 = cofaces.begin(); iter3 != cofaces.end(); ++iter3){ @@ -1304,12 +1218,12 @@ createCoFace(std::map & filtre_vertex, for (uint i=0; i<4; i++){ Edge* newEdge; - Vertex* som0 = coface->getVertex(i); - Vertex* som1 = coface->getVertex((i+1)%4); + Vertex* som0 = coface->getVertices()[i]; + Vertex* som1 = coface->getVertices()[(i+1)%4]; if (filtre_vertex[som0] == 2 && filtre_vertex[som1] == 2) // on conserve l'arête lorsqu'elle est interne - newEdge = coface->getEdge(i); + newEdge = coface->getEdges()[i]; else newEdge = createEdge( som0, @@ -1347,8 +1261,8 @@ createCoFace(std::map & filtre_vertex, for (uint i=0; i<4; i++){ Edge* newEdge; - Vertex* som0 = face->getVertex(i); - Vertex* som1 = face->getVertex((i+1)%4); + Vertex* som0 = face->getVertices()[i]; + Vertex* som1 = face->getVertices()[(i+1)%4]; newEdge = createEdge( som0, @@ -1366,11 +1280,8 @@ createCoFace(std::map & filtre_vertex, newCoface = new Topo::CoFace(getContext(), edges[0], edges[1], edges[2], edges[3]); getInfoCommand().addTopoInfoEntity(newCoface, Internal::InfoCommand::CREATED); - std::vector cofaces; - face->getCoFaces(cofaces); - for (std::vector::iterator iter3 = cofaces.begin(); - iter3 != cofaces.end(); ++iter3) - corr_coface[*iter3] = newCoface; + for (CoFace* cf : face->getCoFaces()) + corr_coface[cf] = newCoface; } // end else if (filtre_face[face] == 2) } // end else / if (face->getNbCoFaces() == 1) @@ -1521,11 +1432,9 @@ createBlock(std::map & filtre_vertex, if (filtre_bloc[bloc] == 2) continue; - std::vector faces; - bloc->getFaces(faces); + const std::vector& faces = bloc->getFaces(); - for (std::vector::iterator iter2 = faces.begin(); - iter2 != faces.end(); ++iter2){ + for (auto iter2 = faces.begin(); iter2 != faces.end(); ++iter2){ Face* face = *iter2; #ifdef _DEBUG_SPLIT_OGRID std::cout<<"face: "<getName()< & filtre_vertex, std::vector jCoedges; face->getOrientedCoEdges(iCoedges, jCoedges); - if (filtre_face[face] == 2 || face->getNbCoFaces() == 1){ + if (filtre_face[face] == 2 || face->getCoFaces().size() == 1){ // cas de la face qui donne un bloc par coface - std::vector cofaces; - face->getCoFaces(cofaces); + std::vector cofaces = face->getCoFaces(); for (std::vector::iterator iter3 = cofaces.begin(); iter3 != cofaces.end(); ++iter3){ @@ -1554,13 +1462,13 @@ createBlock(std::map & filtre_vertex, std::vector newFaces; std::vector newVertices; - newVertices.push_back(coface->getVertex(0)); + newVertices.push_back(coface->getVertices()[0]); newVertices.push_back(corr_vertex[newVertices[0]]); - newVertices.push_back(coface->getVertex(1)); + newVertices.push_back(coface->getVertices()[1]); newVertices.push_back(corr_vertex[newVertices[2]]); - newVertices.push_back(coface->getVertex(3)); + newVertices.push_back(coface->getVertices()[3]); newVertices.push_back(corr_vertex[newVertices[4]]); - newVertices.push_back(coface->getVertex(2)); + newVertices.push_back(coface->getVertices()[2]); newVertices.push_back(corr_vertex[newVertices[6]]); if (cofaces.size() == 1) @@ -1621,7 +1529,7 @@ createBlock(std::map & filtre_vertex, } // end if filtre_coface[...] == 1 } // end iter3 } // end if (filtre_face[face] == 2 || face->getNbCoFaces() == 1) - else if (filtre_face[face] == 1 && filtre_coface[face->getCoFace(0)] == 1){ + else if (filtre_face[face] == 1 && filtre_coface[face->getCoFaces()[0]] == 1){ // cas de la face qui ne donne qu'un bloc (bien qu'il y ait plusieurs cofaces) #ifdef _DEBUG_SPLIT_OGRID std::cout<<"face non décomposée"< & filtre_vertex, std::vector newFaces; std::vector newVertices; - newVertices.push_back(face->getVertex(0)); + newVertices.push_back(face->getVertices()[0]); newVertices.push_back(corr_vertex[newVertices[0]]); - newVertices.push_back(face->getVertex(1)); + newVertices.push_back(face->getVertices()[1]); newVertices.push_back(corr_vertex[newVertices[2]]); - newVertices.push_back(face->getVertex(3)); + newVertices.push_back(face->getVertices()[3]); newVertices.push_back(corr_vertex[newVertices[4]]); - newVertices.push_back(face->getVertex(2)); + newVertices.push_back(face->getVertices()[2]); newVertices.push_back(corr_vertex[newVertices[6]]); // la face de départ newFaces.push_back(face); // la face opposée - newFaces.push_back(new Topo::Face(getContext(), corr_coface[face->getCoFace(0)])); + newFaces.push_back(new Topo::Face(getContext(), corr_coface[face->getCoFaces()[0]])); getInfoCommand().addTopoInfoEntity(newFaces.back(), Internal::InfoCommand::CREATED); #ifdef _DEBUG_SPLIT_OGRID std::cout<<" => création de "<getName()<<" comme face opposée"< & filtre_vertex, std::vector newFaces; std::vector newVertices; + const std::vector& vertices = bloc->getVertices(); for (uint i=0; i<8; i++) - newVertices.push_back(corr_vertex[bloc->getVertex(i)]); + newVertices.push_back(corr_vertex[vertices[i]]); for (uint i=0; i<6; i++) newFaces.push_back(createFace(faces[i], corr_vertex, corr_coface)); @@ -1734,13 +1643,12 @@ createFace(Face* face, std::cout<<"createFace("<getName()<<")"< cofaces; - face->getCoFaces(cofaces); + std::vector cofaces = face->getCoFaces(); Face* newFace = 0; if (cofaces.size() == 1){ - CoFace* coface = face->getCoFace(0); + CoFace* coface = cofaces[0]; #ifdef _DEBUG_SPLIT_OGRID std::cout<<"coface (unique): "<getName()< vertices; - face->getVertices(vertices); + std::vector vertices = face->getVertices(); std::vector newVertices; for (std::vector::iterator iter6 = vertices.begin(); @@ -1852,18 +1759,14 @@ freeUnused(std::map & filtre_vertex, if (filtre_bloc[bloc] == 2) continue; - std::vector faces; - bloc->getFaces(faces); + const std::vector& faces = bloc->getFaces(); - for (std::vector::iterator iter2 = faces.begin(); - iter2 != faces.end(); ++iter2){ + for (auto iter2 = faces.begin(); iter2 != faces.end(); ++iter2){ Face* face = *iter2; #ifdef _DEBUG_SPLIT_OGRID std::cout<<"face: "<getName()< cofaces; - face->getCoFaces(cofaces); - + std::vector cofaces = face->getCoFaces(); bool faceToBeDeleted = false; for (std::vector::iterator iter3 = cofaces.begin(); iter3 != cofaces.end(); ++iter3){ @@ -1885,44 +1788,46 @@ freeUnused(std::map & filtre_vertex, newCoface->setGeomAssociation(ga); // pour les arêtes et sommets au bord de cette coface centrale - std::vector coedges; - newCoface->getCoEdges(coedges); - for (std::vector::iterator iter5 = coedges.begin(); - iter5 != coedges.end(); ++iter5){ + std::vector coedges = newCoface->getCoEdges(); + for (auto iter5 = coedges.begin(); iter5 != coedges.end(); ++iter5){ + Topo::Vertex* vtx0 = (*iter5)->getVertices()[0]; + Topo::Vertex* vtx1 = (*iter5)->getVertices()[1]; #ifdef _DEBUG_SPLIT_OGRID std::cout<<"coedge: "<<(*iter5)->getName()<getVertex(0)->getName()<<", filtre à "<getVertex(0)]<getVertex(1)->getName()<<", filtre à "<getVertex(1)]<getVertex(0)->getGeomAssociation() == (*iter5)->getVertex(1)->getGeomAssociation()) + std::cout<<" vtx0: "<getName()<<", filtre à "<getName()<<", filtre à "<getGeomAssociation() == vtx1->getGeomAssociation()) std::cout<<" associés à la même entité"<getVertex(0)] == 4 - || filtre_vertex[(*iter5)->getVertex(1)] == 4) - && (*iter5)->getVertex(0)->getGeomAssociation() == (*iter5)->getVertex(1)->getGeomAssociation()) - (*iter5)->setGeomAssociation((*iter5)->getVertex(0)->getGeomAssociation()); + if ((filtre_vertex[vtx0] == 4 + || filtre_vertex[vtx1] == 4) + && vtx0->getGeomAssociation() == vtx1->getGeomAssociation()) + (*iter5)->setGeomAssociation(vtx0->getGeomAssociation()); else (*iter5)->setGeomAssociation(ga); for (uint i=0; i<2; i++) - if ((*iter5)->getVertex(i)->getGeomAssociation() == 0) - (*iter5)->getVertex(i)->setGeomAssociation(ga); + if ((*iter5)->getVertices()[i]->getGeomAssociation() == 0) + (*iter5)->getVertices()[i]->setGeomAssociation(ga); } // end for iter5 // pour les arêtes entre les sommets de la face initiale et celle créée au centre for (uint i=0; i<4; i++){ - CoEdge* newCoedge = corr_vtx_coedge[coface->getVertex(i)]; + CoEdge* newCoedge = corr_vtx_coedge[coface->getVertices()[i]]; + Topo::Vertex* vtx0 = newCoedge->getVertices()[0]; + Topo::Vertex* vtx1 = newCoedge->getVertices()[1]; if (newCoedge){ #ifdef _DEBUG_SPLIT_OGRID std::cout<<"newCoedge: "<getName()<getVertex(0)->getName()<<", filtre à "<getVertex(0)]<getVertex(1)->getName()<<", filtre à "<getVertex(1)]<getName()<<", filtre à "<getName()<<", filtre à "<getVertex(0)] == 4) - newCoedge->setGeomAssociation(newCoedge->getVertex(0)->getGeomAssociation()); - else if (filtre_vertex[newCoedge->getVertex(1)] == 4) - newCoedge->setGeomAssociation(newCoedge->getVertex(1)->getGeomAssociation()); + if (filtre_vertex[vtx0] == 4) + newCoedge->setGeomAssociation(vtx0->getGeomAssociation()); + else if (filtre_vertex[vtx1] == 4) + newCoedge->setGeomAssociation(vtx1->getGeomAssociation()); else newCoedge->setGeomAssociation(ga); } @@ -1930,8 +1835,8 @@ freeUnused(std::map & filtre_vertex, // pour les faces entre les bords de la face initiale et celle au centre for (uint i=0; i<4; i++){ - Vertex* vtx0 = coface->getVertex(i); - Vertex* vtx1 = coface->getVertex((i+1)%4); + Topo::Vertex* vtx0 = coface->getVertices()[i]; + Topo::Vertex* vtx1 = coface->getVertices()[(i+1)%4]; // on ordonne les sommets suivant leur id TopoHelper::sortVertices(vtx0, vtx1); @@ -1957,8 +1862,8 @@ freeUnused(std::map & filtre_vertex, // pour les faces entre les bords de la face initiale et celle au centre for (uint i=0; i<4; i++){ - Vertex* vtx0 = coface->getVertex(i); - Vertex* vtx1 = coface->getVertex((i+1)%4); + Topo::Vertex* vtx0 = coface->getVertices()[i]; + Topo::Vertex* vtx1 = coface->getVertices()[(i+1)%4]; // on ordonne les sommets suivant leur id TopoHelper::sortVertices(vtx0, vtx1); @@ -1974,21 +1879,16 @@ freeUnused(std::map & filtre_vertex, } } // end if (!coface->getGroupsContainer().empty()) - std::vector edges; - coface->getEdges(edges); + std::vector edges = coface->getEdges(); for (std::vector::iterator iter4 = edges.begin(); iter4 != edges.end(); ++iter4){ Edge* edge = *iter4; bool edgeToBeDeleted = true; - filtre_edge[edge] = 2; - - std::vector loc_coedges; - edge->getCoEdges(loc_coedges); + std::vector loc_coedges = edge->getCoEdges(); // recherche si l'une des arêtes est reliée à une coface qui n'est pas détruite - std::vector neighborCofaces; - edge->getCoFaces(neighborCofaces); + std::vector neighborCofaces = edge->getCoFaces(); #ifdef _DEBUG_SPLIT_OGRID std::cout<<" observation des faces reliées à "<getName()<<" : "<::iterator iter6 = neighborCofaces.begin(); @@ -2031,7 +1931,7 @@ freeUnused(std::map & filtre_vertex, } } // end for iter5 - if (edge->getNbCoFaces() == 1){ + if (edge->getCoFaces().size() == 1){ #ifdef _DEBUG_SPLIT_OGRID std::cout<<" destruction de "<getName()< & filtre_vertex, } // end for iter4 bool cofaceToBeReplaced=false; - std::vector blocs; - coface->getBlocks(blocs); - for (uint i=0; igetBlocks()) + if (filtre_bloc[bl] == 0) cofaceToBeReplaced = true; if (cofaceToBeReplaced && !m_propagate_neighbor_block){ // recherche de la face qu'il faut mettre à jour Face* faceToUpdate = 0; - std::vector faces; - coface->getFaces(faces); + std::vector faces = coface->getFaces(); if (faces.size() != 2){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message <<"Erreur interne, CommandSplitBlocksWithOgrid n'est pas prévu pour le cas avec une seule face pour face commune " @@ -2066,8 +1963,8 @@ freeUnused(std::map & filtre_vertex, // pour les faces entre les bords de la face initiale et celle au centre for (uint i=0; i<4; i++){ - Vertex* vtx0 = coface->getVertex(i); - Vertex* vtx1 = coface->getVertex((i+1)%4); + Vertex* vtx0 = coface->getVertices()[i]; + Vertex* vtx1 = coface->getVertices()[(i+1)%4]; TopoHelper::sortVertices(vtx0, vtx1); CoFace* newCoface = corr_2vtx_coface[std::pair(vtx0, vtx1)]; if (newCoface){ @@ -2092,7 +1989,7 @@ freeUnused(std::map & filtre_vertex, } // end if (filtre_coface[coface] == 2) else { // recherche si l'une des cofaces est référencée par plus de 2 faces - if (coface->getNbFaces()>2) + if (coface->getFaces().size()>2) faceToBeDeleted = true; } } // end for iter3 @@ -2125,8 +2022,7 @@ freeUnused(std::map & filtre_vertex, std::cout<<" coedge à détruire : "<getName()< edges; - coedge->getEdges(edges); + const std::vector& edges = coedge->getEdges(); std::vector edgesToBeUpdated; for (uint i=0; i & filtre_vertex, // recherche de ce par quoi elle est remplacée std::vector newCoEdges; - std::vector vertices; - coedge->getVertices(vertices); + const std::vector& vertices = coedge->getVertices(); if (vertices.size() != 2) throw TkUtil::Exception("Errer interne dans CommandSplitBlocksWithOgrid::freeUnused, une arête commune n'a pas 2 sommets"); @@ -2179,9 +2074,9 @@ freeUnused(std::map & filtre_vertex, std::cout<<"corr_vtx_coedge["<getName()<<"] -> "<<(coedge?coedge->getName():"0")<isDestroyed() && coedge->getNbEdges() == 0){ + if (coedge && !coedge->isDestroyed() && coedge->getEdges().size() == 0){ Vertex* newVtx = coedge->getOppositeVertex(vtx); - if (newVtx->getNbCoEdges() == 1){ + if (newVtx->getCoEdges().size() == 1){ #ifdef _DEBUG_SPLIT_OGRID std::cout<<" sommet à détruire : "<getName()< & filtre_vertex, void CommandSplitBlocksWithOgrid:: updateNeighBorFilter(Edge* edge, std::map & filtre_edge) { - std::vector coedges; - edge->getCoEdges(coedges); - for (std::vector::iterator iter1 = coedges.begin(); - iter1 != coedges.end(); ++iter1){ - CoEdge* coedge = *iter1; - - std::vector edges; - coedge->getEdges(edges); - for (std::vector::iterator iter2 = edges.begin(); - iter2 != edges.end(); ++iter2){ - Edge* edge = *iter2; - - if (filtre_edge[edge] == 0) - filtre_edge[edge] = 1; - } - } + for (CoEdge* coedge : edge->getCoEdges()) + for (Edge* edge : coedge->getEdges()) + if (filtre_edge[edge] == 0) + filtre_edge[edge] = 1; } /*----------------------------------------------------------------------------*/ void CommandSplitBlocksWithOgrid:: countNbCoEdgesByVertices(std::map &nb_coedges_by_vertex) { // stocke pour chacun des sommets le nombre d'arêtes auxquelles il est relié - for (std::vector::iterator iter1 = m_blocs.begin(); - iter1 != m_blocs.end(); ++iter1){ - Block* bloc = *iter1; - std::vector all_vertices; - bloc->getAllVertices(all_vertices); - for (uint i=0; igetNbCoEdges(); - } + for (Block* b : m_blocs) + for (Vertex* vtx : b->getAllVertices()) + nb_coedges_by_vertex[vtx] = vtx->getCoEdges().size(); } /*----------------------------------------------------------------------------*/ void CommandSplitBlocksWithOgrid::getPreviewRepresentation(Utils::DisplayRepresentation& dr) diff --git a/src/Core/Topo/CommandSplitFaces.cpp b/src/Core/Topo/CommandSplitFaces.cpp index 80fe9613..d82e740b 100644 --- a/src/Core/Topo/CommandSplitFaces.cpp +++ b/src/Core/Topo/CommandSplitFaces.cpp @@ -134,9 +134,7 @@ void CommandSplitFaces::verif(Topo::CoFace* coface) std::cout<<"CommandSplitFaces::verif pour "<getName()< coedges; - coface->getCoEdges(coedges, false); - + std::vector coedges = coface->getCoEdges(); // recherche si une arête est projetée sur un demi cercle @@ -168,15 +166,14 @@ void CommandSplitFaces::verif(Topo::CoFace* coface) // recherche si 2 côtés de part et d'autre d'un sommet logique de la coface sont colinéaires - if (coface->isStructured() && coface->getNbVertices() == 4){ + const std::vector& vertices = coface->getVertices(); + if (coface->isStructured() && vertices.size() == 4){ // on marque les arêtes de cette coface std::map filtre_ce; for (uint i=0; i vertices; - coface->getVertices(vertices); // pour tous les sommets de la coface // recherche d'un couple d'arêtes de la face de part et d'autre d'un sommet @@ -188,11 +185,10 @@ void CommandSplitFaces::verif(Topo::CoFace* coface) std::vector aretes; // on se limite aux arêtes reliés au sommet - vtx->getCoEdges(coedges); - for (uint j=0; jgetCoEdges()) + if (filtre_ce[vtx_ce] == 1){ + filtre_ce[vtx_ce] = 2; + aretes.push_back(vtx_ce); } if (aretes.size() == 2){ @@ -272,10 +268,8 @@ internalExecute() for (std::vector::iterator iter1 = m_cofaces.begin(); iter1 != m_cofaces.end(); ++iter1){ CoFace* coface = *iter1; - std::vector coedges; - coface->getCoEdges(coedges); - for (uint i=0; igetCoEdges()) + if (coedge == m_arete) arete_vue = true; } if (!arete_vue) @@ -304,19 +298,15 @@ internalExecute() if(findFaceUnmarkedWithVertexMarked(filtre_faces, filtre_vertices, coface, sommet)) { coface_vec = {coface}; - std::vector coedges; - coface->getCoEdges(coedges); - CoEdge *coedge = 0; - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter) - if ((*iter)->find(sommet)) - coedge = *iter; + for (CoEdge* cf_ce : coface->getCoEdges()) + if (Utils::contains(sommet, cf_ce->getVertices())) + coedge = cf_ce; - if (coedge->getVertex(0) == sommet) + if (coedge->getVertices()[0] == sommet) TopoHelper::splitFaces(coface_vec, coedge, 0, m_ratio_ogrid, false, false, current_splitingEdge, &getInfoCommand()); - else if (coedge->getVertex(1) == sommet) + else if (coedge->getVertices()[1] == sommet) TopoHelper::splitFaces(coface_vec, coedge, 1, m_ratio_ogrid, false, false, current_splitingEdge, &getInfoCommand()); @@ -324,11 +314,8 @@ internalExecute() } } else{ - std::vector arete_cofaces; - m_arete->getCoFaces(arete_cofaces); - - for (std::vector::iterator iter = arete_cofaces.begin(); - iter != arete_cofaces.end(); ++iter) + std::vector arete_cofaces = m_arete->getCoFaces(); + for (auto iter = arete_cofaces.begin(); iter != arete_cofaces.end(); ++iter) if (std::find(m_cofaces.begin(), m_cofaces.end(),*iter) != m_cofaces.end()) coface = *iter; @@ -343,8 +330,8 @@ internalExecute() for(auto e : current_splitingEdge){ splitingEdges.push_back(e); - filtre_vertices.insert(e->getVertex(0)); - filtre_vertices.insert(e->getVertex(1)); + filtre_vertices.insert(e->getVertices()[0]); + filtre_vertices.insert(e->getVertices()[1]); } } while (nb_faces_dep != nb_faces_split); @@ -360,11 +347,9 @@ internalExecute() // recherche les cofaces de part et d'autre de cette edge std::vector cofaces; - std::vector edge_cofaces; - edge->getCoFaces(edge_cofaces); - for (uint j=0; jgetCoFaces()) + if (getInfoCommand().getTopoInfoEntity()[cf] == Internal::InfoCommand::CREATED) + cofaces.push_back(cf); // cas avec découpage au bord (sans coupe en fait) if (cofaces.size() == 0) @@ -378,20 +363,18 @@ internalExecute() // on utilise un filtre pour marquer les Edges que l'on accepte pour la suite std::map filtre_edge; - for (uint j=0; jgetNbEdges(); k++) - filtre_edge[cofaces[j]->getEdge(k)] = 1; + for (CoFace* cf : cofaces) + for (Edge* cf_e : cf->getEdges()) + filtre_edge[cf_e] = 1; filtre_edge[edge] = 0; - for (uint j=0; jgetNbVertices(); j++){ - Vertex* vtx_c = edge->getVertex(j); + for (uint j=0; jgetVertices().size(); j++){ + Vertex* vtx_c = edge->getVertices()[j]; // les 2 arêtes de part et d'autre d'un sommet std::vector edges; - std::vector vtx_edges; - vtx_c->getEdges(vtx_edges); - for (uint j=0; jgetEdges()) + if (filtre_edge[e] == 1) + edges.push_back(e); if (edges.size() != 2) throw TkUtil::Exception (TkUtil::UTF8String ("On ne peut replacer le sommet suivant le ratio, on ne trouve pas exactement 2 edges autour d'un sommet", TkUtil::Charset::UTF_8)); @@ -445,16 +428,13 @@ findFaceUnmarkedWithVertexMarked(std::set& filtre_faces, std::set& filtre_vertices, CoFace* &face, Vertex* &noeud) { //std::cout<<"findBlockUnmarkedWithCoEdgeMarked ..."<::iterator iter1 = m_cofaces.begin(); iter1 != m_cofaces.end(); ++iter1){ + for (CoFace* cf : m_cofaces){ // le bloc est-il marqué ? - if (filtre_faces.find(*iter1) == filtre_faces.end()){ - CoFace* cf = *iter1; + if (filtre_faces.find(cf) == filtre_faces.end()){ // possède-t-il une arête marquée ? - std::vector vertices; - cf->getAllVertices(vertices); - for (std::vector::iterator iter2 = vertices.begin(); iter2 != vertices.end(); ++iter2){ - if (filtre_vertices.find(*iter2) != filtre_vertices.end()){ - noeud = *iter2; + for (Vertex* vtx : cf->getAllVertices()){ + if (filtre_vertices.find(vtx) != filtre_vertices.end()){ + noeud = vtx; face = cf; return true; } @@ -468,13 +448,9 @@ void CommandSplitFaces:: countNbCoEdgesByVertices(std::map &nb_coedges_by_vertex) { // stocke pour chacun des sommets le nombre d'arêtes auxquelles il est relié - for (std::vector::iterator iter1 = m_cofaces.begin(); - iter1 != m_cofaces.end(); ++iter1){ - CoFace* coface = *iter1; - std::vector all_vertices; - coface->getAllVertices(all_vertices); - for (uint i=0; igetNbCoEdges(); + for (CoFace* coface : m_cofaces){ + for (Vertex* vtx : coface->getAllVertices()) + nb_coedges_by_vertex[vtx] = vtx->getCoEdges().size(); } } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Topo/CommandSplitFacesWithOgrid.cpp b/src/Core/Topo/CommandSplitFacesWithOgrid.cpp index 8dcb0a72..ea25b7a9 100644 --- a/src/Core/Topo/CommandSplitFacesWithOgrid.cpp +++ b/src/Core/Topo/CommandSplitFacesWithOgrid.cpp @@ -48,7 +48,7 @@ CommandSplitFacesWithOgrid(Internal::Context& c, for (std::vector::iterator iter = cofaces.begin(); iter != cofaces.end(); ++iter){ Topo::CoFace* hf = *iter; - if (hf->isStructured() && hf->getNbVertices() == 4) + if (hf->isStructured() && hf->getVertices().size() == 4) m_cofaces.push_back(hf); else{ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); @@ -172,16 +172,12 @@ computeFilters(std::map & filtre_vertex, filtre_coface[coface] = 2; // les sommets - std::vector vertices; - coface->getAllVertices(vertices); - for (uint i=0; igetAllVertices()) + filtre_vertex[v] = 2; // on incrémente à chaque fois que l'on voit l'arête commune - std::vector coedges; - coface->getCoEdges(coedges); - for (uint i=0; igetCoEdges()) + filtre_coedge[ce] += 1; } // end for iter1 @@ -194,8 +190,7 @@ computeFilters(std::map & filtre_vertex, CoEdge* coedge = *iter3; bool erreur = false; - std::vector cofaces; - coedge->getCoFaces(cofaces); + std::vector cofaces = coedge->getCoFaces(); if (cofaces.size() == 2){ uint nb_facesAjoutes = 0; // dans se cas on ajoute simplement la face voisine @@ -231,16 +226,12 @@ computeFilters(std::map & filtre_vertex, filtre_coface[coface] = 2; // les sommets - std::vector vertices; - coface->getAllVertices(vertices); - for (uint i=0; igetAllVertices()) + filtre_vertex[v] = 2; // on incrémente à chaque fois que l'on voit l'arête commune - std::vector coedges; - coface->getCoEdges(coedges); - for (uint i=0; igetCoEdges()) + filtre_coedge[ce] += 1; } // end for iter1 @@ -251,11 +242,9 @@ computeFilters(std::map & filtre_vertex, iter1 != m_cofaces.end(); ++iter1){ CoFace* coface = *iter1; - std::vector coedges; - coface->getCoEdges(coedges); - for (uint i=0; igetCoEdges()) + if (filtre_coedge[ce] == 1) + coedgesAuBord.push_back(ce); } // end for iter1 // pour les arêtes au bord, on marque les sommets et faces @@ -274,8 +263,7 @@ computeFilters(std::map & filtre_vertex, // filtre_coedge[coedges[i]] = 1; // les faces sélectionnées qui touchent le bord - std::vector cofaces; - coedge->getCoFaces(cofaces); + std::vector cofaces = coedge->getCoFaces(); for (uint i=0; i & filtre_vertex, CoFace* coface = *iter1; - std::vector edges; - coface->getEdges(edges); - - for (std::vector::iterator iter2 = edges.begin(); - iter2 != edges.end(); ++iter2){ + const std::vector& edges = coface->getEdges(); + for (auto iter2 = edges.begin(); iter2 != edges.end(); ++iter2){ Edge* edge = *iter2; // recherche des nombres d'arêtes communes internes et externes dans cette arête uint nb_arete_int = 0; uint nb_arete_ext = 0; - - std::vector coedges; - edge->getCoEdges(coedges); + std::vector coedges = edge->getCoEdges(); for (std::vector::iterator iter3 = coedges.begin(); iter3 != coedges.end(); ++iter3) @@ -313,25 +296,17 @@ computeFilters(std::map & filtre_vertex, if (nb_arete_int == 0){ filtre_edge[edge] = 1; - std::vector vertices; - edge->getVertices(vertices); - for (uint i=0; igetVertices()) + filtre_vertex[ve] = 1; } else { filtre_edge[edge] = 2; // pour ces arete particulières, on marques tous les noeuds des aretes au bord - for (std::vector::iterator iter3 = coedges.begin(); - iter3 != coedges.end(); ++iter3){ - CoEdge* coedge = *iter3; - if (filtre_coedge[coedge] == 1){ - std::vector vertices; - coedge->getVertices(vertices); - for (uint i=0; igetVertices()) + filtre_vertex[ve] = 1; } } } @@ -349,61 +324,44 @@ computeFilters(std::map & filtre_vertex, #endif // les arêtes communes - std::vector coedges; - coface->getCoEdges(coedges); - for (uint i=0; igetCoEdges()) + filtre_coedge[ce] = 3; } } // constitution de la liste de arêtes au bord std::vector aretesAuBord; - for (std::vector::iterator iter1 = m_cofaces.begin(); - iter1 != m_cofaces.end(); ++iter1){ - - CoFace* coface = *iter1; - std::vector edges; - coface->getEdges(edges); - for (uint i=0; igetEdges()) + if (filtre_edge[e] == 1) + aretesAuBord.push_back(e); // pour les arêtes au bord, on marque les sommets, // à 1 (au bord) - for (std::vector::iterator iter3 = aretesAuBord.begin(); - iter3 != aretesAuBord.end(); ++iter3){ - Edge* edge = *iter3; - - std::vector vertices; - edge->getVertices(vertices); - for (uint i=0; igetAllVertices(vertices); - for (uint i=0; igetVertices()) + if (filtre_vertex[v] == 2) + filtre_vertex[v] = 1; + + for (Topo::Vertex* v : edge->getAllVertices()) + if (filtre_vertex[v] == 2){ // par défaut ce sommet est à ignorer - filtre_vertex[vertices[i]] = 5; + filtre_vertex[v] = 5; // recherche si ce sommet est relié à une arête interne (filtre à 2) // si oui, alors on le considère au bord - std::vector coedges; - vertices[i]->getCoEdges(coedges); - for (uint j=0; jgetCoEdges()) + if (filtre_coedge[v_ce] == 2) + filtre_vertex[v] = 1; } - } // on ne touchera pas aux arêtes entièrement à l'intérieur (celles avec les 2 sommets internes) for (std::map::iterator iter_ce=filtre_coedge.begin(); iter_ce!=filtre_coedge.end(); ++iter_ce) if (iter_ce->second == 2 - && filtre_vertex[iter_ce->first->getVertex(0)] == 2 - && filtre_vertex[iter_ce->first->getVertex(1)] == 2) + && filtre_vertex[iter_ce->first->getVertices()[0]] == 2 + && filtre_vertex[iter_ce->first->getVertices()[1]] == 2) iter_ce->second = 3; @@ -436,42 +394,22 @@ void CommandSplitFacesWithOgrid::saveTopoProperty(std::map & filt std::map & filtre_coedge, std::map & filtre_coface) { - for (std::vector::iterator iter1 = m_cofaces.begin(); - iter1 != m_cofaces.end(); ++iter1){ - - CoFace* coface = *iter1; - + for (CoFace* coface : m_cofaces){ // seules les faces communes internes ne sont pas touchées if (filtre_coface[coface] != 3){ // les sommets - std::vector vertices; - coface->getVertices(vertices); - for (uint i=0; isaveVertexTopoProperty(&getInfoCommand()); - - std::vector edges; - coface->getEdges(edges); - for (std::vector::iterator iter4 = edges.begin(); - iter4 != edges.end(); ++iter4){ - Edge* edge = *iter4; + for (Vertex* v : coface->getVertices()) + v->saveVertexTopoProperty(&getInfoCommand()); + for (Edge* edge : coface->getEdges()){ edge->saveEdgeTopoProperty(&getInfoCommand()); - - std::vector coedges; - edge->getCoEdges(coedges); - for (std::vector::iterator iter5 = coedges.begin(); - iter5 != coedges.end(); ++iter5){ - CoEdge* coedge = *iter5; - + for (CoEdge* coedge : edge->getCoEdges()) // seules les arêtes communes internes ne sont pas touchées if (filtre_coedge[coedge] != 3) coedge->saveCoEdgeTopoProperty(&getInfoCommand()); - //std::cout<<"saveCoEdgeTopoProperty pour "<getName()< & filtre_vertex, CoFace* coface = *iter1; // les sommets extrémités de la face - std::vector vertices; - coface->getVertices(vertices); + std::vector vertices = coface->getVertices(); // recherche du barycentre de la face Utils::Math::Point barycentre_cf; @@ -496,7 +433,7 @@ createVertices(std::map & filtre_vertex, barycentre_cf += vertices[i]->getCoord(); barycentre_cf /= (double)vertices.size(); - coface->getAllVertices(vertices); + vertices = coface->getAllVertices(); // création des sommets pour la face centrale for (std::vector::iterator iter6 = vertices.begin(); @@ -520,18 +457,14 @@ createVertices(std::map & filtre_vertex, // on conserve les arêtes internes std::vector coedges_int; - std::vector coedges; - sommet->getCoEdges(coedges); - - for (std::vector::iterator iter3 = coedges.begin(); - iter3 != coedges.end(); ++iter3){ + for (CoEdge* sommet_ce : sommet->getCoEdges()){ #ifdef _DEBUG_SPLIT_OGRID - std::cout<<" coedge = "<<(*iter3)->getName()<<", filtre à "< & filtre_vertex, // ce cas n'est valide que si le sommet n'est relié qu'à une seule face sélectionnée // pas valide en cas de sommet commun à 2 faces sans arête commune // => récupération des faces du sommet pour compter le nombre de faces candidates à l'ogrid - std::vector cofaces; - sommet->getCoFaces(cofaces); int nb_selected = 0; - for (auto f1 : cofaces) { + for (auto f1 : sommet->getCoFaces()) { for (auto f2 : m_cofaces) { if (f1 == f2) nb_selected++; } @@ -639,8 +570,7 @@ createVertices(std::map & filtre_vertex, CoEdge* coedge = coedges_int[0]; // calcul le barycentre de la CoEdge - std::vector vertices_ce; - coedge->getVertices(vertices_ce); + const std::vector& vertices_ce = coedge->getVertices(); Utils::Math::Point barycentre_ce = (vertices_ce[0]->getCoord()+vertices_ce[1]->getCoord())/2; Utils::Math::Point pt = (barycentre_ce + (sommet->getCoord() - barycentre_ce)*m_ratio_ogrid); @@ -715,9 +645,7 @@ createCoEdges(std::map & filtre_vertex, CoFace* coface = *iter1; - std::vector vertices; - coface->getAllVertices(vertices); - + std::vector vertices = coface->getAllVertices(); for (std::vector::iterator iter6 = vertices.begin(); iter6 != vertices.end(); ++iter6){ CoEdge* newCoEdge = corr_vtx_coedge[*iter6]; @@ -772,18 +700,16 @@ createCoEdgeAndFace(std::map & filtre_vertex, // on procède par Edge // et si cette Edge est composée de Edge commune interne et externe // alors on procède par arête commune - std::vector edges; - coface->getEdges(edges); + const std::vector& edges = coface->getEdges(); - for (std::vector::iterator iter2 = edges.begin(); - iter2 != edges.end(); ++iter2){ + for (auto iter2 = edges.begin(); iter2 != edges.end(); ++iter2){ Edge* edge = *iter2; #ifdef _DEBUG_SPLIT_OGRID std::cout<<"arête: "<getName()<<", filtre à "<getVertex(0); - Vertex* vtx1 = edge->getVertex(1); + Vertex* vtx0 = edge->getVertices()[0]; + Vertex* vtx1 = edge->getVertices()[1]; std::vector groupsName; @@ -827,13 +753,11 @@ getSelectedVertices(Vertex* vtx0, do { // recherche de l'arête marquée à 1 parmis celles liées au sommet vtx_prec - std::vector coedge_vois; - vtx_prec->getCoEdges(coedge_vois); CoEdge* coedge = 0; - for (uint i=0; igetCoEdges()) + if (filtre_vu[coedge_vois] == 1) + coedge = coedge_vois; if (0 == coedge) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne dans CommandSplitFacesWithOgrid::getSelectedVertices, aucune arête voisine de vtx_prec", TkUtil::Charset::UTF_8)); @@ -882,8 +806,7 @@ createCoEdgeAndFace(Vertex* vtx0, TopoHelper::sortVertices(som0, som1); // recherche des arêtes entre les 2 sommets - std::vector coedges_between; - edge->getCoEdges(coedges_between); + std::vector coedges_between = edge->getCoEdges(); // si l'une des arêtes est interne (sans toucher le bord), on passe if (filtre_coedge[coedges_between[0]] == 3) @@ -1049,12 +972,12 @@ createCoFace(std::map & filtre_vertex, for (uint i=0; i<4; i++){ Edge* newEdge; - Vertex* som0 = coface->getVertex(i); - Vertex* som1 = coface->getVertex((i+1)%4); + Vertex* som0 = coface->getVertices()[i]; + Vertex* som1 = coface->getVertices()[(i+1)%4]; if (filtre_vertex[som0] == 2 && filtre_vertex[som1] == 2) // on conserve l'arête lorsqu'elle est interne - newEdge = coface->getEdge(i); + newEdge = coface->getEdges()[i]; else newEdge = createEdge( som0, @@ -1108,44 +1031,45 @@ freeUnused(std::map & filtre_vertex, newCoface->setGeomAssociation(ga); // pour les arêtes et sommets au bord de cette coface centrale - std::vector coedges; - newCoface->getCoEdges(coedges); - for (std::vector::iterator iter5 = coedges.begin(); - iter5 != coedges.end(); ++iter5){ + std::vector coedges = newCoface->getCoEdges(); + for (auto iter5 = coedges.begin(); iter5 != coedges.end(); ++iter5){ + Topo::Vertex* vtx0 = (*iter5)->getVertices()[0]; + Topo::Vertex* vtx1 = (*iter5)->getVertices()[1]; #ifdef _DEBUG_SPLIT_OGRID std::cout<<"coedge: "<<(*iter5)->getName()<getVertex(0)->getName()<<", filtre à "<getVertex(0)]<getVertex(1)->getName()<<", filtre à "<getVertex(1)]<getVertex(0)->getGeomAssociation() == (*iter5)->getVertex(1)->getGeomAssociation()) + std::cout<<" vtx0: "<getName()<<", filtre à "<getName()<<", filtre à "<getGeomAssociation() == vtx1->getGeomAssociation()) std::cout<<" associés à la même entité"<getVertex(0)] == 4 - || filtre_vertex[(*iter5)->getVertex(1)] == 4) - && (*iter5)->getVertex(0)->getGeomAssociation() == (*iter5)->getVertex(1)->getGeomAssociation()) - (*iter5)->setGeomAssociation((*iter5)->getVertex(0)->getGeomAssociation()); + if ((filtre_vertex[vtx0] == 4 || filtre_vertex[vtx1] == 4) + && vtx0->getGeomAssociation() == vtx1->getGeomAssociation()) + (*iter5)->setGeomAssociation(vtx0->getGeomAssociation()); else (*iter5)->setGeomAssociation(ga); for (uint i=0; i<2; i++) - if ((*iter5)->getVertex(i)->getGeomAssociation() == 0) - (*iter5)->getVertex(i)->setGeomAssociation(ga); + if ((*iter5)->getVertices()[i]->getGeomAssociation() == 0) + (*iter5)->getVertices()[i]->setGeomAssociation(ga); } // end for iter5 // pour les arêtes entre les sommets de la face initiale et celle créée au centre for (uint i=0; i<4; i++){ - CoEdge* newCoedge = corr_vtx_coedge[coface->getVertex(i)]; + CoEdge* newCoedge = corr_vtx_coedge[coface->getVertices()[i]]; if (newCoedge){ + Topo::Vertex* vtx0 = newCoedge->getVertices()[0]; + Topo::Vertex* vtx1 = newCoedge->getVertices()[1]; #ifdef _DEBUG_SPLIT_OGRID std::cout<<"newCoedge: "<getName()<getVertex(0)->getName()<<", filtre à "<getVertex(0)]<getVertex(1)->getName()<<", filtre à "<getVertex(1)]<getName()<<", filtre à "<getName()<<", filtre à "<getVertex(0)] == 4) - newCoedge->setGeomAssociation(newCoedge->getVertex(0)->getGeomAssociation()); - else if (filtre_vertex[newCoedge->getVertex(1)] == 4) - newCoedge->setGeomAssociation(newCoedge->getVertex(1)->getGeomAssociation()); + if (filtre_vertex[vtx0] == 4) + newCoedge->setGeomAssociation(vtx0->getGeomAssociation()); + else if (filtre_vertex[vtx1] == 4) + newCoedge->setGeomAssociation(vtx1->getGeomAssociation()); else newCoedge->setGeomAssociation(ga); } @@ -1153,8 +1077,8 @@ freeUnused(std::map & filtre_vertex, // pour les faces entre les bords de la face initiale et celle au centre for (uint i=0; i<4; i++){ - Vertex* vtx0 = coface->getVertex(i); - Vertex* vtx1 = coface->getVertex((i+1)%4); + Vertex* vtx0 = coface->getVertices()[i]; + Vertex* vtx1 = coface->getVertices()[(i+1)%4]; // on ordonne les sommets suivant leur id TopoHelper::sortVertices(vtx0, vtx1); @@ -1181,8 +1105,8 @@ freeUnused(std::map & filtre_vertex, // pour les faces entre les bords de la face initiale et celle au centre for (uint i=0; i<4; i++){ - Vertex* vtx0 = coface->getVertex(i); - Vertex* vtx1 = coface->getVertex((i+1)%4); + Vertex* vtx0 = coface->getVertices()[i]; + Vertex* vtx1 = coface->getVertices()[(i+1)%4]; // on ordonne les sommets suivant leur id TopoHelper::sortVertices(vtx0, vtx1); @@ -1198,15 +1122,11 @@ freeUnused(std::map & filtre_vertex, } // end if (newCoface) - - std::vector edges; - coface->getEdges(edges); - for (std::vector::iterator iter4 = edges.begin(); - iter4 != edges.end(); ++iter4){ + // travaille sur une copie du vecteur + std::vector edges = coface->getEdges(); + for (auto iter4 = edges.begin(); iter4 != edges.end(); ++iter4){ Edge* edge = *iter4; - - std::vector coedges; - edge->getCoEdges(coedges); + std::vector coedges = edge->getCoEdges(); // suppression des arêtes initiales entre le bord et le centre de la sélection for (std::vector::iterator iter5 = coedges.begin(); @@ -1220,7 +1140,7 @@ freeUnused(std::map & filtre_vertex, } } // end for iter5 - if (edge->getNbCoFaces() == 1) + if (edge->getCoFaces().size() == 1) edge->free(&getInfoCommand()); } // end for iter4 @@ -1235,9 +1155,9 @@ freeUnused(std::map & filtre_vertex, CoEdge* coedge = iter->second; Vertex* vtx = iter->first; - if (coedge && !coedge->isDestroyed() && coedge->getNbEdges() == 0){ + if (coedge && !coedge->isDestroyed() && coedge->getEdges().size() == 0){ Vertex* newVtx = coedge->getOppositeVertex(vtx); - if (newVtx->getNbCoEdges() == 1){ + if (newVtx->getCoEdges().size() == 1){ #ifdef _DEBUG_SPLIT_OGRID std::cout<<" sommet à détruire : "<getName()< &nb_coedges_by_vertex) { // stocke pour chacun des sommets le nombre d'arêtes auxquelles il est relié - for (std::vector::iterator iter1 = m_cofaces.begin(); - iter1 != m_cofaces.end(); ++iter1){ - CoFace* coface = *iter1; - std::vector all_vertices; - coface->getAllVertices(all_vertices); - for (uint i=0; igetNbCoEdges(); + for (CoFace* coface : m_cofaces){ + for (Vertex* vtx : coface->getAllVertices()) + nb_coedges_by_vertex[vtx] = vtx->getCoEdges().size(); } } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Topo/CommandTransformTopo.cpp b/src/Core/Topo/CommandTransformTopo.cpp index fca7f0e8..d2d24162 100644 --- a/src/Core/Topo/CommandTransformTopo.cpp +++ b/src/Core/Topo/CommandTransformTopo.cpp @@ -126,12 +126,9 @@ transform(Block* bl, gp_Trsf* transf, std::map& filtre) if (filtre[bl] == 1) return; - std::vector faces; - bl->getFaces(faces); - for (std::vector::iterator iter1 = faces.begin(); - iter1 != faces.end(); ++iter1){ - std::vector cofaces; - (*iter1)->getCoFaces(cofaces); + const std::vector& faces = bl->getFaces(); + for (auto iter1 = faces.begin(); iter1 != faces.end(); ++iter1){ + std::vector cofaces = (*iter1)->getCoFaces(); for (std::vector::iterator iter2 = cofaces.begin(); iter2 != cofaces.end(); ++iter2){ transform(*iter2, transf, filtre); @@ -147,12 +144,9 @@ transform(Block* bl, gp_GTrsf* transf, std::map& filtre) if (filtre[bl] == 1) return; - std::vector faces; - bl->getFaces(faces); - for (std::vector::iterator iter1 = faces.begin(); - iter1 != faces.end(); ++iter1){ - std::vector cofaces; - (*iter1)->getCoFaces(cofaces); + const std::vector& faces = bl->getFaces(); + for (auto iter1 = faces.begin(); iter1 != faces.end(); ++iter1){ + std::vector cofaces = (*iter1)->getCoFaces(); for (std::vector::iterator iter2 = cofaces.begin(); iter2 != cofaces.end(); ++iter2){ transform(*iter2, transf, filtre); @@ -168,14 +162,10 @@ transform(CoFace* co, gp_Trsf* transf, std::map& filtre) if (filtre[co] == 1) return; - std::vector edges; - co->getEdges(edges); - for (std::vector::iterator iter1 = edges.begin(); - iter1 != edges.end(); ++iter1){ - std::vector coedges; - (*iter1)->getCoEdges(coedges); - for (std::vector::iterator iter2 = coedges.begin(); - iter2 != coedges.end(); ++iter2){ + const std::vector& edges = co->getEdges(); + for (auto iter1 = edges.begin(); iter1 != edges.end(); ++iter1){ + const std::vector& coedges = (*iter1)->getCoEdges(); + for (auto iter2 = coedges.begin(); iter2 != coedges.end(); ++iter2){ transform(*iter2, transf, filtre); } } @@ -189,14 +179,10 @@ transform(CoFace* co, gp_GTrsf* transf, std::map& filtre) if (filtre[co] == 1) return; - std::vector edges; - co->getEdges(edges); - for (std::vector::iterator iter1 = edges.begin(); - iter1 != edges.end(); ++iter1){ - std::vector coedges; - (*iter1)->getCoEdges(coedges); - for (std::vector::iterator iter2 = coedges.begin(); - iter2 != coedges.end(); ++iter2){ + const std::vector& edges = co->getEdges(); + for (auto iter1 = edges.begin(); iter1 != edges.end(); ++iter1){ + const std::vector& coedges = (*iter1)->getCoEdges(); + for (auto iter2 = coedges.begin(); iter2 != coedges.end(); ++iter2){ transform(*iter2, transf, filtre); } } diff --git a/src/Core/Topo/Edge.cpp b/src/Core/Topo/Edge.cpp index 2e76eaf8..5dca2e15 100644 --- a/src/Core/Topo/Edge.cpp +++ b/src/Core/Topo/Edge.cpp @@ -49,10 +49,8 @@ Edge(Internal::Context& ctx, // association remontante ce->addEdge(this); - const std::vector & vertices = ce->getVertices(); - m_topo_property->getVertexContainer().add(vertices); - - m_topo_property->getCoEdgeContainer().add(ce); + m_topo_property->getVertexContainer() = ce->getVertices(); + m_topo_property->getCoEdgeContainer().push_back(ce); ctx.newGraphicalRepresentation (*this); } /*----------------------------------------------------------------------------*/ @@ -69,24 +67,21 @@ Edge(Internal::Context& ctx, , m_mesh_property (new EdgeMeshingProperty()) , m_save_mesh_property (0) { - m_topo_property->getVertexContainer().add(v1); - m_topo_property->getVertexContainer().add(v2); - - m_topo_property->getCoEdgeContainer().add(coedges); + m_topo_property->getVertexContainer().push_back(v1); + m_topo_property->getVertexContainer().push_back(v2); + m_topo_property->getCoEdgeContainer() = coedges; // association remontante - for (uint i=0; iaddEdge(this); + for (CoEdge* ce : coedges) + ce->addEdge(this); ctx.newGraphicalRepresentation (*this); } /*----------------------------------------------------------------------------*/ Edge* Edge:: clone() { - std::vector coedges; - getCoEdges(coedges); - - Edge* new_edge = new Edge(getContext(), getVertex(0), getVertex(1), coedges); + std::vector coedges = getCoEdges(); + Edge* new_edge = new Edge(getContext(), getVertices()[0], getVertices()[1], coedges); delete new_edge->m_mesh_property; new_edge->m_mesh_property = m_mesh_property->clone(); @@ -140,14 +135,13 @@ void Edge::sortCoEdges() const std::vector & coedges = getCoEdges(); std::vector sorted_coedges; - if (!TopoHelper::getCoEdgesBetweenVertices(getVertex(0), getVertex(1), + if (!TopoHelper::getCoEdgesBetweenVertices(getVertices()[0], getVertices()[1], coedges, sorted_coedges)){ std::cerr<< "Erreur, Edge::sortCoEdges() pour : "<<*this; throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne avec Edge::sortCoEdges()", TkUtil::Charset::UTF_8)); } - m_topo_property->getCoEdgeContainer().clear(); - m_topo_property->getCoEdgeContainer().add(sorted_coedges); + m_topo_property->getCoEdgeContainer() = sorted_coedges; } /*----------------------------------------------------------------------------*/ void Edge::replace(Vertex* v1, Vertex* v2, bool propagate_up, bool propagate_down, Internal::InfoCommand* icmd) @@ -156,43 +150,38 @@ void Edge::replace(Vertex* v1, Vertex* v2, bool propagate_up, bool propagate_dow // if (isDestroyed()) // return; - if (!find(v1)){ + if (!Utils::contains(v1, getVertices())){ // si le sommet est interne à l'arête, tout va bien, // il n'y a rien à faire pour l'arête ni pour la face, // sinon erreur ... - - std::vector coedges; - getCoEdges(coedges); - - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter) - if ((*iter)->find(v1)) + for (CoEdge* ce : getCoEdges()) + if (Utils::contains(v1, ce->getVertices())) return; } // transmet aux entités de niveau supérieur // avant de modifier les arêtes, des fois que les arêtes dégénèrent if (propagate_up) - for (uint i=0; ireplace(v1, v2, propagate_up, propagate_down, icmd); + for (uint i=0; ireplace(v1, v2, propagate_up, propagate_down, icmd); if (propagate_down) - for (uint i=0; ireplace(v1, v2, propagate_up, propagate_down, icmd); + for (uint i=0; ireplace(v1, v2, propagate_up, propagate_down, icmd); bool found = false; - for (uint i=0; igetVertexContainer().set(i,v2); + m_topo_property->getVertexContainer()[i] = v2; } if (propagate_up && !found) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne (sommet non trouvé), avec Edge::replace", TkUtil::Charset::UTF_8)); - if (getNbVertices() == 2 && getVertex(0) == getVertex(1)) + if (getVertices().size() == 2 && getVertices()[0] == getVertices()[1]) free(icmd); } /*----------------------------------------------------------------------------*/ @@ -202,8 +191,8 @@ void Edge::replace(CoEdge* e1, CoEdge* e2, Internal::InfoCommand* icmd) if (isDestroyed()) return; - for (uint i=0; igetNbMeshingEdges()getNbMeshingEdges()){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); @@ -236,7 +225,7 @@ void Edge::replace(CoEdge* e1, CoEdge* e2, Internal::InfoCommand* icmd) } saveEdgeTopoProperty(icmd); - m_topo_property->getCoEdgeContainer().set(i, e2); + m_topo_property->getCoEdgeContainer()[i] = e2; e1->saveCoEdgeTopoProperty(icmd); e2->saveCoEdgeTopoProperty(icmd); @@ -265,8 +254,7 @@ void Edge::replace(CoEdge* e1, std::vector& coedges, Internal::InfoComm saveEdgeTopoProperty(icmd); std::vector new_edges; - std::vector old_edges; - getCoEdges(old_edges); + std::vector old_edges = getCoEdges(); std::vector::iterator iter = old_edges.begin(); while (e1 != *iter){ new_edges.push_back(*iter); @@ -292,8 +280,7 @@ void Edge::replace(CoEdge* e1, std::vector& coedges, Internal::InfoComm coedges[i]->saveCoEdgeTopoProperty(icmd); coedges[i]->addEdge(this); } - m_topo_property->getCoEdgeContainer().clear(); - m_topo_property->getCoEdgeContainer().add(new_edges); + m_topo_property->getCoEdgeContainer() = new_edges; #ifdef _DEBUG2 std::cout<<"new_edges:"; for (uint i=0; i cofaces; - ed->getCoFaces(cofaces); - + std::vector cofaces = ed->getCoFaces(); for (std::vector::iterator iter=cofaces.begin(); iter != cofaces.end(); ++iter) (*iter)->replace(ed, this, icmd); // les arêtes qui disparaissent - std::vector old_coedges; - ed->getCoEdges(old_coedges); + std::vector old_coedges = ed->getCoEdges(); // changement des coedges de ed par celle de this dans les edges qui références if (updateOtherEdges){ if (old_coedges.size() == 1){ - std::vector new_coedges; - getCoEdges(new_coedges); - - std::vector edges; - old_coedges[0]->getEdges(edges); + std::vector new_coedges = getCoEdges(); + const std::vector& edges = old_coedges[0]->getEdges(); for (uint i=0; ireplace(old_coedges[0], new_coedges, icmd); @@ -360,8 +341,7 @@ void Edge::merge(Edge* ed, Internal::InfoCommand* icmd, bool updateOtherEdges) } // updateOtherEdges // il faut libérer les CoEdges de l'arête qui disparait (ed) - for (std::vector::iterator iter = old_coedges.begin(); - iter != old_coedges.end(); ++iter){ + for (auto iter = old_coedges.begin(); iter != old_coedges.end(); ++iter){ // std::cout<<"libération de "<<(*iter)->getName()<free(icmd); } @@ -374,18 +354,13 @@ collapse(Internal::InfoCommand* icmd) { //std::cout<<"Edge::collapse pour : "<<*this< coedges; - getCoEdges(coedges); - - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter){ - (*iter)->collapse(icmd); - } + for (CoEdge* coedge : getCoEdges()) + coedge->collapse(icmd); free(icmd); } @@ -409,15 +384,15 @@ free(Internal::InfoCommand* icmd) setDestroyed(true); // on supprime l'arête des relations des arêtes communes vers les arêtes - for (uint i=0; isaveCoEdgeTopoProperty(icmd); - getCoEdge(i)->removeEdge(this, false); + for (uint i=0; isaveCoEdgeTopoProperty(icmd); + getCoEdges()[i]->removeEdge(this); } // idem entre faces communes et cette arête - for (uint i=0; isaveCoFaceTopoProperty(icmd); - getCoFace(i)->removeEdge(this, false); + for (uint i=0; isaveCoFaceTopoProperty(icmd); + getCoFaces()[i]->removeEdge(this); } clearDependancy(); @@ -436,14 +411,14 @@ split(std::vector new_vtx, std::vector& new_edges, Internal::Inf uint nb_splitingVtx = new_vtx.size(); for (uint i=0; i& new_edges, Internal::InfoCommand* icm #ifdef _DEBUG_TIMER TkUtil::Timer timer(true); #endif - std::vector coedges; - getCoEdges(coedges); - + std::vector coedges = getCoEdges(); for (std::vector::iterator iter = coedges.begin(); iter != coedges.end(); ++iter) (*iter)->saveCoEdgeTopoProperty(icmd); @@ -473,12 +446,12 @@ split(Vertex* new_vtx, std::vector& new_edges, Internal::InfoCommand* icm // on part d'une extrémité de l'arête std::vector coedges1; std::vector coedges2; - TopoHelper::getCoEdgesBetweenVertices(getVertex(0), new_vtx, coedges, coedges1); - TopoHelper::getCoEdgesBetweenVertices(getVertex(1), new_vtx, coedges, coedges2); + TopoHelper::getCoEdgesBetweenVertices(getVertices()[0], new_vtx, coedges, coedges1); + TopoHelper::getCoEdgesBetweenVertices(getVertices()[1], new_vtx, coedges, coedges2); // construction des 2 nouvelles arêtes - Edge* edge1 = new Topo::Edge(getContext(), getVertex(0), new_vtx, coedges1); - Edge* edge2 = new Topo::Edge(getContext(), new_vtx, getVertex(1), coedges2); + Edge* edge1 = new Topo::Edge(getContext(), getVertices()[0], new_vtx, coedges1); + Edge* edge2 = new Topo::Edge(getContext(), new_vtx, getVertices()[1], coedges2); edge1->sortCoEdges(); edge2->sortCoEdges(); if (icmd){ @@ -515,9 +488,7 @@ split(Vertex* new_vtx1, Vertex* new_vtx2, std::vector& new_edges, Interna TkUtil::Timer timer(true); #endif - std::vector coedges; - getCoEdges(coedges); - + std::vector coedges = getCoEdges(); for (std::vector::iterator iter = coedges.begin(); iter != coedges.end(); ++iter) (*iter)->saveCoEdgeTopoProperty(icmd); @@ -528,8 +499,8 @@ split(Vertex* new_vtx1, Vertex* new_vtx2, std::vector& new_edges, Interna // on fait les 2 recherches std::vector coedges1_1; std::vector coedges1_2; - TopoHelper::getCoEdgesBetweenVertices(getVertex(0), new_vtx1, coedges, coedges1_1); - TopoHelper::getCoEdgesBetweenVertices(getVertex(0), new_vtx2, coedges, coedges1_2); + TopoHelper::getCoEdgesBetweenVertices(getVertices()[0], new_vtx1, coedges, coedges1_1); + TopoHelper::getCoEdgesBetweenVertices(getVertices()[0], new_vtx2, coedges, coedges1_2); bool newVtxOrdonnes = (coedges1_1.size() < coedges1_2.size()); std::vector coedges1; @@ -545,12 +516,12 @@ split(Vertex* new_vtx1, Vertex* new_vtx2, std::vector& new_edges, Interna new_vtx2 = vtxTmp; } TopoHelper::getCoEdgesBetweenVertices(new_vtx1, new_vtx2, coedges, coedges2); - TopoHelper::getCoEdgesBetweenVertices(new_vtx2, getVertex(1), coedges, coedges3); + TopoHelper::getCoEdgesBetweenVertices(new_vtx2, getVertices()[1], coedges, coedges3); // construction des 3 nouvelles arêtes - Edge* edge1 = new Topo::Edge(getContext(), getVertex(0), new_vtx1, coedges1); + Edge* edge1 = new Topo::Edge(getContext(), getVertices()[0], new_vtx1, coedges1); Edge* edge2 = new Topo::Edge(getContext(), new_vtx1, new_vtx2, coedges2); - Edge* edge3 = new Topo::Edge(getContext(), new_vtx2, getVertex(1), coedges3); + Edge* edge3 = new Topo::Edge(getContext(), new_vtx2, getVertices()[1], coedges3); edge1->sortCoEdges(); edge2->sortCoEdges(); edge3->sortCoEdges(); @@ -587,16 +558,18 @@ split(Vertex* new_vtx1, Vertex* new_vtx2, std::vector& new_edges, Interna Vertex* Edge:: getOppositeVertex(Vertex* v) { - if (v == getVertex(0)){ - return getVertex(1); + if (v == getVertices()[0]){ + return getVertices()[1]; } - else if (v == getVertex(1)){ - return getVertex(0); + else if (v == getVertices()[1]){ + return getVertices()[0]; } else { - std::cerr<<"Edge::getOppositeVertex("<getName()<<")"<getName()<<") pour " <getName()<<","; + msg<getName()<<"]"; + std::cerr << msg << std::endl; + throw TkUtil::Exception (msg); } return 0; } @@ -613,8 +586,8 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const Topo::TopoDisplayRepresentation tdr(Utils::DisplayRepresentation::WIRE); // on cumule les représentations des CoEdges - for (uint i=0; igetRepresentation(tdr, checkDestroyed); + for (uint i=0; igetRepresentation(tdr, checkDestroyed); std::vector& coedge_points = tdr.getPoints(); std::vector& coedge_indices = tdr.getCurveDiscretization(); @@ -643,9 +616,7 @@ getDescription (bool alsoComputed) const topoProprietes.addProperty ( Utils::SerializedRepresentation::Property ("Nombre de bras", (long)getNbMeshingEdges())); - std::vector ce; - getCoEdges(ce); - + std::vector ce = getCoEdges(); for (std::vector::iterator iter = ce.begin( ); ce.end( )!=iter; iter++) if (getRatio(*iter) > 1) topoProprietes.addProperty ( @@ -659,9 +630,7 @@ getDescription (bool alsoComputed) const Utils::SerializedRepresentation topoRelation ("Relations topologiques", ""); - std::vector vtx; - getVertices(vtx); - + std::vector vtx = getVertices(); Utils::SerializedRepresentation vertices ("Sommets topologiques", TkUtil::NumericConversions::toStr(vtx.size())); for (std::vector::iterator iter = vtx.begin( ); vtx.end( )!=iter; iter++) @@ -680,9 +649,7 @@ getDescription (bool alsoComputed) const topoRelation.addPropertiesSet (coedges); - std::vector fa; - getCoFaces(fa); - + std::vector fa = getCoFaces(); Utils::SerializedRepresentation cofaces ("Faces communes topologiques", TkUtil::NumericConversions::toStr(fa.size())); for (std::vector::iterator iter = fa.begin( ); fa.end( )!=iter; iter++) @@ -757,11 +724,11 @@ check() const throw TkUtil::Exception (TkUtil::UTF8String ("On utilise une arête détruite", TkUtil::Charset::UTF_8)); } - for (uint i=0; icheck(); + for (CoEdge* ce : getCoEdges()) + ce->check(); - for (uint i=0; iisDestroyed()){ + for (CoFace* cf : getCoFaces()) + if (cf->isDestroyed()){ std::cerr<<"Edge::check() pour l'arête "<getName(); - - std::vector vertices; - getVertices(vertices); - for (Vertex* v : vertices) - infos._vertices.push_back(v->getName()); - - std::vector coedges; - getCoEdges(coedges); - for (CoEdge* e : coedges) - infos._coedges.push_back(e->getName()); - - std::vector cofaces; - getCoFaces(cofaces); - for (CoFace* f : cofaces) - infos._cofaces.push_back(f->getName()); - return infos; } /*----------------------------------------------------------------------------*/ @@ -874,9 +828,9 @@ getNodes(Vertex* v1, Vertex* v2, std::vector& vectNd) // - Ar2510 [Som0839 --> Som0844] // - Ar2306 [Som0414 --> Som0839] // Ce qui signifie que le "chemin" pour relier les 2 sommets de Edge2273 est : - // - Ar2306.getVertex(0) --> Ar2306.getVertex(1) - // - Ar2510.getVertex(0) --> Ar2510.getVertex(1) - // - Ar2311.getVertex(1) --> Ar2311.getVertex(0) + // - Ar2306.getVertices()[0] --> Ar2306.getVertices()[1] + // - Ar2510.getVertices()[0] --> Ar2510.getVertices()[1] + // - Ar2311.getVertices()[1] --> Ar2311.getVertices()[0] // Tous les cas de sens et d'ordre sont possibles. Il faut donc retrouver le chemin... std::list> path; @@ -884,8 +838,8 @@ getNodes(Vertex* v1, Vertex* v2, std::vector& vectNd) for(auto it=path.begin() ; it!=path.end() ; ++it) { CoEdge* current_coedge = it->first; bool direction = it->second; - Vertex* from_vertex = current_coedge->getVertex(direction?0:1); - Vertex* to_vertex = current_coedge->getVertex(direction?1:0); + Vertex* from_vertex = current_coedge->getVertices()[direction?0:1]; + Vertex* to_vertex = current_coedge->getVertices()[direction?1:0]; std::vector nodes; // les noeuds de la CoEdge current_coedge->getNodes(from_vertex, to_vertex, nodes); // Rappel : on évite le premier noeud de la CoEdge pour éviter les doublons @@ -914,9 +868,8 @@ void Edge::getPoints(std::vector &points) const // utilise les CoEdge pour obtenir les points internes de l'arête - std::vector coedges; - getCoEdges(coedges); - Vertex* v_dep = getVertex(0); + std::vector coedges = getCoEdges(); + Vertex* v_dep = getVertices()[0]; Vertex* v_opp = 0; for (std::vector::iterator iter = coedges.begin(); @@ -933,7 +886,7 @@ void Edge::getPoints(std::vector &points) const // <<", v_dep : "<getName()<<", v_opp : "<getName()<getVertex(0) != v_dep){ + if ((*iter)->getVertices()[0] != v_dep){ // std::cout<<" inversion du sens ..."< &points) const uint nb_bras = (*iter)->getNbMeshingEdges() / ratio; - if (v_dep == getVertex(0)) + if (v_dep == getVertices()[0]) points.push_back(*iter2); for (uint j=0; j &points) const v_dep = v_opp; } - if (getVertex(1) != v_opp) + if (getVertices()[1] != v_opp) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne: Edge::getPoints a échouée, on ne trouve pas le dernier sommet", TkUtil::Charset::UTF_8)); } /*----------------------------------------------------------------------------*/ -uint Edge:: -getNbVertices() const -{ -#ifdef _DEBUG - if (isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message << "Edge::getNbVertices() pour arête "<getVertexContainer().getNb(); -} -/*----------------------------------------------------------------------------*/ -void Edge::getAllVertices(std::vector& vertices, const bool unique) const +std::vector Edge::getAllVertices() const { - vertices.clear(); - std::list l_v; - for(uint l=0; l < getNbCoEdges(); l++){ - CoEdge* coedge = getCoEdge(l); - - const std::vector & local_vertices = coedge->getVertices(); - - l_v.insert(l_v.end(), local_vertices.begin(), local_vertices.end()); + Utils::EntitySet vertices(Utils::Entity::compareEntity); + for(CoEdge* ce : getCoEdges()){ + const std::vector & local_vertices = ce->getVertices(); + vertices.insert(local_vertices.begin(), local_vertices.end()); } - - l_v.sort(Utils::Entity::compareEntity); - l_v.unique(); - - vertices.insert(vertices.end(),l_v.begin(),l_v.end()); + return Utils::toVect(vertices); } /*----------------------------------------------------------------------------*/ uint Edge:: @@ -1016,33 +948,33 @@ getNbNodes() const CoEdgeMeshingProperty* Edge:: getMeshingProperty() { - if (getNbCoEdges() != 1) + if (getCoEdges().size() != 1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne: Il n'est pas prévu d'utiliser Edge::getMeshingProperty en dehors du cas avec une seule CoEdge", TkUtil::Charset::UTF_8)); - return getCoEdge(0)->getMeshingProperty(); + return getCoEdges()[0]->getMeshingProperty(); } /*----------------------------------------------------------------------------*/ const CoEdgeMeshingProperty* Edge:: getMeshingProperty() const { - if (getNbCoEdges() != 1) + if (getCoEdges().size() != 1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne: Il n'est pas prévu d'utiliser Edge::getMeshingProperty en dehors du cas avec une seule CoEdge", TkUtil::Charset::UTF_8)); - return getCoEdge(0)->getMeshingProperty(); + return getCoEdges()[0]->getMeshingProperty(); } /*----------------------------------------------------------------------------*/ void Edge::setRatio(uint ratio) { - for (uint i=0; isetRatio(getCoEdge(i), ratio); + for (uint i=0; isetRatio(getCoEdges()[i], ratio); } /*----------------------------------------------------------------------------*/ void Edge:: setGeomAssociation(Geom::GeomEntity* ge) { // ce sont les arêtes communes qui portent les projections - for (uint i=0; isetGeomAssociation(ge); + for (uint i=0; isetGeomAssociation(ge); } /*----------------------------------------------------------------------------*/ //#define _DEBUG_SPLIT @@ -1056,12 +988,12 @@ computeCorrespondingNbMeshingEdges(Vertex* v_dep, const CoEdge* coedge, uint nbB #endif Vertex* v_ar; - if (v_dep == getVertex(0)) v_ar = getVertex(1); - else if (v_dep == getVertex(1)) v_ar = getVertex(0); + if (v_dep == getVertices()[0]) v_ar = getVertices()[1]; + else if (v_dep == getVertices()[1]) v_ar = getVertices()[0]; else { TkUtil::UTF8String msg(TkUtil::Charset::UTF_8); msg << "Erreur interne Edge::computeCorrespondingNbMeshingEdges : " << getName(); - msg << " [" << getVertex(0)->getName() << ", " << getVertex(1)->getName(); + msg << " [" << getVertices()[0]->getName() << ", " << getVertices()[1]->getName(); msg << "] ne possède pas le sommet " << v_dep->getName(); throw TkUtil::Exception(msg); } @@ -1128,15 +1060,15 @@ computeCorrespondingCoEdgeAndNbMeshingEdges(Vertex* v_dep, uint nbBras_edge, boo // sommes nous dans le même sens que l'arête ? bool sens; - if (v_dep == getVertex(0)) + if (v_dep == getVertices()[0]) sens = true; - else if (v_dep == getVertex(1)) + else if (v_dep == getVertices()[1]) sens = false; else { throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, Edge::computeCorrespondingCoEdgeAndNbMeshingEdges ne trouve pas le sommet", TkUtil::Charset::UTF_8)); } - int ind_dep = (sens?0:getNbCoEdges()-1); + int ind_dep = (sens?0:getCoEdges().size()-1); int ind_inc = (sens?1:-1); Vertex* v_ar; @@ -1144,48 +1076,48 @@ computeCorrespondingCoEdgeAndNbMeshingEdges(Vertex* v_dep, uint nbBras_edge, boo int i = ind_dep; do { - if (i<0 || i>getNbCoEdges()-1){ + if (i<0 || i>getCoEdges().size()-1){ throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, Edge::computeCorrespondingCoEdgeAndNbMeshingEdges indice i en dehors des bornes...", TkUtil::Charset::UTF_8)); } #ifdef _DEBUG_SPLIT std::cout<<"i = "<getNbMeshingEdges()/getRatio(getCoEdge(i)) < nbBras_edge - || (coedge_after_cut && getCoEdge(i)->getNbMeshingEdges()/getRatio(getCoEdge(i)) == nbBras_edge)){ - //std::cout<<"nbBras_edge : "<getNbMeshingEdges()<<" / ratio : "<getNbMeshingEdges()/getRatio(getCoEdge(i)); + if (getCoEdges()[i]->getNbMeshingEdges()/getRatio(getCoEdges()[i]) < nbBras_edge + || (coedge_after_cut && getCoEdges()[i]->getNbMeshingEdges()/getRatio(getCoEdges()[i]) == nbBras_edge)){ + //std::cout<<"nbBras_edge : "<getNbMeshingEdges()<<" / ratio : "<getNbMeshingEdges()/getRatio(getCoEdges()[i]); if (nbBras_edge == 0){ - coedge = getCoEdge(i); - nbBras_coedge = getCoEdge(i)->getNbMeshingEdges(); + coedge = getCoEdges()[i]; + nbBras_coedge = getCoEdges()[i]->getNbMeshingEdges(); } } else { if (sens_coedge){ - //std::cout<<"nbBras_edge = "<getNbMeshingEdges()<<" - nbBras_edge = "<getNbMeshingEdges()-nbBras_edge*getRatio(getCoEdge(i)); + //std::cout<<"getNbMeshingEdges: "<getNbMeshingEdges()<<" - nbBras_edge = "<getNbMeshingEdges()-nbBras_edge*getRatio(getCoEdges()[i]); } - coedge = getCoEdge(i); + coedge = getCoEdges()[i]; termine = true; } i+=ind_inc; v_dep = v_ar; - if (i<0 || i>getNbCoEdges()-1){ + if (i<0 || i>getCoEdges().size()-1){ termine = true; } @@ -1207,32 +1139,32 @@ computeCorrespondingCoEdgeAndNbMeshingEdges(Vertex* v_dep, uint nbBras_edge, boo bool Edge:: isSameSense(Vertex* vtx, CoEdge* coedge) { - if (vtx == getVertex(0)){ + if (vtx == getVertices()[0]){ uint i=0; do { - if (vtx == coedge->getVertex(0)) + if (vtx == coedge->getVertices()[0]) return true; - else if (vtx == coedge->getVertex(1)) + else if (vtx == coedge->getVertices()[1]) return false; // on passe au sommet suivant - vtx = getCoEdge(i)->getOppositeVertex(vtx); + vtx = getCoEdges()[i]->getOppositeVertex(vtx); i++; } - while (igetVertex(0)) + if (vtx == coedge->getVertices()[0]) return true; - else if (vtx == coedge->getVertex(1)) + else if (vtx == coedge->getVertices()[1]) return false; // on passe au sommet suivant - vtx = getCoEdge(getNbCoEdges()-i-1)->getOppositeVertex(vtx); + vtx = getCoEdges()[getCoEdges().size()-i-1]->getOppositeVertex(vtx); i++; } - while (igetCoFaceContainer().push_back(f); +} +/*----------------------------------------------------------------------------*/ +void Edge::removeCoFace(CoFace* f) +{ + Utils::remove(f, m_topo_property->getCoFaceContainer()); +} +/*----------------------------------------------------------------------------*/ +void Edge::addCoEdge(CoEdge* e) +{ + m_topo_property->getCoEdgeContainer().push_back(e); +} +/*----------------------------------------------------------------------------*/ +void Edge::removeCoEdge(CoEdge* e) +{ + Utils::remove(e, m_topo_property->getCoEdgeContainer()); +} +/*----------------------------------------------------------------------------*/ CoEdge* Edge::getCoEdge(Vertex* vtx1, Vertex* vtx2) { - std::vector coedges; - getCoEdges(coedges); - - uint nb = 0; - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter){ - CoEdge* coedge = *iter; - if ((vtx1 == coedge->getVertex(0) && vtx2 == coedge->getVertex(1)) - || (vtx2 == coedge->getVertex(0) && vtx1 == coedge->getVertex(1))) + for (CoEdge* coedge : getCoEdges()) + if ((vtx1 == coedge->getVertices()[0] && vtx2 == coedge->getVertices()[1]) + || (vtx2 == coedge->getVertices()[0] && vtx1 == coedge->getVertices()[1])) return coedge; - } std::cout<<"Edge::getCoEdge("<getName()<<","<getName()<<") dans l'arête "<<*this<>& path) { - std::vector coedges; - getCoEdges(coedges); + std::vector coedges = getCoEdges(); Vertex* from_vertex = v1; if (from_vertex == v2 && coedges.size()==1) { @@ -1280,14 +1224,14 @@ void Edge::computeCoEdgesPath(Vertex* v1, Vertex* v2, std::listgetVertex(0)==from_vertex) { - to_vertex = ce->getVertex(1); + if (ce->getVertices()[0]==from_vertex) { + to_vertex = ce->getVertices()[1]; direction = true; return true; } - if (ce->getVertex(1)==from_vertex) { - to_vertex = ce->getVertex(0); + if (ce->getVertices()[1]==from_vertex) { + to_vertex = ce->getVertices()[0]; direction = false; return true; } @@ -1319,8 +1263,8 @@ void Edge::computeCoEdgesPath(Vertex* v1, Vertex* v2, std::listgetName() << ")" << std::endl; std::cout << " path: [ "; for (auto it=path.begin() ; it!=path.end() ; it++) { - std::cout << it->first->getName() << " [" << it->first->getVertex(0)->getName(); - std::cout << (it->second?"-->":"<--") << it->first->getVertex(1)->getName() << "] "; + std::cout << it->first->getName() << " [" << it->first->getVertices()[0]->getName(); + std::cout << (it->second?"-->":"<--") << it->first->getVertices()[1]->getName() << "] "; } std::cout << "]" << std::endl; #endif diff --git a/src/Core/Topo/EdgeMeshingPropertyInterpolate.cpp b/src/Core/Topo/EdgeMeshingPropertyInterpolate.cpp index 424a778a..2a054387 100644 --- a/src/Core/Topo/EdgeMeshingPropertyInterpolate.cpp +++ b/src/Core/Topo/EdgeMeshingPropertyInterpolate.cpp @@ -205,9 +205,9 @@ getPointsRef(std::vector &points_ref, const Topo::CoEdge* co } // déterminer les indices sur l'edge - uint ind_edge = coface->getIndex(edge_dep); + uint ind_edge = Utils::getIndexOf(edge_dep, coface->getEdges()); //Vertex* v_dep = coface->getVertex(ind_edge); - Vertex* v_dep = edge_dep->getVertex(0); + Vertex* v_dep = edge_dep->getVertices()[0]; uint nb_bras1, nb_bras2; bool sens_dep; edge_dep->computeCorrespondingNbMeshingEdges(v_dep, coedge, 0, nb_bras1, sens_dep); @@ -223,7 +223,7 @@ getPointsRef(std::vector &points_ref, const Topo::CoEdge* co #endif // récupérer les points de l'edge qui fait face - uint nbPts = coface->getNbVertices(); + uint nbPts = coface->getVertices().size(); uint indP1 = (ind_edge+3) % nbPts; uint indP2 = (ind_edge+2) % nbPts; if (nbPts == 3 && ind_edge>1){ @@ -244,9 +244,9 @@ getPointsRef(std::vector &points_ref, const Topo::CoEdge* co #endif // sens de l'arête de départ / face - bool sens_edge_dep = (edge_dep->getVertex(0) == coface->getVertex(ind_edge)); + bool sens_edge_dep = (edge_dep->getVertices()[0] == coface->getVertices()[ind_edge]); // idem avec celle référencée - bool sens_edge_ref = (edge_ref->getVertex(0) == coface->getVertex(indP1)); + bool sens_edge_ref = (edge_ref->getVertices()[0] == coface->getVertices()[indP1]); uint nb_bras_edge = edge_ref->getNbMeshingEdges(); // si les arêtes sont de sens opposé, on prend du côté opposé diff --git a/src/Core/Topo/ExportBlocksImplementation.cpp b/src/Core/Topo/ExportBlocksImplementation.cpp index 9a0876c9..ecfb67ff 100644 --- a/src/Core/Topo/ExportBlocksImplementation.cpp +++ b/src/Core/Topo/ExportBlocksImplementation.cpp @@ -67,8 +67,8 @@ void ExportBlocksImplementation::writeEdges(std::ofstream &str, std::vectorgetVertex(0)->getName()]; - int n1 = m_node_ids_mapping[e->getVertex(1)->getName()]; + int n0 = m_node_ids_mapping[e->getVertices()[0]->getName()]; + int n1 = m_node_ids_mapping[e->getVertices()[1]->getName()]; str << n0 << " " << n1 << "\n"; m_edge_ids_mapping[e->getName()] = blk_edge_id++; } @@ -129,46 +129,47 @@ void ExportBlocksImplementation::writeFaces(std::ofstream &str, std::vectorgetName()] = blk_face_id++; - Edge* e0 = f->getEdge(0); - Edge* e1 = f->getEdge(1); - Edge* e2 = f->getEdge(2); - Edge* e3 = f->getEdge(3); + const std::vector f_edges = f->getEdges(); + Edge* e0 = f_edges[0]; + Edge* e1 = f_edges[1]; + Edge* e2 = f_edges[2]; + Edge* e3 = f_edges[3]; str << "[ "; - if(f->getVertex(0)->getName() == e0->getVertex(0)->getName()) { + if(f->getVertices()[0]->getName() == e0->getVertices()[0]->getName()) { for (int i = 0; i < e0->getCoEdges().size(); i++) - str << m_edge_ids_mapping[e0->getCoEdge(i)->getName()]<<" "; - }else if(f->getVertex(0)->getName() == e0->getVertex(1)->getName()){ + str << m_edge_ids_mapping[e0->getCoEdges()[i]->getName()]<<" "; + }else if(f->getVertices()[0]->getName() == e0->getVertices()[1]->getName()){ for (int i = e0->getCoEdges().size()-1; i >= 0 ; i--) - str << m_edge_ids_mapping[e0->getCoEdge(i)->getName()]<<" "; + str << m_edge_ids_mapping[e0->getCoEdges()[i]->getName()]<<" "; } str << "] [ "; - if(f->getVertex(1)->getName() == e1->getVertex(0)->getName()) { + if(f->getVertices()[1]->getName() == e1->getVertices()[0]->getName()) { for (int i = 0; i < e1->getCoEdges().size(); i++) - str << m_edge_ids_mapping[e1->getCoEdge(i)->getName()]<<" "; - }else if(f->getVertex(1)->getName() == e1->getVertex(1)->getName()){ + str << m_edge_ids_mapping[e1->getCoEdges()[i]->getName()]<<" "; + }else if(f->getVertices()[1]->getName() == e1->getVertices()[1]->getName()){ for (int i = e1->getCoEdges().size()-1; i >= 0 ; i--) - str << m_edge_ids_mapping[e1->getCoEdge(i)->getName()]<<" "; + str << m_edge_ids_mapping[e1->getCoEdges()[i]->getName()]<<" "; } str << "] [ "; - if(f->getVertex(2)->getName() == e2->getVertex(0)->getName()) { + if(f->getVertices()[2]->getName() == e2->getVertices()[0]->getName()) { for (int i = 0; i < e2->getCoEdges().size(); i++) - str << m_edge_ids_mapping[e2->getCoEdge(i)->getName()]<<" "; - }else if(f->getVertex(2)->getName() == e2->getVertex(1)->getName()){ + str << m_edge_ids_mapping[e2->getCoEdges()[i]->getName()]<<" "; + }else if(f->getVertices()[2]->getName() == e2->getVertices()[1]->getName()){ for (int i = e2->getCoEdges().size()-1; i >= 0 ; i--) - str << m_edge_ids_mapping[e2->getCoEdge(i)->getName()]<<" "; + str << m_edge_ids_mapping[e2->getCoEdges()[i]->getName()]<<" "; } str << "] [ "; - if(f->getVertex(3)->getName() == e3->getVertex(0)->getName()) { + if(f->getVertices()[3]->getName() == e3->getVertices()[0]->getName()) { for (int i = 0; i < e3->getCoEdges().size(); i++) - str << m_edge_ids_mapping[e3->getCoEdge(i)->getName()]<<" "; - }else if(f->getVertex(3)->getName() == e3->getVertex(1)->getName()){ + str << m_edge_ids_mapping[e3->getCoEdges()[i]->getName()]<<" "; + }else if(f->getVertices()[3]->getName() == e3->getVertices()[1]->getName()){ for (int i = e3->getCoEdges().size()-1; i >= 0 ; i--) - str << m_edge_ids_mapping[e3->getCoEdge(i)->getName()]<<" "; + str << m_edge_ids_mapping[e3->getCoEdges()[i]->getName()]<<" "; } str << "]\n"; } @@ -178,42 +179,43 @@ void ExportBlocksImplementation::writeFaces(std::ofstream &str, std::vector blocks) { str << "BLOCKS " << blocks.size() << "\n"; for(auto b : blocks){ - - int v0 = m_node_ids_mapping[b->getVertex(0)->getName()]; - int v1 = m_node_ids_mapping[b->getVertex(1)->getName()]; - int v2 = m_node_ids_mapping[b->getVertex(2)->getName()]; - int v3 = m_node_ids_mapping[b->getVertex(3)->getName()]; - int v4 = m_node_ids_mapping[b->getVertex(4)->getName()]; - int v5 = m_node_ids_mapping[b->getVertex(5)->getName()]; - int v6 = m_node_ids_mapping[b->getVertex(6)->getName()]; - int v7 = m_node_ids_mapping[b->getVertex(7)->getName()]; - - Face* f0 = b->getFace(0); - Face* f1 = b->getFace(1); - Face* f2 = b->getFace(2); - Face* f3 = b->getFace(3); - Face* f4 = b->getFace(4); - Face* f5 = b->getFace(5); + const std::vector& vertices = b->getVertices(); + int v0 = m_node_ids_mapping[vertices[0]->getName()]; + int v1 = m_node_ids_mapping[vertices[1]->getName()]; + int v2 = m_node_ids_mapping[vertices[2]->getName()]; + int v3 = m_node_ids_mapping[vertices[3]->getName()]; + int v4 = m_node_ids_mapping[vertices[4]->getName()]; + int v5 = m_node_ids_mapping[vertices[5]->getName()]; + int v6 = m_node_ids_mapping[vertices[6]->getName()]; + int v7 = m_node_ids_mapping[vertices[7]->getName()]; + + const std::vector& faces = b->getFaces(); + Face* f0 = faces[0]; + Face* f1 = faces[1]; + Face* f2 = faces[2]; + Face* f3 = faces[3]; + Face* f4 = faces[4]; + Face* f5 = faces[5]; str << v0 << " " << v1 << " " << v2 << " " << v3 << " " << v4 << " "; str << v5 << " " << v6 << " " << v7 << " [ "; for (int i = 0; i < f0->getCoFaces().size(); i++) - str << m_face_ids_mapping[f0->getCoFace(i)->getName()]<<" "; + str << m_face_ids_mapping[f0->getCoFaces()[i]->getName()]<<" "; str << "] [ "; for (int i = 0; i < f1->getCoFaces().size(); i++) - str << m_face_ids_mapping[f1->getCoFace(i)->getName()]<<" "; + str << m_face_ids_mapping[f1->getCoFaces()[i]->getName()]<<" "; str << "] [ "; for (int i = 0; i < f2->getCoFaces().size(); i++) - str << m_face_ids_mapping[f2->getCoFace(i)->getName()]<<" "; + str << m_face_ids_mapping[f2->getCoFaces()[i]->getName()]<<" "; str << "] [ "; for (int i = 0; i < f3->getCoFaces().size(); i++) - str << m_face_ids_mapping[f3->getCoFace(i)->getName()]<<" "; + str << m_face_ids_mapping[f3->getCoFaces()[i]->getName()]<<" "; str << "] [ "; for (int i = 0; i < f4->getCoFaces().size(); i++) - str << m_face_ids_mapping[f4->getCoFace(i)->getName()]<<" "; + str << m_face_ids_mapping[f4->getCoFaces()[i]->getName()]<<" "; str << "] [ "; for (int i = 0; i < f5->getCoFaces().size(); i++) - str << m_face_ids_mapping[f5->getCoFace(i)->getName()]<<" "; + str << m_face_ids_mapping[f5->getCoFaces()[i]->getName()]<<" "; str << "]\n"; } } diff --git a/src/Core/Topo/Face.cpp b/src/Core/Topo/Face.cpp index fc870902..f1dbe26a 100644 --- a/src/Core/Topo/Face.cpp +++ b/src/Core/Topo/Face.cpp @@ -50,10 +50,8 @@ Face(Internal::Context& ctx, m_mesh_property = new FaceMeshingProperty(coface->isStructured()); - m_topo_property->getCoFaceContainer().add(coface); - - const std::vector & vertices = coface->getVertices(); - m_topo_property->getVertexContainer().add(vertices); + m_topo_property->getCoFaceContainer().push_back(coface); + m_topo_property->getVertexContainer() = coface->getVertices(); coface->addFace(this); ctx.newGraphicalRepresentation (*this); @@ -80,10 +78,10 @@ Face(Internal::Context& ctx, if (cofaces.empty()) throw TkUtil::Exception (TkUtil::UTF8String ("Tentative de création d'une face sans coface", TkUtil::Charset::UTF_8)); - m_topo_property->getCoFaceContainer().add(cofaces); - m_topo_property->getVertexContainer().add(vertices); - for (uint i=0; iaddFace(this); + m_topo_property->getCoFaceContainer() = cofaces; + m_topo_property->getVertexContainer() = vertices; + for (uint i=0; iaddFace(this); ctx.newGraphicalRepresentation (*this); #ifdef _DEBUG_MEMORY std::cout << "Face::Face( avec "<getBlockContainer().push_back(b); +} +/*----------------------------------------------------------------------------*/ +void Face::removeBlock(Block* b) +{ + Utils::remove(b, m_topo_property->getBlockContainer()); +} +/*----------------------------------------------------------------------------*/ +void Face::addCoFace(CoFace* f) +{ + m_topo_property->getCoFaceContainer().push_back(f); +} +/*----------------------------------------------------------------------------*/ +void Face::removeCoFace(CoFace* f) +{ + Utils::remove(f, m_topo_property->getCoFaceContainer()); +} +/*----------------------------------------------------------------------------*/ void Face:: replace(Vertex* v1, Vertex* v2, bool propagate_up, bool propagate_down, Internal::InfoCommand* icmd) { @@ -148,16 +166,16 @@ replace(Vertex* v1, Vertex* v2, bool propagate_up, bool propagate_down, Internal // if (isDestroyed()) // return; - for (uint i=0; igetVertexContainer().find(v2)){ + if (Utils::contains(v2, getVertices())){ if (isStructured()){ - if (getNbVertices() == 4){ + if (getVertices().size() == 4){ // il faut mettre en premier le sommet conservé // et en dernier le sommet qui va disparaitre _permuteToFirstAndLastVertices(v2, v1, icmd); @@ -165,30 +183,30 @@ replace(Vertex* v1, Vertex* v2, bool propagate_up, bool propagate_down, Internal m_topo_property->getVertexContainer().resize(3); } else { - m_topo_property->getVertexContainer().remove(v1, true); + Utils::remove(v1, m_topo_property->getVertexContainer()); } } else { _permuteToFirstAndLastVertices(v2, v1, icmd); - uint new_size = m_topo_property->getVertexContainer().getNb()-1; + uint new_size = m_topo_property->getVertexContainer().size()-1; m_topo_property->getVertexContainer().resize(new_size); } } else - m_topo_property->getVertexContainer().set(i, v2); + m_topo_property->getVertexContainer()[i] = v2; - } // end if (v1 == getVertex(i)) + } // end if (v1 == getVertices()[i]) // transmet aux entités de niveau supérieur if (propagate_up) - for (uint i=0; ireplace(v1, v2, propagate_up, propagate_down, icmd); + for (uint i=0; ireplace(v1, v2, propagate_up, propagate_down, icmd); if (propagate_down) - for (uint i=0; ireplace(v1, v2, propagate_up, propagate_down, icmd); + for (uint i=0; ireplace(v1, v2, propagate_up, propagate_down, icmd); // destruction de la face si elle est dégénérée en une arête ou moins - if (getNbVertices()<3){ + if (getVertices().size()<3){ setDestroyed(true); if (icmd) icmd->addTopoInfoEntity(this,Internal::InfoCommand::DELETED); @@ -204,10 +222,10 @@ replace(CoFace* cf1, CoFace* cf2, Internal::InfoCommand* icmd) if (isDestroyed()) return; - for (uint i=0; igetCoFaceContainer().set(i, cf2); + m_topo_property->getCoFaceContainer()[i] = cf2; cf1->saveCoFaceTopoProperty(icmd); cf2->saveCoFaceTopoProperty(icmd); @@ -219,8 +237,8 @@ replace(CoFace* cf1, CoFace* cf2, Internal::InfoCommand* icmd) void Face:: replace(CoEdge* e1, CoEdge* e2, Internal::InfoCommand* icmd) { - for (uint i=0; ireplace(e1, e2, icmd); + for (uint i=0; ireplace(e1, e2, icmd); } /*----------------------------------------------------------------------------*/ void Face:: @@ -229,77 +247,21 @@ merge(Face* fa, Internal::InfoCommand* icmd) if (fa == this) return; - // on remplace fa dans les blocs associées à fa - // On travaille sur une copie car il y a une mise à jour en même temps de m_blocks -// std::vector blocs; -// fa->getBlocks(blocs); -// -// for (std::vector::iterator iter=blocs.begin(); -// iter != blocs.end(); ++iter) -// (*iter)->replace(fa, this, icmd); -// -// // suppression de la face parmi la liste des faces des arêtes. -// for (uint i=0; isaveEdgeTopoProperty(icmd); -// getEdge(i)->removeFace(fa); -// } -// -// fa->setDestroyed(true); -// if (icmd) -// icmd->addTopoInfoEntity(fa,Internal::InfoCommand::DELETED); - MGX_NOT_YET_IMPLEMENTED("Face::merge à faire ..."); - - // il faut libérer les CoFaces -// std::vector coedges; -// getCoEdges(coedges); -// for (std::vector::iterator iter = coedges.begin(); -// iter != coedges.end(); ++iter){ -// (*iter)->setDestroyed(true); -// if (icmd) -// icmd->addTopoInfoEntity(*iter,Internal::InfoCommand::DELETED); -// (*iter)->saveCoEdgeTopoProperty(icmd); -// (*iter).clearDependancy(); -// } - - } /*----------------------------------------------------------------------------*/ -uint Face:: -getNbVertices() const +std::vector Face::getAllVertices() const { -#ifdef _DEBUG - if (isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message << "Face::getNbVertices() pour face "<getVertexContainer().getNb(); -} -/*----------------------------------------------------------------------------*/ -void Face::getAllVertices(std::vector& vertices, const bool unique) const -{ - vertices.clear(); - std::list l_v; - for(uint j=0; j < getNbCoFaces();j++) { - CoFace* coface = getCoFace(j); - for(uint k=0; k < coface->getNbEdges();k++) { - Edge* edge = coface->getEdge(k); - for(uint l=0; l < edge->getNbCoEdges(); l++){ - CoEdge* coedge = edge->getCoEdge(l); - + Utils::EntitySet vertices(Utils::Entity::compareEntity); + for(CoFace* coface : getCoFaces()) { + for(Edge* edge : coface->getEdges()) { + for(CoEdge* coedge : edge->getCoEdges()){ const std::vector & local_vertices = coedge->getVertices(); - - l_v.insert(l_v.end(), local_vertices.begin(), local_vertices.end()); + vertices.insert(local_vertices.begin(), local_vertices.end()); } } } - - l_v.sort(Utils::Entity::compareEntity); - l_v.unique(); - - vertices.insert(vertices.end(),l_v.begin(),l_v.end()); + return Utils::toVect(vertices); } /*----------------------------------------------------------------------------*/ Block* Face:: @@ -344,19 +306,19 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const // modif des coordonnées des sommets de la représentation en fonction du shrink points.clear(); - for (uint i=0; igetCoord() - barycentre) * tdr->getShrink()); + for (Vertex* vtx : getVertices()) + points.push_back(barycentre + (vtx->getCoord() - barycentre) * tdr->getShrink()); if (tdr->hasRepresentation(Utils::DisplayRepresentation::WIRE)){ indicesFilaire.clear(); - for (uint i=0; ihasRepresentation(Utils::DisplayRepresentation::SOLID)) { - if (getNbVertices() == 4){ + if (getVertices().size() == 4){ // représentation à l'aide de 2 triangles indicesSurf.push_back(0); indicesSurf.push_back(1); @@ -366,13 +328,13 @@ getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroyed) const indicesSurf.push_back(3); indicesSurf.push_back(0); } - else if (getNbVertices() == 3){ + else if (getVertices().size() == 3){ // représentation à l'aide d'1 triangle indicesSurf.push_back(0); indicesSurf.push_back(1); indicesSurf.push_back(2); } - else if (getNbVertices() < 3){ + else if (getVertices().size() < 3){ // pas de représentation solide prévue } else { @@ -418,9 +380,7 @@ getDescription (bool alsoComputed) const } } - std::vector fa; - getCoFaces(fa); - + std::vector fa = getCoFaces(); for (std::vector::iterator iter = fa.begin( ); fa.end( )!=iter; iter++){ if (getRatio(*iter,0) > 1) topoProprietes.addProperty ( @@ -438,9 +398,7 @@ getDescription (bool alsoComputed) const description->addPropertiesSet (topoProprietes); // les relations vers les autres types d'entités topologiques - std::vector vtx; - getVertices(vtx); - + std::vector vtx = getVertices(); Utils::SerializedRepresentation topoRelation ("Relations topologiques", ""); Utils::SerializedRepresentation vertices ("Sommets topologiques", @@ -461,9 +419,7 @@ getDescription (bool alsoComputed) const topoRelation.addPropertiesSet (cofaces); - std::vector bl; - getBlocks(bl); - + std::vector bl = getBlocks(); Utils::SerializedRepresentation blocks ("Blocs topologiques", TkUtil::NumericConversions::toStr(bl.size())); for (std::vector::iterator iter = bl.begin( ); bl.end( )!=iter; iter++) @@ -496,8 +452,8 @@ structurable() // return res; // } // return true; - if (getNbCoFaces() == 1) - return getCoFace(0)->structurable(); + if (getCoFaces().size() == 1) + return getCoFaces()[0]->structurable(); else { MGX_NOT_YET_IMPLEMENTED("Face structurable à implémenter") } @@ -509,8 +465,8 @@ bool Face:: unstructurable() { // il faut que toutes les faces communes soient unstructurable - for(uint i=0; i < getNbCoFaces();i++) - if (!getCoFace(i)->unstructurable()) + for(CoFace* coface : getCoFaces()) + if (!coface->unstructurable()) return false; return true; } @@ -521,8 +477,8 @@ structure(Internal::InfoCommand* icmd) if (!structurable()) throw TkUtil::Exception (TkUtil::UTF8String ("Structuration d'une Face impossible", TkUtil::Charset::UTF_8)); - for(uint i=0; i < getNbCoFaces();i++) - getCoFace(i)->structure(icmd); + for(CoFace* coface : getCoFaces()) + coface->structure(icmd); m_mesh_property->setStructured(true); } @@ -533,8 +489,8 @@ unstructure(Internal::InfoCommand* icmd) if (!unstructurable()) throw TkUtil::Exception (TkUtil::UTF8String ("Destructuration d'une Face impossible", TkUtil::Charset::UTF_8)); - for(uint i=0; i < getNbCoFaces();i++) - getCoFace(i)->unstructure(icmd); + for(CoFace* coface : getCoFaces()) + coface->unstructure(icmd); m_mesh_property->setStructured(false); } @@ -547,10 +503,8 @@ void Face::setStructured(Internal::InfoCommand* icmd, bool str) if (isStructured()){ saveFaceMeshingProperty(icmd); m_mesh_property->setStructured(str); - std::vector blocs; - getBlocks(blocs); - for (std::vector::iterator iter = blocs.begin(); iter != blocs.end(); ++iter) - (*iter)->setStructured(icmd, false); + for (Block* b : getBlocks()) + b->setStructured(icmd, false); } } /*----------------------------------------------------------------------------*/ @@ -566,8 +520,8 @@ check() const throw TkUtil::Exception (TkUtil::UTF8String ("On utilise une face détruite", TkUtil::Charset::UTF_8)); } - for(uint i=0; i < getNbCoFaces();i++) - getCoFace(i)->check(); + for(CoFace* coface : getCoFaces()) + coface->check(); if (isStructured()){ // on vérifie que les côtés opposées ont le même nombre de bras @@ -580,32 +534,29 @@ check() const // on marque les arêtes et les faces communes de la face à 1 std::map filtre_edges; std::map filtre_cofaces; - for(uint i=0; i < getNbCoFaces(); i++){ - CoFace* coface = getCoFace(i); + for(CoFace* coface : getCoFaces()){ filtre_cofaces[coface] = 1; - for(uint j=0; j < coface->getNbEdges(); j++){ - Edge* edge = coface->getEdge(j); + for(Edge* edge : coface->getEdges()) filtre_edges[edge] = 1; - } // for(uint j=0; j < coface->getNbEdges(); j++) - } // for(uint i=0; i < getNbCoFaces(); i++) + } // comparaison entre les côtés 0 et 2 { uint nb1, nb2; std::vector coedges_cote; - if (TopoHelper::getCoEdgesBetweenVertices(getVertex(1), getVertex(0), coedges_dir[1], coedges_cote)) + if (TopoHelper::getCoEdgesBetweenVertices(getVertices()[1], getVertices()[0], coedges_dir[1], coedges_cote)) // à partir des ces arêtes commune on recherche les arêtes de la face // (ce qui permet d'avoir un nombre de bras tenant compte de la semi-conformité) nb1 = _getNbMeshingEdges(filtre_edges, filtre_cofaces, coedges_cote, - getVertex(1), getVertex(0)); + getVertices()[1], getVertices()[0]); else { std::cerr<<"Face::check() pour "<<*this< coedges_cote; - if (TopoHelper::getCoEdgesBetweenVertices(getVertex(1), getVertex(2), coedges_dir[0], coedges_cote)) + if (TopoHelper::getCoEdgesBetweenVertices(getVertices()[1], getVertices()[2], coedges_dir[0], coedges_cote)) // à partir des ces arêtes commune on recherche les arêtes de la face // (ce qui permet d'avoir un nombre de bras tenant compte de la semi-conformité) nb1 = _getNbMeshingEdges(filtre_edges, filtre_cofaces, coedges_cote, - getVertex(1), getVertex(2)); + getVertices()[1], getVertices()[2]); else { std::cerr<<"Face::check() pour "<<*this<isDestroyed()){ + for (Block* b : getBlocks()) + if (b->isDestroyed()){ std::cerr<<"Face::check() pour la face "<getName()<<"\n"; -// o <<*f.getCoFace(i)<<"\n"; + for (CoFace* cf : f.getCoFaces()) + o <<" "<getName()<<"\n"; o << "\n"; - o << " " << f.getName()<< " face avec "<<(short)f.getNbVertices()<<" sommets:\n"; - const std::vector & vertices = f.getVertices(); - for (uint i=0; i & blocs = f.getBlocks(); if (blocs.empty()){ @@ -701,9 +650,9 @@ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Face & f) } else { o << " " << (blocs.size()==1?"cette face pointe sur le bloc :":"cette face pointe sur les blocs :"); - for (uint i=0; igetName(); - if (blocs[i]->isDestroyed()) + for (Block* b : blocs){ + o << " " << b->getName(); + if (b->isDestroyed()) o << " [DETRUIT] "; } } @@ -724,29 +673,12 @@ Topo::TopoInfo Face::getInfos() const Topo::TopoInfo infos; infos.name = getName(); infos.dimension = getDim(); + infos._vertices = Utils::toNames(getVertices()); + infos._coedges = Utils::toNames(getCoEdges()); + infos._cofaces = Utils::toNames(getCoFaces()); + infos._blocks = Utils::toNames(getBlocks()); if (getGeomAssociation() != 0) infos.geom_entity = getGeomAssociation()->getName(); - - std::vector vertices; - getVertices(vertices); - for (Vertex* v : vertices) - infos._vertices.push_back(v->getName()); - - std::vector coedges; - getCoEdges(coedges); - for (CoEdge* e : coedges) - infos._coedges.push_back(e->getName()); - - std::vector cofaces; - getCoFaces(cofaces); - for (CoFace* f : cofaces) - infos._cofaces.push_back(f->getName()); - - std::vector blocks; - getBlocks(blocks); - for (Block* b : blocks) - infos._blocks.push_back(b->getName()); - return infos; } /*----------------------------------------------------------------------------*/ @@ -817,8 +749,8 @@ getNodes(Vertex* sommet1, Vertex* sommet2, Vertex* sommet3, Vertex* sommet4, #endif // filtre pour marquer/retrouver les CoFaces dans la Face std::map filtre_cofaces; - for(uint i=0; i < getNbCoFaces(); i++) - filtre_cofaces[getCoFace(i)] = 1; + for(CoFace* cf : getCoFaces()) + filtre_cofaces[cf] = 1; // lien entre les sommets et la position dans le tableau vectNd std::map vertex2indVectNd; @@ -840,10 +772,8 @@ getNodes(Vertex* sommet1, Vertex* sommet2, Vertex* sommet3, Vertex* sommet4, // on recherche la coface qui utilise cette CoEdge CoFace* coface_select = 0; - std::vector loc_cofaces; - coedge->getCoFaces(loc_cofaces); - for (std::vector::iterator iter4 = loc_cofaces.begin(); - iter4 != loc_cofaces.end(); ++iter4) + std::vector loc_cofaces = coedge->getCoFaces(); + for (auto iter4 = loc_cofaces.begin(); iter4 != loc_cofaces.end(); ++iter4) if (filtre_cofaces[*iter4] == 1) coface_select = (*iter4); if (0 == coface_select) @@ -852,22 +782,24 @@ getNodes(Vertex* sommet1, Vertex* sommet2, Vertex* sommet3, Vertex* sommet4, // recherche de l'Edge de cette CoFace qui utilise cette CoEdge Edge* edge = coface_select->getEdgeContaining(coedge); - uint id0 = vertex2indVectNd[coedge->getVertex(0)]; - uint id1 = vertex2indVectNd[coedge->getVertex(1)]; + Vertex* vtx0 = coedge->getVertices()[0]; + Vertex* vtx1 = coedge->getVertices()[1]; + uint id0 = vertex2indVectNd[vtx0]; + uint id1 = vertex2indVectNd[vtx1]; uint inc = coedge->getNbMeshingEdges() / edge->getRatio(coedge) / m_mesh_property->getRatio(coface_select, (dir + permIJ_face)%2); if (dir==1) inc *= nbNoeudsI; - if (id0>id1 || sommet2==coedge->getVertex(0)){ - vertex2indVectNd[coedge->getVertex(1)] = id0+inc; - // std::cout<<"vertex2indVectNd["<getVertex(1)->getName()<<"] = "<id1 || sommet2==vtx0){ + vertex2indVectNd[vtx1] = id0+inc; + // std::cout<<"vertex2indVectNd["<getName()<<"] = "<getVertex(0)] = id1+inc; - // std::cout<<"vertex2indVectNd["<getVertex(0)->getName()<<"] = "<getName()<<"] = "<getNbVertices(); k++){ - Vertex* vk = coface->getVertex(k); + for (Vertex* vk : coface->getVertices()) if (sommet2==vk || vertex2indVectNd[vk]>0) nbIdPos++; - } // end for kgetNbVertices() if (nbIdPos>=3) coface_select = coface; } // end if (filtre_cofaces[getFace(j)] == 0) @@ -902,18 +832,19 @@ getNodes(Vertex* sommet1, Vertex* sommet2, Vertex* sommet3, Vertex* sommet4, // équivalent local de sommet2 uint idSommet2 = 5; uint indMin = UINT_MAX; - for (uint k=0; kgetNbVertices(); k++){ - Vertex* vk = coface_select->getVertex(k); + for (uint k=0; kgetVertices().size(); k++){ + Vertex* vk = coface_select->getVertices()[k]; if (sommet2==vk || (vertex2indVectNd[vk] != 0 && vertex2indVectNd[vk]getNbVertices(); - Vertex* sommetLoc1 = coface_select->getVertex((idSommet2-1+nbSom)%nbSom); - Vertex* sommetLoc2 = coface_select->getVertex(idSommet2); - Vertex* sommetLoc3 = coface_select->getVertex((idSommet2+1)%nbSom); - Vertex* sommetLoc4 = (nbSom==4?coface_select->getVertex((idSommet2+2)%nbSom):0); + const std::vector& cfs_vertices = coface_select->getVertices(); + uint nbSom = cfs_vertices.size(); + Vertex* sommetLoc1 = cfs_vertices[(idSommet2-1+nbSom)%nbSom]; + Vertex* sommetLoc2 = cfs_vertices[idSommet2]; + Vertex* sommetLoc3 = cfs_vertices[(idSommet2+1)%nbSom]; + Vertex* sommetLoc4 = (nbSom==4?cfs_vertices[(idSommet2+2)%nbSom]:0); // std::cout<<"recherche du sens\n"; // recherche le sens / sens dans la Face iLocDir = TopoHelper::getInternalDir(sommetLoc2, sommetLoc3, iCoedges, jCoedges); @@ -967,9 +898,10 @@ getNodes(Vertex* sommet1, Vertex* sommet2, Vertex* sommet3, Vertex* sommet4, for (std::vector::iterator iter = coedges_between.begin(); iter != coedges_between.end(); ++iter){ CoEdge* coedge = *iter; - - uint id0 = vertex2indVectNd[coedge->getVertex(0)]; - uint id1 = vertex2indVectNd[coedge->getVertex(1)]; + Vertex* vtx0 = coedge->getVertices()[0]; + Vertex* vtx1 = coedge->getVertices()[1]; + uint id0 = vertex2indVectNd[vtx0]; + uint id1 = vertex2indVectNd[vtx1]; uint inc = coedge->getNbMeshingEdges() / edge->getRatio(coedge) / m_mesh_property->getRatio(coface_select, (dir + permIJ_face)%2); @@ -977,12 +909,12 @@ getNodes(Vertex* sommet1, Vertex* sommet2, Vertex* sommet3, Vertex* sommet4, inc *= nbNoeudsI; if (id0>id1 && id1 == 0){ - vertex2indVectNd[coedge->getVertex(1)] = id0+inc; - // std::cout<<"vertex2indVectNd["<getVertex(1)->getName()<<"] = "<getName()<<"] = "<getVertex(0)] = id1+inc; - // std::cout<<"vertex2indVectNd["<getVertex(0)->getName()<<"] = "<getName()<<"] = "<getNbVertices() != 3) + CoFace* coface = getCoFaces()[0]; + const std::vector& cf_vertices = coface->getVertices(); + if (cf_vertices.size() != 3) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, la face commune n'est pas dégénérée", TkUtil::Charset::UTF_8)); // test sur le sommet à la dégénérescence - if (getVertex(0) != coface->getVertex(0)) + if (getVertices()[0] != cf_vertices[0]) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, la face commune n'a pas le même premier sommet", TkUtil::Charset::UTF_8)); - if (getVertex(1) == coface->getVertex(1) && getVertex(2) == coface->getVertex(2)) + if (getVertices()[1] == cf_vertices[1] && getVertices()[2] == cf_vertices[2]) coface->getNodes(decalage, sens_directe, vectNd); - else if (getVertex(2) == coface->getVertex(1) && getVertex(1) == coface->getVertex(2)) + else if (getVertices()[2] == cf_vertices[1] && getVertices()[1] == cf_vertices[2]) coface->getNodes((sens_directe?3:0), !sens_directe, vectNd); else throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, la face commune n'a pas les mêmes sommets que la face", TkUtil::Charset::UTF_8)); @@ -1127,10 +1060,10 @@ fuse(Face* face_B, const std::vector& l_sommets_B, Internal::InfoCommand* icmd) { - if (getNbCoFaces() != 1 || face_B->getNbCoFaces() != 1) + if (getCoFaces().size() != 1 || face_B->getCoFaces().size() != 1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, il n'est pas prévu de faire appel à Face::fuse pour une face composée", TkUtil::Charset::UTF_8)); - getCoFace(0)->fuse(face_B->getCoFace(0), l_sommets_A, l_sommets_B, icmd); + getCoFaces()[0]->fuse(face_B->getCoFaces()[0], l_sommets_A, l_sommets_B, icmd); // TODO [EB] traiter le cas avec de multiples faces communes } @@ -1160,9 +1093,9 @@ free(Internal::InfoCommand* icmd) // on laisse les relation du bloc vers cette face // suppression des relations remontantes des faces communes vers cette face - for (uint i=0; isaveCoFaceTopoProperty(icmd); - getCoFace(i)->removeFace(this, true); + for (uint i=0; isaveCoFaceTopoProperty(icmd); + getCoFaces()[i]->removeFace(this); } clearDependancy(); @@ -1188,40 +1121,27 @@ split(std::vector & splitingEdges, std::map filtre_coedges; std::map filtre_cofaces; std::map filtre_vertex; - for(uint i=0; i < getNbCoFaces(); i++){ - CoFace* coface = getCoFace(i); + for(CoFace* coface : getCoFaces()){ filtre_cofaces[coface] = 1; - std::vector coedges; - coface->getCoEdges(coedges); - for(uint j=0; j < coedges.size(); j++) - filtre_coedges[coedges[j]] = 1; - - } // for(uint i=0; i < getNbCoFaces(); i++) + for(CoEdge* ce : coface->getCoEdges()) + filtre_coedges[ce] = 1; + } // on marque les CoEdges qui délimitent la coupe (comme étant en dehors de la face) // on marque égallement ces sommets - for(std::vector::iterator iter = splitingEdges.begin(); - iter != splitingEdges.end(); ++iter){ - Edge* edge = *iter; - - std::vector coedges; - edge->getCoEdges(coedges); - for(uint j=0; j < coedges.size(); j++) - filtre_coedges[coedges[j]] = 2; + for(Edge* edge : splitingEdges){ + for(CoEdge* ce : edge->getCoEdges()) + filtre_coedges[ce] = 2; - filtre_vertex[edge->getVertex(0)] = 2; - filtre_vertex[edge->getVertex(1)] = 2; + filtre_vertex[edge->getVertices()[0]] = 2; + filtre_vertex[edge->getVertices()[1]] = 2; } // on part d'une CoFace reliée au sommet 1 de la face CoFace* coface_dep = 0; - for (uint i=0; igetNbCoEdges(); i++){ - CoEdge* coedge = getVertex(1)->getCoEdge(i); + for (CoEdge* coedge : getVertices()[1]->getCoEdges()){ if (1 == filtre_coedges[coedge]){ - std::vector cofaces; - coedge->getCoFaces(cofaces); - for (uint k=0; kgetCoFaces()){ if (1 == filtre_cofaces[coface]) coface_dep = coface; } @@ -1239,28 +1159,18 @@ split(std::vector & splitingEdges, while (!cofaces_dep.empty()) { - for (std::vector::iterator iter1 = cofaces_dep.begin(); - iter1 != cofaces_dep.end(); ++iter1){ - CoFace* coface = *iter1; - - std::vector coedges; - coface->getCoEdges(coedges); - - for (std::vector::iterator iter2 = coedges.begin(); - iter2 != coedges.end(); ++iter2){ - if (filtre_coedges[*iter2] == 1){ - std::vector loc_cofaces; - (*iter2)->getCoFaces(loc_cofaces); - for (std::vector::iterator iter4 = loc_cofaces.begin(); - iter4 != loc_cofaces.end(); ++iter4){ - if (filtre_cofaces[*iter4] == 1){ - cofaces_suiv.push_back(*iter4); - filtre_cofaces[*iter4] = 2; + for (CoFace* coface : cofaces_dep){ + for (CoEdge* coedge : coface->getCoEdges()){ + if (filtre_coedges[coedge] == 1){ + for (CoFace* loc_cf : coedge->getCoFaces()){ + if (filtre_cofaces[loc_cf] == 1){ + cofaces_suiv.push_back(loc_cf); + filtre_cofaces[loc_cf] = 2; } } } - } // for iter2 = coedges.begin() - } // for iter1 = cofaces_dep.begin() + } // for coedge + } // for coface cofaces_dep = cofaces_suiv; cofaces_suiv.clear(); @@ -1318,51 +1228,47 @@ split(std::vector & splitingEdges, // on sépare les coedges en 4 groupes (un par côté de la face) std::vector iCoedges_1, iCoedges_2, jCoedges_1, jCoedges_2; - if (!TopoHelper::getCoEdgesBetweenVertices(getVertex(1), getVertex(2), iCoedges, iCoedges_1)) + if (!TopoHelper::getCoEdgesBetweenVertices(getVertices()[1], getVertices()[2], iCoedges, iCoedges_1)) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, Face::split echoue avec getCoEdgesBetweenVertices / iCoedges_1", TkUtil::Charset::UTF_8)); - if (getNbVertices() == 4){ - if (!TopoHelper::getCoEdgesBetweenVertices(getVertex(0), getVertex(3), iCoedges, iCoedges_2)) + if (getVertices().size() == 4){ + if (!TopoHelper::getCoEdgesBetweenVertices(getVertices()[0], getVertices()[3], iCoedges, iCoedges_2)) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, Face::split echoue avec getCoEdgesBetweenVertices / iCoedges_2", TkUtil::Charset::UTF_8)); } else { // iCoedges_2 reste vide } - if (!TopoHelper::getCoEdgesBetweenVertices(getVertex(1), getVertex(0), jCoedges, jCoedges_1)) + if (!TopoHelper::getCoEdgesBetweenVertices(getVertices()[1], getVertices()[0], jCoedges, jCoedges_1)) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, Face::split echoue avec getCoEdgesBetweenVertices / jCoedges_1", TkUtil::Charset::UTF_8)); - if (getNbVertices() == 4){ - if (!TopoHelper::getCoEdgesBetweenVertices(getVertex(2), getVertex(3), jCoedges, jCoedges_2)) + if (getVertices().size() == 4){ + if (!TopoHelper::getCoEdgesBetweenVertices(getVertices()[2], getVertices()[3], jCoedges, jCoedges_2)) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, Face::split echoue avec getCoEdgesBetweenVertices / jCoedges_2", TkUtil::Charset::UTF_8)); } else { - if (!TopoHelper::getCoEdgesBetweenVertices(getVertex(2), getVertex(0), jCoedges, jCoedges_2)) + if (!TopoHelper::getCoEdgesBetweenVertices(getVertices()[2], getVertices()[0], jCoedges, jCoedges_2)) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, Face::split echoue avec getCoEdgesBetweenVertices / jCoedges_2", TkUtil::Charset::UTF_8)); } - if (getNbVertices() == 4){ - for (std::vector::iterator iter = iCoedges_1.begin(); - iter != iCoedges_1.end(); ++iter) - if (filtre_vertex[(*iter)->getVertex(0)] == 2 || filtre_vertex[(*iter)->getVertex(1)] == 2) + if (getVertices().size() == 4){ + for (auto iter = iCoedges_1.begin(); iter != iCoedges_1.end(); ++iter) + if (filtre_vertex[(*iter)->getVertices()[0]] == 2 || filtre_vertex[(*iter)->getVertices()[1]] == 2) dirFaceSplit = i_dir; - for (std::vector::iterator iter = iCoedges_2.begin(); - iter != iCoedges_2.end(); ++iter) - if (filtre_vertex[(*iter)->getVertex(0)] == 2 || filtre_vertex[(*iter)->getVertex(1)] == 2) + for (auto iter = iCoedges_2.begin(); iter != iCoedges_2.end(); ++iter) + if (filtre_vertex[(*iter)->getVertices()[0]] == 2 || filtre_vertex[(*iter)->getVertices()[1]] == 2) dirFaceSplit = i_dir; - for (std::vector::iterator iter = jCoedges_1.begin(); - iter != jCoedges_1.end(); ++iter) - if (filtre_vertex[(*iter)->getVertex(0)] == 2 || filtre_vertex[(*iter)->getVertex(1)] == 2) + for (auto iter = jCoedges_1.begin(); iter != jCoedges_1.end(); ++iter) + if (filtre_vertex[(*iter)->getVertices()[0]] == 2 || filtre_vertex[(*iter)->getVertices()[1]] == 2) dirFaceSplit = j_dir; - for (std::vector::iterator iter = jCoedges_2.begin(); - iter != jCoedges_2.end(); ++iter) - if (filtre_vertex[(*iter)->getVertex(0)] == 2 || filtre_vertex[(*iter)->getVertex(1)] == 2) + for (auto iter = jCoedges_2.begin(); iter != jCoedges_2.end(); ++iter) + if (filtre_vertex[(*iter)->getVertices()[0]] == 2 || filtre_vertex[(*iter)->getVertices()[1]] == 2) dirFaceSplit = j_dir; } else { // cas avec dégénérecence, on détermine le sens en fonction du fait // que la coupe passe par un des sommets de la face ou non bool coupeParSommetFace = false; - for (uint i=0; i & splitingEdges, Vertex* vtx1 = 0; Vertex* vtx2 = 0; if (dirFaceSplit == i_dir){ - for (std::vector::iterator iter = iCoedges_1.begin(); - iter != iCoedges_1.end(); ++iter) - if (filtre_vertex[(*iter)->getVertex(0)] == 2) - vtx1 = (*iter)->getVertex(0); - else if (filtre_vertex[(*iter)->getVertex(1)] == 2) - vtx1 = (*iter)->getVertex(1); + for (auto iter = iCoedges_1.begin(); iter != iCoedges_1.end(); ++iter) + if (filtre_vertex[(*iter)->getVertices()[0]] == 2) + vtx1 = (*iter)->getVertices()[0]; + else if (filtre_vertex[(*iter)->getVertices()[1]] == 2) + vtx1 = (*iter)->getVertices()[1]; if (iCoedges_2.empty()) - vtx2 = getVertex(0); + vtx2 = getVertices()[0]; else - for (std::vector::iterator iter = iCoedges_2.begin(); - iter != iCoedges_2.end(); ++iter) - if (filtre_vertex[(*iter)->getVertex(0)] == 2) - vtx2 = (*iter)->getVertex(0); - else if (filtre_vertex[(*iter)->getVertex(1)] == 2) - vtx2 = (*iter)->getVertex(1); + for (auto iter = iCoedges_2.begin(); iter != iCoedges_2.end(); ++iter) + if (filtre_vertex[(*iter)->getVertices()[0]] == 2) + vtx2 = (*iter)->getVertices()[0]; + else if (filtre_vertex[(*iter)->getVertices()[1]] == 2) + vtx2 = (*iter)->getVertices()[1]; } else { - for (std::vector::iterator iter = jCoedges_1.begin(); - iter != jCoedges_1.end(); ++iter) - if (filtre_vertex[(*iter)->getVertex(0)] == 2) - vtx1 = (*iter)->getVertex(0); - else if (filtre_vertex[(*iter)->getVertex(1)] == 2) - vtx1 = (*iter)->getVertex(1); - - for (std::vector::iterator iter = jCoedges_2.begin(); - iter != jCoedges_2.end(); ++iter) - if (filtre_vertex[(*iter)->getVertex(0)] == 2) - vtx2 = (*iter)->getVertex(0); - else if (filtre_vertex[(*iter)->getVertex(1)] == 2) - vtx2 = (*iter)->getVertex(1); + for (auto iter = jCoedges_1.begin(); iter != jCoedges_1.end(); ++iter) + if (filtre_vertex[(*iter)->getVertices()[0]] == 2) + vtx1 = (*iter)->getVertices()[0]; + else if (filtre_vertex[(*iter)->getVertices()[1]] == 2) + vtx1 = (*iter)->getVertices()[1]; + + for (auto iter = jCoedges_2.begin(); iter != jCoedges_2.end(); ++iter) + if (filtre_vertex[(*iter)->getVertices()[0]] == 2) + vtx2 = (*iter)->getVertices()[0]; + else if (filtre_vertex[(*iter)->getVertices()[1]] == 2) + vtx2 = (*iter)->getVertices()[1]; } if (0 == vtx1 || 0 == vtx2) @@ -1421,29 +1323,29 @@ split(std::vector & splitingEdges, // construction des 2 groupes de 4 sommets pour chacunes des faces std::vector vertices_1, vertices_2; if (dirFaceSplit == i_dir){ - vertices_1.push_back(getVertex(0)); - vertices_1.push_back(getVertex(1)); + vertices_1.push_back(getVertices()[0]); + vertices_1.push_back(getVertices()[1]); vertices_1.push_back(vtx1); - if (getNbVertices() == 4) + if (getVertices().size() == 4) vertices_1.push_back(vtx2); vertices_2.push_back(vtx2); vertices_2.push_back(vtx1); - vertices_2.push_back(getVertex(2)); - if (getNbVertices() == 4) - vertices_2.push_back(getVertex(3)); + vertices_2.push_back(getVertices()[2]); + if (getVertices().size() == 4) + vertices_2.push_back(getVertices()[3]); } else { vertices_1.push_back(vtx1); - vertices_1.push_back(getVertex(1)); - vertices_1.push_back(getVertex(2)); + vertices_1.push_back(getVertices()[1]); + vertices_1.push_back(getVertices()[2]); vertices_1.push_back(vtx2); - vertices_2.push_back(getVertex(0)); + vertices_2.push_back(getVertices()[0]); vertices_2.push_back(vtx1); vertices_2.push_back(vtx2); - if (getNbVertices() == 4) - vertices_2.push_back(getVertex(3)); + if (getVertices().size() == 4) + vertices_2.push_back(getVertices()[3]); } @@ -1527,35 +1429,26 @@ saveInternals(CommandEditTopo* cet) } } /*----------------------------------------------------------------------------*/ -void Face:: -getEdges(std::vector& edges) const +std::vector Face:: +getEdges() const { - edges.clear(); - std::list l_e; - for(uint i=0; i < getNbCoFaces();i++) { - const std::vector& local_edges = getCoFace(i)->getEdges(); - l_e.insert(l_e.end(), local_edges.begin(), local_edges.end()); + Utils::EntitySet edges(Utils::Entity::compareEntity); + for(CoFace* coface : getCoFaces()) { + const std::vector& local_edges = coface->getEdges(); + edges.insert(local_edges.begin(), local_edges.end()); } - - l_e.sort(Utils::Entity::compareEntity); - l_e.unique(); - - edges.insert(edges.end(),l_e.begin(),l_e.end()); + return Utils::toVect(edges); } /*----------------------------------------------------------------------------*/ Edge* Face:: getEdge(Vertex* v1, Vertex* v2) const { - std::vector edges; - getEdges(edges); - - for (std::vector::iterator iter = edges.begin(); - iter != edges.end(); ++iter) - if ((*iter)->getNbVertices() == 2){ - Vertex* s1 = (*iter)->getVertex(0); - Vertex* s2 = (*iter)->getVertex(1); + for (Edge* e : getEdges()) + if (e->getVertices().size() == 2){ + Vertex* s1 = e->getVertices()[0]; + Vertex* s2 = e->getVertices()[1]; if ((s1 == v1 && s2 == v2) || (s1 == v2 && s2 == v1)) - return (*iter); + return e; } // on a échoué @@ -1569,35 +1462,17 @@ getEdge(Vertex* v1, Vertex* v2) const throw TkUtil::Exception (TkUtil::UTF8String ("Face::getEdge(v1,v2) ne trouve l'arête pour ces 2 sommets", TkUtil::Charset::UTF_8)); } /*----------------------------------------------------------------------------*/ -Edge* Face:: -getEdge(uint ind) const -{ - if (!isStructured()) - throw TkUtil::Exception (TkUtil::UTF8String ("Face::getEdge(ind) n'est pas possible avec une surface non structurée", TkUtil::Charset::UTF_8)); - if (getNbCoFaces() != 1) - throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, il n'est pas prévu de faire appel à Face::getEdge pour une face composée", TkUtil::Charset::UTF_8)); - - return getCoFace(0)->getEdge(ind); -} -/*----------------------------------------------------------------------------*/ -void Face:: -getCoEdges(std::vector& coedges) const +std::vector Face:: +getCoEdges() const { - coedges.clear(); - std::list l_e; - for(uint i=0; i < getNbCoFaces();i++) { - const std::vector& local_edges = getCoFace(i)->getEdges(); - for(uint j=0; j < local_edges.size();j++) { - const std::vector& local_coedges = local_edges[j]->getCoEdges(); - - l_e.insert(l_e.end(), local_coedges.begin(), local_coedges.end()); + Utils::EntitySet coedges(Utils::Entity::compareEntity); + for(CoFace* coface : getCoFaces()) { + for(Edge* edge : coface->getEdges()) { + const std::vector& local_coedges = edge->getCoEdges(); + coedges.insert(local_coedges.begin(), local_coedges.end()); } } - - l_e.sort(Utils::Entity::compareEntity); - l_e.unique(); - - coedges.insert(coedges.end(),l_e.begin(),l_e.end()); + return Utils::toVect(coedges); } /*----------------------------------------------------------------------------*/ void Face:: @@ -1607,9 +1482,9 @@ getOrientedCoEdges(std::vector & iCoedges, //#define _DEBUG_getOrientedCoEdges #ifdef _DEBUG_getOrientedCoEdges std::cout<<"Face::getOrientedCoEdges() pour la face: "<getName(); + std::cout<<"avec "<getName(); std::cout< & iCoedges, // on marque tous les cofaces et coedges de la face std::map filtre_coface; std::map filtre_coedge; - for(uint i=0; i < getNbCoFaces();i++){ - CoFace* coface = getCoFace(i); + for(CoFace* coface : getCoFaces()){ filtre_coface[coface] = 1; - - for(uint j=0; j < coface->getNbEdges();j++){ - Edge* edge = coface->getEdge(j); - - for(uint k=0; k < edge->getNbCoEdges();k++){ - CoEdge* coedge = edge->getCoEdge(k); + for(Edge* edge : coface->getEdges()){ + for(CoEdge* coedge : edge->getCoEdges()){ filtre_coedge[coedge] = 1; #ifdef _DEBUG_getOrientedCoEdges std::cout<<" on marque l'arête "<getName()<<" vue dans "<getName()<<" "<getName()<getNbCoEdges();k++) - } // for(uint j=0; j < coface->getNbEdges();j++) - } // for(uint i=0; i < getNbCoFaces();i++) + } // for coedge + } // for edge + } // for coface // on part d'une première CoFace et de proche en proche on parcours toute la face std::vector cofaces_dep, cofaces_suiv; - if (getNbCoFaces()==0) + if (getCoFaces().size()==0) throw TkUtil::Exception (TkUtil::UTF8String ("Face::getOrientedCoEdges(,) ne peut se faire sur une face vide dans ", TkUtil::Charset::UTF_8)+getName()); // on prend arbitrairement le même sens que pour la première CoFace // une permutation à la fin peut être nécessaire - cofaces_dep.push_back(getCoFace(0)); - getCoFace(0)->getOrientedCoEdges(iCoedges, jCoedges); - filtre_coface[getCoFace(0)] = 2; + CoFace* cf0 = getCoFaces()[0]; + cofaces_dep.push_back(cf0); + cf0->getOrientedCoEdges(iCoedges, jCoedges); + filtre_coface[cf0] = 2; // on marque les CoEdge - for (std::vector::iterator iter = iCoedges.begin(); - iter != iCoedges.end(); ++iter) - filtre_coedge[*iter] = 2; - for (std::vector::iterator iter = jCoedges.begin(); - iter != jCoedges.end(); ++iter) - filtre_coedge[*iter] = 3; + for (CoEdge* coedge : iCoedges) + filtre_coedge[coedge] = 2; + for (CoEdge* coedge : jCoedges) + filtre_coedge[coedge] = 3; while (!cofaces_dep.empty()) { @@ -1749,16 +1617,16 @@ getOrientedCoEdges(std::vector & iCoedges, uint nbCoedges10_j = 0; - sens12_i_ok = TopoHelper::getCoEdgesBetweenVertices(getVertex(1), getVertex(2), iCoedges, coedges_between); + sens12_i_ok = TopoHelper::getCoEdgesBetweenVertices(getVertices()[1], getVertices()[2], iCoedges, coedges_between); nbCoedges12_i = coedges_between.size(); - sens10_i_ok = TopoHelper::getCoEdgesBetweenVertices(getVertex(1), getVertex(0), iCoedges, coedges_between); + sens10_i_ok = TopoHelper::getCoEdgesBetweenVertices(getVertices()[1], getVertices()[0], iCoedges, coedges_between); nbCoedges10_i = coedges_between.size(); - sens12_j_ok = TopoHelper::getCoEdgesBetweenVertices(getVertex(1), getVertex(2), jCoedges, coedges_between); + sens12_j_ok = TopoHelper::getCoEdgesBetweenVertices(getVertices()[1], getVertices()[2], jCoedges, coedges_between); nbCoedges12_j = coedges_between.size(); - sens10_j_ok = TopoHelper::getCoEdgesBetweenVertices(getVertex(1), getVertex(0), jCoedges, coedges_between); + sens10_j_ok = TopoHelper::getCoEdgesBetweenVertices(getVertices()[1], getVertices()[0], jCoedges, coedges_between); nbCoedges10_j = coedges_between.size(); #ifdef _DEBUG_getOrientedCoEdges @@ -1847,14 +1715,12 @@ _getNbMeshingEdges(uint& nbI, uint& nbJ, // on marque les arêtes et les faces communes de la face à 1 std::map filtre_edges; std::map filtre_cofaces; - for(uint i=0; i < getNbCoFaces(); i++){ - CoFace* coface = getCoFace(i); + for(CoFace* coface : getCoFaces()){ filtre_cofaces[coface] = 1; - for(uint j=0; j < coface->getNbEdges(); j++){ - Edge* edge = coface->getEdge(j); + for(Edge* edge : coface->getEdges()){ filtre_edges[edge] = 1; - } // for(uint j=0; j < coface->getNbEdges(); j++) - } // for(uint i=0; i < getNbCoFaces(); i++) + } // for edge + } // for coface // on fait la même chose pour les deux directions: // on cumule le nombre de bras pour les arêtes en tenant compte des ratios au niveau des arêtes et des faces @@ -1862,11 +1728,11 @@ _getNbMeshingEdges(uint& nbI, uint& nbJ, for (uint dir = 0; dir<2; dir++){ // on fait un parcours depuis un sommet jusqu'à un autre sommet pour en extraire le sous-ensemble std::vector coedges_cote; - if (TopoHelper::getCoEdgesBetweenVertices(getVertex(1), getVertex(dir==0?2:0), dir==0?coedgesI:coedgesJ, coedges_cote)){ + if (TopoHelper::getCoEdgesBetweenVertices(getVertices()[1], getVertices()[dir==0?2:0], dir==0?coedgesI:coedgesJ, coedges_cote)){ // à partir des ces arêtes commune on recherche les arêtes de la face // (ce qui permet d'avoir un nombre de bras tenant compte de la semi-conformité) nb_dir[dir] = _getNbMeshingEdges(filtre_edges, filtre_cofaces, coedges_cote, - getVertex(1), getVertex(dir==0?2:0)); + getVertices()[1], getVertices()[dir==0?2:0]); } else throw TkUtil::Exception (TkUtil::UTF8String ("Face::_getNbMeshingEdges ne trouve pas les arêtes communes pour la direction i", TkUtil::Charset::UTF_8)); @@ -1936,10 +1802,10 @@ _getNbMeshingEdges(std::map &filtre_edges, Edge* Face:: getOppositeEdge(Edge* e) const { - if (getNbCoFaces() != 1) + if (getCoFaces().size() != 1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur Interne, il n'est pas prévu de faire appel à Face::getOppositeEdge pour une face composée", TkUtil::Charset::UTF_8)); - return getCoFace(0)->getOppositeEdge(e); + return getCoFaces()[0]->getOppositeEdge(e); } /*----------------------------------------------------------------------------*/ Vertex* Face:: @@ -1947,29 +1813,30 @@ getOppositeVertex(Vertex* v, eDirOnFace& dir) const { // std::cout<<"Face::getOppositeVertex("<getName()<<", "<getName()<<", "<getName()<<") dans la face : "<<*this<setGeomAssociation(ge); + for (CoFace* coface : getCoFaces()) + coface->setGeomAssociation(ge); } /*----------------------------------------------------------------------------*/ void Face:: _permuteToFirstAndLastVertices(Vertex* v1, Vertex* v2, Internal::InfoCommand* icmd) { - - uint nb = getNbVertices(); + auto vertices = getVertices(); + uint nb = vertices.size(); // recherche des indices de v1 et v2 uint ind1 = 0; @@ -2020,7 +1888,7 @@ _permuteToFirstAndLastVertices(Vertex* v1, Vertex* v2, Internal::InfoCommand* ic bool trouve1 = false; bool trouve2 = false; for (uint ind = 0; ind initial_vertices; - m_topo_property->getVertexContainer().get(initial_vertices); - + std::vector initial_vertices = getVertices(); std::vector sorted_vertices; // le changement implique-t-il de permuter les ratios de FaceMeshProperty ? @@ -2044,7 +1910,7 @@ _permuteToFirstAndLastVertices(Vertex* v1, Vertex* v2, Internal::InfoCommand* ic bool perm_ratio = false; if (isStructured()){ - if (getNbVertices() != 4){ + if (getVertices().size() != 4){ TkUtil::UTF8String message1 (TkUtil::Charset::UTF_8); message1 << "Face::_permuteToFirstAndLastVertices(...) pour "<<*this; message1 << " avec v1 : "<<*v1<< " et v2 : "<<*v2; @@ -2088,8 +1954,7 @@ _permuteToFirstAndLastVertices(Vertex* v1, Vertex* v2, Internal::InfoCommand* ic throw TkUtil::Exception (TkUtil::UTF8String ("Face::_permuteToFirstAndLastVertices n'arrive pas à ordonner les sommets", TkUtil::Charset::UTF_8)); } - m_topo_property->getVertexContainer().clear(); - m_topo_property->getVertexContainer().add(sorted_vertices); + m_topo_property->getVertexContainer() = sorted_vertices; if (perm_ratio) _permuteMeshingRatios(icmd); @@ -2098,8 +1963,7 @@ _permuteToFirstAndLastVertices(Vertex* v1, Vertex* v2, Internal::InfoCommand* ic void Face:: _permuteMeshingRatios(Internal::InfoCommand* icmd) { - for (uint i=0; igetRatio(coface, 0); uint nbJ = m_mesh_property->getRatio(coface, 1); if (nbI != nbJ){ @@ -2121,12 +1985,9 @@ isEdited() const Utils::Math::Point Face::getBarycentre() const { Utils::Math::Point barycentre; - - std::vector vertices; - getVertices(vertices); - for (uint i=0; igetCoord(); - barycentre /= (double)vertices.size(); + for (Vertex * v : getVertices()) + barycentre += v->getCoord(); + barycentre /= (double)getVertices().size(); return barycentre; } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Topo/ImportBlocksImplementation.cpp b/src/Core/Topo/ImportBlocksImplementation.cpp index 57ae7005..47522bf8 100644 --- a/src/Core/Topo/ImportBlocksImplementation.cpp +++ b/src/Core/Topo/ImportBlocksImplementation.cpp @@ -239,17 +239,13 @@ void ImportBlocksImplementation::internalExecute() { coedges_f.resize(coedges_in_face.size()); coedges_f[0] = coedges[coedges_in_face[0]]; bool v1changed = false; - std::string v1Edge = coedges[coedges_in_face[0]]->getVertex( - 0)->getName(); - std::string v2Edge = coedges[coedges_in_face[0]]->getVertex( - 1)->getName(); + std::string v1Edge = coedges[coedges_in_face[0]]->getVertices()[0]->getName(); + std::string v2Edge = coedges[coedges_in_face[0]]->getVertices()[1]->getName(); for (int i_e = 1; i_e < coedges_in_face.size(); i_e++) { coedges_f[i_e] = coedges[coedges_in_face[i_e]]; - std::string v1current = coedges[coedges_in_face[i_e]]->getVertex( - 0)->getName(); - std::string v2current = coedges[coedges_in_face[i_e]]->getVertex( - 1)->getName(); + std::string v1current = coedges[coedges_in_face[i_e]]->getVertices()[0]->getName(); + std::string v2current = coedges[coedges_in_face[i_e]]->getVertices()[1]->getName(); if (v1Edge == v1current) { v1Edge = v2current; diff --git a/src/Core/Topo/SetNbMeshingEdgesImplementation.cpp b/src/Core/Topo/SetNbMeshingEdgesImplementation.cpp index 4dc4e1a4..530f61c7 100644 --- a/src/Core/Topo/SetNbMeshingEdgesImplementation.cpp +++ b/src/Core/Topo/SetNbMeshingEdgesImplementation.cpp @@ -170,21 +170,21 @@ addParalelCoEdges(CoEdge* coedge_dep, std::vector& whole_coedges) uint cote_dep = coface->getIndex(coedge_dep); uint cote_opp = (cote_dep+2)%4; // cas d'une face dégénérée en triangle - if (cote_opp == 3 && coface->getNbEdges() == 3) + if (cote_opp == 3 && coface->getEdges().size() == 3) continue; // déséquilibre dans cette face int delta = computeDelta(coface, cote_dep); - Edge* edge_opp = coface->getEdge(cote_opp); - if (edge_opp->getNbCoEdges() == 1){ - CoEdge* coedge_opp = edge_opp->getCoEdge(0); + Edge* edge_opp = coface->getEdges()[cote_opp]; + if (edge_opp->getCoEdges().size() == 1){ + CoEdge* coedge_opp = edge_opp->getCoEdges()[0]; if (m_coedges_vue[coedge_opp]){ // reste à vérifier que la coface est équilibrée if (delta){ - Edge* edge_dep = coface->getEdge(cote_dep); - if (edge_dep->getNbCoEdges() == 1){ + Edge* edge_dep = coface->getEdges()[cote_dep]; + if (edge_dep->getCoEdges().size() == 1){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message << "La modification a échouée, elle est bloquée sur la face commune "<< coface->getName(); message<<"\n avec une première arête "<getName()<<" et delta de "<<(short)m_coedge_delta[coedge_dep]; @@ -222,7 +222,7 @@ addParalelCoEdges(CoEdge* coedge_dep, std::vector& whole_coedges) m_cofaces_vue[coface] = true; } // else / if m_coedges_vue - } // if edge_opp->getNbCoEdges() == 1 + } // if edge_opp->getCoEdges().size() == 1 else { // cas avec un choix à faire sur l'arête qui devra être déséquilibrée // on reporte cela à plus tard @@ -233,7 +233,7 @@ addParalelCoEdges(CoEdge* coedge_dep, std::vector& whole_coedges) <<", cote_dep "<getName()<getNbCoEdges() == 1 + } // else / if edge_opp->getCoEdges().size() == 1 } // end for iter } /*----------------------------------------------------------------------------*/ @@ -243,10 +243,10 @@ findOppositeCoEdge(CoEdge* coedge_dep, uint cote_dep, CoFace* coface) CoEdge* coedge_opp = 0; uint cote_opp = (cote_dep+2)%4; - Edge* edge_dep = coface->getEdge(cote_dep); - Edge* edge_opp = coface->getEdge(cote_opp); + Edge* edge_dep = coface->getEdges()[cote_dep]; + Edge* edge_opp = coface->getEdges()[cote_opp]; - if (coface->getNbVertices() != 4){ + if (coface->getVertices().size() != 4){ TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message << "Erreur interne, cas avec face "<< coface->getName() <<" avec autre chose que 4 côtés pas encore pris en compte."; @@ -254,18 +254,16 @@ findOppositeCoEdge(CoEdge* coedge_dep, uint cote_dep, CoFace* coface) } // recherche des arêtes triées côté départ - Vertex* vtx1_dep = coface->getVertex(cote_dep); - Vertex* vtx2_dep = coface->getVertex((cote_dep+1)%4); - std::vector coedges_dep; - edge_dep->getCoEdges(coedges_dep); + Vertex* vtx1_dep = coface->getVertices()[cote_dep]; + Vertex* vtx2_dep = coface->getVertices()[(cote_dep+1)%4]; + std::vector coedges_dep = edge_dep->getCoEdges(); std::vector coedges_dep_sort; TopoHelper::getCoEdgesBetweenVertices(vtx1_dep, vtx2_dep, coedges_dep, coedges_dep_sort); // idem côté opposé - Vertex* vtx1_opp = coface->getVertex((cote_dep+3)%4); - Vertex* vtx2_opp = coface->getVertex((cote_dep+2)%4); - std::vector coedges_opp; - edge_opp->getCoEdges(coedges_opp); + Vertex* vtx1_opp = coface->getVertices()[(cote_dep+3)%4]; + Vertex* vtx2_opp = coface->getVertices()[(cote_dep+2)%4]; + std::vector coedges_opp = edge_opp->getCoEdges(); std::vector coedges_opp_sort; TopoHelper::getCoEdgesBetweenVertices(vtx1_opp, vtx2_opp, coedges_opp, coedges_opp_sort); @@ -318,25 +316,20 @@ computeDelta(CoFace* coface, uint cote) uint cote_opp = (cote+2)%4; - if (cote_opp == 3 && coface->getNbEdges() == 3) + if (cote_opp == 3 && coface->getEdges().size() == 3) return 0; else { - std::vector coedges; - int nb_init = 0; - coface->getEdge(cote)->getCoEdges(coedges); - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter){ - nb_init += (*iter)->getNbMeshingEdges() + m_coedge_delta[*iter]; - //std::cout<<"nb_init += "<<(*iter)->getNbMeshingEdges()<<" + "<getEdges()[cote]->getCoEdges()){ + nb_init += ce->getNbMeshingEdges() + m_coedge_delta[ce]; + //std::cout<<"nb_init += "<getNbMeshingEdges()<<" + "<getEdge(cote_opp)->getCoEdges(coedges); - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter){ - nb_opp += (*iter)->getNbMeshingEdges() + m_coedge_delta[*iter]; - //std::cout<<"nb_opp += "<<(*iter)->getNbMeshingEdges()<<" + "<getEdges()[cote_opp]->getCoEdges()){ + nb_opp += ce->getNbMeshingEdges() + m_coedge_delta[ce]; + //std::cout<<"nb_opp += "<getNbMeshingEdges()<<" + "<& cofaces) { - std::vector all_cofaces; - coedge->getCoFaces(all_cofaces); - - for (std::vector::iterator iter = all_cofaces.begin(); - iter != all_cofaces.end(); ++iter) - if ((*iter)->isStructured()) - cofaces.push_back(*iter); + for (CoFace* cf : coedge->getCoFaces()) + if (cf->isStructured()) + cofaces.push_back(cf); } /*----------------------------------------------------------------------------*/ void SetNbMeshingEdgesImplementation:: diff --git a/src/Core/Topo/TopoHelper.cpp b/src/Core/Topo/TopoHelper.cpp index 1fdf6b87..cbea4cbd 100644 --- a/src/Core/Topo/TopoHelper.cpp +++ b/src/Core/Topo/TopoHelper.cpp @@ -235,9 +235,8 @@ uint TopoHelper::getInternalDir(Vertex* v1, Vertex* v2, void TopoHelper::getCoEdges(const std::vector & edges, std::vector & coedges) { - for (std::vector::const_iterator iter = edges.begin(); - iter != edges.end(); ++iter){ - const std::vector & l_coedges = (*iter)->getCoEdges(); + for (Edge* e : edges){ + const std::vector & l_coedges = e->getCoEdges(); coedges.insert(coedges.end(), l_coedges.begin(), l_coedges.end()); } } @@ -247,10 +246,8 @@ void TopoHelper::getCoFaces(const std::vector & blocs, { std::list liste; - for (std::vector::const_iterator iter = blocs.begin(); - iter != blocs.end(); ++iter){ - std::vector l_cofaces; - (*iter)->getCoFaces(l_cofaces); + for (Block* b : blocs){ + std::vector l_cofaces = b->getCoFaces(); liste.insert(liste.end(), l_cofaces.begin(), l_cofaces.end()); } @@ -265,11 +262,9 @@ void TopoHelper::getCoEdges(const std::vector & faces, { std::list liste; - for (std::vector::const_iterator iter = faces.begin(); - iter != faces.end(); ++iter){ - std::vector l_coedges; - (*iter)->getCoEdges(l_coedges, false); - liste.insert(liste.end(), l_coedges.begin(), l_coedges.end()); + for (CoFace* cf : faces){ + std::vector l_coedges = cf->getCoEdges(); + liste.insert(liste.end(), l_coedges.begin(), l_coedges.end()); } liste.sort(Utils::Entity::compareEntity); @@ -283,10 +278,8 @@ void TopoHelper::getCoEdges(const std::vector & blocs, { std::list liste; - for (std::vector::const_iterator iter = blocs.begin(); - iter != blocs.end(); ++iter){ - std::vector l_coedges; - (*iter)->getCoEdges(l_coedges, false); + for (Block* b : blocs){ + std::vector l_coedges = b->getCoEdges(); liste.insert(liste.end(), l_coedges.begin(), l_coedges.end()); } @@ -301,10 +294,8 @@ void TopoHelper::getVertices(const std::vector & faces, { std::list liste; - for (std::vector::const_iterator iter = faces.begin(); - iter != faces.end(); ++iter){ - std::vector l_vertices; - (*iter)->getAllVertices(l_vertices, false); + for (CoFace* cf : faces){ + std::vector l_vertices = cf->getAllVertices(); liste.insert(liste.end(), l_vertices.begin(), l_vertices.end()); } @@ -319,10 +310,8 @@ void TopoHelper::getVertices(const std::vector & blocs, { std::list liste; - for (std::vector::const_iterator iter = blocs.begin(); - iter != blocs.end(); ++iter){ - std::vector l_vertices; - (*iter)->getAllVertices(l_vertices, false); + for (Block* b : blocs){ + std::vector l_vertices = b->getAllVertices(); liste.insert(liste.end(), l_vertices.begin(), l_vertices.end()); } @@ -494,8 +483,7 @@ void TopoHelper::get(std::vector& vtx, std::set& v void TopoHelper::get(std::vector& blocks, std::set& cofaces) { for (uint k=0; k loc_cofaces; - blocks[k]->getCoFaces(loc_cofaces); + std::vector loc_cofaces = blocks[k]->getCoFaces(); cofaces.insert(loc_cofaces.begin(), loc_cofaces.end()); } } @@ -503,8 +491,7 @@ void TopoHelper::get(std::vector& blocks, std::set& void TopoHelper::get(std::vector& blocks, std::set& coedges) { for (uint k=0; k loc_coedges; - blocks[k]->getCoEdges(loc_coedges); + std::vector loc_coedges = blocks[k]->getCoEdges(); coedges.insert(loc_coedges.begin(), loc_coedges.end()); } } @@ -512,8 +499,7 @@ void TopoHelper::get(std::vector& blocks, std::set& void TopoHelper::get(std::vector& blocks, std::set& vertices) { for (uint k=0; k loc_vertices; - blocks[k]->getVertices(loc_vertices); + std::vector loc_vertices = blocks[k]->getVertices(); vertices.insert(loc_vertices.begin(), loc_vertices.end()); } } @@ -521,8 +507,7 @@ void TopoHelper::get(std::vector& blocks, std::set& void TopoHelper::get(std::vector& cofaces, std::set& coedges) { for (uint k=0; k loc_coedges; - cofaces[k]->getCoEdges(loc_coedges); + std::vector loc_coedges = cofaces[k]->getCoEdges(); coedges.insert(loc_coedges.begin(), loc_coedges.end()); } } @@ -530,8 +515,7 @@ void TopoHelper::get(std::vector& cofaces, std::set& cofaces, std::set& vertices) { for (uint k=0; k loc_vertices; - cofaces[k]->getVertices(loc_vertices); + std::vector loc_vertices = cofaces[k]->getVertices(); vertices.insert(loc_vertices.begin(), loc_vertices.end()); } } @@ -539,8 +523,7 @@ void TopoHelper::get(std::vector& cofaces, std::set& coedges, std::set& vertices) { for (uint k=0; k loc_vertices; - coedges[k]->getVertices(loc_vertices); + const std::vector& loc_vertices = coedges[k]->getVertices(); vertices.insert(loc_vertices.begin(), loc_vertices.end()); } } @@ -562,19 +545,19 @@ void TopoHelper::getVerticesTip(const std::vector & coedges, Vertex* & #endif if (coedges.size() == 1){ CoEdge* coedge = coedges[0]; - v1 = coedge->getVertex(0); - v2 = coedge->getVertex(1); + v1 = coedge->getVertices()[0]; + v2 = coedge->getVertices()[1]; } else if (coedges.empty()) throw TkUtil::Exception (TkUtil::UTF8String ("getVerticesTip(...) ne peut se faire sans au moins une CoEdge", TkUtil::Charset::UTF_8)); else if (isSorted){ // recherche du sommet de départ - if (coedges[0]->getVertex(1) == coedges[1]->getVertex(0) - || coedges[0]->getVertex(1) == coedges[1]->getVertex(1)) - v1 = coedges[0]->getVertex(0); - else if (coedges[0]->getVertex(0) == coedges[1]->getVertex(0) - || coedges[0]->getVertex(0) == coedges[1]->getVertex(1)) - v1 = coedges[0]->getVertex(1); + if (coedges[0]->getVertices()[1] == coedges[1]->getVertices()[0] + || coedges[0]->getVertices()[1] == coedges[1]->getVertices()[1]) + v1 = coedges[0]->getVertices()[0]; + else if (coedges[0]->getVertices()[0] == coedges[1]->getVertices()[0] + || coedges[0]->getVertices()[0] == coedges[1]->getVertices()[1]) + v1 = coedges[0]->getVertices()[1]; else throw TkUtil::Exception (TkUtil::UTF8String ("getVerticesTip(...) ne trouve pas de sommet commun entre les 2 premières", TkUtil::Charset::UTF_8)); @@ -592,7 +575,7 @@ void TopoHelper::getVerticesTip(const std::vector & coedges, Vertex* & std::map filtre_vtx; for (uint i=0; igetVertex(j)] += 1; + filtre_vtx[coedges[i]->getVertices()[j]] += 1; // cette map doit contenir 2 vertex vus une seul fois uint nb_vtx = 0; @@ -688,16 +671,14 @@ void TopoHelper::splitFaces(std::vector cofaces, std::cout<<"coface_prec = "<<(coface_prec?coface_prec->getName():"0")< loc_cofaces; - coedge_dep->getCoFaces(loc_cofaces); + std::vector loc_cofaces = coedge_dep->getCoFaces(); // on en recherche une parmi la sélection et qui ne soit pas encore vue // dans le cas d'une boucle (faces d'un bloc) on ne veut prendre les faces qu'une fois // dans le cas sans boucle, on veut juste passer d'une face à la voisine avec un retour possible // lors du passage par un point au centre d'une boule CoFace* coface = 0; - for (std::vector::iterator iter = loc_cofaces.begin(); - iter != loc_cofaces.end() && 0 == coface; ++iter){ + for (auto iter = loc_cofaces.begin(); iter != loc_cofaces.end() && 0 == coface; ++iter){ if (filtre_cofaces[*iter] == 1 && coface_prec != *iter) coface = *iter; } @@ -707,10 +688,10 @@ void TopoHelper::splitFaces(std::vector cofaces, // ce qui apparait dans le cas d'une face déjà coupée // mais qui n'a pas été détecté par coedge_dep == arete // ou une terminaison pour une coupe localisée - if (coedge_dep->getVertex(0) == arete->getVertex(0) - || coedge_dep->getVertex(0) == arete->getVertex(1) - || coedge_dep->getVertex(1) == arete->getVertex(0) - || coedge_dep->getVertex(1) == arete->getVertex(1) + if (coedge_dep->getVertices()[0] == arete->getVertices()[0] + || coedge_dep->getVertices()[0] == arete->getVertices()[1] + || coedge_dep->getVertices()[1] == arete->getVertices()[0] + || coedge_dep->getVertices()[1] == arete->getVertices()[1] || !boucleDemandee){ boucleTerminee = true; continue; @@ -729,7 +710,7 @@ void TopoHelper::splitFaces(std::vector cofaces, // recherche du côté dans lequel est cette arête, et le nombre de bras de maillage jusqu'à la coupe Edge* edge_dep = coface->getEdgeContaining(coedge_dep); - uint ind_edge_dep = coface->getIndex(edge_dep); + uint ind_edge_dep = Utils::getIndexOf(edge_dep, coface->getEdges()); #ifdef _DEBUG_SPLIT std::cout<<"edge_dep = "<getName()< cofaces, Vertex* vertex1; Vertex* vertex2; if (dirCoFaceSplit == CoFace::i_dir){ - vertex1 = coface->getVertex(1); - vertex2 = coface->getVertex(0); + vertex1 = coface->getVertices()[1]; + vertex2 = coface->getVertices()[0]; } else { - vertex1 = coface->getVertex(1); - vertex2 = coface->getVertex(2); + vertex1 = coface->getVertices()[1]; + vertex2 = coface->getVertices()[2]; } if (ind_edge_dep>1){ @@ -788,16 +769,16 @@ void TopoHelper::splitFaces(std::vector cofaces, Edge* edge_ar = 0; // si on est sur côté face à la dégénérescence, on met à 0 l'arête d'arrivée // ce qui permet de signaler un redémarage nécessaire - if (coface->getNbEdges() == 4){ + if (coface->getEdges().size() == 4){ uint ind_edge_ar = (ind_edge_dep+2)%4; - edge_ar = coface->getEdge(ind_edge_ar); + edge_ar = coface->getEdges()[ind_edge_ar]; } else { if (boucleDemandee){ // cas 3D if (ind_edge_dep == 0) - edge_ar = coface->getEdge(2); + edge_ar = coface->getEdges()[2]; else if (ind_edge_dep == 2) - edge_ar = coface->getEdge(0); + edge_ar = coface->getEdges()[0]; else edge_ar = 0; } @@ -805,17 +786,17 @@ void TopoHelper::splitFaces(std::vector cofaces, // cas 2D edge_ar = 0; if (ind_edge_dep == 0) - edge_ar = coface->getEdge(2); + edge_ar = coface->getEdges()[2]; else if (ind_edge_dep == 2) - edge_ar = coface->getEdge(0); + edge_ar = coface->getEdges()[0]; // on test pour détecter le cas d'une zone avec 1 seul sommet sur l'axe uint nb_sur_axe = 0; - if (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertex(0)->getY())) + if (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertices()[0]->getY())) nb_sur_axe++; - if (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertex(1)->getY())) + if (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertices()[1]->getY())) nb_sur_axe++; - if (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertex(2)->getY())) + if (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertices()[2]->getY())) nb_sur_axe++; if (nb_sur_axe == 1){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -859,7 +840,7 @@ void TopoHelper::splitFaces(std::vector cofaces, InfoSplit* is = cofaceInfoSplit[coface->getUniqueId()]; if (is == 0){ - if (coface->getNbEdges() == 3 && ind_edge_dep != 1 && !boucleDemandee){ + if (coface->getEdges().size() == 3 && ind_edge_dep != 1 && !boucleDemandee){ // cas où on arrive sur face dégénérée par un côté autre que celui qui fait face à la dégénérescence #ifdef _DEBUG_SPLIT std::cout<<"on ne fait rien sur cette face en arrivant par ce côté\n"; @@ -938,10 +919,10 @@ void TopoHelper::splitFaces(std::vector cofaces, // cas d'un "rebond" au niveau du centre d'une "boule" // c'est à dire une topologie équivalente à un demi-cercle, sur l'axe de symétrie - if (0 == coedge_ar && rebondAutorise && coface->getNbEdges() == 3 - && Utils::Math::MgxNumeric::isNearlyZero(coface->getVertex(0)->getY()) - && Utils::Math::MgxNumeric::isNearlyZero(coface->getVertex(1)->getY()) - && Utils::Math::MgxNumeric::isNearlyZero(coface->getVertex(2)->getY()) ){ + if (0 == coedge_ar && rebondAutorise && coface->getEdges().size() == 3 + && Utils::Math::MgxNumeric::isNearlyZero(coface->getVertices()[0]->getY()) + && Utils::Math::MgxNumeric::isNearlyZero(coface->getVertices()[1]->getY()) + && Utils::Math::MgxNumeric::isNearlyZero(coface->getVertices()[2]->getY()) ){ // on coupe une deuxième fois l'arête // on prend le complément pour la coupe @@ -970,10 +951,10 @@ void TopoHelper::splitFaces(std::vector cofaces, is->nbMeshingEdges_ar.push_back(nbMeshingEdges_ar); } - else if (0 == coedge_ar && rebondAutorise && coface->getNbEdges() == 3 - && Utils::Math::MgxNumeric::isNearlyZero(coface->getVertex(0)->getY()) - && (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertex(1)->getY()) - || Utils::Math::MgxNumeric::isNearlyZero(coface->getVertex(2)->getY())) ){ + else if (0 == coedge_ar && rebondAutorise && coface->getEdges().size() == 3 + && Utils::Math::MgxNumeric::isNearlyZero(coface->getVertices()[0]->getY()) + && (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertices()[1]->getY()) + || Utils::Math::MgxNumeric::isNearlyZero(coface->getVertices()[2]->getY())) ){ // on est peut-être dans le cas d'un rebond avec 2 zones pour la "boule" centrale #ifdef _DEBUG_SPLIT @@ -982,21 +963,20 @@ void TopoHelper::splitFaces(std::vector cofaces, // on cherche l'arête qui couperait cette boule Edge* edge_sym = 0; for (uint i=0; i<3; i+=2){ - Edge* edge = coface->getEdge(i); + Edge* edge = coface->getEdges()[i]; // le 2ème sommet de l'arête qui n'est pas à la dégénérescence - Vertex* vtx2 = edge->getOppositeVertex(coface->getVertex(0)); + Vertex* vtx2 = edge->getOppositeVertex(coface->getVertices()[0]); if (!Utils::Math::MgxNumeric::isNearlyZero(vtx2->getY())) edge_sym = edge; } #ifdef _DEBUG_SPLIT std::cout<<"edge_sym = "<<(edge_sym?edge_sym->getName():"0")<getNbCoEdges() == 1){ - CoEdge* coedge_sym = edge_sym->getCoEdge(0); + if (0 != edge_sym && edge_sym->getCoEdges().size() == 1){ + CoEdge* coedge_sym = edge_sym->getCoEdges()[0]; // recherche de la face de l'autre côté de cette arête si elle existe CoFace* coface_sym = 0; - std::vector cofaces_vois; - coedge_sym->getCoFaces(cofaces_vois); + std::vector cofaces_vois = coedge_sym->getCoFaces(); if (cofaces_vois.size() == 2){ if (coface == cofaces_vois[0]) coface_sym = cofaces_vois[1]; @@ -1006,7 +986,7 @@ void TopoHelper::splitFaces(std::vector cofaces, if (reprendreCetteFace){ coface_sym = coface; // dans ce cas il faut recalculer nbMeshingEdges_edge - nbMeshingEdges_edge = coface_sym->getEdge(1)->getNbMeshingEdges() - nbMeshingEdges_edge; + nbMeshingEdges_edge = coface_sym->getEdges()[1]->getNbMeshingEdges() - nbMeshingEdges_edge; #ifdef _DEBUG_SPLIT std::cout<<" cas où il faut adapter nbMeshingEdges_edge ...\n"; std::cout<<" => nbMeshingEdges_edge = "< cofaces, if (coface_sym){ // on test pour détecter le cas d'une zone avec 1 seul sommet sur l'axe uint nb_sur_axe = 0; - if (Utils::Math::MgxNumeric::isNearlyZero(coface_sym->getVertex(0)->getY())) + if (Utils::Math::MgxNumeric::isNearlyZero(coface_sym->getVertices()[0]->getY())) nb_sur_axe++; - if (Utils::Math::MgxNumeric::isNearlyZero(coface_sym->getVertex(1)->getY())) + if (Utils::Math::MgxNumeric::isNearlyZero(coface_sym->getVertices()[1]->getY())) nb_sur_axe++; - if (Utils::Math::MgxNumeric::isNearlyZero(coface_sym->getVertex(2)->getY())) + if (Utils::Math::MgxNumeric::isNearlyZero(coface_sym->getVertices()[2]->getY())) nb_sur_axe++; if (nb_sur_axe == 1){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -1036,15 +1016,15 @@ void TopoHelper::splitFaces(std::vector cofaces, } if (coface_sym && filtre_cofaces[coface_sym] == 1){ - if (coface_sym->getNbEdges() == 3){ + if (coface_sym->getEdges().size() == 3){ // on recherche dans cette face symétrique de la précédente // la positition de la coupe - edge_ar = coface_sym->getEdge(1); + edge_ar = coface_sym->getEdges()[1]; // recherche du sommet symétrique à vertex1 / edge_sym - if (edge_sym->find(vertex1)) + if (Utils::contains(vertex1, edge_sym->getVertices())) vertex2 = vertex1; else { vertex2 = edge_dep->getOppositeVertex(vertex1); @@ -1089,10 +1069,10 @@ void TopoHelper::splitFaces(std::vector cofaces, else { // recherche de l'arête hors de l'axe - if (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertex(1)->getY())) - edge_ar = coface->getEdge(2); - else if (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertex(2)->getY())) - edge_ar = coface->getEdge(0); + if (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertices()[1]->getY())) + edge_ar = coface->getEdges()[2]; + else if (Utils::Math::MgxNumeric::isNearlyZero(coface->getVertices()[2]->getY())) + edge_ar = coface->getEdges()[0]; // si le sommet 1 n'est pas sur l'axe on prend le complément pour nbMeshingEdges_edge if (!Utils::Math::MgxNumeric::isNearlyZero(vertex1->getY())) @@ -1122,7 +1102,7 @@ void TopoHelper::splitFaces(std::vector cofaces, } } // end if (0 != edge_sym && edge_sym->getNbCoEdges() == 1) } - else if (0 == coedge_ar || (!boucleDemandee && coedge_ar->getNbEdges() == 1 && coedge_ar->getNbCofaces() == 1)) { // terminaison ou relance ? + else if (0 == coedge_ar || (!boucleDemandee && coedge_ar->getEdges().size() == 1 && coedge_ar->getCoFaces().size() == 1)) { // terminaison ou relance ? // redémarrage tenteRelance = true; } @@ -1160,7 +1140,7 @@ void TopoHelper::splitFaces(std::vector cofaces, } - if (!boucleDemandee && coedge_dep->getNbEdges() == 1 && coedge_dep->getNbCofaces() == 1){ + if (!boucleDemandee && coedge_dep->getEdges().size() == 1 && coedge_dep->getCoFaces().size() == 1){ #ifdef _DEBUG_SPLIT std::cout<<" cela se termine vraiment ..."< cofaces, newVertices1 = is->coedge_dep[0]->split(is->nbMeshingEdges_dep, icmd); oldCoEdge2newVertices[is->coedge_dep[0]] = newVertices1; } - CoEdge* coedge0 = newVertices1[0]->getCoEdge(0); - CoEdge* coedge1 = newVertices1[0]->getCoEdge(1); + CoEdge* coedge0 = newVertices1[0]->getCoEdges()[0]; + CoEdge* coedge1 = newVertices1[0]->getCoEdges()[1]; // recherche de l'arête qui touche l'axe if (Utils::Math::MgxNumeric::isNearlyZero(coedge0->getOppositeVertex(newVertices1[0])->getY())) ni = coedge0->getNbMeshingEdges(); @@ -1260,13 +1240,13 @@ void TopoHelper::splitFaces(std::vector cofaces, newVertices1.push_back(vtx2[0]); } } - if (coface->getNbEdges() == 3 && ratio_ogrid>0){ + if (coface->getEdges().size() == 3 && ratio_ogrid>0){ #ifdef _DEBUG_SPLIT std::cout<<"split avec ogrid, on coupe les arêtes ..."<getEdge(0)->getNbMeshingEdges() == 1 || coface->getEdge(2)->getNbMeshingEdges() == 1){ + if (coface->getEdges()[0]->getNbMeshingEdges() == 1 || coface->getEdges()[2]->getNbMeshingEdges() == 1){ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Il n'est pas possible de découper en o-grid une face ("<getName()<<") avec un seul bras autour de la dégérescence"; throw TkUtil::Exception(messErr); @@ -1274,17 +1254,17 @@ void TopoHelper::splitFaces(std::vector cofaces, // on découpe les 2 autres arêtes // indice de l'arête / face (1 pour les face dégénérées) - uint ind_ar_dep = coface->getIndex(is->edge_dep); + uint ind_ar_dep = Utils::getIndexOf(is->edge_dep, coface->getEdges()); if (ind_ar_dep!=1) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur interne, Topo::splitFaces ne trouve pas l'arête de départ en position 1", TkUtil::Charset::UTF_8)); - Edge* edge4 = coface->getEdge(0); - if (edge4->getNbCoEdges() == 1){ - newVertices4 = oldCoEdge2newVertices[edge4->getCoEdge(0)]; + Edge* edge4 = coface->getEdges()[0]; + if (edge4->getCoEdges().size() == 1){ + newVertices4 = oldCoEdge2newVertices[edge4->getCoEdges()[0]]; } - else if (edge4->getNbCoEdges() == 2){ + else if (edge4->getCoEdges().size() == 2){ // on considère que l'arête est déjà coupée en 2 - newVertices4.push_back(TopoHelper::getCommonVertex(edge4->getCoEdge(0), edge4->getCoEdge(1))); + newVertices4.push_back(TopoHelper::getCommonVertex(edge4->getCoEdges()[0], edge4->getCoEdges()[1])); } else { TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -1294,13 +1274,13 @@ void TopoHelper::splitFaces(std::vector cofaces, } - Edge* edge2 = coface->getEdge(2); - if (edge2->getNbCoEdges() == 1){ - newVertices2 = oldCoEdge2newVertices[edge2->getCoEdge(0)]; + Edge* edge2 = coface->getEdges()[2]; + if (edge2->getCoEdges().size() == 1){ + newVertices2 = oldCoEdge2newVertices[edge2->getCoEdges()[0]]; } - else if (edge2->getNbCoEdges() == 2){ + else if (edge2->getCoEdges().size() == 2){ // on considère que l'arête est déjà coupée en 2 - newVertices2.push_back(TopoHelper::getCommonVertex(edge2->getCoEdge(0), edge2->getCoEdge(1))); + newVertices2.push_back(TopoHelper::getCommonVertex(edge2->getCoEdges()[0], edge2->getCoEdges()[1])); } else{ TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); @@ -1311,7 +1291,7 @@ void TopoHelper::splitFaces(std::vector cofaces, // le sommet à la dégénérescence - Vertex* vtx0 = coface->getVertex(0); + Vertex* vtx0 = coface->getVertices()[0]; #ifdef _DEBUG_SPLIT std::cout<<" ni trouvé : "< cofaces, if (newVertices2.empty()){ // vérif du sens pour prendre ni ou le complément uint ni_loc = ni; - if (vtx0 == edge2->getCoEdge(0)->getVertex(0)) + if (vtx0 == edge2->getCoEdges()[0]->getVertices()[0]) ni_loc = edge2->getNbMeshingEdges() - ni; #ifdef _DEBUG_SPLIT std::cout<<" ni_loc : "<getCoEdge(0)->split(ni_loc, icmd)); - oldCoEdge2newVertices[edge2->getCoEdge(0)] = newVertices2; + newVertices2.push_back(edge2->getCoEdges()[0]->split(ni_loc, icmd)); + oldCoEdge2newVertices[edge2->getCoEdges()[0]] = newVertices2; } std::vector & newEdges2 = old2newEdges[edge2]; @@ -1354,13 +1334,13 @@ void TopoHelper::splitFaces(std::vector cofaces, if (newVertices4.empty()){ // vérif du sens pour prendre ni ou le complément uint ni_loc = ni; - if (vtx0 == edge4->getCoEdge(0)->getVertex(0)) + if (vtx0 == edge4->getCoEdges()[0]->getVertices()[0]) ni_loc = edge4->getNbMeshingEdges() - ni; #ifdef _DEBUG_SPLIT std::cout<<" ni_loc : "<getCoEdge(0)->split(ni_loc, icmd)); - oldCoEdge2newVertices[edge4->getCoEdge(0)] = newVertices4; + newVertices4.push_back(edge4->getCoEdges()[0]->split(ni_loc, icmd)); + oldCoEdge2newVertices[edge4->getCoEdges()[0]] = newVertices4; } std::vector & newEdges4 = old2newEdges[edge4]; @@ -1402,7 +1382,7 @@ void TopoHelper::splitFaces(std::vector cofaces, } } else { - newVertices3.push_back(coface->getVertex(0)); // le sommet à la dégénérescence + newVertices3.push_back(coface->getVertices()[0]); // le sommet à la dégénérescence } } else if (is->coedge_ar.size() == 2){ if (is->coedge_ar[0]){ @@ -1432,8 +1412,8 @@ void TopoHelper::splitFaces(std::vector cofaces, } } else { - newVertices3.push_back(coface->getVertex(0)); // le sommet à la dégénérescence - newVertices3.push_back(coface->getVertex(0)); + newVertices3.push_back(coface->getVertices()[0]); // le sommet à la dégénérescence + newVertices3.push_back(coface->getVertices()[0]); } } @@ -1449,13 +1429,13 @@ void TopoHelper::splitFaces(std::vector cofaces, is->edge_ar->split(newVertices3, newEdges_ar, icmd); } - if (coface->getNbEdges() == 3 && ratio_ogrid>0){ + if (coface->getEdges().size() == 3 && ratio_ogrid>0){ // découpage en 3 ou 4 CoFace // NB on ne retourne pas les arêtes créées, cela n'a pas d'utilité - Edge* oldEdge0 = coface->getEdge(0); - Edge* oldEdge2 = coface->getEdge(2); + Edge* oldEdge0 = coface->getEdges()[0]; + Edge* oldEdge2 = coface->getEdges()[2]; std::vector newEdges = coface->splitOgrid((CoFace::eDirOnCoFace)is->dirCoFaceSplit, old2newEdges[oldEdge0], @@ -1470,9 +1450,9 @@ void TopoHelper::splitFaces(std::vector cofaces, splitingEdges.insert(splitingEdges.begin(), newEdges.begin(), newEdges.end()); // Destruction des arêtes inutiles (celles sans relation vers une CoFace) - if (oldEdge0->getNbCoFaces() == 0) + if (oldEdge0->getCoFaces().size() == 0) oldEdge0->free(icmd); - if (oldEdge2->getNbCoFaces() == 0) + if (oldEdge2->getCoFaces().size() == 0) oldEdge2->free(icmd); } else { @@ -1485,9 +1465,9 @@ void TopoHelper::splitFaces(std::vector cofaces, } // Destruction des arêtes inutiles (celles sans relation vers une CoFace) - if (0 != is->edge_dep && is->edge_dep->getNbCoFaces() == 0) + if (0 != is->edge_dep && is->edge_dep->getCoFaces().size() == 0) is->edge_dep->free(icmd); - if (0 != is->edge_ar && is->edge_ar->getNbCoFaces() == 0) + if (0 != is->edge_ar && is->edge_ar->getCoFaces().size() == 0) is->edge_ar->free(icmd); // libération de la mémoire @@ -1564,8 +1544,8 @@ void TopoHelper::saveTopoEntities(std::vector& cofaces, Internal::InfoC /*----------------------------------------------------------------------------*/ void TopoHelper::copyMeshingProperty(const Edge* edge, CoEdge* coedge) { - if (edge->getNbCoEdges() == 1){ - CoEdgeMeshingProperty* new_cmp = edge->getCoEdge(0)->getMeshingProperty()->clone(); + if (edge->getCoEdges().size() == 1){ + CoEdgeMeshingProperty* new_cmp = edge->getCoEdges()[0]->getMeshingProperty()->clone(); new_cmp->setPolarCut(false); // ce n'est pas compatible avec les autres côtés CoEdgeMeshingProperty* old_cmp = coedge->setProperty(new_cmp); delete old_cmp; @@ -1593,8 +1573,7 @@ void TopoHelper::deleteAllAdjacentTopoEntitiesGeomAssociation(Vertex* vtx) vtx->saveTopoProperty(); vtx->setGeomAssociation(0); } - std::vector loc_coedges; - vtx->getCoEdges(loc_coedges); + std::vector loc_coedges = vtx->getCoEdges(); for (std::vector::iterator iter = loc_coedges.begin(); iter != loc_coedges.end(); ++iter){ CoEdge* coedge = *iter; @@ -1603,8 +1582,7 @@ void TopoHelper::deleteAllAdjacentTopoEntitiesGeomAssociation(Vertex* vtx) coedge->setGeomAssociation(0); } } - std::vector loc_cofaces; - vtx->getCoFaces(loc_cofaces); + std::vector loc_cofaces = vtx->getCoFaces(); for (std::vector::iterator iter = loc_cofaces.begin(); iter != loc_cofaces.end(); ++iter){ CoFace* coface = *iter; @@ -1617,12 +1595,12 @@ void TopoHelper::deleteAllAdjacentTopoEntitiesGeomAssociation(Vertex* vtx) /*----------------------------------------------------------------------------*/ Vertex* TopoHelper::getCommonVertex(CoEdge* coedge1, CoEdge* coedge2) { - if (coedge1->getVertex(0) == coedge2->getVertex(0) - || coedge1->getVertex(0) == coedge2->getVertex(1)) - return coedge1->getVertex(0); - else if (coedge1->getVertex(1) == coedge2->getVertex(0) - || coedge1->getVertex(1) == coedge2->getVertex(1)) - return coedge1->getVertex(1); + if (coedge1->getVertices()[0] == coedge2->getVertices()[0] + || coedge1->getVertices()[0] == coedge2->getVertices()[1]) + return coedge1->getVertices()[0]; + else if (coedge1->getVertices()[1] == coedge2->getVertices()[0] + || coedge1->getVertices()[1] == coedge2->getVertices()[1]) + return coedge1->getVertices()[1]; TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Pas de sommet commun entre "<<*coedge1<< " et "<<*coedge2; @@ -1634,17 +1612,15 @@ Vertex* TopoHelper::getCommonVertex(Face* face1, Face* face2) // on marque les sommets de la première face std::set filtre_vertices; - std::vector vertices; - face1->getVertices(vertices); - - for (std::vector::iterator iter=vertices.begin(); iter!=vertices.end(); ++iter) + std::vector vertices = face1->getVertices(); + for (auto iter=vertices.begin(); iter!=vertices.end(); ++iter) filtre_vertices.insert(*iter); - // on recherche parmis les sommets de la deuxième faces les somets marqués + // on recherche parmi les sommets de la deuxième face les sommets marqués std::vector selected_vertices; - face2->getVertices(vertices); - for (std::vector::iterator iter=vertices.begin(); iter!=vertices.end(); ++iter) + vertices = face2->getVertices(); + for (auto iter=vertices.begin(); iter!=vertices.end(); ++iter) if (filtre_vertices.find(*iter) != filtre_vertices.end()) selected_vertices.push_back(*iter); @@ -1691,8 +1667,8 @@ bool TopoHelper::isUnidirectionalMeshable(std::vector > co return false; } - double tailleBras = (coedge->getVertex(0)->getCoord() - -coedge->getVertex(1)->getCoord()).norme() + double tailleBras = (coedge->getVertices()[0]->getCoord() + -coedge->getVertices()[1]->getCoord()).norme() /(double)coedge->getNbMeshingEdges(); if (j>=1 && !Utils::Math::MgxNumeric::isNearlyZero(tailleBras_prec-tailleBras) ){ @@ -1727,8 +1703,8 @@ bool TopoHelper::isUnidirectionalMeshable(std::vector > co #endif // s'il y en a plusieur, il faut tester la colinéarité if (j){ - Utils::Math::Vector v1(coedge_prec->getVertex(0)->getCoord(), coedge_prec->getVertex(1)->getCoord()); - Utils::Math::Vector v2(coedge->getVertex(0)->getCoord(), coedge->getVertex(1)->getCoord()); + Utils::Math::Vector v1(coedge_prec->getVertices()[0]->getCoord(), coedge_prec->getVertices()[1]->getCoord()); + Utils::Math::Vector v2(coedge->getVertices()[0]->getCoord(), coedge->getVertices()[1]->getCoord()); Utils::Math::Vector v3 = v1*v2; if (!Utils::Math::MgxNumeric::isNearlyZero(v3.abs2())){ @@ -1819,13 +1795,9 @@ Topo::Vertex* TopoHelper::getVertexAtPosition(std::vector& vertic std::vector TopoHelper::getVerticesNeighbour(Vertex* vtx) { std::vector vertices; - std::vector coedges; - vtx->getCoEdges(coedges); - - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter) - if (!(*iter)->isDestroyed() && (*iter)->getNbVertices() == 2) - vertices.push_back((*iter)->getOppositeVertex(vtx)); + for (CoEdge* coedge : vtx->getCoEdges()) + if (!coedge->isDestroyed() && coedge->getVertices().size() == 2) + vertices.push_back(coedge->getOppositeVertex(vtx)); return vertices; } @@ -1835,14 +1807,9 @@ std::vector TopoHelper::getBorder(std::vector& cofaces) // on marque les coedges suivant le nombre de fois où elles sont référencées par une coface std::map filtre_coedges; - for (uint i=0; i coedges; - // les coedges qui apparaissent 2 fois dans une même coface ne seront pas au bord - cofaces[i]->getCoEdges(coedges, false); - - for (uint j=0; jgetCoEdges()) + filtre_coedges[ce] += 1; std::vector coedges; for (std::map::iterator iter = filtre_coedges.begin(); @@ -1859,10 +1826,8 @@ std::vector TopoHelper::getBorder(std::vector& bloc std::map filtre_cofaces; for (uint i=0; i cofaces; + std::vector cofaces = blocks[i]->getCoFaces(); // les coedges qui apparaissent 2 fois dans une même coface ne seront pas au bord - blocks[i]->getCoFaces(cofaces); - for (uint j=0; j TopoHelper::getCommonCoEdges(Block* bloc1, Block* bloc2) // on marque les arêtes du premier bloc std::set filtre_coedges; - std::vector coedges; - bloc1->getCoEdges(coedges); + std::vector coedges = bloc1->getCoEdges(); for (std::vector::iterator iter=coedges.begin(); iter!=coedges.end(); ++iter) filtre_coedges.insert(*iter); @@ -1890,7 +1854,7 @@ std::vector TopoHelper::getCommonCoEdges(Block* bloc1, Block* bloc2) // on recherche parmis les arêtes du deuxième bloc les arêtes marquées std::vector selected_coedges; - bloc2->getCoEdges(coedges); + coedges = bloc2->getCoEdges(); for (std::vector::iterator iter=coedges.begin(); iter!=coedges.end(); ++iter) if (filtre_coedges.find(*iter) != filtre_coedges.end()) selected_coedges.push_back(*iter); @@ -1902,31 +1866,23 @@ std::vector TopoHelper::getCommonCoEdges(CoFace* face1, CoFace* face2) { // on marque les arêtes de la première coface std::set filtre_coedges; - - std::vector coedges; - face1->getCoEdges(coedges); - - for (std::vector::iterator iter=coedges.begin(); iter!=coedges.end(); ++iter) - filtre_coedges.insert(*iter); + for (CoEdge* ce : face1->getCoEdges()) + filtre_coedges.insert(ce); // on recherche parmis les arêtes de la deuxième coface les arêtes marquées std::vector selected_coedges; - - face2->getCoEdges(coedges); - for (std::vector::iterator iter=coedges.begin(); iter!=coedges.end(); ++iter) - if (filtre_coedges.find(*iter) != filtre_coedges.end()) - selected_coedges.push_back(*iter); + for (CoEdge* ce : face2->getCoEdges()) + if (filtre_coedges.find(ce) != filtre_coedges.end()) + selected_coedges.push_back(ce); return selected_coedges; } /*----------------------------------------------------------------------------*/ CoEdge* TopoHelper::getCommonCoEdge(Topo::Vertex* v0, Topo::Vertex* v1) { - std::vector coedges; - v0->getCoEdges(coedges); - for (uint i=0; igetOppositeVertex(v0)) - return coedges[i]; + for (CoEdge* coedge : v0->getCoEdges()) + if (v1 == coedge->getOppositeVertex(v0)) + return coedge; TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << "Erreur interne dans TopoHelper::getCommonCoEdge avec sommets " @@ -1947,17 +1903,13 @@ getCoedge(std::vector& vertices, std::vector& coedges) std::map filtre_vtx; // marque les sommets que doit posséder la coedge recherchée - for (std::vector::iterator iter = vertices.begin(); - iter != vertices.end(); ++iter) + for (auto iter = vertices.begin(); iter != vertices.end(); ++iter) filtre_vtx[*iter] = 1; - for (std::vector::iterator iter1 = coedges.begin(); - iter1 != coedges.end(); ++iter1){ - std::vector loc_vertices; - (*iter1)->getVertices(loc_vertices); + for (auto iter1 = coedges.begin(); iter1 != coedges.end(); ++iter1){ + const std::vector& loc_vertices = (*iter1)->getVertices(); uint nbSommetsMarques = 0; - for (std::vector::iterator iter2 = loc_vertices.begin(); - iter2 != loc_vertices.end(); ++iter2) + for (auto iter2 = loc_vertices.begin(); iter2 != loc_vertices.end(); ++iter2) nbSommetsMarques += filtre_vtx[*iter2]; #ifdef _DEBUG2 std::cout<<" "<<(*iter1)->getName()<<":"; @@ -1985,27 +1937,16 @@ getCoface(std::vector& vertices, std::vector& cofaces) std::map filtre_vtx; // marque les sommets que doit posséder la coface recherchée - for (std::vector::iterator iter = vertices.begin(); - iter != vertices.end(); ++iter) - filtre_vtx[*iter] = 1; + for (Vertex* v : vertices) + filtre_vtx[v] = 1; - for (std::vector::iterator iter1 = cofaces.begin(); - iter1 != cofaces.end(); ++iter1){ - std::vector loc_vertices; - (*iter1)->getAllVertices(loc_vertices); + for (CoFace* cf : cofaces){ uint nbSommetsMarques = 0; - for (std::vector::iterator iter2 = loc_vertices.begin(); - iter2 != loc_vertices.end(); ++iter2) - nbSommetsMarques += filtre_vtx[*iter2]; -#ifdef _DEBUG2 - std::cout<<" "<<(*iter1)->getName()<<":"; - for (uint i=0;igetName(); - std::cout<<" nbSommetsMarques = "<getAllVertices()) + nbSommetsMarques += filtre_vtx[loc_v]; if (nbSommetsMarques == vertices.size()) - return *iter1; - } // end for iter1 = cofaces.begin() + return cf; + } return 0; } @@ -2039,7 +1980,7 @@ getPoints(Topo::Vertex* vtx1, Topo::Vertex* vtx2, coedge->getPoints(loc_points); int ind_dep, inc, nb_pt; - if (coedge->getVertex(0) == vtx_dep){ + if (coedge->getVertices()[0] == vtx_dep){ ind_dep = 0; inc = ratio; } @@ -2097,8 +2038,9 @@ getOppositeVertex(Block* bloc, Topo::Vertex* vtx, uint indDir, uint indCote) { //uint tabIndVtxByEdgeAndDirOnBlock[3][4][2]; int indVtx = -1; + const std::vector& vertices = bloc->getVertices(); for (uint i=0; i<4; i++) - if (vtx == bloc->getVertex(tabIndVtxByEdgeAndDirOnBlock[indDir][i][indCote])) + if (vtx == vertices[tabIndVtxByEdgeAndDirOnBlock[indDir][i][indCote]]) indVtx = i; if (indVtx == -1){ @@ -2108,7 +2050,7 @@ getOppositeVertex(Block* bloc, Topo::Vertex* vtx, uint indDir, uint indCote) throw TkUtil::Exception(messErr); } - return bloc->getVertex(tabIndVtxByEdgeAndDirOnBlock[indDir][indVtx][(indCote+1)%2]); + return vertices[tabIndVtxByEdgeAndDirOnBlock[indDir][indVtx][(indCote+1)%2]]; } /*----------------------------------------------------------------------------*/ //#define _DEBUG_NORMALE @@ -2135,20 +2077,18 @@ computeNormale(Topo::Vertex* vtx0, const Topo::CoEdge* coedge) // les blocs autour de l'arête pour se limiter aux cofaces orthogonales // on marque les cofaces autour directement reliées à l'arête // pour ne pas les prendre - std::vector blocks; - coedge->getBlocks(blocks); - std::vector cofaces; - coedge->getCoFaces(cofaces); + std::vector blocks = coedge->getBlocks(); + std::vector cofaces = coedge->getCoFaces(); for (uint i=0; igetCoFaces(cofaces); + cofaces = blocks[i]->getCoFaces(); for (uint j=0; jfind(vtx0)) + if (filtre_coface[cofaces[j]] == 0 && Utils::contains(vtx0, cofaces[j]->getVertices())) coface = cofaces[j]; if (coface == 0){ @@ -2163,11 +2103,9 @@ computeNormale(Topo::Vertex* vtx0, const Topo::CoEdge* coedge) // recherche d'une paire de coedges dans cette face, reliés au sommet std::vector coedges_adjacentes; - std::vector coedges; - coface->getCoEdges(coedges, true); - for (uint j=0; jfind(vtx0)) - coedges_adjacentes.push_back(coedges[j]); + for (CoEdge* ce : coface->getCoEdges()) + if (Utils::contains(vtx0, ce->getVertices())) + coedges_adjacentes.push_back(ce); if (coedges_adjacentes.size() == 2){ @@ -2185,7 +2123,7 @@ computeNormale(Topo::Vertex* vtx0, const Topo::CoEdge* coedge) // création d'une discrétisation tabulée pour avoir un point proche du sommet std::vector tabulation; double dist = 0.001; - if (vtx0 == coedges_adjacentes[j]->getVertex(0)){ + if (vtx0 == coedges_adjacentes[j]->getVertices()[0]){ tabulation.push_back(dist); tabulation.push_back(1-dist); } @@ -2258,12 +2196,9 @@ computeInvertedDir(std::vector& cofaces, std::mapgetName()< coedges; - coface->getCoEdges(coedges, true); + std::vector coedges = coface->getCoEdges(); for (uint j=0; j cofaces_vois; - coedges[j]->getCoFaces(cofaces_vois); - + std::vector cofaces_vois = coedges[j]->getCoFaces(); for (uint i=0; igetIndex(coedge); - Topo::Edge* edge1 = coface->getEdge(ind1); - bool sens1 = edge1->isSameSense(coface->getVertex(ind1),coedge); + Topo::Edge* edge1 = coface->getEdges()[ind1]; + bool sens1 = edge1->isSameSense(coface->getVertices()[ind1],coedge); uint ind2 = coface_vois->getIndex(coedge); - Topo::Edge* edge2 = coface_vois->getEdge(ind2); - bool sens2 = edge2->isSameSense(coface_vois->getVertex(ind2),coedge); + Topo::Edge* edge2 = coface_vois->getEdges()[ind2]; + bool sens2 = edge2->isSameSense(coface_vois->getVertices()[ind2],coedge); return sens1 == sens2; } @@ -2340,16 +2275,15 @@ std::vector TopoHelper::getSheet(Topo::TopoEntity* entityStart, dou //Need to find the sheet direction, using the point given in parameter - std::vector b_coedges; - convertStartBlock->getCoEdges(b_coedges); + std::vector b_coedges = convertStartBlock->getCoEdges(); // Naive algorithm, get the nearest edge center CoEdge* startingEdge; double distance = MAXFLOAT; for (auto e : b_coedges) { - double centerX = (e->getVertex(0)->getX()+e->getVertex(1)->getX())/2; - double centerY = (e->getVertex(0)->getY()+e->getVertex(1)->getY())/2; - double centerZ = (e->getVertex(0)->getZ()+e->getVertex(1)->getZ())/2; + double centerX = (e->getVertices()[0]->getX()+e->getVertices()[1]->getX())/2; + double centerY = (e->getVertices()[0]->getY()+e->getVertices()[1]->getY())/2; + double centerZ = (e->getVertices()[0]->getZ()+e->getVertices()[1]->getZ())/2; Utils::Math::Point center(centerX,centerY,centerZ); @@ -2368,8 +2302,7 @@ std::vector TopoHelper::getSheet(Topo::TopoEntity* entityStart, dou iter != parallel_coedges.end(); ++iter) { CoEdge *coedge = (*iter).first; - std::vector edge_blocks; - coedge->getBlocks(edge_blocks); + std::vector edge_blocks = coedge->getBlocks(); for (auto b: edge_blocks) { blocks.insert(b); } @@ -2394,15 +2327,18 @@ std::vector TopoHelper::getChord(Topo::TopoEntity * entityStart, d Block *convertStartBlock = dynamic_cast(entityStart); - std::vector b_cofaces; - convertStartBlock->getCoFaces(b_cofaces); + std::vector b_cofaces = convertStartBlock->getCoFaces(); CoFace* startingFace; double distance = MAXFLOAT; for (auto f : b_cofaces) { - double centerX = (f->getVertex(0)->getX()+f->getVertex(1)->getX()+f->getVertex(2)->getX()+f->getVertex(3)->getX())/4; - double centerY = (f->getVertex(0)->getY()+f->getVertex(1)->getY()+f->getVertex(2)->getY()+f->getVertex(3)->getY())/4; - double centerZ = (f->getVertex(0)->getZ()+f->getVertex(1)->getZ()+f->getVertex(2)->getZ()+f->getVertex(3)->getZ())/4; + Vertex* v0 = f->getVertices()[0]; + Vertex* v1 = f->getVertices()[1]; + Vertex* v2 = f->getVertices()[2]; + Vertex* v3 = f->getVertices()[3]; + double centerX = (v0->getX()+v1->getX()+v2->getX()+v3->getX())/4; + double centerY = (v0->getY()+v1->getY()+v2->getY()+v3->getY())/4; + double centerZ = (v0->getZ()+v1->getZ()+v2->getZ()+v3->getZ())/4; Utils::Math::Point center(centerX,centerY,centerZ); @@ -2428,27 +2364,20 @@ std::vector TopoHelper::getChord(Topo::TopoEntity * entityStart, d cofaces_in.pop_back(); // boucle sur les cofaces autour - std::vector blocks; - coface_dep->getBlocks(blocks); - + std::vector blocks = coface_dep->getBlocks(); for (uint i = 0; i < blocks.size(); i++) { Block *block = blocks[i]; - std::vector block_cofaces; + std::vector block_cofaces = block->getCoFaces(); CoFace *coface_vois; - block->getCoFaces(block_cofaces); //Ici on veut trouver la face opposee if(block_cofaces.size() == 6){ - std::vector cf_coedges; - coface_dep->getCoEdges(cf_coedges); - + std::vector cf_coedges = coface_dep->getCoEdges(); for(auto f : block_cofaces){ - std::vector cfv_coedges; - f->getCoEdges(cfv_coedges); int cpt_e = 0; - for (auto cfv_e : cfv_coedges) { + for (auto cfv_e : f->getCoEdges()) { if(std::find(cf_coedges.begin(), cf_coedges.end(), cfv_e) != cf_coedges.end()) cpt_e++; } @@ -2468,12 +2397,8 @@ std::vector TopoHelper::getChord(Topo::TopoEntity * entityStart, d } // end while std::set blocks; - for (auto f : parallel_cofaces) { - - std::vector face_blocks; - f->getBlocks(face_blocks); - for (auto b: face_blocks) { + for (Topo::Block* b : f->getBlocks()) { blocks.insert(b); } } @@ -2510,9 +2435,7 @@ std::map TopoHelper::parallelEdges(Topo::CoEdge* edgeStart) coedges_in.pop_back(); // boucle sur les cofaces autour - std::vector cofaces; - coedge_dep->getCoFaces(cofaces); - + std::vector cofaces = coedge_dep->getCoFaces(); for (uint i = 0; i < cofaces.size(); i++) { CoFace *coface = cofaces[i]; diff --git a/src/Core/Topo/TopoManager.cpp b/src/Core/Topo/TopoManager.cpp index 031725bb..43062f8f 100644 --- a/src/Core/Topo/TopoManager.cpp +++ b/src/Core/Topo/TopoManager.cpp @@ -787,7 +787,7 @@ std::string TopoManager::getEdgeAt(const Point& pt1, const Point& pt2) const const std::vector& all = m_coedges.get(); for (std::vector::const_iterator iter = all.begin(); iter != all.end(); ++iter) - if ((*iter)->getVertex(0)->getCoord() == pt1 && (*iter)->getVertex(1)->getCoord() == pt2) + if ((*iter)->getVertices()[0]->getCoord() == pt1 && (*iter)->getVertices()[1]->getCoord() == pt2) selected.push_back(*iter); if (selected.size() == 1) @@ -814,8 +814,7 @@ std::string TopoManager::getFaceAt(std::vector& pts) const const std::vector& all = m_cofaces.get(); for (std::vector::const_iterator iter = all.begin(); iter != all.end(); ++iter){ - std::vector vertices; - (*iter)->getAllVertices(vertices); + std::vector vertices = (*iter)->getAllVertices(); uint i; if (vertices.size() != pts.size()) continue; @@ -848,8 +847,7 @@ std::string TopoManager::getBlockAt(std::vector& pts) const const std::vector& all = m_blocks.get(); for (std::vector::const_iterator iter = all.begin(); iter != all.end(); ++iter){ - std::vector vertices; - (*iter)->getAllVertices(vertices); + std::vector vertices = (*iter)->getAllVertices(); uint i; if (vertices.size() != pts.size()) continue; @@ -2939,11 +2937,8 @@ Mgx3D::Internal::M3DCommandResult* TopoManager::snapVertices(Topo::CoEdge* ce1, bool project_on_first, TkUtil::UTF8String& scriptCommand) { - std::vector vertices1; - std::vector vertices2; - - ce1->getVertices(vertices1); - ce2->getVertices(vertices2); + const std::vector& vertices1 = ce1->getVertices(); + const std::vector& vertices2 = ce2->getVertices(); return snapVertices(vertices1, vertices2, project_on_first, scriptCommand); } @@ -2952,11 +2947,8 @@ Mgx3D::Internal::M3DCommandResult* TopoManager::snapVertices(Topo::CoFace* cf1, bool project_on_first, TkUtil::UTF8String& scriptCommand) { - std::vector vertices1; - std::vector vertices2; - - cf1->getVertices(vertices1); - cf2->getVertices(vertices2); + const std::vector& vertices1 = cf1->getVertices(); + const std::vector& vertices2 = cf2->getVertices(); return snapVertices(vertices1, vertices2, project_on_first, scriptCommand); } @@ -3036,11 +3028,9 @@ Mgx3D::Internal::M3DCommandResult* TopoManager::makeBlocksByRevol(std::vector cofaces_dep; + std::vector cofaces_dep = coedge->getCoFaces(); std::vector cofaces_suiv; - coedge->getCoFaces(cofaces_dep); - for (std::vector::iterator iter = cofaces_dep.begin(); iter != cofaces_dep.end(); ++iter){ Geom::GeomEntity* ge = (*iter)->getGeomAssociation(); @@ -3616,7 +3606,7 @@ getFusableEdgesObj() std::vector cofaces; for (std::vector::iterator iter = all_cofaces.begin(); iter != all_cofaces.end(); ++iter) - if ((*iter)->getNbFaces() == 0) + if ((*iter)->getFaces().size() == 0) cofaces.push_back(*iter); // On fait une recherche des groupes de CoEdges partagées par les même CoFaces @@ -3626,17 +3616,9 @@ getFusableEdgesObj() std::map coedge_color; uint color = 0; // la couleur pour les prochaines coedges vues - for (std::vector::iterator iter1 = cofaces.begin(); - iter1 != cofaces.end(); ++iter1){ - Topo::CoFace* coface = *iter1; - std::vector edges; - coface->getEdges(edges); - - for (std::vector::iterator iter2 = edges.begin(); - iter2 != edges.end(); ++iter2){ - Topo::Edge* edge = *iter2; - std::vector coedges; - edge->getCoEdges(coedges); + for (Topo::CoFace* coface : cofaces){ + for (Topo::Edge* edge : coface->getEdges()){ + std::vector coedges = edge->getCoEdges(); // on change de couleur à chaque nouvelle arête color += 1; @@ -3661,17 +3643,9 @@ getFusableEdgesObj() // après coloration, on recherche les groupes de même couleur // on remet à 0 les couleurs des groupes sélectionnés pour éviter de les prendre 2 fois - for (std::vector::iterator iter1 = cofaces.begin(); - iter1 != cofaces.end(); ++iter1){ - Topo::CoFace* coface = *iter1; - std::vector edges; - coface->getEdges(edges); - - for (std::vector::iterator iter2 = edges.begin(); - iter2 != edges.end(); ++iter2){ - Topo::Edge* edge = *iter2; - std::vector coedges; - edge->getCoEdges(coedges); + for (Topo::CoFace* coface : cofaces){ + for (Topo::Edge* edge : coface->getEdges()){ + std::vector coedges = edge->getCoEdges(); uint prec_color = 0; std::vector fusesableCoedges; @@ -5020,7 +4994,7 @@ std::vector TopoManager::getBorderFaces() const for (std::vector::iterator iter = cofaces.begin(); iter != cofaces.end(); ++iter) - if ((*iter)->getNbBlocks() == 1) + if ((*iter)->getBlocks().size() == 1) borderFaces.push_back((*iter)->getName()); return borderFaces; @@ -5036,7 +5010,7 @@ std::vector TopoManager::getFacesWithoutBlock() const for (std::vector::iterator iter = cofaces.begin(); iter != cofaces.end(); ++iter) - if ((*iter)->getNbBlocks() == 0) + if ((*iter)->getBlocks().size() == 0) facesWB.push_back((*iter)->getName()); return facesWB; @@ -5050,12 +5024,11 @@ std::vector TopoManager::getSemiConformalFaces() const // recherches parmis ces cofaces celles qui sont reliées à deux faces et pour lesquelles // il y a une semi-conformité std::vector semiConf; - for (uint i=0; igetNbFaces() == 2 && coface->isStructured()) + if (coface->getFaces().size() == 2 && coface->isStructured()) for (uint j=0; j<2; j++){ - Face* face = coface->getFace(j); + Face* face = coface->getFaces()[j]; for (uint dir=0; dir<2; dir++) if (face->getRatio(coface,dir) != 1) isSemiConf = true; diff --git a/src/Core/Topo/Vertex.cpp b/src/Core/Topo/Vertex.cpp index e22cabc6..070d4757 100644 --- a/src/Core/Topo/Vertex.cpp +++ b/src/Core/Topo/Vertex.cpp @@ -148,6 +148,16 @@ setCoord(const Utils::Math::Point & pt, bool acceptMeshed) updateCoEdgeModificationTime(); } /*----------------------------------------------------------------------------*/ +void Vertex::addCoEdge(CoEdge* e) +{ + m_topo_property->getCoEdgeContainer().push_back(e); +} +/*----------------------------------------------------------------------------*/ +void Vertex::removeCoEdge(CoEdge* e) +{ + Utils::remove(e, m_topo_property->getCoEdgeContainer()); +} +/*----------------------------------------------------------------------------*/ void Vertex:: merge(Vertex* ve, Internal::InfoCommand* icmd) { @@ -164,8 +174,7 @@ merge(Vertex* ve, Internal::InfoCommand* icmd) if (dist2 > Utils::Math::MgxNumeric::mgxGeomDoubleEpsilonSquare){ // si le sommet bouge suffisament, il faut éviter les méthodes de maillage autres que transfini - std::vector cofaces; - ve->getCoFaces(cofaces); + std::vector cofaces = ve->getCoFaces(); for (uint i=0; igetMeshLaw() < CoFaceMeshingProperty::transfinite){ #ifdef _DEBUG2 @@ -178,8 +187,7 @@ merge(Vertex* ve, Internal::InfoCommand* icmd) } } - std::vector blocs; - ve->getBlocks(blocs); + std::vector blocs = ve->getBlocks(); for (uint i=0; igetMeshLaw() < BlockMeshingProperty::transfinite){ #ifdef _DEBUG2 @@ -194,8 +202,7 @@ merge(Vertex* ve, Internal::InfoCommand* icmd) } // les arêtes voisines sont déplacées donc avec une association invalide - std::vector coedges; - ve->getCoEdges(coedges); + std::vector coedges = ve->getCoEdges(); for (uint i=0; iisDestroyed()){ @@ -219,9 +226,7 @@ merge(Vertex* ve, Internal::InfoCommand* icmd) // on remplace le sommet dans les arêtes associées à ve // On travaille sur une copie car il y a une mise à jour en même temps de m_coedges - std::vector coedges; - ve->getCoEdges(coedges); - + std::vector coedges = ve->getCoEdges(); for (std::vector::iterator iter=coedges.begin(); iter != coedges.end(); ++iter) (*iter)->replace(ve, this, true, false, icmd); @@ -252,15 +257,15 @@ setDestroyed(bool b) if (isDestroyed() == b) return; - Utils::Container& groups = m_topo_property->getGroupsContainer(); + auto groups = m_topo_property->getGroupsContainer(); if (b) for (uint i=0; iremove(this); } else for (uint i=0; iadd(this); } @@ -364,11 +369,8 @@ getDescription (bool alsoComputed) const // les relations vers les autres types d'entités topologiques // on cache l'existance des Edge et Face - std::vector ce; - getCoEdges(ce); - + std::vector ce = getCoEdges(); Utils::SerializedRepresentation topoRelation ("Relations topologiques", ""); - Utils::SerializedRepresentation coedges ("Arêtes topologiques", TkUtil::NumericConversions::toStr(ce.size())); for (std::vector::iterator iter = ce.begin( ); ce.end( )!=iter; iter++) @@ -405,42 +407,20 @@ saveVertexGeomProperty(Internal::InfoCommand* icmd, bool propagate) // les blocs, faces, arêtes ont leur aspect qui change if (propagate){ - - std::vector loc_coedges; - getCoEdges(loc_coedges); - - for (std::vector::iterator iter1=loc_coedges.begin(); - iter1 != loc_coedges.end(); ++iter1){ - std::vector local_edges; - (*iter1)->getEdges(local_edges); - icmd->addTopoInfoEntity(*iter1, Internal::InfoCommand::DISPMODIFIED); - - for (std::vector::iterator iter2 = local_edges.begin(); - iter2 != local_edges.end(); ++iter2){ - std::vector loc_cofaces; - (*iter2)->getCoFaces(loc_cofaces); - icmd->addTopoInfoEntity(*iter2, Internal::InfoCommand::DISPMODIFIED); - - for (std::vector::iterator iter3 = loc_cofaces.begin(); - iter3 != loc_cofaces.end(); ++iter3){ - std::vector loc_faces; - (*iter3)->getFaces(loc_faces); - icmd->addTopoInfoEntity(*iter3, Internal::InfoCommand::DISPMODIFIED); - - for (std::vector::iterator iter4 = loc_faces.begin(); - iter4 != loc_faces.end(); ++iter4){ - std::vector loc_bl; - (*iter4)->getBlocks(loc_bl); - icmd->addTopoInfoEntity(*iter4, Internal::InfoCommand::DISPMODIFIED); - - for (std::vector::iterator iter5 = loc_bl.begin(); - iter5 != loc_bl.end(); ++iter5){ - icmd->addTopoInfoEntity(*iter5, Internal::InfoCommand::DISPMODIFIED); - } // end for iter5 - } // end for iter4 - } // end for iter3 - } // end for iter2 - } // end for iter1 + for (CoEdge* ce : getCoEdges()){ + icmd->addTopoInfoEntity(ce, Internal::InfoCommand::DISPMODIFIED); + for (Edge* e : ce->getEdges()){ + icmd->addTopoInfoEntity(e, Internal::InfoCommand::DISPMODIFIED); + for (CoFace* cf : e->getCoFaces()){ + icmd->addTopoInfoEntity(cf, Internal::InfoCommand::DISPMODIFIED); + for (Face* f : cf->getFaces()){ + icmd->addTopoInfoEntity(f, Internal::InfoCommand::DISPMODIFIED); + for (Block* b : f->getBlocks()) + icmd->addTopoInfoEntity(b, Internal::InfoCommand::DISPMODIFIED); + } // end for f + } // end for cf + } // end for e + } // end for ce } // end if (propagate) } // if (change ... } // end if (icmd) @@ -578,9 +558,8 @@ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Vertex & v) o << ", sans projection"; o << v.getCoord(); - std::vector coedges; - v.getCoEdges(coedges); - o << " relié à "<<(short int)v.getNbCoEdges()<<" arêtes communes : "; + std::vector coedges = v.getCoEdges(); + o << " relié à "<<(short int)coedges.size()<<" arêtes communes : "; for (uint j=0; jgetName(); if (coedges[j]->isDestroyed()) @@ -604,28 +583,12 @@ Topo::TopoInfo Vertex::getInfos() const infos.name = getName(); infos.dimension = getDim(); infos._groups = Utils::toNames(getGroups()); + infos._coedges = Utils::toNames(getCoEdges()); + infos._edges = Utils::toNames(getEdges()); + infos._cofaces = Utils::toNames(getCoFaces()); + infos._blocks = Utils::toNames(getBlocks()); if (getGeomAssociation() != 0) infos.geom_entity = getGeomAssociation()->getName(); - - std::vector coedges; - getCoEdges(coedges); - for (CoEdge* e : coedges) - infos._coedges.push_back(e->getName()); - - std::vector edges; - getEdges(edges); - for (Edge* e : edges) - infos._edges.push_back(e->getName()); - - std::vector cofaces; - getCoFaces(cofaces); - for (CoFace* f : cofaces) - infos._cofaces.push_back(f->getName()); - - std::vector blocks; - getBlocks(blocks); - for (Block* b : blocks) - infos._blocks.push_back(b->getName()); return infos; } @@ -688,85 +651,50 @@ void Vertex::findNearlyVertices(const std::vector& vertices_A, } // for iterA } /*----------------------------------------------------------------------------*/ -void Vertex:: -getEdges(std::vector& edges) const -{ - edges.clear(); - std::list l_e; - for(uint i=0; i local_edges; - getCoEdge(i)->getEdges(local_edges); - l_e.insert(l_e.end(), local_edges.begin(), local_edges.end()); +std::vector Vertex:: +getEdges() const +{ + Utils::EntitySet edges(Utils::Entity::compareEntity); + for(CoEdge* coedge : getCoEdges()) { + const std::vector& local_edges = coedge->getEdges(); + edges.insert(local_edges.begin(), local_edges.end()); } - l_e.sort(Utils::Entity::compareEntity); - l_e.unique(); - - edges.insert(edges.end(),l_e.begin(),l_e.end()); + return Utils::toVect(edges); } /*----------------------------------------------------------------------------*/ -void Vertex:: -getCoFaces(std::vector& cofaces) const +std::vector Vertex:: +getCoFaces() const { - std::list l_f; - - std::vector edges; - getEdges(edges); - - for (std::vector::iterator iter1 = edges.begin(); - iter1 != edges.end(); ++iter1){ - std::vector loc_cofaces; - (*iter1)->getCoFaces(loc_cofaces); - - l_f.insert(l_f.end(), loc_cofaces.begin(), loc_cofaces.end()); + Utils::EntitySet cofaces(Utils::Entity::compareEntity); + for (Edge* edge : getEdges()){ + std::vector loc_cofaces = edge->getCoFaces(); + cofaces.insert(loc_cofaces.begin(), loc_cofaces.end()); } - - l_f.sort(Utils::Entity::compareEntity); - l_f.unique(); - - cofaces.insert(cofaces.end(),l_f.begin(),l_f.end()); + return Utils::toVect(cofaces); } /*----------------------------------------------------------------------------*/ -void Vertex:: -getBlocks(std::vector& blocks) const +std::vector Vertex:: +getBlocks() const { #ifdef _DEBUG2 std::cout<<"getBlocks() pour "< l_b; - - for(uint i=0; i local_edges; - getCoEdge(i)->getEdges(local_edges); - - for (std::vector::iterator iter1 = local_edges.begin(); - iter1 != local_edges.end(); ++iter1){ - std::vector loc_cofaces; - (*iter1)->getCoFaces(loc_cofaces); - - for (std::vector::iterator iter2 = loc_cofaces.begin(); - iter2 != loc_cofaces.end(); ++iter2){ - std::vector loc_faces; - (*iter2)->getFaces(loc_faces); - - for (std::vector::iterator iter3 = loc_faces.begin(); - iter3 != loc_faces.end(); ++iter3){ - std::vector loc_bl; - (*iter3)->getBlocks(loc_bl); - - l_b.insert(l_b.end(), loc_bl.begin(), loc_bl.end()); + Utils::EntitySet blocks(Utils::Entity::compareEntity); + + for(CoEdge* coedge : getCoEdges()) { + for (Edge* e : coedge->getEdges()){ + for (CoFace* cf : e->getCoFaces()){ + for (Face* f : cf->getFaces()){ + std::vector loc_bl = f->getBlocks(); + blocks.insert(loc_bl.begin(), loc_bl.end()); } } } } - - - l_b.sort(Utils::Entity::compareEntity); - l_b.unique(); - - blocks.insert(blocks.end(),l_b.begin(),l_b.end()); #ifdef _DEBUG2 std::cout<<" => trouve "<& vertices, const bool unique) const +std::vector Vertex::getAllVertices() const { - vertices.clear(); - Vertex* vtx = (Vertex*)this; + std::vector vertices; + Vertex* vtx = const_cast(this); vertices.push_back(vtx); + return vertices; } /*----------------------------------------------------------------------------*/ void Vertex::getGroupsName (std::vector& gn) const @@ -790,37 +719,33 @@ void Vertex::getGroupsName (std::vector& gn) const TopoEntity::getGroupsName(gn); for (uint i = 0; igetGroupsContainer().size(); ++i) - gn.push_back(m_topo_property->getGroupsContainer().get(i)->getName()); + gn.push_back(m_topo_property->getGroupsContainer()[i]->getName()); } /*----------------------------------------------------------------------------*/ void Vertex::add(Group::Group0D* grp) { - m_topo_property->getGroupsContainer().add(grp); + m_topo_property->getGroupsContainer().push_back(grp); } /*----------------------------------------------------------------------------*/ void Vertex::remove(Group::Group0D* grp) { - m_topo_property->getGroupsContainer().remove(grp); + Utils::remove(grp, m_topo_property->getGroupsContainer()); } /*----------------------------------------------------------------------------*/ int Vertex::getNbGroups() const { - return m_topo_property->getGroupsContainer().getNb(); + return m_topo_property->getGroupsContainer().size(); } /*----------------------------------------------------------------------------*/ std::vector Vertex::getGroups() const { - return m_topo_property->getGroupsContainer().get(); + return m_topo_property->getGroupsContainer(); } /*----------------------------------------------------------------------------*/ void Vertex::updateCoEdgeModificationTime() { - std::vector coedges; - getCoEdges(coedges); - - for (std::vector::iterator iter=coedges.begin(); - iter != coedges.end(); ++iter) - (*iter)->getMeshingProperty()->updateModificationTime(); + for (CoEdge* coedge : getCoEdges()) + coedge->getMeshingProperty()->updateModificationTime(); } /*----------------------------------------------------------------------------*/ } // end namespace Topo diff --git a/src/Core/protected/Topo/Block.h b/src/Core/protected/Topo/Block.h index 2125ec9e..f6bd5f47 100644 --- a/src/Core/protected/Topo/Block.h +++ b/src/Core/protected/Topo/Block.h @@ -179,26 +179,10 @@ class Block : public TopoEntity { void degenerateFaceInEdge(uint id, Topo::Vertex* v1, Topo::Vertex* v2, Internal::InfoCommand* icmd); - /*------------------------------------------------------------------------*/ - /** Fournit l'accès aux sommets topologiques incidents avec une copie - * - * \param vertices les sommets incidents - */ - void getVertices(std::vector& vertices) const - {m_topo_property->getVertexContainer().get(vertices);} - /** Fournit l'accès aux sommets topologiques incidents sans copie */ const std::vector& getVertices() const - {return m_topo_property->getVertexContainer().get();} - - /// \return le nombre de Vertex - uint getNbVertices() const - {return m_topo_property->getVertexContainer().getNb();} - - /// fournit l'accès à l'un des sommets - Topo::Vertex* getVertex(uint ind) const - {return m_topo_property->getVertexContainer().get(ind);} + {return m_topo_property->getVertexContainer();} /** Retourne le sommet suivant ses coordonnées logiques dans le bloc lorsqu'il est structuré @param cote_i faux pour i minimum @@ -207,67 +191,37 @@ class Block : public TopoEntity { */ Topo::Vertex* getVertex(bool cote_i, bool cote_j, bool cote_k); - /// retourne l'indice d'un sommet - uint getIndex(Topo::Vertex* v) - {return m_topo_property->getVertexContainer().getIndex(v);} - /// retourne la liste des 8 sommets en duplicant les derniers en cas de dégénérescence - void getHexaVertices(std::vector& vertices) const; + std::vector getHexaVertices() const; /// accès à tous les sommets y compris ceux internes - void getAllVertices(std::vector& vertices, bool unique = true) const; - - /*------------------------------------------------------------------------*/ - /** \brief Fournit l'accès aux faces topologiques incidentes avec copie - * - * \param faces les faces incidentes - */ - void getFaces(std::vector& faces) const - {m_topo_property->getFaceContainer().get(faces);} + std::vector getAllVertices() const; /** \brief Fournit l'accès aux faces topologiques incidentes sans copie */ - const std::vector getFaces() const - {return m_topo_property->getFaceContainer().get();} - - /// Accesseur pour l'une des faces - Face* getFace(uint id) const - {return m_topo_property->getFaceContainer().get(id);} - - /// retourne le nombre de faces - uint getNbFaces() const - {return m_topo_property->getFaceContainer().getNb();} - - /// retourne l'indice d'une face - uint getIndex(Face* f) - {return m_topo_property->getFaceContainer().getIndex(f);} + const std::vector& getFaces() const + {return m_topo_property->getFaceContainer();} /*------------------------------------------------------------------------*/ /** \brief Fournit l'accès aux faces communes topologiques incidentes * * \param cofaces les faces communes incidentes en retour */ - void getCoFaces(std::vector& cofaces) const; - - uint getNbCoFaces() const; + std::vector getCoFaces() const; /*------------------------------------------------------------------------*/ /** \brief Fournit l'accès aux arêtes topologiques incidentes * * \param edges les arêtes incidentes */ - void getEdges(std::vector& edges) const; - - uint getNbEdges() const; + std::vector getEdges() const; /*------------------------------------------------------------------------*/ /** \brief Fournit l'accès aux arêtes communes topologiques incidentes * * \param coedges les arêtes communes incidentes */ - void getCoEdges(std::vector& coedges, bool unique = true) const; - - uint getNbCoEdges() const; + std::vector getCoEdges() const; /*------------------------------------------------------------------------*/ /** \brief Fournit une représentation affichable de l'entité en se basant diff --git a/src/Core/protected/Topo/BlockTopoProperty.h b/src/Core/protected/Topo/BlockTopoProperty.h index 54972fb2..da4da83e 100644 --- a/src/Core/protected/Topo/BlockTopoProperty.h +++ b/src/Core/protected/Topo/BlockTopoProperty.h @@ -1,21 +1,8 @@ -/*----------------------------------------------------------------------------*/ -/** \file BlockTopoProperty.h - * - * \author Eric Brière de l'Isle - * - * \date 23 nov. 2011 - */ -/*----------------------------------------------------------------------------*/ #ifndef BLOCK_TOPO_PROPERTY_H_ #define BLOCK_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ -#include "Utils/Container.h" #include "Group/GroupEntity.h" -#include -#include #include -#include -#include /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -31,35 +18,31 @@ class Face; class BlockTopoProperty { public: - BlockTopoProperty() - {} - - ~BlockTopoProperty() - {} + BlockTopoProperty() = default; + ~BlockTopoProperty() = default; /*------------------------------------------------------------------------*/ /** Création d'un clone, on copie toutes les informations */ - BlockTopoProperty* clone() { + BlockTopoProperty* clone() + { BlockTopoProperty* prop = new BlockTopoProperty(); - - prop->m_vertices.clone(m_vertices); - prop->m_faces.clone(m_faces); - prop->m_groups.clone(m_groups); - + prop->m_vertices = m_vertices; + prop->m_faces = m_faces; + prop->m_groups = m_groups; return prop; } /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des sommets - Utils::Container& getVertexContainer() {return m_vertices;} + std::vector& getVertexContainer() {return m_vertices;} /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des faces - Utils::Container& getFaceContainer() {return m_faces;} + std::vector& getFaceContainer() {return m_faces;} - /*------------------------------------------------------------------------*/ - /// accesseur sur le conteneur des groupes - Utils::Container& getGroupsContainer() {return m_groups;} + /*------------------------------------------------------------------------*/ + /// accesseur sur le conteneur des groupes + std::vector& getGroupsContainer() {return m_groups;} /*------------------------------------------------------------------------*/ /** \brief Suppression des dépendances (entités topologiques incidentes) @@ -73,13 +56,13 @@ class Face; private: /// Lien avec les faces qui composent le bloc - Utils::Container m_faces; + std::vector m_faces; /// Lien avec les sommets extrémités - Utils::Container m_vertices; + std::vector m_vertices; /// Listes des groupes 3D - Utils::Container m_groups; + std::vector m_groups; }; /*----------------------------------------------------------------------------*/ } // end namespace Topo diff --git a/src/Core/protected/Topo/CoEdge.h b/src/Core/protected/Topo/CoEdge.h index 2e74601b..84444933 100644 --- a/src/Core/protected/Topo/CoEdge.h +++ b/src/Core/protected/Topo/CoEdge.h @@ -90,26 +90,14 @@ class CoEdge : public TopoEntity { /*------------------------------------------------------------------------*/ /// ajoute une relation vers une arête - void addEdge(Edge* e) {m_topo_property->getEdgeContainer().add(e);} + void addEdge(Edge* e); /// enlève une relation vers une arête - void removeEdge(Edge* e, const bool exceptionIfNotFound=true) - {m_topo_property->getEdgeContainer().remove(e, exceptionIfNotFound);} - - /// Fournit l'accès aux arêtes topologiques qui utilisent cette CoEdge avec une copie - void getEdges(std::vector& edges) const - { m_topo_property->getEdgeContainer().get(edges); } + void removeEdge(Edge* e); /// Fournit l'accès aux arêtes topologiques qui utilisent cette CoEdge sans copie const std::vector & getEdges() const - {return m_topo_property->getEdgeContainer().get();} - - /// fournit l'accès à l'une des arêtes - Edge* getEdge(uint ind) const - {return m_topo_property->getEdgeContainer().get(ind);} - - uint getNbEdges() const - {return m_topo_property->getEdgeContainer().getNb();} + {return m_topo_property->getEdgeContainer();} /*------------------------------------------------------------------------*/ /** \brief Remplace un sommet v1 par le sommet v2 @@ -176,32 +164,11 @@ class CoEdge : public TopoEntity { */ std::vector split(Topo::Vertex* vtx, uint nbMeshingEdges, Internal::InfoCommand* icmd, bool sortCoEdges); - /*------------------------------------------------------------------------*/ - /** \brief Fournit l'accès aux sommets topologiques incidents avec une copie - * - * \param vertices les sommets incidents - */ - void getVertices(std::vector& vertices) const - {m_topo_property->getVertexContainer().get(vertices);} - - /** Fournit l'accès aux sommets topologiques incidents sans copie - */ const std::vector& getVertices() const - {return m_topo_property->getVertexContainer().get();} - - /// fournit l'accès à l'un des sommets - Topo::Vertex* getVertex(uint ind) const - {return m_topo_property->getVertexContainer().get(ind);} - - /// \return le nombre de Vertex - uint getNbVertices() const; - - /// vérifie si cette arête commune contient ou non ce sommet - bool find(Topo::Vertex* v) const - {return m_topo_property->getVertexContainer().find(v);} + {return m_topo_property->getVertexContainer();} /// accès à tous les sommets - void getAllVertices(std::vector& vertices, const bool unique=true) const; + std::vector getAllVertices() const; /*------------------------------------------------------------------------*/ /** \brief Fournit l'accès aux sommets topologiques opposé à un sommet @@ -213,7 +180,7 @@ class CoEdge : public TopoEntity { /*------------------------------------------------------------------------*/ /** Constitue la liste des Blocs adjacents */ - void getBlocks(std::vector& blocks) const; + std::vector getBlocks() const; /*------------------------------------------------------------------------*/ /** \brief Fournit une représentation affichable de l'entité en se basant @@ -391,10 +358,7 @@ class CoEdge : public TopoEntity { /*------------------------------------------------------------------------*/ /** Constitue la liste des CoFaces adjacentes */ - void getCoFaces(std::vector& cofaces) const; - - /// le nombre de cofaces adjacentes - uint getNbCofaces() const; + std::vector getCoFaces() const; /** Booléen qui signale que l'on est en cours d'édition de l'objet * (une des propriétées a sa copie non nulle) */ diff --git a/src/Core/protected/Topo/CoEdgeTopoProperty.h b/src/Core/protected/Topo/CoEdgeTopoProperty.h index 920281c9..468d50ff 100644 --- a/src/Core/protected/Topo/CoEdgeTopoProperty.h +++ b/src/Core/protected/Topo/CoEdgeTopoProperty.h @@ -1,20 +1,8 @@ -/*----------------------------------------------------------------------------*/ -/** \file CoEdgeTopoProperty.h - * - * \author Eric Brière de l'Isle - * - * \date 9/2/2012 - */ -/*----------------------------------------------------------------------------*/ #ifndef COEDGE_TOPO_PROPERTY_H_ #define COEDGE_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ -#include "Utils/Container.h" #include "Group/GroupEntity.h" -#include #include -#include -#include /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -30,35 +18,30 @@ class Edge; class CoEdgeTopoProperty { public: - CoEdgeTopoProperty() - { - } - - ~CoEdgeTopoProperty() - {} + CoEdgeTopoProperty() = default; + ~CoEdgeTopoProperty() = default; /*------------------------------------------------------------------------*/ /** Création d'un clone, on copie toutes les informations */ - CoEdgeTopoProperty* clone() { + CoEdgeTopoProperty* clone() + { CoEdgeTopoProperty* prop = new CoEdgeTopoProperty(); - - prop->m_vertices.clone(m_vertices); - prop->m_edges.clone(m_edges); - prop->m_groups.clone(m_groups); - + prop->m_vertices = m_vertices; + prop->m_edges = m_edges; + prop->m_groups = m_groups; return prop; } /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des sommets - Utils::Container& getVertexContainer() {return m_vertices;} + std::vector& getVertexContainer() {return m_vertices;} /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des arêtes - Utils::Container& getEdgeContainer() {return m_edges;} + std::vector& getEdgeContainer() {return m_edges;} /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des groupes - Utils::Container& getGroupsContainer() {return m_groups;} + std::vector& getGroupsContainer() {return m_groups;} /*------------------------------------------------------------------------*/ /** \brief Suppression des dépendances (entités topologiques incidentes) @@ -72,13 +55,13 @@ class Edge; private: /// Lien avec les arêtes qui utilisent cette CoEdge - Utils::Container m_edges; + std::vector m_edges; /// Lien avec les sommets extrémités - Utils::Container m_vertices; + std::vector m_vertices; /// Listes des groupes 1D - Utils::Container m_groups; + std::vector m_groups; }; /*----------------------------------------------------------------------------*/ } // end namespace Topo diff --git a/src/Core/protected/Topo/CoFace.h b/src/Core/protected/Topo/CoFace.h index b37d56b8..031a4526 100644 --- a/src/Core/protected/Topo/CoFace.h +++ b/src/Core/protected/Topo/CoFace.h @@ -93,43 +93,19 @@ class CoFace : public TopoEntity { /*------------------------------------------------------------------------*/ /// ajoute une relation vers une face - - virtual void addFace(Face* f) {m_topo_property->getFaceContainer().add(f);} - + void addFace(Face* f); /// enlève une relation vers une face - - virtual void removeFace(Face* f, const bool exceptionIfNotFound=true) - {m_topo_property->getFaceContainer().remove(f, exceptionIfNotFound);} - - - /** \brief Fournit l'accès aux faces topologiques qui référencent cette face commune - * - * \param faces les faces incidentes - */ - - void getFaces(std::vector& faces) const - {m_topo_property->getFaceContainer().get(faces);} - + void removeFace(Face* f); /** \brief Fournit l'accès aux faces topologiques incidentes sans copie */ - const std::vector getFaces() const - {return m_topo_property->getFaceContainer().get();} - - uint getNbFaces() const - { return m_topo_property->getFaceContainer().getNb(); } - - Face* getFace(uint ind) const - { return m_topo_property->getFaceContainer().get(ind); } - + const std::vector getFaces() const + {return m_topo_property->getFaceContainer();} /*------------------------------------------------------------------------*/ /** Constitue la liste des Blocs adjacents */ - void getBlocks(std::vector& blocks) const; - - /** Retourne la taille de la liste des Blocs adjacents (en général soit 0 pour le 2D, soit 1, soit 2 pour les cofaces entres 2 blocs) */ - uint getNbBlocks() const; + std::vector getBlocks() const; /** Renseigne sur le bloc adjacent à la face et la position de cette face par rapport au bloc (structuré) */ TkUtil::UTF8String getInfoBlock() const; @@ -212,84 +188,28 @@ class CoFace : public TopoEntity { double& ratio, Internal::InfoCommand* icmd); - - /*------------------------------------------------------------------------*/ - /** \brief Fournit l'accès aux sommets topologiques incidents - * - * \param vertices les sommets incidents - */ - void getVertices(std::vector& vertices) const - {m_topo_property->getVertexContainer().get(vertices);} - /** Fournit l'accès aux sommets topologiques incidents sans copie */ const std::vector& getVertices() const - {return m_topo_property->getVertexContainer().get();} - - /// fournit l'accès à l'un des sommets - Topo::Vertex* getVertex(uint ind) const - {return m_topo_property->getVertexContainer().get(ind);} - - /// retourne le nombre de sommets - uint getNbVertices() const; - - /// retourne l'indice d'un sommet - uint getIndex(Topo::Vertex* v) - {return m_topo_property->getVertexContainer().getIndex(v);} - - /// vérifie si cette face commune contient ou non ce sommet - bool find(Topo::Vertex* v) const - {return m_topo_property->getVertexContainer().find(v);} + {return m_topo_property->getVertexContainer();} /// accès à tous les sommets y compris ceux internes aux Edges - void getAllVertices(std::vector& vertices, const bool unique=true) const; - - /*------------------------------------------------------------------------*/ - /** \brief Fournit l'accès aux arêtes topologiques incidentes avec copie - * - * \param edges les arêtes incidentes - */ - - void getEdges(std::vector& edges) const - {m_topo_property->getEdgeContainer().get(edges);} - + std::vector getAllVertices() const; /// Fournit l'accès aux arêtes topologiques qui utilisent cette CoEdge sans copie - const std::vector & getEdges() const - {return m_topo_property->getEdgeContainer().get();} - - - /// fournit l'accès à l'une des arêtes - - Edge* getEdge(uint ind) const - {return m_topo_property->getEdgeContainer().get(ind);} - - - /// retourne le nombre d'arêtes - - uint getNbEdges() const {return m_topo_property->getEdgeContainer().getNb();} - - - /// retourne l'indice d'une arête - - uint getIndex(Edge* e) const - {return m_topo_property->getEdgeContainer().getIndex(e);} + {return m_topo_property->getEdgeContainer();} + /// ajoute une relation vers une arête + void addEdge(Edge* e); /// enlève une relation vers une arête - - void removeEdge(Edge* e, const bool exceptionIfNotFound=true) - {m_topo_property->getEdgeContainer().remove(e, exceptionIfNotFound);} - + void removeEdge(Edge* e); /// accès à l'une des arêtes suivant 2 sommets - Edge* getEdge(Topo::Vertex* v1, Topo::Vertex* v2) const; - /// retourne l'arête contenant une arête commune, lève une exception en cas d'erreur - Edge* getEdgeContaining(const CoEdge* coedge) const; @@ -297,8 +217,7 @@ class CoFace : public TopoEntity { bool hasHole() { return m_topo_property->hasHole();} /// retourne l'indice du côté contenant une arête commune - uint getIndex(CoEdge* coedge) const - { return getIndex(getEdgeContaining(coedge)); } + uint getIndex(CoEdge* coedge) const; /*------------------------------------------------------------------------*/ /** \brief Fournit l'accès à l'arête topologiques opposé à une arête @@ -309,8 +228,6 @@ class CoFace : public TopoEntity { Edge* getOppositeEdge(Edge* e) const; - - /*------------------------------------------------------------------------*/ /** \brief Retourne l'arête commune qui fait face à une arête donnée. * Cette arête doit faire parfaitement face, les sommets se font face au niveau @@ -475,7 +392,7 @@ class CoFace : public TopoEntity { /// retourne l'ensemble des arêtes communes toute directions confondues - void getCoEdges(std::vector& coedges, bool unique = true) const; + std::vector getCoEdges() const; /*------------------------------------------------------------------------*/ /** Retrouve la direction dans une coface structurée à partir de 2 sommets diff --git a/src/Core/protected/Topo/CoFaceTopoProperty.h b/src/Core/protected/Topo/CoFaceTopoProperty.h index 52b29741..7c580670 100644 --- a/src/Core/protected/Topo/CoFaceTopoProperty.h +++ b/src/Core/protected/Topo/CoFaceTopoProperty.h @@ -1,20 +1,8 @@ -/*----------------------------------------------------------------------------*/ -/** \file CoFaceTopoProperty.h - * - * \author Eric Brière de l'Isle - * - * \date 13/2/2012 - */ -/*----------------------------------------------------------------------------*/ #ifndef COFACE_TOPO_PROPERTY_H_ #define COFACE_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ -#include "Utils/Container.h" #include "Group/GroupEntity.h" -#include #include -#include -#include /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -37,38 +25,35 @@ class Block; :m_hasHole(false) {} - ~CoFaceTopoProperty() - {} + ~CoFaceTopoProperty() = default; /*------------------------------------------------------------------------*/ /** Création d'un clone, on copie toutes les informations */ CoFaceTopoProperty* clone() { - CoFaceTopoProperty* prop = new CoFaceTopoProperty(); - - prop->m_vertices.clone(m_vertices); - prop->m_edges.clone(m_edges); - prop->m_faces.clone(m_faces); - prop->m_groups.clone(m_groups); - prop->m_hasHole = m_hasHole; - - return prop; + CoFaceTopoProperty* prop = new CoFaceTopoProperty(); + prop->m_vertices = m_vertices; + prop->m_edges = m_edges; + prop->m_faces = m_faces; + prop->m_groups = m_groups; + prop->m_hasHole = m_hasHole; + return prop; } /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des sommets - Utils::Container& getVertexContainer() {return m_vertices;} + std::vector& getVertexContainer() {return m_vertices;} /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des arêtes - Utils::Container& getEdgeContainer() {return m_edges;} + std::vector& getEdgeContainer() {return m_edges;} /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des faces - Utils::Container& getFaceContainer() {return m_faces;} + std::vector& getFaceContainer() {return m_faces;} /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des groupes - Utils::Container& getGroupsContainer() {return m_groups;} + std::vector& getGroupsContainer() {return m_groups;} /*------------------------------------------------------------------------*/ /** \brief Suppression des dépendances (entités topologiques incidentes) @@ -90,16 +75,16 @@ class Block; private: /// Lien avec les faces incidentes - Utils::Container m_faces; + std::vector m_faces; /// Lien avec les arêtes incidentes - Utils::Container m_edges; + std::vector m_edges; /// Lien avec les sommets extrémités - Utils::Container m_vertices; + std::vector m_vertices; /// Listes des groupes 2D - Utils::Container m_groups; + std::vector m_groups; /// vrai si les arêtes ne forment pas un unique cycle (il y a des trous) bool m_hasHole; diff --git a/src/Core/protected/Topo/CommandNewTopoOGridOnGeometry.h b/src/Core/protected/Topo/CommandNewTopoOGridOnGeometry.h index 001fc255..e387f588 100644 --- a/src/Core/protected/Topo/CommandNewTopoOGridOnGeometry.h +++ b/src/Core/protected/Topo/CommandNewTopoOGridOnGeometry.h @@ -72,8 +72,10 @@ class CommandNewTopoOGridOnGeometry: public Topo::CommandCreateTopo{ virtual void getPreviewRepresentation(Utils::DisplayRepresentation& dr); private: + /// retourne l'une des arêtes d'un côté pour le cas avec une seule face commune + Edge* getEdge(const Face* f, uint ind) const; - /** Méthode de vérification et validation de l'entité présente */ + /// Méthode de vérification et validation de l'entité présente virtual void validGeomEntity(); /// Création de la topologie avec un unique bloc pour le cylindre diff --git a/src/Core/protected/Topo/Edge.h b/src/Core/protected/Topo/Edge.h index bac6e673..27307328 100644 --- a/src/Core/protected/Topo/Edge.h +++ b/src/Core/protected/Topo/Edge.h @@ -118,33 +118,15 @@ class Edge : public TopoEntity { /*------------------------------------------------------------------------*/ /// ajoute une relation vers une face - void addCoFace(CoFace* f) - {m_topo_property->getCoFaceContainer().add(f);} + void addCoFace(CoFace* f); /// enlève une relation vers une face - void removeCoFace(CoFace* f, const bool exceptionIfNotFound=true) - {m_topo_property->getCoFaceContainer().remove(f, exceptionIfNotFound);} - - /*------------------------------------------------------------------------*/ - /** Fournit l'accès aux faces topologiques incidentes avec une copie - * - * \param faces les faces incidentes - */ - void getCoFaces(std::vector& faces) const - {m_topo_property->getCoFaceContainer().get(faces);} + void removeCoFace(CoFace* f); /** Fournit l'accès aux faces topologiques incidentes sans copie */ const std::vector & getCoFaces() const - {return m_topo_property->getCoFaceContainer().get();} - - /// fournit l'accès à l'une des faces communes - CoFace* getCoFace(uint ind) const - {return m_topo_property->getCoFaceContainer().get(ind);} - - /// \return le nombre de faces - uint getNbCoFaces() const - {return m_topo_property->getCoFaceContainer().getNb();} + {return m_topo_property->getCoFaceContainer();} /*------------------------------------------------------------------------*/ /** \brief Remplace un sommet v1 par le sommet v2 @@ -201,61 +183,24 @@ class Edge : public TopoEntity { */ void split(std::vector new_vtx, std::vector& new_edges, Internal::InfoCommand* icmd); - /*------------------------------------------------------------------------*/ - /** \brief Fournit l'accès aux sommets topologiques incidents avec une copie - * - * \param vertices les sommets incidents - */ - void getVertices(std::vector& vertices) const - {m_topo_property->getVertexContainer().get(vertices);} - /** Fournit l'accès aux sommets topologiques incidents sans copie */ const std::vector& getVertices() const - {return m_topo_property->getVertexContainer().get();} - - /// fournit l'accès à l'un des sommets - Vertex* getVertex(uint ind) const - {return m_topo_property->getVertexContainer().get(ind);} - - /// \return le nombre de Vertex - uint getNbVertices() const; - - /// vérifie si cette arête contient ou non ce sommet - bool find(Vertex* v) const - {return m_topo_property->getVertexContainer().find(v);} + {return m_topo_property->getVertexContainer();} /// accès à tous les sommets y compris ceux internes - void getAllVertices(std::vector& vertices, const bool unique=true) const; + std::vector getAllVertices() const; /*------------------------------------------------------------------------*/ /// ajoute une relation vers une arête - void addCoEdge(CoEdge* e) - {m_topo_property->getCoEdgeContainer().add(e);} + void addCoEdge(CoEdge* e); /// enlève une relation vers une arête - void removeCoEdge(CoEdge* e, const bool exceptionIfNotFound=true) - {m_topo_property->getCoEdgeContainer().remove(e, exceptionIfNotFound);} - - /// Fournit l'accès aux arêtes topologiques qui utilisent cette CoEdge avec une copie - void getCoEdges(std::vector& edges) const - {m_topo_property->getCoEdgeContainer().get(edges);} + void removeCoEdge(CoEdge* e); /// Fournit l'accès aux arêtes topologiques qui utilisent cette CoEdge sans copie - const std::vector & getCoEdges() const - {return m_topo_property->getCoEdgeContainer().get();} - - /// le nombre d'arêtes communes utilisées par cette arête - uint getNbCoEdges() const - {return m_topo_property->getCoEdgeContainer().getNb();} - - /// fournit l'accès à l'une des arêtes communes - CoEdge* getCoEdge(uint ind) const - {return m_topo_property->getCoEdgeContainer().get(ind);} - - /// vérifie si cette arête contient ou non cette arête commune - bool find(const CoEdge* e) const - {return m_topo_property->getCoEdgeContainer().find(e);} + const std::vector& getCoEdges() const + {return m_topo_property->getCoEdgeContainer();} /// retourne une arête à partir des 2 sommets qui la compose, exception sinon CoEdge* getCoEdge(Vertex* vtx1, Vertex* vtx2); diff --git a/src/Core/protected/Topo/EdgeTopoProperty.h b/src/Core/protected/Topo/EdgeTopoProperty.h index 3abfde22..7bd3736a 100644 --- a/src/Core/protected/Topo/EdgeTopoProperty.h +++ b/src/Core/protected/Topo/EdgeTopoProperty.h @@ -1,19 +1,7 @@ -/*----------------------------------------------------------------------------*/ -/** \file EdgeTopoProperty.h - * - * \author Eric Brière de l'Isle - * - * \date 23 nov. 2011 - */ -/*----------------------------------------------------------------------------*/ #ifndef EDGE_TOPO_PROPERTY_H_ #define EDGE_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ -#include "Utils/Container.h" -#include #include -#include -#include /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -30,35 +18,31 @@ class CoEdge; class EdgeTopoProperty { public: - EdgeTopoProperty() - { - } - - ~EdgeTopoProperty() - {} + EdgeTopoProperty() = default; + ~EdgeTopoProperty() = default; /*------------------------------------------------------------------------*/ /** Création d'un clone, on copie toutes les informations */ - EdgeTopoProperty* clone() { - EdgeTopoProperty* prop = new EdgeTopoProperty(); - prop->m_vertices.clone(m_vertices); - prop->m_coedges.clone(m_coedges); - prop->m_cofaces.clone(m_cofaces); - - return prop; + EdgeTopoProperty* clone() + { + EdgeTopoProperty* prop = new EdgeTopoProperty(); + prop->m_vertices = m_vertices; + prop->m_coedges = m_coedges; + prop->m_cofaces = m_cofaces; + return prop; } /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des sommets - Utils::Container& getVertexContainer() {return m_vertices;} + std::vector& getVertexContainer() {return m_vertices;} /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des faces communes - Utils::Container& getCoFaceContainer() {return m_cofaces;} + std::vector& getCoFaceContainer() {return m_cofaces;} /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des arêtes communes - Utils::Container& getCoEdgeContainer() {return m_coedges;} + std::vector& getCoEdgeContainer() {return m_coedges;} /*------------------------------------------------------------------------*/ /** \brief Suppression des dépendances (entités topologiques incidentes) @@ -72,13 +56,13 @@ class CoEdge; private: /// Lien avec les faces incidentes communes - Utils::Container m_cofaces; + std::vector m_cofaces; /// Lien avec les arêtes communes sur lesquelles se base cette arête - Utils::Container m_coedges; + std::vector m_coedges; /// Lien avec les sommets extrémités - Utils::Container m_vertices; + std::vector m_vertices; }; /*----------------------------------------------------------------------------*/ } // end namespace Topo diff --git a/src/Core/protected/Topo/Face.h b/src/Core/protected/Topo/Face.h index 959a2123..c0f6eb2f 100644 --- a/src/Core/protected/Topo/Face.h +++ b/src/Core/protected/Topo/Face.h @@ -87,100 +87,35 @@ class Face : public TopoEntity { /*------------------------------------------------------------------------*/ /// ajoute une relation vers un bloc - void addBlock(Block* b) - {m_topo_property->getBlockContainer().add(b);} + void addBlock(Block* b); /// enlève une relation vers un bloc - void removeBlock(Block* b, const bool exceptionIfNotFound=true) - {m_topo_property->getBlockContainer().remove(b, exceptionIfNotFound);} + void removeBlock(Block* b); - /// le nombre de block incidents - uint getNbBlocks() const - {return m_topo_property->getBlockContainer().getNb();} - - /// accès à un des blocks - Block* getBlock(uint ind) const - {return m_topo_property->getBlockContainer().get(ind);} - - /** \brief Fournit l'accès aux blocs topologiques incidents avec une copie - * - * \param blocks les blocs incidents - */ - void getBlocks(std::vector& blocks) const - {m_topo_property->getBlockContainer().get(blocks);} - - /** \brief Fournit l'accès aux blocs topologiques incidents sans copie - */ + /// Fournit l'accès aux blocs topologiques incidents sans copie const std::vector& getBlocks() const - {return m_topo_property->getBlockContainer().get();} + {return m_topo_property->getBlockContainer();} /*------------------------------------------------------------------------*/ - /** \brief Fournit l'accès aux sommets topologiques incidents avec une copie - * - * \param vertices les sommets incidents - */ - void getVertices(std::vector& vertices) const - {m_topo_property->getVertexContainer().get(vertices);} - - /** Fournit l'accès aux sommets topologiques incidents sans copie - */ + /// Fournit l'accès aux sommets topologiques incidents sans copie const std::vector& getVertices() const - {return m_topo_property->getVertexContainer().get();} - - /// fournit l'accès à l'un des sommets - Vertex* getVertex(uint ind) const - {return m_topo_property->getVertexContainer().get(ind);} - - /// retourne le nombre de sommets - uint getNbVertices() const; - - /// vérifie si cette face contient ou non ce sommet - bool find(Vertex* v) const - {return m_topo_property->getVertexContainer().find(v);} - - /// retourne l'indice d'un sommet - uint getIndex(Vertex* v) const - {return m_topo_property->getVertexContainer().getIndex(v);} + {return m_topo_property->getVertexContainer();} /// accès à tous les sommets y compris ceux internes - void getAllVertices(std::vector& vertices, const bool unique=true) const; + std::vector getAllVertices() const; /*------------------------------------------------------------------------*/ - void addCoFace(CoFace* f) - { - m_topo_property->getCoFaceContainer().add(f); - } - - void addCoFaces(std::vector faces) - { - m_topo_property->getCoFaceContainer().add(faces); - } - - void removeCoFace(CoFace* f, const bool exceptionIfNotFound=true) - { - m_topo_property->getCoFaceContainer().remove(f, exceptionIfNotFound); - } + /// ajoute une relation vers une coface + void addCoFace(CoFace* f); - /** \brief Fournit l'accès aux faces topologiques communes avec copie - * - * \param faces les faces communes - */ - void getCoFaces(std::vector& faces) const - {m_topo_property->getCoFaceContainer().get(faces);} + /// enlève une relation vers une coface + void removeCoFace(CoFace* f); /** Fournit l'accès aux faces topologiques incidentes sans copie */ const std::vector & getCoFaces() const - {return m_topo_property->getCoFaceContainer().get();} - - /// Accesseur pour l'une des faces communes - CoFace* getCoFace(uint id) const - {return m_topo_property->getCoFaceContainer().get(id);} - - /// retourne le nombre de faces communes - uint getNbCoFaces() const - {return m_topo_property->getCoFaceContainer().getNb();} + {return m_topo_property->getCoFaceContainer();} /*------------------------------------------------------------------------*/ /** \brief Remplace un sommet v1 par le sommet v2 @@ -337,17 +272,14 @@ class Face : public TopoEntity { /*------------------------------------------------------------------------*/ /// retourne l'ensemble des arêtes toute directions confondues - void getEdges(std::vector& edges) const; + std::vector getEdges() const; /// accès à l'une des arêtes suivant 2 sommets (recherchée parmis les CoFace) Edge* getEdge(Vertex* v1, Vertex* v2) const; - /// retourne l'une des arêtes d'un côté pour le cas avec une seule face commune - Edge* getEdge(uint ind) const; - /*------------------------------------------------------------------------*/ /// retourne l'ensemble des arêtes communes toute directions confondues - void getCoEdges(std::vector& coedges) const; + std::vector getCoEdges() const; /*------------------------------------------------------------------------*/ /// retourne les 2 listes de CoEdge, une par direction, pour une face structurée diff --git a/src/Core/protected/Topo/FaceTopoProperty.h b/src/Core/protected/Topo/FaceTopoProperty.h index ec046254..a33eab4e 100644 --- a/src/Core/protected/Topo/FaceTopoProperty.h +++ b/src/Core/protected/Topo/FaceTopoProperty.h @@ -1,19 +1,7 @@ -/*----------------------------------------------------------------------------*/ -/** \file FaceTopoProperty.h - * - * \author Eric Brière de l'Isle - * - * \date 7/12/2011 - */ -/*----------------------------------------------------------------------------*/ #ifndef FACE_TOPO_PROPERTY_H_ #define FACE_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ -#include "Utils/Container.h" -#include #include -#include -#include /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -31,35 +19,31 @@ class Block; class FaceTopoProperty { public: - FaceTopoProperty() - {} - - ~FaceTopoProperty() - {} + FaceTopoProperty() = default; + ~FaceTopoProperty() = default; /*------------------------------------------------------------------------*/ /** Création d'un clone, on copie toutes les informations */ - FaceTopoProperty* clone() { - FaceTopoProperty* prop = new FaceTopoProperty(); - - prop->m_vertices.clone(m_vertices); - prop->m_cofaces.clone(m_cofaces); - prop->m_blocks.clone(m_blocks); - - return prop; + FaceTopoProperty* clone() + { + FaceTopoProperty* prop = new FaceTopoProperty(); + prop->m_vertices = m_vertices; + prop->m_cofaces = m_cofaces; + prop->m_blocks = m_blocks; + return prop; } /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des sommets - Utils::Container& getVertexContainer() {return m_vertices;} + std::vector& getVertexContainer() {return m_vertices;} /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des faces communes - Utils::Container& getCoFaceContainer() {return m_cofaces;} + std::vector& getCoFaceContainer() {return m_cofaces;} /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des blocs - Utils::Container& getBlockContainer() {return m_blocks;} + std::vector& getBlockContainer() {return m_blocks;} /*------------------------------------------------------------------------*/ /** \brief Suppression des dépendances (entités topologiques incidentes) @@ -73,13 +57,13 @@ class Block; private: /// Lien avec les blocs incidents - Utils::Container m_blocks; + std::vector m_blocks; /// Lien avec les faces communes - Utils::Container m_cofaces; + std::vector m_cofaces; /// Lien avec les sommets extrémités - Utils::Container m_vertices; + std::vector m_vertices; }; /*----------------------------------------------------------------------------*/ } // end namespace Topo diff --git a/src/Core/protected/Topo/Vertex.h b/src/Core/protected/Topo/Vertex.h index 5b9cf56e..eb18ac42 100644 --- a/src/Core/protected/Topo/Vertex.h +++ b/src/Core/protected/Topo/Vertex.h @@ -71,7 +71,7 @@ class Vertex : public TopoEntity { /*------------------------------------------------------------------------*/ /// accès à tous les sommets (un seul pour un sommet) - void getAllVertices(std::vector& vertices, const bool unique=true) const; + std::vector getAllVertices() const; /*------------------------------------------------------------------------*/ /** \brief Suppression des dépendances (entités topologiques incidentes) @@ -109,9 +109,7 @@ class Vertex : public TopoEntity { * \see saveVertexTopoProperty */ - void addCoEdge(CoEdge* e) - {m_topo_property->getCoEdgeContainer().add(e);} - + void addCoEdge(CoEdge* e); /*------------------------------------------------------------------------*/ /** \brief Enlève une relation vers une arête commune @@ -120,31 +118,12 @@ class Vertex : public TopoEntity { * Attention à sauvegarder pour le undo * \see saveVertexTopoProperty */ - - void removeCoEdge(CoEdge* e, const bool exceptionIfNotFound=true) - {m_topo_property->getCoEdgeContainer().remove(e, exceptionIfNotFound);} - + void removeCoEdge(CoEdge* e); /*------------------------------------------------------------------------*/ - /** \brief Fournit l'accès aux arêtes topologiques communes incidentes avec copie - * - * \param edges les arêtes incidentes - */ - void getCoEdges(std::vector& edges) const - {m_topo_property->getCoEdgeContainer().get(edges);} - /// Fournit l'accès aux arêtes topologiques communes incidentes sans copie const std::vector & getCoEdges() const - {return m_topo_property->getCoEdgeContainer().get();} - - /*------------------------------------------------------------------------*/ - /// fournit l'accès à l'une des arêtes communes - CoEdge* getCoEdge(uint ind) const - {return m_topo_property->getCoEdgeContainer().get(ind);} - - /// retourne le nombre d'arêtes communes - uint getNbCoEdges() const - {return m_topo_property->getCoEdgeContainer().getNb();} + {return m_topo_property->getCoEdgeContainer();} /*------------------------------------------------------------------------*/ /** \brief Fournit l'accès aux arêtes topologiques incidentes @@ -152,16 +131,16 @@ class Vertex : public TopoEntity { * \param edges les arêtes incidentes */ - void getEdges(std::vector& edges) const; + std::vector getEdges() const; /*------------------------------------------------------------------------*/ /** Constitue la liste des CoFaces adjacentes */ - void getCoFaces(std::vector& cofaces) const; + std::vector getCoFaces() const; /*------------------------------------------------------------------------*/ /** Constitue la liste des Blocs adjacents */ - void getBlocks(std::vector& blocks) const; + std::vector getBlocks() const; /*------------------------------------------------------------------------*/ /** \brief Fusionne 2 sommets ensembles diff --git a/src/Core/protected/Topo/VertexTopoProperty.h b/src/Core/protected/Topo/VertexTopoProperty.h index c6bee9fd..faa62cda 100644 --- a/src/Core/protected/Topo/VertexTopoProperty.h +++ b/src/Core/protected/Topo/VertexTopoProperty.h @@ -1,19 +1,8 @@ -/*----------------------------------------------------------------------------*/ -/** \file VertexTopoProperty.h - * - * \author Eric Brière de l'Isle - * - * \date 23 nov. 2011 - */ -/*----------------------------------------------------------------------------*/ #ifndef VERTEX_TOPO_PROPERTY_H_ #define VERTEX_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ -#include "Utils/Container.h" -#include "Group/GroupEntity.h" -#include #include -#include +#include "Group/GroupEntity.h" /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -28,30 +17,26 @@ class CoEdge; class VertexTopoProperty { public: - VertexTopoProperty() - {} - - ~VertexTopoProperty() - {} + VertexTopoProperty() = default; + ~VertexTopoProperty() = default; /*------------------------------------------------------------------------*/ /** Création d'un clone, on copie toutes les informations */ - VertexTopoProperty* clone() { - VertexTopoProperty* prop = new VertexTopoProperty(); - - prop->m_coedges.clone(m_coedges); - prop->m_groups.clone(m_groups); - - return prop; + VertexTopoProperty* clone() + { + VertexTopoProperty* prop = new VertexTopoProperty(); + prop->m_coedges = m_coedges; + prop->m_groups = m_groups; + return prop; } /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des arêtes communes - Utils::Container& getCoEdgeContainer() {return m_coedges;} + std::vector& getCoEdgeContainer() {return m_coedges;} /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des groupes - Utils::Container& getGroupsContainer() {return m_groups;} + std::vector& getGroupsContainer() {return m_groups;} /*------------------------------------------------------------------------*/ /** \brief Suppression des dépendances (entités topologiques incidentes) @@ -64,10 +49,10 @@ class CoEdge; private: /// accès aux arêtes incidentes communes - Utils::Container m_coedges; + std::vector m_coedges; /// Listes des groupes 0D - Utils::Container m_groups; + std::vector m_groups; }; /*----------------------------------------------------------------------------*/ } // end namespace Topo diff --git a/src/QtComponents/QtMgx3DEdgePanel.cpp b/src/QtComponents/QtMgx3DEdgePanel.cpp index e31fa562..6523694d 100644 --- a/src/QtComponents/QtMgx3DEdgePanel.cpp +++ b/src/QtComponents/QtMgx3DEdgePanel.cpp @@ -194,7 +194,7 @@ void QtMgx3DEdgePanel::getPoints (Math::Point& p1, Math::Point& p2) const Topo::CoEdge* coEdge = dynamic_cast(&entity); if (0 != curve) { - auto vertices = curve->getVertices(); + auto vertices = curve->getVertices (); if (2 != vertices.size ( )) throw Exception (UTF8String ("Arête géométrique non composée de 2 points.", Charset::UTF_8)); p1 = vertices [0]->getCoord ( ); @@ -202,8 +202,7 @@ void QtMgx3DEdgePanel::getPoints (Math::Point& p1, Math::Point& p2) const } // if (0 != curve) else if (0 != edge) { - vector vertices; - edge->getVertices (vertices); + auto vertices = edge->getVertices (); if (2 != vertices.size ( )) throw Exception (UTF8String ("Arête topologique non composée de 2 points.", Charset::UTF_8)); p1 = vertices [0]->getCoord ( ); @@ -211,8 +210,7 @@ void QtMgx3DEdgePanel::getPoints (Math::Point& p1, Math::Point& p2) const } // else if (0 != edge) else if (0 != coEdge) { - vector vertices; - coEdge->getVertices (vertices); + auto vertices = coEdge->getVertices (); if (2 != vertices.size ( )) throw Exception (UTF8String ("Arête topologique non composée de 2 points.", Charset::UTF_8)); p1 = vertices [0]->getCoord ( ); diff --git a/src/QtVtkComponents/VTKGMDSEntityRepresentation.cpp b/src/QtVtkComponents/VTKGMDSEntityRepresentation.cpp index 6d6d6cd2..d387b9f6 100644 --- a/src/QtVtkComponents/VTKGMDSEntityRepresentation.cpp +++ b/src/QtVtkComponents/VTKGMDSEntityRepresentation.cpp @@ -723,29 +723,12 @@ createMeshEntitySurfacicRepresentation3D(Mesh::MeshEntity* meshEntity, gmds::Mes // la liste des faces externes au groupe de blocs // on utilise une map et on marque les faces à chaque fois qu'elles sont vus std::map marque_faces; - - std::vector faces; - for (std::vector::iterator iter1 = - blocs.begin(); iter1 != blocs.end(); ++iter1) - { - (*iter1)->getFaces(faces); - - std::vector cofaces; - for (std::vector::iterator iter2 = - faces.begin(); iter2 != faces.end(); ++iter2) - { - (*iter2)->getCoFaces(cofaces); - - for (std::vector::iterator iter3 = - cofaces.begin(); iter3 != cofaces.end(); - ++iter3) - marque_faces[*iter3] += 1; - } - } - + for (Topo::Block* bloc : blocs) + for (Topo::Face* face : bloc->getFaces()) + for (Topo::CoFace* coface : face->getCoFaces()) + marque_faces[coface] += 1; std::vector cofaces; - for (std::map::iterator iter = marque_faces.begin(); iter != marque_faces.end(); ++iter) @@ -927,8 +910,8 @@ createCoFacesSurfacicRepresentationRatioN(std::vector cofaces, gm size_t pos = 0; for (std::vector::iterator iter = cofaces.begin(); iter != cofaces.end(); ++iter) { - uint niMax = (*iter)->getEdge(Topo::CoFace::j_min)->getNbNodes(); - uint njMax = (*iter)->getEdge(Topo::CoFace::i_min)->getNbNodes(); + uint niMax = (*iter)->getEdges()[Topo::CoFace::j_min]->getNbNodes(); + uint njMax = (*iter)->getEdges()[Topo::CoFace::i_min]->getNbNodes(); #ifdef _DEBUG_VTKGMDSEntityRepresentation std::cout<<" pour "<<(*iter)->getName()<<" niMax = "< #include +#include #include #include /*----------------------------------------------------------------------------*/ @@ -389,7 +390,22 @@ std::vector toNames(const std::vector& entities) } template::value>> -int getIndexOf(const std::vector& entities, T* e) +std::vector toVect(const EntitySet& entities) +{ + std::vector ret(entities.begin(), entities.end()); + return ret; +} + + +template::value>> +std::list toList(const std::vector& entities) +{ + std::list ret(entities.begin(), entities.end()); + return ret; +} + +template::value>> +int getIndexOf(T* e, const std::vector& entities) { int index = -1; for (unsigned int i=0; i& entities, T* e) } if (index == -1) { TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getIndexOf impossible pour un volume"; + message << "getIndexOf impossible pour un " << e->getName(); throw TkUtil::Exception(message); } return index; } + +template::value>> +bool contains(const T* e, const std::vector& entities) +{ + return std::find(entities.begin(), entities.end(), e) != entities.end(); +} + +// en attendant C++ 23 +template::value>> +void append(std::vector& to, const std::vector& from) +{ + to.insert(to.end(), from.begin(), from.end()); +} + +template::value>> +bool remove(T* e, std::vector& entities) +{ + if (auto it = std::find(entities.begin(), entities.end(), e); it != entities.end()) { + entities.erase(it); + return true; + } else { + return false; + } +} #endif /*----------------------------------------------------------------------------*/ } // end namespace Utils From a22f016b45ab58594d2c7a0dfd4f4639d2d03d28 Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Wed, 19 Nov 2025 11:15:20 +0100 Subject: [PATCH 12/18] Remove home made container for mesh entities --- src/Core/Mesh/Cloud.cpp | 39 ++++++++----------- src/Core/Mesh/Line.cpp | 20 ++++------ src/Core/Mesh/MeshImplementation.cpp | 6 --- src/Core/Mesh/Surface.cpp | 33 ++++++---------- src/Core/Mesh/Volume.cpp | 38 +++++++----------- src/Core/protected/Mesh/Cloud.h | 13 +------ src/Core/protected/Mesh/Line.h | 11 +----- src/Core/protected/Mesh/Surface.h | 11 +----- src/Core/protected/Mesh/Volume.h | 11 +----- .../protected/Topo/MeshCloudTopoProperty.h | 39 ++++++------------- .../protected/Topo/MeshLineTopoProperty.h | 34 +++++----------- .../protected/Topo/MeshSurfaceTopoProperty.h | 34 +++++----------- .../protected/Topo/MeshVolumeTopoProperty.h | 37 ++++++------------ .../VTKGMDSEntityRepresentation.cpp | 39 ++++++------------- .../VTKGraphicalRepresentationFactory.cpp | 6 +-- .../VTKMgx3DMeshEntityRepresentation.cpp | 4 +- src/Utils/protected/Utils/Entity.h | 11 ++++++ 17 files changed, 119 insertions(+), 267 deletions(-) diff --git a/src/Core/Mesh/Cloud.cpp b/src/Core/Mesh/Cloud.cpp index e090c3c4..64702c38 100644 --- a/src/Core/Mesh/Cloud.cpp +++ b/src/Core/Mesh/Cloud.cpp @@ -101,34 +101,34 @@ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Cloud & cl) /*----------------------------------------------------------------------------*/ void Cloud::addCoEdge(Topo::CoEdge* ed) { - m_topo_property->getCoEdgeContainer().add(ed); + m_topo_property->getCoEdgeContainer().push_back(ed); } /*----------------------------------------------------------------------------*/ void Cloud::removeCoEdge(Topo::CoEdge* ed) { - m_topo_property->getCoEdgeContainer().remove(ed, true); + Utils::remove(ed, m_topo_property->getCoEdgeContainer()); } /*----------------------------------------------------------------------------*/ -void Cloud::getCoEdges(std::vector& edges) const +const std::vector& Cloud::getCoEdges() const { - m_topo_property->getCoEdgeContainer().checkIfDestroyed(); - m_topo_property->getCoEdgeContainer().get(edges); + Utils::checkIfDestroyed(m_topo_property->getCoEdgeContainer()); + return m_topo_property->getCoEdgeContainer(); } /*----------------------------------------------------------------------------*/ void Cloud::addVertex(Topo::Vertex* vtx) { - m_topo_property->getVertexContainer().add(vtx); + m_topo_property->getVertexContainer().push_back(vtx); } /*----------------------------------------------------------------------------*/ void Cloud::removeVertex(Topo::Vertex* vtx) { - m_topo_property->getVertexContainer().remove(vtx, true); + Utils::remove(vtx, m_topo_property->getVertexContainer()); } /*----------------------------------------------------------------------------*/ -void Cloud::getVertices(std::vector& vertices) const +const std::vector& Cloud::getVertices() const { - m_topo_property->getVertexContainer().checkIfDestroyed(); - m_topo_property->getVertexContainer().get(vertices); + Utils::checkIfDestroyed(m_topo_property->getVertexContainer()); + return m_topo_property->getVertexContainer(); } /*----------------------------------------------------------------------------*/ Utils::SerializedRepresentation* Cloud:: @@ -140,10 +140,8 @@ getDescription (bool alsoComputed) const // le maillage vu depuis les arêtes et celui stocké dans GMDS Utils::SerializedRepresentation meshProprietes ("Propriétés du maillage", ""); - std::vector coedges; - getCoEdges(coedges); - std::vector vertices; - getVertices(vertices); + auto coedges = getCoEdges(); + auto vertices = getVertices(); uint nbNodes = 0; for (uint i=0; i& ANodes) const { ANodes.clear(); - std::vector coEdges; - getCoEdges(coEdges); - std::vector vertices; - getVertices(vertices); - Mesh::MeshItf* meshItf = getMeshManager ( ).getMesh ( ); Mesh::MeshImplementation* meshImpl = dynamic_cast (meshItf); @@ -208,8 +201,8 @@ void Cloud::getGMDSNodes(std::vector& ANodes) const // ajout d'un filtre pour éviter de mettre 2 fois (ou plus) un même noeud std::map filtre; - for(unsigned int iVertex=0; iVertexgetNode(); + for(Topo::Vertex* vtx : getVertices()) { + gmds::TCellID node = vtx->getNode(); if (filtre[node] == 0){ ANodes.push_back(gmdsMesh.get(node)); @@ -217,8 +210,8 @@ void Cloud::getGMDSNodes(std::vector& ANodes) const } } - for(unsigned int iCoEdge=0; iCoEdge nodes = coEdges[iCoEdge]->nodes(); + for(Topo::CoEdge* coedge : getCoEdges()) { + std::vector nodes = coedge->nodes(); for(unsigned int iNode=0; iNodegetCoEdgeContainer().add(ed); + m_topo_property->getCoEdgeContainer().push_back(ed); } /*----------------------------------------------------------------------------*/ void Line::removeCoEdge(Topo::CoEdge* ed) { - m_topo_property->getCoEdgeContainer().remove(ed, true); + Utils::remove(ed, m_topo_property->getCoEdgeContainer()); } /*----------------------------------------------------------------------------*/ -void Line::getCoEdges(std::vector& edges) const +const std::vector& Line::getCoEdges() const { - m_topo_property->getCoEdgeContainer().checkIfDestroyed(); - m_topo_property->getCoEdgeContainer().get(edges); + Utils::checkIfDestroyed(m_topo_property->getCoEdgeContainer()); + return m_topo_property->getCoEdgeContainer(); } /*----------------------------------------------------------------------------*/ Utils::SerializedRepresentation* Line:: @@ -123,8 +123,7 @@ getDescription (bool alsoComputed) const // le maillage vu depuis les arêtes et celui stocké dans GMDS Utils::SerializedRepresentation meshProprietes ("Propriétés du maillage", ""); - std::vector coedges; - getCoEdges(coedges); + auto coedges = getCoEdges(); uint nbEdges = 0; for (uint i=0; i& AEdges) const { AEdges.clear(); - std::vector coEdges; - getCoEdges(coEdges); - Mesh::MeshItf* meshItf = getMeshManager ( ).getMesh ( ); Mesh::MeshImplementation* meshImpl = dynamic_cast (meshItf); CHECK_NULL_PTR_ERROR(meshImpl); gmds::Mesh& gmdsMesh = meshImpl->getGMDSMesh(); - for(unsigned int iCoEdge=0; iCoEdge edges = coEdges[iCoEdge]->edges(); + for(Topo::CoEdge* coedge : getCoEdges()) { + std::vector edges = coedge->edges(); for(unsigned int iEdge=0; iEdge(edges[iEdge])); diff --git a/src/Core/Mesh/MeshImplementation.cpp b/src/Core/Mesh/MeshImplementation.cpp index 904988ef..e569bc06 100644 --- a/src/Core/Mesh/MeshImplementation.cpp +++ b/src/Core/Mesh/MeshImplementation.cpp @@ -267,9 +267,6 @@ bool MeshImplementation::createGMDSGroups() auto su = getGMDSMesh().newGroup(current_surf->getName()); createdGMDSSurfaces.push_back(su); - std::vector coFaces; - current_surf->getCoFaces(coFaces); - std::vector faces; current_surf->getGMDSFaces(faces); @@ -283,9 +280,6 @@ bool MeshImplementation::createGMDSGroups() auto vo = getGMDSMesh().newGroup(current_vol->getName()); createdGMDSVolumes.push_back(vo); - std::vector blocks; - current_vol->getBlocks(blocks); - std::vector regions; current_vol->getGMDSRegions(regions); diff --git a/src/Core/Mesh/Surface.cpp b/src/Core/Mesh/Surface.cpp index 9226b3a1..2bbe6707 100644 --- a/src/Core/Mesh/Surface.cpp +++ b/src/Core/Mesh/Surface.cpp @@ -240,34 +240,31 @@ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Surface & cl) /*----------------------------------------------------------------------------*/ void Surface::addCoFace(Topo::CoFace* f) { - m_topo_property->getCoFaceContainer().add(f); + m_topo_property->getCoFaceContainer().push_back(f); } /*----------------------------------------------------------------------------*/ void Surface::removeCoFace(Topo::CoFace* f) { - m_topo_property->getCoFaceContainer().remove(f, true); + Utils::remove(f, m_topo_property->getCoFaceContainer()); } /*----------------------------------------------------------------------------*/ -void Surface::getCoFaces(std::vector& faces) const +const std::vector& Surface::getCoFaces() const { - m_topo_property->getCoFaceContainer().checkIfDestroyed(); - m_topo_property->getCoFaceContainer().get(faces); + Utils::checkIfDestroyed(m_topo_property->getCoFaceContainer()); + return m_topo_property->getCoFaceContainer(); } /*----------------------------------------------------------------------------*/ void Surface::getGMDSFaces(std::vector& AFaces) const { AFaces.clear(); - std::vector coFaces; - getCoFaces(coFaces); - Mesh::MeshItf* meshItf = getMeshManager ( ).getMesh ( ); Mesh::MeshImplementation* meshImpl = dynamic_cast (meshItf); CHECK_NULL_PTR_ERROR(meshImpl); gmds::Mesh& gmdsMesh = meshImpl->getGMDSMesh(); - for(unsigned int iCoFace=0; iCoFace faces = coFaces[iCoFace]->faces(); + for(Topo::CoFace* coface : getCoFaces()) { + std::vector faces = coface->faces(); for(unsigned int iFace=0; iFace(faces[iFace])); @@ -282,16 +279,13 @@ void Surface::getGMDSNodes(std::vector& ANodes) const // utilisation d'un filtre pour ne pas référencer plusieurs fois un même noeud std::map filtre_nodes; - std::vector coFaces; - getCoFaces(coFaces); - Mesh::MeshItf* meshItf = getMeshManager ( ).getMesh ( ); Mesh::MeshImplementation* meshImpl = dynamic_cast (meshItf); CHECK_NULL_PTR_ERROR(meshImpl); gmds::Mesh& gmdsMesh = meshImpl->getGMDSMesh(); - for(unsigned int iCoFace=0; iCoFace nodes = coFaces[iCoFace]->nodes(); + for(Topo::CoFace* coface : getCoFaces()) { + std::vector nodes = coface->nodes(); for(unsigned int iNode=0; iNode description ( MeshEntity::getDescription (alsoComputed)); - std::vector faces; - getCoFaces(faces); + auto faces = getCoFaces(); // le maillage vu depuis les cofaces Utils::SerializedRepresentation meshProprietes ("Propriétés du maillage", ""); @@ -375,10 +368,8 @@ saveInternals(Mesh::CommandCreateMesh* ccm) bool Surface:: isStructured() { - std::vector coFaces; - getCoFaces(coFaces); - for(unsigned int iCoFace=0; iCoFaceisStructured()) + for(Topo::CoFace* coface : getCoFaces()) + if (!coface->isStructured()) return false; return true; diff --git a/src/Core/Mesh/Volume.cpp b/src/Core/Mesh/Volume.cpp index ed046c97..a3dfa319 100644 --- a/src/Core/Mesh/Volume.cpp +++ b/src/Core/Mesh/Volume.cpp @@ -233,15 +233,12 @@ void Volume::getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestr { // On prend la peau du maillage // on passe par GMDS pour récupérer les noeuds et les mailles : gmds::Mesh& gmdsMesh = meshImpl->getGMDSMesh ( ); - // la liste des Topo::Block qui ont contribués : - std::vector blocs; - getBlocks (blocs); // la liste des faces externes au groupe de blocs // on utilise une map et on marque les faces à chaque fois // qu'elles sont vus std::map marque_faces; - for (Topo::Block* bloc : blocs) + for (Topo::Block* bloc : getBlocks()) for (Topo::Face* face : bloc->getFaces()) for (Topo::CoFace* coface : face->getCoFaces()) marque_faces[coface] += 1; @@ -335,34 +332,31 @@ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Volume & cl) /*----------------------------------------------------------------------------*/ void Volume::addBlock(Topo::Block* b) { - m_topo_property->getBlockContainer().add(b); + m_topo_property->getBlockContainer().push_back(b); } /*----------------------------------------------------------------------------*/ void Volume::removeBlock(Topo::Block* b) { - m_topo_property->getBlockContainer().remove(b, true); + Utils::remove(b, m_topo_property->getBlockContainer()); } /*----------------------------------------------------------------------------*/ -void Volume::getBlocks(std::vector& blocks) const +const std::vector& Volume::getBlocks() const { - m_topo_property->getBlockContainer().checkIfDestroyed(); - m_topo_property->getBlockContainer().get(blocks); + Utils::checkIfDestroyed(m_topo_property->getBlockContainer()); + return m_topo_property->getBlockContainer(); } /*----------------------------------------------------------------------------*/ void Volume::getGMDSRegions(std::vector& ARegions) const { ARegions.clear(); - std::vector blocks; - getBlocks(blocks); - Mesh::MeshItf* meshItf = getMeshManager ( ).getMesh ( ); Mesh::MeshImplementation* meshImpl = dynamic_cast (meshItf); CHECK_NULL_PTR_ERROR(meshImpl); gmds::Mesh& gmdsMesh = meshImpl->getGMDSMesh ( ); - for(unsigned int iBlock=0; iBlock regions = blocks[iBlock]->regions(); + for(Topo::Block* block : getBlocks()) { + std::vector regions = block->regions(); for(unsigned int iRegion=0; iRegion(regions[iRegion])); @@ -377,16 +371,13 @@ void Volume::getGMDSNodes(std::vector& ANodes) const // utilisation d'un filtre pour ne pas référencer plusieurs fois un même noeud std::map filtre_nodes; - std::vector blocks; - getBlocks(blocks); - Mesh::MeshItf* meshItf = getMeshManager ( ).getMesh ( ); Mesh::MeshImplementation* meshImpl = dynamic_cast (meshItf); CHECK_NULL_PTR_ERROR(meshImpl); gmds::Mesh& gmdsMesh = meshImpl->getGMDSMesh(); - for(unsigned int iBlock=0; iBlock nodes = blocks[iBlock]->nodes(); + for(Topo::Block* block : getBlocks()) { + std::vector nodes = block->nodes(); for(unsigned int iNode=0; iNode description ( MeshEntity::getDescription (alsoComputed)); - std::vector blocks; - getBlocks(blocks); + auto blocks = getBlocks(); if (!blocks.empty()){ // le maillage vu depuis les blocs @@ -495,10 +485,8 @@ saveInternals(Mesh::CommandCreateMesh* ccm) bool Volume:: isStructured() { - std::vector blocs; - getBlocks(blocs); - for(unsigned int i=0; iisStructured()) + for(Topo::Block* block : getBlocks()) + if (!block->isStructured()) return false; return true; diff --git a/src/Core/protected/Mesh/Cloud.h b/src/Core/protected/Mesh/Cloud.h index c2f46b87..2157d6cd 100644 --- a/src/Core/protected/Mesh/Cloud.h +++ b/src/Core/protected/Mesh/Cloud.h @@ -1,12 +1,3 @@ -/*----------------------------------------------------------------------------*/ -/* - * \file Cloud.h - * - * \author Eric Brière de l'Isle - * - * \date 25 nov. 2011 - */ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_MESH_CLOUD_H_ #define MGX3D_MESH_CLOUD_H_ /*----------------------------------------------------------------------------*/ @@ -122,7 +113,7 @@ class Cloud : public MeshEntity { #endif /// Fournit l'accès aux arêtes topologiques qui ont participées à la constitution du nuage - void getCoEdges(std::vector& edges) const; + const std::vector& getCoEdges() const; /** supprime les relations vers les arêtes */ void clearCoEdges() @@ -140,7 +131,7 @@ class Cloud : public MeshEntity { #endif /// Fournit l'accès aux sommets topologiques qui ont participées à la constitution du nuage - void getVertices(std::vector& vertices) const; + const std::vector& getVertices() const; /** supprime les relations vers les sommets */ void clearVertices() diff --git a/src/Core/protected/Mesh/Line.h b/src/Core/protected/Mesh/Line.h index 394e9c24..6165f13b 100644 --- a/src/Core/protected/Mesh/Line.h +++ b/src/Core/protected/Mesh/Line.h @@ -1,12 +1,3 @@ -/*----------------------------------------------------------------------------*/ -/* - * \file Line.h - * - * \author Eric Brière de l'Isle - * - * \date 24/08/16 - */ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_MESH_LINE_H_ #define MGX3D_MESH_LINE_H_ /*----------------------------------------------------------------------------*/ @@ -123,7 +114,7 @@ class Line : public MeshEntity { #endif /// Fournit l'accès aux arêtes topologiques qui ont participées à la constitution de la ligne - void getCoEdges(std::vector& edges) const; + const std::vector& getCoEdges() const; /** supprime les relations vers les arêtes */ void clearCoEdges() diff --git a/src/Core/protected/Mesh/Surface.h b/src/Core/protected/Mesh/Surface.h index 252861eb..07af9292 100644 --- a/src/Core/protected/Mesh/Surface.h +++ b/src/Core/protected/Mesh/Surface.h @@ -1,12 +1,3 @@ -/*----------------------------------------------------------------------------*/ -/* - * \file Surface.h - * - * \author Eric Brière de l'Isle - * - * \date 25 nov. 2011 - */ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_MESH_SURFACE_H_ #define MGX3D_MESH_SURFACE_H_ /*----------------------------------------------------------------------------*/ @@ -128,7 +119,7 @@ class Surface : public MeshEntity { /*----------------------------------------------------------------------------*/ /// Fournit l'accès aux faces topologiques communes qui ont participées à la constitution de la surface - void getCoFaces(std::vector& faces) const; + const std::vector& getCoFaces() const; /** supprime les relations vers les cofaces */ void clearCoFaces() diff --git a/src/Core/protected/Mesh/Volume.h b/src/Core/protected/Mesh/Volume.h index 4353babf..3329b437 100644 --- a/src/Core/protected/Mesh/Volume.h +++ b/src/Core/protected/Mesh/Volume.h @@ -1,12 +1,3 @@ -/*----------------------------------------------------------------------------*/ -/* - * \file Volume.h - * - * \author Eric Brière de l'Isle - * - * \date 25 nov. 2011 - */ -/*----------------------------------------------------------------------------*/ #ifndef MGX3D_MESH_VOLUME_H_ #define MGX3D_MESH_VOLUME_H_ /*----------------------------------------------------------------------------*/ @@ -128,7 +119,7 @@ class Volume : public MeshEntity { /*----------------------------------------------------------------------------*/ /// Fournit l'accès aux blocs topologiques qui ont participées à la constitution du volume - void getBlocks(std::vector& blocs) const; + const std::vector& getBlocks() const; /** supprime les relations vers les blocs */ void clearBlocks() diff --git a/src/Core/protected/Topo/MeshCloudTopoProperty.h b/src/Core/protected/Topo/MeshCloudTopoProperty.h index 4f18725c..f83b7b03 100644 --- a/src/Core/protected/Topo/MeshCloudTopoProperty.h +++ b/src/Core/protected/Topo/MeshCloudTopoProperty.h @@ -1,19 +1,7 @@ -/*----------------------------------------------------------------------------*/ -/** \file MeshCloudTopoProperty.h - * - * \author Eric Brière de l'Isle - * - * \date 15/11/13 - */ -/*----------------------------------------------------------------------------*/ #ifndef MESH_CLOUD_TOPO_PROPERTY_H_ #define MESH_CLOUD_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ -#include "Utils/Container.h" -#include #include -#include -#include /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -27,31 +15,28 @@ class Vertex; * Rassemble les propriétés topologiques communes aux arêtes et sommets. */ - class MeshCloudTopoProperty { + class MeshCloudTopoProperty + { public: - MeshCloudTopoProperty() - { - } - - ~MeshCloudTopoProperty() - {} + MeshCloudTopoProperty() = default; + ~MeshCloudTopoProperty() = default; /*------------------------------------------------------------------------*/ /** Création d'un clone, on copie toutes les informations */ - MeshCloudTopoProperty* clone() { + MeshCloudTopoProperty* clone() + { MeshCloudTopoProperty* prop = new MeshCloudTopoProperty(); - prop->m_coedges.clone(m_coedges); - prop->m_vertices.clone(m_vertices); - + prop->m_coedges = m_coedges; + prop->m_vertices = m_vertices; return prop; } /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des arêtes communes - Utils::Container& getCoEdgeContainer() {return m_coedges;} + std::vector& getCoEdgeContainer() {return m_coedges;} /// accesseur sur le conteneur des sommets - Utils::Container& getVertexContainer() {return m_vertices;} + std::vector& getVertexContainer() {return m_vertices;} /*------------------------------------------------------------------------*/ /** \brief Suppression des relations @@ -64,10 +49,10 @@ class Vertex; private: /// Lien avec les arêtes communes sur lesquelles se base ce nuage - Utils::Container m_coedges; + std::vector m_coedges; /// Lien avec les sommets sur lesquels se base ce nuage - Utils::Container m_vertices; + std::vector m_vertices; }; /*----------------------------------------------------------------------------*/ } // end namespace Topo diff --git a/src/Core/protected/Topo/MeshLineTopoProperty.h b/src/Core/protected/Topo/MeshLineTopoProperty.h index 0dfc4207..289baa74 100644 --- a/src/Core/protected/Topo/MeshLineTopoProperty.h +++ b/src/Core/protected/Topo/MeshLineTopoProperty.h @@ -1,19 +1,7 @@ -/*----------------------------------------------------------------------------*/ -/** \file MeshLineTopoProperty.h - * - * \author Eric Brière de l'Isle - * - * \date 24/08/16 - */ -/*----------------------------------------------------------------------------*/ #ifndef MESH_LINE_TOPO_PROPERTY_H_ #define MESH_LINE_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ -#include "Utils/Container.h" -#include #include -#include -#include /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -26,27 +14,24 @@ class CoEdge; * Rassemble les propriétés topologiques communes aux arêtes et sommets. */ - class MeshLineTopoProperty { + class MeshLineTopoProperty + { public: - MeshLineTopoProperty() - { - } - - ~MeshLineTopoProperty() - {} + MeshLineTopoProperty() = default; + ~MeshLineTopoProperty() = default; /*------------------------------------------------------------------------*/ /** Création d'un clone, on copie toutes les informations */ - MeshLineTopoProperty* clone() { + MeshLineTopoProperty* clone() + { MeshLineTopoProperty* prop = new MeshLineTopoProperty(); - prop->m_coedges.clone(m_coedges); - + prop->m_coedges = m_coedges; return prop; } /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des arêtes communes - Utils::Container& getCoEdgeContainer() {return m_coedges;} + std::vector& getCoEdgeContainer() {return m_coedges;} /*------------------------------------------------------------------------*/ /** \brief Suppression des relations @@ -58,8 +43,7 @@ class CoEdge; private: /// Lien avec les arêtes communes sur lesquelles se base ce nuage - Utils::Container m_coedges; - + std::vector m_coedges; }; /*----------------------------------------------------------------------------*/ } // end namespace Topo diff --git a/src/Core/protected/Topo/MeshSurfaceTopoProperty.h b/src/Core/protected/Topo/MeshSurfaceTopoProperty.h index e9878f60..a99a5722 100644 --- a/src/Core/protected/Topo/MeshSurfaceTopoProperty.h +++ b/src/Core/protected/Topo/MeshSurfaceTopoProperty.h @@ -1,20 +1,7 @@ -/*----------------------------------------------------------------------------*/ -/** \file MeshSurfaceTopoProperty.h - * - * \author Eric Brière de l'Isle - * - * \date 15/11/13 - */ -/*----------------------------------------------------------------------------*/ #ifndef MESH_SURFACE_TOPO_PROPERTY_H_ #define MESH_SURFACE_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ -#include "Utils/Container.h" -#include -#include #include -#include -#include /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -27,27 +14,24 @@ class CoFace; * Rassemble les propriétés topologiques communes aux blocs. */ - class MeshSurfaceTopoProperty { +class MeshSurfaceTopoProperty +{ public: - MeshSurfaceTopoProperty() - {} - - ~MeshSurfaceTopoProperty() - {} + MeshSurfaceTopoProperty() = default; + ~MeshSurfaceTopoProperty() = default; /*------------------------------------------------------------------------*/ /** Création d'un clone, on copie toutes les informations */ - MeshSurfaceTopoProperty* clone() { + MeshSurfaceTopoProperty* clone() + { MeshSurfaceTopoProperty* prop = new MeshSurfaceTopoProperty(); - - prop->m_cofaces.clone(m_cofaces); - + prop->m_cofaces = m_cofaces; return prop; } /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des faces - Utils::Container& getCoFaceContainer() {return m_cofaces;} + std::vector& getCoFaceContainer() {return m_cofaces;} /*------------------------------------------------------------------------*/ /** \brief Suppression des relations @@ -59,7 +43,7 @@ class CoFace; private: /// lien sur les Topo::CoFace qui ont participées à la constitution des mailles - Utils::Container m_cofaces; + std::vector m_cofaces; }; /*----------------------------------------------------------------------------*/ } // end namespace Topo diff --git a/src/Core/protected/Topo/MeshVolumeTopoProperty.h b/src/Core/protected/Topo/MeshVolumeTopoProperty.h index 87869f0c..a9f84380 100644 --- a/src/Core/protected/Topo/MeshVolumeTopoProperty.h +++ b/src/Core/protected/Topo/MeshVolumeTopoProperty.h @@ -1,19 +1,7 @@ -/*----------------------------------------------------------------------------*/ -/** \file MeshVolumeTopoProperty.h - * - * \author Eric Brière de l'Isle - * - * \date 15/11/13 - */ -/*----------------------------------------------------------------------------*/ #ifndef MESH_VOLUME_TOPO_PROPERTY_H_ #define MESH_VOLUME_TOPO_PROPERTY_H_ /*----------------------------------------------------------------------------*/ -#include "Utils/Container.h" -#include #include -#include -#include /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -26,27 +14,24 @@ class Block; * Rassemble les propriétés topologiques communes aux Mesh::Volume. */ - class MeshVolumeTopoProperty { +class MeshVolumeTopoProperty +{ public: - MeshVolumeTopoProperty() - {} - - ~MeshVolumeTopoProperty() - {} + MeshVolumeTopoProperty() = default; + ~MeshVolumeTopoProperty() = default; /*------------------------------------------------------------------------*/ /** Création d'un clone, on copie toutes les informations */ - MeshVolumeTopoProperty* clone() { - MeshVolumeTopoProperty* prop = new MeshVolumeTopoProperty(); - - prop->m_blocks.clone(m_blocks); - - return prop; + MeshVolumeTopoProperty* clone() + { + MeshVolumeTopoProperty* prop = new MeshVolumeTopoProperty(); + prop->m_blocks = m_blocks; + return prop; } /*------------------------------------------------------------------------*/ /// accesseur sur le conteneur des blocs - Utils::Container& getBlockContainer() {return m_blocks;} + std::vector& getBlockContainer() {return m_blocks;} /*------------------------------------------------------------------------*/ /** \brief Suppression des relations @@ -58,7 +43,7 @@ class Block; private: /// lien sur les Topo::Block qui ont participés à la constitution des mailles - Utils::Container m_blocks; + std::vector m_blocks; }; /*----------------------------------------------------------------------------*/ } // end namespace Topo diff --git a/src/QtVtkComponents/VTKGMDSEntityRepresentation.cpp b/src/QtVtkComponents/VTKGMDSEntityRepresentation.cpp index d387b9f6..9d3879d8 100644 --- a/src/QtVtkComponents/VTKGMDSEntityRepresentation.cpp +++ b/src/QtVtkComponents/VTKGMDSEntityRepresentation.cpp @@ -403,22 +403,16 @@ void VTKGMDSEntityRepresentation::createMeshEntityCloudRepresentation( Mesh::Mes throw exc; } - // la liste des Topo::CoFace qui ont contribuées - std::vector faces; - surf->getCoFaces(faces); - // calcul le nombre total de noeuds (il y a des doublons sur les arêtes, tant pis) - for (std::vector::iterator iter = - faces.begin(); iter != faces.end(); ++iter) - pointsNum += (*iter)->nodes().size(); + for (Topo::CoFace* f : surf->getCoFaces()) + pointsNum += f->nodes().size(); points->SetNumberOfPoints(pointsNum); _cloudGrid->Allocate(pointsNum, 1000); - for (std::vector::iterator iter = - faces.begin(); iter != faces.end(); ++iter) + for (Topo::CoFace* f : surf->getCoFaces()) { - std::vector& nodes = (*iter)->nodes(); + std::vector& nodes = f->nodes(); for (std::vector::const_iterator itp = nodes.begin(); nodes.end() != itp; itp++, id++) { @@ -440,22 +434,16 @@ void VTKGMDSEntityRepresentation::createMeshEntityCloudRepresentation( Mesh::Mes throw exc; } - // la liste des Topo::Block qui ont contribués - std::vector blocs; - vol->getBlocks(blocs); - // calcul le nombre total de noeuds (il y a des doublons sur les faces, tant pis) - for (std::vector::iterator iter = - blocs.begin(); iter != blocs.end(); ++iter) - pointsNum += (*iter)->nodes().size(); + for (Topo::Block* bl : vol->getBlocks()) + pointsNum += bl->nodes().size(); points->SetNumberOfPoints(pointsNum); _cloudGrid->Allocate(pointsNum, 1000); - for (std::vector::iterator iter = - blocs.begin(); iter != blocs.end(); ++iter) + for (Topo::Block* bl : vol->getBlocks()) { - std::vector& nodes = (*iter)->nodes(); + std::vector& nodes = bl->nodes(); for (std::vector::const_iterator itp = nodes.begin(); nodes.end() != itp; itp++, id++) { @@ -689,11 +677,9 @@ createMeshEntitySurfacicRepresentation2D(Mesh::MeshEntity* meshEntity, gmds::Mes throw exc; } - std::vector cofaces; - - surf->getCoFaces(cofaces); + std::vector cofaces =surf->getCoFaces(); - if (meshEntity->getContext().getRatioDegrad() == 1 || !surf->isStructured()) + if (meshEntity->getContext().getRatioDegrad() == 1 || !surf->isStructured()) createCoFacesSurfacicRepresentationRatio1(cofaces, gmdsMesh); else createCoFacesSurfacicRepresentationRatioN(cofaces, gmdsMesh, meshEntity->getContext().getRatioDegrad()); @@ -716,14 +702,11 @@ createMeshEntitySurfacicRepresentation3D(Mesh::MeshEntity* meshEntity, gmds::Mes "VTKGMDSEntityRepresentation::createMeshEntityCloudRepresentation"); throw exc; } - // la liste des Topo::Block qui ont contribués - std::vector blocs; - vol->getBlocks(blocs); // la liste des faces externes au groupe de blocs // on utilise une map et on marque les faces à chaque fois qu'elles sont vus std::map marque_faces; - for (Topo::Block* bloc : blocs) + for (Topo::Block* bloc : vol->getBlocks()) for (Topo::Face* face : bloc->getFaces()) for (Topo::CoFace* coface : face->getCoFaces()) marque_faces[coface] += 1; diff --git a/src/QtVtkComponents/VTKGraphicalRepresentationFactory.cpp b/src/QtVtkComponents/VTKGraphicalRepresentationFactory.cpp index 1fe64439..343fd906 100644 --- a/src/QtVtkComponents/VTKGraphicalRepresentationFactory.cpp +++ b/src/QtVtkComponents/VTKGraphicalRepresentationFactory.cpp @@ -101,11 +101,7 @@ DisplayProperties::GraphicalRepresentation* VTKGraphicalRepresentationFactory::c Mesh::Volume* volume = dynamic_cast(meshEntity); if (0 != volume) { - vector blocks; - volume->getBlocks (blocks); - //std::cout<<"blocks.size() "<getBlocks().empty(); //std::cout<<"hasBlocks "<(getEntity ( )); CHECK_NULL_PTR_ERROR (volume) - vector blocks; - volume->getBlocks (blocks); - mdr.setSkinDisplayed (0 == blocks.size ( ) ? false : true); + mdr.setSkinDisplayed (0 == volume->getBlocks ( ).size ( ) ? false : true); } // if (3 == getEntity ( )->getDim ( )) getEntity ( )->getRepresentation (mdr, true); vector& points = mdr.getPoints ( ); diff --git a/src/Utils/protected/Utils/Entity.h b/src/Utils/protected/Utils/Entity.h index a60f0211..1988adee 100644 --- a/src/Utils/protected/Utils/Entity.h +++ b/src/Utils/protected/Utils/Entity.h @@ -443,6 +443,17 @@ bool remove(T* e, std::vector& entities) return false; } } + +template::value>> +void checkIfDestroyed(const std::vector& entities) +{ + for (T* e : entities) + if (e->isDestroyed()) { + TkUtil::UTF8String message; + message << e->getName() << " est marquée à détruire"; + throw TkUtil::Exception (message); + } +} #endif /*----------------------------------------------------------------------------*/ } // end namespace Utils From 64a1392025fcf0a3e057ec0e117da2fe7ee23621 Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Wed, 19 Nov 2025 11:47:47 +0100 Subject: [PATCH 13/18] Home made container removed --- src/Core/Geom/ExportVTKImplementation.cpp | 3 +- src/Core/Geom/GeomManager.cpp | 152 +--- src/Core/Internal/Context.cpp | 46 +- src/Core/Internal/NameManager.cpp | 6 +- src/Core/Mesh/Cloud.cpp | 15 +- src/Core/Mesh/CommandAddRemoveGroupName.cpp | 32 +- src/Core/Mesh/CommandClearGroupName.cpp | 32 +- src/Core/Mesh/CommandCreateMesh.cpp | 33 +- src/Core/Mesh/CommandDestroyMesh.cpp | 50 +- src/Core/Mesh/CommandNewBlocksMesh.cpp | 4 +- src/Core/Mesh/CommandNewFacesMesh.cpp | 4 +- src/Core/Mesh/CommandReadMLI.cpp | 2 +- .../Mesh/ExportBlocksCGNSImplementation.cpp | 6 +- src/Core/Mesh/Line.cpp | 11 +- src/Core/Mesh/MeshImplementation.cpp | 63 +- src/Core/Mesh/MeshImplementationGMSH.cpp | 2 +- .../Mesh/MeshImplementationStructured.cpp | 4 +- src/Core/Mesh/MeshImplementationTetgen.cpp | 219 +----- src/Core/Mesh/MeshManager.cpp | 159 ++--- src/Core/Mesh/SubSurface.cpp | 11 +- src/Core/Mesh/SubVolume.cpp | 17 +- src/Core/Mesh/Surface.cpp | 11 +- src/Core/Mesh/Volume.cpp | 11 +- .../Smoothing/MesquiteDomainImplAdapter.cpp | 13 +- src/Core/SysCoord/SysCoordManager.cpp | 46 +- src/Core/Topo/Block.cpp | 14 +- src/Core/Topo/CoEdge.cpp | 38 +- src/Core/Topo/CoFace.cpp | 52 +- src/Core/Topo/CommandDestroyTopo.cpp | 4 +- src/Core/Topo/CommandMakeBlocksByRevol.cpp | 5 +- src/Core/Topo/CommandModificationTopo.cpp | 4 +- src/Core/Topo/CommandProjectEdgesOnCurves.cpp | 3 +- .../Topo/CommandProjectFacesOnSurfaces.cpp | 3 +- src/Core/Topo/CommandRefineAllCoEdges.cpp | 7 +- .../Topo/CommandSnapProjectedVertices.cpp | 5 +- src/Core/Topo/CommandSplitBlocks.cpp | 7 +- src/Core/Topo/CommandSplitBlocksWithOgrid.cpp | 8 +- src/Core/Topo/CommandSplitFaces.cpp | 12 +- src/Core/Topo/CommandTransformTopo.cpp | 8 +- src/Core/Topo/Edge.cpp | 34 +- src/Core/Topo/ExportBlocksImplementation.cpp | 12 +- src/Core/Topo/Face.cpp | 23 +- src/Core/Topo/TopoManager.cpp | 670 +++--------------- src/Core/Topo/Vertex.cpp | 11 +- src/Core/protected/Geom/Curve.h | 2 +- src/Core/protected/Internal/NameManager.h | 62 +- src/Core/protected/Mesh/Cloud.h | 19 +- src/Core/protected/Mesh/CommandCreateMesh.h | 16 +- src/Core/protected/Mesh/Line.h | 17 +- src/Core/protected/Mesh/MeshEntity.h | 2 +- src/Core/protected/Mesh/MeshManager.h | 28 +- src/Core/protected/Mesh/SubSurface.h | 14 +- src/Core/protected/Mesh/SubVolume.h | 10 - src/Core/protected/Mesh/Surface.h | 15 +- src/Core/protected/Mesh/Volume.h | 15 +- src/Core/protected/SysCoord/SysCoordManager.h | 7 +- src/Core/protected/Topo/CoEdge.h | 4 +- src/Core/protected/Topo/CoFace.h | 8 +- src/Core/protected/Topo/Edge.h | 8 +- src/Core/protected/Topo/Face.h | 8 +- src/Core/protected/Topo/TopoManager.h | 21 +- src/Core/protected/Topo/Vertex.h | 4 +- src/QtComponents/QtGroupsPanel.cpp | 18 +- .../QtMeshInformationOperationAction.cpp | 6 +- .../QtMeshQualityDividerOperationAction.cpp | 4 +- .../QtMeshQualityOperationAction.cpp | 6 +- src/QtComponents/QtMgx3DMainWindow.cpp | 24 +- .../QtMgx3DQualityDividerWidget.cpp | 2 +- .../QtTopoInformationOperationAction.cpp | 18 +- .../QtTopologySplitBlockAction.cpp | 20 +- .../QtTopologySplitFacesAction.cpp | 7 +- src/Utils/protected/Utils/Container.h | 225 ------ src/Utils/protected/Utils/Entity.h | 25 +- 73 files changed, 589 insertions(+), 1898 deletions(-) delete mode 100644 src/Utils/protected/Utils/Container.h diff --git a/src/Core/Geom/ExportVTKImplementation.cpp b/src/Core/Geom/ExportVTKImplementation.cpp index dda9a189..ddf31f66 100644 --- a/src/Core/Geom/ExportVTKImplementation.cpp +++ b/src/Core/Geom/ExportVTKImplementation.cpp @@ -57,8 +57,7 @@ void ExportVTKImplementation::perform(Internal::InfoCommand* icmd) "one and only one block", TkUtil::Charset::UTF_8)); } - std::vector topo_blocs; - m_context.getTopoManager().getBlocks(topo_blocs); + std::vector topo_blocs = m_context.getTopoManager().getBlocksObj(); gmds::Mesh& mesh = m_context.getMeshManager().getMesh()->getGMDSMesh(); { diff --git a/src/Core/Geom/GeomManager.cpp b/src/Core/Geom/GeomManager.cpp index 1e63700b..038744d8 100644 --- a/src/Core/Geom/GeomManager.cpp +++ b/src/Core/Geom/GeomManager.cpp @@ -4555,138 +4555,22 @@ int GeomManager::getNbVolumes() const /*----------------------------------------------------------------------------*/ Volume* GeomManager::getVolume(const std::string& name, const bool exceptionIfNotFound) const { - Volume* vol = 0; - - std::string new_name; - if (getContext().getNameManager().isShiftingIdActivated()){ - if (Volume::isA(name)) - new_name = getContext().getNameManager().getTypeDedicatedNameManager(Utils::Entity::GeomVolume)->renameWithShiftingId(name); - else - return vol; - } - else - new_name = name; - - for (std::vector::const_iterator iter = m_volumes.begin(); - iter != m_volumes.end(); ++iter) - if (new_name == (*iter)->getName()) - vol = (*iter); - - if (exceptionIfNotFound && vol == 0){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getVolume impossible, entité \""<isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getVolume impossible, entité \""<renameWithShiftingId(name); - else - return surf; - } - else - new_name = name; - - for (std::vector::const_iterator iter = m_surfaces.begin(); - iter != m_surfaces.end(); ++iter) - if (new_name == (*iter)->getName()) - surf = (*iter); - - if (exceptionIfNotFound && surf == 0){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getSurface impossible, entité \""<isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getSurface impossible, entité \""<renameWithShiftingId(name); - else - return curve; - } - else - new_name = name; - - for (std::vector::const_iterator iter = m_curves.begin(); - iter != m_curves.end(); ++iter) - if (new_name == (*iter)->getName()) - curve = (*iter); - - if (exceptionIfNotFound && curve == 0){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getCurve impossible, entité \""<isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getCurve impossible, entité \""<renameWithShiftingId(name); - else - return vertex; - } - else - new_name = name; - - for (std::vector::const_iterator iter = m_vertices.begin(); - iter != m_vertices.end(); ++iter) - if (new_name == (*iter)->getName()) - vertex = (*iter); - - if (exceptionIfNotFound && vertex == 0){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getVertex impossible, entité \""<isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getVertex impossible, entité \""<::iterator iter; - iter = find(m_volumes.begin(), m_volumes.end(), v); - if (iter != m_volumes.end()) - m_volumes.erase(iter); - else - throw TkUtil::Exception("Erreur interne, volume absent du GeomManager pour removeVolume"); + Utils::remove(v, m_volumes); } /*----------------------------------------------------------------------------*/ void GeomManager::remove (Surface* s) { - std::vector::iterator iter; - iter = find(m_surfaces.begin(), m_surfaces.end(), s); - if (iter != m_surfaces.end()) - m_surfaces.erase(iter); - else - throw TkUtil::Exception("Erreur interne, surface absente du GeomManager pour removeSurface"); + Utils::remove(s, m_surfaces); } /*----------------------------------------------------------------------------*/ void GeomManager::remove (Curve* c) { - std::vector::iterator iter; - iter = find(m_curves.begin(), m_curves.end(), c); - if (iter != m_curves.end()) - m_curves.erase(iter); - else - throw TkUtil::Exception("Erreur interne, courbe absente du GeomManager pour removeCurve"); + Utils::remove(c, m_curves); } /*----------------------------------------------------------------------------*/ void GeomManager::remove (Vertex* v) { - std::vector::iterator iter; - iter = find(m_vertices.begin(), m_vertices.end(), v); - if (iter != m_vertices.end()) - m_vertices.erase(iter); - else - throw TkUtil::Exception("Erreur interne, sommet absent du GeomManager pour removeVertex"); + Utils::remove(v, m_vertices); } /*----------------------------------------------------------------------------*/ std::string GeomManager::getLastVolume() const diff --git a/src/Core/Internal/Context.cpp b/src/Core/Internal/Context.cpp index 50bebbe6..019df667 100644 --- a/src/Core/Internal/Context.cpp +++ b/src/Core/Internal/Context.cpp @@ -1727,22 +1727,15 @@ void Context::clearSession() // commande de destruction de toutes les entités topologiques qui ont pu être construites std::vector ve; - std::vector blocks; - getTopoManager().getBlocks(blocks); - for (uint i=0; i cofaces; - getTopoManager().getCoFaces(cofaces); - for (uint i=0; i coedges; - getTopoManager().getCoEdges(coedges); - for (uint i=0; i vertices; - getTopoManager().getVertices(vertices); - for (uint i=0; i entities; - std::vector volumes = getGeomManager().getVolumesObj(); - for (uint i=0; i surfaces = getGeomManager().getSurfacesObj(); - for (uint i=0; i curves = getGeomManager().getCurvesObj(); - for (uint i=0; i vtx = getGeomManager().getVerticesObj(); - for (uint i=0; igetCoEdgeContainer().push_back(ed); } /*----------------------------------------------------------------------------*/ -void Cloud::removeCoEdge(Topo::CoEdge* ed) +void Cloud::remove(Topo::CoEdge* ed) { Utils::remove(ed, m_topo_property->getCoEdgeContainer()); } @@ -115,12 +108,12 @@ const std::vector& Cloud::getCoEdges() const return m_topo_property->getCoEdgeContainer(); } /*----------------------------------------------------------------------------*/ -void Cloud::addVertex(Topo::Vertex* vtx) +void Cloud::add(Topo::Vertex* vtx) { m_topo_property->getVertexContainer().push_back(vtx); } /*----------------------------------------------------------------------------*/ -void Cloud::removeVertex(Topo::Vertex* vtx) +void Cloud::remove(Topo::Vertex* vtx) { Utils::remove(vtx, m_topo_property->getVertexContainer()); } diff --git a/src/Core/Mesh/CommandAddRemoveGroupName.cpp b/src/Core/Mesh/CommandAddRemoveGroupName.cpp index 57db047a..8e1e7a43 100644 --- a/src/Core/Mesh/CommandAddRemoveGroupName.cpp +++ b/src/Core/Mesh/CommandAddRemoveGroupName.cpp @@ -331,15 +331,15 @@ updateMesh(std::vector& blocs, std::string grpName, bool add) if (blk->isMeshed()){ if (add){ #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" addBlock("<<(*iter)->getName()<<")"<getName()<<" add("<<(*iter)->getName()<<")"<addBlock(blk); + mvol->add(blk); } else { #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" removeBlock("<<(*iter)->getName()<<")"<getName()<<" remove("<<(*iter)->getName()<<")"<removeBlock(blk); + mvol->remove(blk); } } if (isNewVolume) @@ -398,15 +398,15 @@ updateMesh(std::vector& cofaces, std::string grpName, bool add) if ((*iter)->isMeshed()){ if (add){ #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" addCoFace("<<(*iter)->getName()<<")"<getName()<<" add("<<(*iter)->getName()<<")"<addCoFace(*iter); + msurf->add(*iter); } else { #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" removeCoFace("<<(*iter)->getName()<<")"<getName()<<" remove("<<(*iter)->getName()<<")"<removeCoFace(*iter); + msurf->remove(*iter); } } } // end if (is_meshed) @@ -463,15 +463,15 @@ updateMesh(std::vector& coedges, std::string grpName, bool add) if ((*iter)->isMeshed()){ if (add){ #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" addCoEdge("<<(*iter)->getName()<<")"<getName()<<" add("<<(*iter)->getName()<<")"<addCoEdge(*iter); + mcld->add(*iter); } else { #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" removeCoEdge("<<(*iter)->getName()<<")"<getName()<<" remove("<<(*iter)->getName()<<")"<removeCoEdge(*iter); + mcld->remove(*iter); } } @@ -498,15 +498,15 @@ updateMesh(std::vector& coedges, std::string grpName, bool add) if ((*iter)->isMeshed()){ if (add){ #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" addCoEdge("<<(*iter)->getName()<<")"<getName()<<" add("<<(*iter)->getName()<<")"<addCoEdge(*iter); + mln->add(*iter); } else { #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" removeCoEdge("<<(*iter)->getName()<<")"<getName()<<" remove("<<(*iter)->getName()<<")"<removeCoEdge(*iter); + mln->remove(*iter); } } diff --git a/src/Core/Mesh/CommandClearGroupName.cpp b/src/Core/Mesh/CommandClearGroupName.cpp index eec9cf6a..d7433063 100644 --- a/src/Core/Mesh/CommandClearGroupName.cpp +++ b/src/Core/Mesh/CommandClearGroupName.cpp @@ -370,15 +370,15 @@ updateMesh(std::vector& blocs, std::string grpName, bool add) if ((*iter)->isMeshed()){ if (add){ #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" addBlock("<<(*iter)->getName()<<")"<getName()<<" add("<<(*iter)->getName()<<")"<addBlock(*iter); + mvol->add(*iter); } else { #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" removeBlock("<<(*iter)->getName()<<")"<getName()<<" remove("<<(*iter)->getName()<<")"<removeBlock(*iter); + mvol->remove(*iter); } } if (isNewVolume) @@ -437,15 +437,15 @@ updateMesh(std::vector& cofaces, std::string grpName, bool add) if ((*iter)->isMeshed()){ if (add){ #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" addCoFace("<<(*iter)->getName()<<")"<getName()<<" add("<<(*iter)->getName()<<")"<addCoFace(*iter); + msurf->add(*iter); } else { #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" removeCoFace("<<(*iter)->getName()<<")"<getName()<<" remove("<<(*iter)->getName()<<")"<removeCoFace(*iter); + msurf->remove(*iter); } } } // end if (is_meshed) @@ -502,15 +502,15 @@ updateMesh(std::vector& coedges, std::string grpName, bool add) if ((*iter)->isMeshed()){ if (add){ #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" addCoEdge("<<(*iter)->getName()<<")"<getName()<<" add("<<(*iter)->getName()<<")"<addCoEdge(*iter); + mcld->add(*iter); } else { #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" removeCoEdge("<<(*iter)->getName()<<")"<getName()<<" remove("<<(*iter)->getName()<<")"<removeCoEdge(*iter); + mcld->remove(*iter); } } @@ -537,15 +537,15 @@ updateMesh(std::vector& coedges, std::string grpName, bool add) if ((*iter)->isMeshed()){ if (add){ #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" addCoEdge("<<(*iter)->getName()<<")"<getName()<<" add("<<(*iter)->getName()<<")"<addCoEdge(*iter); + mln->add(*iter); } else { #ifdef _DEBUG_UPDATE - std::cout<<" "<getName()<<" removeCoEdge("<<(*iter)->getName()<<")"<getName()<<" remove("<<(*iter)->getName()<<")"<removeCoEdge(*iter); + mln->remove(*iter); } } diff --git a/src/Core/Mesh/CommandCreateMesh.cpp b/src/Core/Mesh/CommandCreateMesh.cpp index fabbfd32..76373c98 100644 --- a/src/Core/Mesh/CommandCreateMesh.cpp +++ b/src/Core/Mesh/CommandCreateMesh.cpp @@ -697,7 +697,7 @@ void CommandCreateMesh::addNewCloud(const std::string& name) getInfoCommand().addMeshInfoEntity(cl, Internal::InfoCommand::CREATED); getMeshManager().add(cl); - m_created_clouds.add(cl); + m_created_clouds.push_back(cl); } /*----------------------------------------------------------------------------*/ void CommandCreateMesh::addNewLine(const std::string& name) @@ -710,7 +710,7 @@ void CommandCreateMesh::addNewLine(const std::string& name) getInfoCommand().addMeshInfoEntity(ln, Internal::InfoCommand::CREATED); getMeshManager().add(ln); - m_created_lines.add(ln); + m_created_lines.push_back(ln); } /*----------------------------------------------------------------------------*/ void CommandCreateMesh::addNewSurface(const std::string& name) @@ -723,7 +723,7 @@ void CommandCreateMesh::addNewSurface(const std::string& name) getInfoCommand().addMeshInfoEntity(sf, Internal::InfoCommand::CREATED); getMeshManager().add(sf); - m_created_surfaces.add(sf); + m_created_surfaces.push_back(sf); } /*----------------------------------------------------------------------------*/ void CommandCreateMesh::addNewVolume(const std::string& name) @@ -736,7 +736,7 @@ void CommandCreateMesh::addNewVolume(const std::string& name) getInfoCommand().addMeshInfoEntity(vo, Internal::InfoCommand::CREATED); getMeshManager().add(vo); - m_created_volumes.add(vo); + m_created_volumes.push_back(vo); } /*----------------------------------------------------------------------------*/ void CommandCreateMesh::addModifiedCloud(const std::string& name) @@ -954,27 +954,26 @@ deleteCreatedMeshGroups() if (m_strategy == MeshManager::MODIFIABLE){ // désenregistrement du MeshManager des groupes créés - for (std::vector::const_iterator iter = m_created_clouds.get().begin(); - iter != m_created_clouds.get().end(); ++iter) + for (std::vector::const_iterator iter = m_created_clouds.begin(); + iter != m_created_clouds.end(); ++iter) getMeshManager().remove(*iter); - for (std::vector::const_iterator iter = m_created_lines.get().begin(); - iter != m_created_lines.get().end(); ++iter) + for (std::vector::const_iterator iter = m_created_lines.begin(); + iter != m_created_lines.end(); ++iter) getMeshManager().remove(*iter); - for (std::vector::const_iterator iter = m_created_surfaces.get().begin(); - iter != m_created_surfaces.get().end(); ++iter) + for (std::vector::const_iterator iter = m_created_surfaces.begin(); + iter != m_created_surfaces.end(); ++iter) getMeshManager().remove(*iter); - for (std::vector::const_iterator iter = m_created_volumes.get().begin(); - iter != m_created_volumes.get().end(); ++iter) + for (std::vector::const_iterator iter = m_created_volumes.begin(); + iter != m_created_volumes.end(); ++iter) getMeshManager().remove(*iter); - m_created_clouds.deleteAndClear(); - m_created_lines.deleteAndClear(); - m_created_surfaces.deleteAndClear(); - m_created_volumes.deleteAndClear(); - + Utils::deleteAndClear(m_created_clouds); + Utils::deleteAndClear(m_created_lines); + Utils::deleteAndClear(m_created_surfaces); + Utils::deleteAndClear(m_created_volumes); } } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Mesh/CommandDestroyMesh.cpp b/src/Core/Mesh/CommandDestroyMesh.cpp index 95d5a8fb..8516f8a1 100644 --- a/src/Core/Mesh/CommandDestroyMesh.cpp +++ b/src/Core/Mesh/CommandDestroyMesh.cpp @@ -28,22 +28,15 @@ CommandDestroyMesh::~CommandDestroyMesh() void CommandDestroyMesh::internalExecute() { std::vector me; - std::vector mvol; - getContext().getMeshManager().getVolumes(mvol); - for (uint i=0; i msurf; - getContext().getMeshManager().getSurfaces(msurf); - for (uint i=0; i mline; - getContext().getMeshManager().getLines(mline); - for (uint i=0; i mcloud; - getContext().getMeshManager().getClouds(mcloud); - for (uint i=0; i blocks; - getContext().getTopoManager().getBlocks(blocks); - for (uint i=0; igetMeshingData()->setMeshed(false); - std::vector cofaces; - getContext().getTopoManager().getCoFaces(cofaces); - for (uint i=0; igetMeshingData()->setMeshed(false); - std::vector coedges; - getContext().getTopoManager().getCoEdges(coedges); - for (uint i=0; igetMeshingData()->setMeshed(false); - std::vector vertices; - getContext().getTopoManager().getVertices(vertices); - for (uint i=0; igetMeshingData()->setMeshed(false); + Topo::TopoManager& tm = getContext().getTopoManager(); + for (Topo::Block* b : tm.getBlocksObj()) + b->getMeshingData()->setMeshed(false); + for (Topo::CoFace* cf : tm.getCoFacesObj()) + cf->getMeshingData()->setMeshed(false); + for (Topo::CoEdge* ce : tm.getCoEdgesObj()) + ce->getMeshingData()->setMeshed(false); + for (Topo::Vertex* v : tm.getVerticesObj()) + v->getMeshingData()->setMeshed(false); } /*----------------------------------------------------------------------------*/ void CommandDestroyMesh::internalUndo() diff --git a/src/Core/Mesh/CommandNewBlocksMesh.cpp b/src/Core/Mesh/CommandNewBlocksMesh.cpp index e8185c8f..5891ba4e 100644 --- a/src/Core/Mesh/CommandNewBlocksMesh.cpp +++ b/src/Core/Mesh/CommandNewBlocksMesh.cpp @@ -45,9 +45,7 @@ CommandNewBlocksMesh:: CommandNewBlocksMesh(Internal::Context& c, size_t tasksNum) : CommandCreateMesh(c, "Création du maillage pour tous les blocs", tasksNum) { - std::vector blocs; - getContext().getTopoManager().getBlocks(blocs, true); - + std::vector blocs = getContext().getTopoManager().getBlocksObj(); validate(blocs); } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Mesh/CommandNewFacesMesh.cpp b/src/Core/Mesh/CommandNewFacesMesh.cpp index 8e039bae..50fc0e8c 100644 --- a/src/Core/Mesh/CommandNewFacesMesh.cpp +++ b/src/Core/Mesh/CommandNewFacesMesh.cpp @@ -29,9 +29,7 @@ CommandNewFacesMesh:: CommandNewFacesMesh(Internal::Context& c, size_t tasksNum) : CommandCreateMesh(c, "Création du maillage pour toutes les faces", tasksNum) { - std::vector faces; - getContext().getTopoManager().getCoFaces(faces); - + std::vector faces = getContext().getTopoManager().getCoFacesObj(); validate(faces); } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Mesh/CommandReadMLI.cpp b/src/Core/Mesh/CommandReadMLI.cpp index 4967abd1..7e25dd38 100644 --- a/src/Core/Mesh/CommandReadMLI.cpp +++ b/src/Core/Mesh/CommandReadMLI.cpp @@ -138,7 +138,7 @@ void CommandReadMLI::internalExecute() for (auto face_id : surf->cells()) { auto face = gmdsMesh.get(face_id); - ss->addFace(face); + ss->add(face); } getContext().newGraphicalRepresentation (*ss); diff --git a/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp b/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp index 6b6cdb2b..e3b6c297 100644 --- a/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp +++ b/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp @@ -55,11 +55,8 @@ namespace Mgx3D { gmds::Node n = mesh.newNode(n_local.X(),n_local.Y(),n_local.Z()); } - m_context.getTopoManager().getBlocks(topo_blocs); - m_context.getTopoManager().getCoFaces(topo_faces); - + std::vector topo_faces = m_context.getTopoManager().getCoFacesObj(); std::map topoF_2_gmdsF; - for (auto cf : topo_faces) { int n0 = cf->getVertex(0)->getNode(); int n1 = cf->getVertex(1)->getNode(); @@ -73,6 +70,7 @@ namespace Mgx3D { std::map topoB_2_gmdsB; + std::vector topo_blocs = m_context.getTopoManager().getBlocksObj(); for(int iBlock = 0; iBlock < topo_blocs.size(); iBlock++){ Topo::Block* block = topo_blocs[iBlock]; std::vector ids; diff --git a/src/Core/Mesh/Line.cpp b/src/Core/Mesh/Line.cpp index 163999a6..d9f95e3f 100644 --- a/src/Core/Mesh/Line.cpp +++ b/src/Core/Mesh/Line.cpp @@ -85,25 +85,18 @@ void Line::getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestroy // cf VTKGMDSEntityRepresentation } /*----------------------------------------------------------------------------*/ -bool Line::isA(std::string& name) -{ - MGX_NOT_YET_IMPLEMENTED("Il n'est pas prévu de faire un tel test"); -// return (name.compare(0,strlen(typeNameMeshLine),typeNameMeshLine) == 0); - return false; -} -/*----------------------------------------------------------------------------*/ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Line & cl) { o << cl.getName() << " (uniqueId " << cl.getUniqueId() << ", Name "<getCoEdgeContainer().push_back(ed); } /*----------------------------------------------------------------------------*/ -void Line::removeCoEdge(Topo::CoEdge* ed) +void Line::remove(Topo::CoEdge* ed) { Utils::remove(ed, m_topo_property->getCoEdgeContainer()); } diff --git a/src/Core/Mesh/MeshImplementation.cpp b/src/Core/Mesh/MeshImplementation.cpp index e569bc06..033b615e 100644 --- a/src/Core/Mesh/MeshImplementation.cpp +++ b/src/Core/Mesh/MeshImplementation.cpp @@ -211,16 +211,7 @@ bool MeshImplementation::createGMDSGroups() { // création des clouds, lines, surfaces et volumes gmds correspondants aux // Mgx3D::Mesh::Cloud, Line, Surface et Volume - - std::vector clouds; - getContext().getMeshManager().getClouds(clouds); - std::vector lines; - getContext().getMeshManager().getLines(lines); - std::vector surfaces; - getContext().getMeshManager().getSurfaces(surfaces); - std::vector volumes; - getContext().getMeshManager().getVolumes(volumes); - + Mesh::MeshManager& mm = getContext().getMeshManager(); std::vector*> createdGMDSClouds; std::vector*> createdGMDSLines; std::vector*> createdGMDSSurfaces; @@ -228,8 +219,7 @@ bool MeshImplementation::createGMDSGroups() try { - for(unsigned int iCloud=0; iCloudgetName() + std::string("ND"); auto cl = getGMDSMesh().newGroup(cloudName); @@ -244,9 +234,7 @@ bool MeshImplementation::createGMDSGroups() } // std::string lineDefaultName = getContext().getGroupManager().getDefaultName(1); - for(unsigned int iLine=0; iLine 1 && current_line->getName() == lineDefaultName) // continue; @@ -262,8 +250,7 @@ bool MeshImplementation::createGMDSGroups() } } - for(unsigned int iSurf=0; iSurf(current_surf->getName()); createdGMDSSurfaces.push_back(su); @@ -275,8 +262,7 @@ bool MeshImplementation::createGMDSGroups() } } - for(unsigned int iVol=0; iVol(current_vol->getName()); createdGMDSVolumes.push_back(vo); @@ -410,9 +396,6 @@ void MeshImplementation::writeCGNS(std::string nom) // les indices sont à choisir comme en fortran (à partir de 1) // REM CP : pour ne pas dépendre de l'option +scoping (sous spack) de CGNS on utilise // ici la macro CGNS_ENUMV. - - std::vector blocks; - getContext().getTopoManager().getBlocks(blocks, true); gmds::Mesh& gmdsMesh = getGMDSMesh(); int index_file, icelldim, iphysdim, index_base; @@ -432,8 +415,7 @@ void MeshImplementation::writeCGNS(std::string nom) throw TkUtil::Exception (TkUtil::UTF8String ("Erreur dans cg_base_write", TkUtil::Charset::UTF_8)); // on ajoute un à un tous les blocks maillés et structurés - for (uint i=0; iisMeshed() && bloc->isStructured()){ if (bloc->getVertices().size() != 8){ @@ -925,41 +907,24 @@ void MeshImplementation::deleteGMDSGroups() { // destruction des clouds, surfaces et volumes gmds correspondants aux // Mgx3D::Mesh::Cloud, Surface et Volume + Mesh::MeshManager& mm = getContext().getMeshManager(); - std::vector clouds; - getContext().getMeshManager().getClouds(clouds); - std::vector lines; - getContext().getMeshManager().getLines(lines); - std::vector surfaces; - getContext().getMeshManager().getSurfaces(surfaces); - std::vector volumes; - getContext().getMeshManager().getVolumes(volumes); - - - for(unsigned int iCloud=0; iCloudgetName() + std::string("ND"); getGMDSMesh().deleteGroup(getGMDSMesh().getGroup(cloudName)); } - for(unsigned int iLine=0; iLine(getGMDSMesh().getGroup(current_line->getName())); } - for(unsigned int iSurf=0; iSurf(getGMDSMesh().getGroup(current_surf->getName())); } - for(unsigned int iVol=0; iVol(getGMDSMesh().getGroup(current_vol->getName())); } } @@ -1288,7 +1253,7 @@ void MeshImplementation::_addNodesInClouds(Mesh::CommandCreateMesh* command, Top Mesh::Cloud* cl = getContext().getMeshManager().getCloud(nom); cl->saveMeshCloudTopoProperty(&command->getInfoCommand()); - cl->addCoEdge(ed); + cl->add(ed); } // end for isaveMeshCloudTopoProperty(&command->getInfoCommand()); - cl->addVertex(ve); + cl->add(ve); } // end for isaveMeshLineTopoProperty(&command->getInfoCommand()); - ln->addCoEdge(ed); + ln->add(ed); } // end for isaveMeshSurfaceTopoProperty(&command->getInfoCommand()); - sf->addCoFace(fa); + sf->add(fa); } // end for iaddBlock(bl); + vol->add(bl); if (isNewVolume) getContext().newGraphicalRepresentation (*vol); } // end for iaddCoFace(fa); + sf->add(fa); } // end for i allFaces; -// // pour les noeuds de ces faces, on construit une connectivité indirecte -// std::map > N2Faces; -// //============================================================================ -// //recuperation des faces sur lesquelles on travaillera -// for(unsigned int i=0;i mfaces = mesh_faces[i]; -// allFaces.insert(allFaces.end(),mfaces.begin(),mfaces.end()); -// } -// //marquage des faces sur lesquelles on travaill -// std::list::iterator itOF = allFaces.begin(); -// Face *currentF; -// for(;itOF!=allFaces.end();itOF++) -// { -// currentF = *itOF; -// //creation de N2F -// std::vector currentNodes = currentF->getNodes(); -// for(unsigned int i =0;i currentNodes = currentF->getNodes(); -// //pour chaque arete, on recupere le triangle adjacent -// Node *n0=currentNodes[0]; -// Node *n1=currentNodes[1]; -// Node *n2=currentNodes[2]; -// -// std::vector nnn; -// nnn.push_back(n0); -// nnn.push_back(n2); -// nnn.push_back(n1); -// currentF->setNodes(nnn); -// -// getGMDSMesh().mark(currentF,orientMark); -// -// bool finishOrient=false; -// int nbPermutations = 0; -// allFaces.size(); -// do{ -// int nbMarkedFaces=0; -// std::cout<<"================================"<::iterator itOF = allFaces.begin(); -// for(;itOF!=allFaces.end();itOF++) -// { -// currentF = *itOF; -// bool reoriented = false; -// if(!getGMDSMesh().isMarked(currentF,orientMark)){ -// std::cout<<"FACE A REORIENTER"< currentNodes = currentF->getNodes(); -// //pour chaque arete, on recupere le triangle adjacent -// Node *n0=currentNodes[0]; -// Node *n1=currentNodes[1]; -// Node *n2=currentNodes[2]; -// -// std::vector n0Faces = N2Faces[n0]; -// std::vector n1Faces = N2Faces[n1]; -// std::vector n2Faces = N2Faces[n2]; -// //ARETE 01 -// Face* f01=0; -// for(unsigned int i0=0;i0getID()<<" "<getID()<<" "<getID()< f01Nodes = f01->getNodes(); -// for(unsigned int i=0;i f02Nodes = f02->getNodes(); -// -// for(unsigned int i=0;i f12Nodes = f12->getNodes(); -// -// for(unsigned int i=0;i newNodes; -// newNodes.push_back(n0); -// newNodes.push_back(n2); -// newNodes.push_back(n1); -// currentF->setNodes(newNodes); -// nbPermutations++; -// } -// -// getGMDSMesh().mark(currentF,orientMark); -// nbMarkedFaces++; -// } -// -// } -// } -// -// if(nbMarkedFaces==0) -// finishOrient=true; -// } -// while(finishOrient==false); -// -// std::cout<<"REORIENTATION EFFECTUEE, nb permutations = "< mfaces = mesh_faces[i]; -// for(unsigned int j=0;jaddBlock(bl); + vol->add(bl); if (isNewVolume) getContext().newGraphicalRepresentation (*vol); @@ -621,7 +406,7 @@ meshDelaunayTetgen(Mesh::CommandCreateMesh* command, Topo::Block* bl) // } // // la surface de maillage que l'on vient de créer/modifier // Mesh::Surface* sf = getContext().getMeshManager().getSurface(nom); -// sf->addCoFace(fa); +// sf->add(fa); // } // end for i& clouds = m_clouds.get(); - for (std::vector::const_iterator iter = clouds.begin(); - iter != clouds.end(); ++iter) - if (name == (*iter)->getName()) - cloud = (*iter); - - if (exceptionIfNotFound && cloud == 0){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getCloud impossible, entité \""<& AClouds) const +std::vector MeshManager::getCloudsObj() const { - AClouds = m_clouds.get(); + return Utils::filterAndSort(m_clouds); } /*----------------------------------------------------------------------------*/ void MeshManager::add(Line* ln) { - m_lines.add(ln); + m_lines.push_back(ln); } /*----------------------------------------------------------------------------*/ void MeshManager::remove(Line* ln) { - m_lines.remove(ln, true); + Utils::remove(ln, m_lines); } /*----------------------------------------------------------------------------*/ Line* MeshManager::getLine(const std::string& name, const bool exceptionIfNotFound) const { - Line* line = 0; - const std::vector& lines = m_lines.get(); - for (std::vector::const_iterator iter = lines.begin(); - iter != lines.end(); ++iter) - if (name == (*iter)->getName()) - line = (*iter); - - if (exceptionIfNotFound && line == 0){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getLine impossible, entité \""<& ALines) const +std::vector MeshManager::getLinesObj() const { - ALines = m_lines.get(); + return Utils::filterAndSort(m_lines); } /*----------------------------------------------------------------------------*/ void MeshManager::add(Surface* sf) { - m_surfaces.add(sf); + m_surfaces.push_back(sf); } /*----------------------------------------------------------------------------*/ void MeshManager::remove(Surface* sf) { - m_surfaces.remove(sf, true); + Utils::remove(sf, m_surfaces); } /*----------------------------------------------------------------------------*/ Surface* MeshManager::getSurface(const std::string& name, const bool exceptionIfNotFound) const { - Surface* surf = 0; - - const std::vector& surfaces = m_surfaces.get(); - for (std::vector::const_iterator iter = surfaces.begin(); - iter != surfaces.end(); ++iter) - if (name == (*iter)->getName()) - surf = (*iter); - - if (exceptionIfNotFound && surf == 0){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getSurface impossible, entité \""<& ASurfaces) const +std::vector MeshManager::getSurfacesObj() const { - ASurfaces = m_surfaces.get(); + return Utils::filterAndSort(m_surfaces); } /*----------------------------------------------------------------------------*/ void MeshManager::add(Volume* vo) { - m_volumes.add(vo); + m_volumes.push_back(vo); } /*----------------------------------------------------------------------------*/ void MeshManager::remove(Volume* vo) { - //std::cout<<"MeshManager::remove("<getName()<<")"<& volumes = m_volumes.get(); - for (std::vector::const_iterator iter = volumes.begin(); - iter != volumes.end(); ++iter) - if (name == (*iter)->getName()) - vol = (*iter); - - if (exceptionIfNotFound && vol == 0){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getVolume impossible, entité \""< MeshManager::getVolumesObj() const +{ + return Utils::filterAndSort(m_volumes); } /*----------------------------------------------------------------------------*/ SubVolume* MeshManager::getNewSubVolume(const std::string& gr_name, Internal::InfoCommand* icmd) @@ -199,9 +145,8 @@ SubVolume* MeshManager::getNewSubVolume(const std::string& gr_name, Internal::In throw TkUtil::Exception (TkUtil::UTF8String ("Création d'un sous-volume impossible sans un nom", TkUtil::Charset::UTF_8)); Volume* vol = 0; - const std::vector& volumes = m_volumes.get(); - for (std::vector::const_iterator iter = volumes.begin(); - iter != volumes.end(); ++iter) + for (std::vector::const_iterator iter = m_volumes.begin(); + iter != m_volumes.end(); ++iter) if (gr_name == (*iter)->getName()) vol = (*iter); @@ -234,11 +179,6 @@ SubVolume* MeshManager::getNewSubVolume(const std::string& gr_name, Internal::In return sv; } /*----------------------------------------------------------------------------*/ -void MeshManager::getVolumes(std::vector& AVolumes) const -{ - AVolumes = m_volumes.get(); -} -/*----------------------------------------------------------------------------*/ Mgx3D::Internal::M3DCommandResult* MeshManager::newBlocksMesh(std::vector& names) { std::vector entities; @@ -529,28 +469,19 @@ std::string MeshManager::getInfos(const Volume* me) const return std::string("Volume non trouvé !"); } /*----------------------------------------------------------------------------*/ -int MeshManager::getNbClouds(bool onlyVisible) const +int MeshManager::getNbClouds() const { - if (onlyVisible) - return m_clouds.getVisibleNb(); - else - return m_clouds.getNb(); + return getCloudsObj().size(); } /*----------------------------------------------------------------------------*/ -int MeshManager::getNbSurfaces(bool onlyVisible) const +int MeshManager::getNbSurfaces() const { - if (onlyVisible) - return m_surfaces.getVisibleNb(); - else - return m_surfaces.getNb(); + return getSurfacesObj().size(); } /*----------------------------------------------------------------------------*/ -int MeshManager::getNbVolumes(bool onlyVisible) const +int MeshManager::getNbVolumes() const { - if (onlyVisible) - return m_volumes.getVisibleNb(); - else - return m_volumes.getNb(); + return getVolumesObj().size(); } /*----------------------------------------------------------------------------*/ int MeshManager::getNbNodes() @@ -634,6 +565,22 @@ CommandMeshExplorer* MeshManager::endExplorer(CommandMeshExplorer* oldExplo, boo return cmdResult; } /*----------------------------------------------------------------------------*/ +template ::value>> +T* MeshManager::findByName(const std::string& name, const std::vector entities, const bool exceptionIfNotFound) const +{ + T* entity = 0; + for (T* e : entities) + if (name == e->getName()) + entity = e; + + if (exceptionIfNotFound && entity == 0) { + TkUtil::UTF8String message (TkUtil::Charset::UTF_8); + message << name << " n'a pas été trouvée dans le MeshManager"; + throw TkUtil::Exception(message); + } + + return entity; +} /*----------------------------------------------------------------------------*/ } // end namespace Mesh /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Mesh/SubSurface.cpp b/src/Core/Mesh/SubSurface.cpp index 57a12234..a0b0801b 100644 --- a/src/Core/Mesh/SubSurface.cpp +++ b/src/Core/Mesh/SubSurface.cpp @@ -73,19 +73,12 @@ Utils::SerializedRepresentation* SubSurface::getDescription (bool alsoComputed) return description.release ( ); } /*----------------------------------------------------------------------------*/ -bool SubSurface::isA(std::string& name) -{ - MGX_NOT_YET_IMPLEMENTED("Il n'est pas prévu de faire un tel test"); -// return (name.compare(0,strlen(typeNameMeshSubSurface),typeNameMeshSubSurface) == 0); - return false; -} -/*----------------------------------------------------------------------------*/ -void SubSurface::addFace(gmds::Face face) +void SubSurface::add(gmds::Face face) { m_poly.push_back(face); } /*----------------------------------------------------------------------------*/ -void SubSurface::addFace(std::vector faces) +void SubSurface::add(std::vector faces) { m_poly.insert(m_poly.end(), faces.begin(), faces.end()); } diff --git a/src/Core/Mesh/SubVolume.cpp b/src/Core/Mesh/SubVolume.cpp index cb4235f9..444c0104 100644 --- a/src/Core/Mesh/SubVolume.cpp +++ b/src/Core/Mesh/SubVolume.cpp @@ -1,15 +1,7 @@ -/*----------------------------------------------------------------------------*/ -/* - * \file SubVolume.cpp - * - * \author Eric Brière de l'Isle - * - * \date 6/12/12 - */ -/*----------------------------------------------------------------------------*/ #include "Mesh/SubVolume.h" #include "Mesh/MeshDisplayRepresentation.h" #include "Mesh/MeshImplementation.h" +#include "Mesh/MeshManager.h" #include "Utils/Common.h" #include "Utils/SerializedRepresentation.h" @@ -253,13 +245,6 @@ Utils::SerializedRepresentation* SubVolume::getDescription (bool alsoComputed) c return description.release ( ); } /*----------------------------------------------------------------------------*/ -bool SubVolume::isA(std::string& name) -{ - MGX_NOT_YET_IMPLEMENTED("Il n'est pas prévu de faire un tel test"); -// return (name.compare(0,strlen(typeNameMeshSubVolume),typeNameMeshSubVolume) == 0); - return false; -} -/*----------------------------------------------------------------------------*/ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const SubVolume & cl) { o << cl.getName() << " (uniqueId " << cl.getUniqueId() << ", Name "<getCoFaceContainer().push_back(f); } /*----------------------------------------------------------------------------*/ -void Surface::removeCoFace(Topo::CoFace* f) +void Surface::remove(Topo::CoFace* f) { Utils::remove(f, m_topo_property->getCoFaceContainer()); } diff --git a/src/Core/Mesh/Volume.cpp b/src/Core/Mesh/Volume.cpp index a3dfa319..48fade7f 100644 --- a/src/Core/Mesh/Volume.cpp +++ b/src/Core/Mesh/Volume.cpp @@ -317,25 +317,18 @@ void Volume::getRepresentation(Utils::DisplayRepresentation& dr, bool checkDestr } // if (true == solid) } /*----------------------------------------------------------------------------*/ -bool Volume::isA(std::string& name) -{ - MGX_NOT_YET_IMPLEMENTED("Il n'est pas prévu de faire un tel test"); -// return (name.compare(0,strlen(typeNameMeshVolume),typeNameMeshVolume) == 0); - return false; -} -/*----------------------------------------------------------------------------*/ TkUtil::UTF8String & operator << (TkUtil::UTF8String & o, const Volume & cl) { o << cl.getName() << " (uniqueId " << cl.getUniqueId() << ", Name "<getBlockContainer().push_back(b); } /*----------------------------------------------------------------------------*/ -void Volume::removeBlock(Topo::Block* b) +void Volume::remove(Topo::Block* b) { Utils::remove(b, m_topo_property->getBlockContainer()); } diff --git a/src/Core/Smoothing/MesquiteDomainImplAdapter.cpp b/src/Core/Smoothing/MesquiteDomainImplAdapter.cpp index 962d50cf..bd44a032 100644 --- a/src/Core/Smoothing/MesquiteDomainImplAdapter.cpp +++ b/src/Core/Smoothing/MesquiteDomainImplAdapter.cpp @@ -40,15 +40,10 @@ MesquiteDomainImplAdapter( m_mesquite2GMDSNodes(AMesquite2GMDSNodes), m_mesquite2GMDSCells2D(AMesquite2GMDSCells2D), m_mesquite2GMDSCells3D(AMesquite2GMDSCells3D) { - std::vector blocks; - std::vector coFaces; - std::vector coEdges; - std::vector vertices; - - m_topoManager.getBlocks(blocks); - m_topoManager.getCoFaces(coFaces); - m_topoManager.getCoEdges(coEdges); - m_topoManager.getVertices(vertices); + auto blocks = m_topoManager.getBlocksObj(); + auto coFaces = m_topoManager.getCoFacesObj(); + auto coEdges = m_topoManager.getCoEdgesObj(); + auto vertices = m_topoManager.getVerticesObj(); // for(unsigned int iBlock=0; iBlock& regions = blocks[iBlock]->regions(); diff --git a/src/Core/SysCoord/SysCoordManager.cpp b/src/Core/SysCoord/SysCoordManager.cpp index 04ea67c4..b70c8ed8 100644 --- a/src/Core/SysCoord/SysCoordManager.cpp +++ b/src/Core/SysCoord/SysCoordManager.cpp @@ -47,6 +47,16 @@ void SysCoordManager::clear() m_reperes.clear(); } /*----------------------------------------------------------------------------*/ +void SysCoordManager::add(SysCoord* rep) +{ + m_reperes.push_back(rep); +} +/*----------------------------------------------------------------------------*/ +void SysCoordManager::remove(SysCoord* rep) +{ + Utils::remove(rep, m_reperes); +} +/*----------------------------------------------------------------------------*/ Mgx3D::Internal::M3DCommandResult* SysCoordManager::newSysCoord(std::string groupName) { @@ -282,41 +292,7 @@ SysCoordManager::copy(SysCoord* syscoord, std::string groupName) /*----------------------------------------------------------------------------*/ SysCoord* SysCoordManager::getSysCoord (const std::string& name, const bool exceptionIfNotFound) const { - SysCoord* rep = 0; - - std::string new_name; - if (getContext().getNameManager().isShiftingIdActivated()) - new_name = getContext().getNameManager().getTypeDedicatedNameManager(Utils::Entity::SysCoord)->renameWithShiftingId(name); - else - new_name = name; - - if (SysCoord::isA(new_name)){ - const std::vector& sysCoord = m_reperes.get(); - for (std::vector::const_iterator iter2 = sysCoord.begin(); - iter2 != sysCoord.end() && rep == 0; ++iter2){ - if (new_name == (*iter2)->getName()) - rep = (*iter2); - } - } - else if (exceptionIfNotFound){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getSysCoord impossible, entité \""<isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getSysCoord trouve l'entité \""< faces = getFaces(); for (uint i=0; iaddBlock(this); + faces[i]->add(this); getContext ( ).newGraphicalRepresentation (*this); } /*----------------------------------------------------------------------------*/ @@ -383,8 +383,8 @@ replace(Face* f1, Face* f2, Internal::InfoCommand* icmd) f1->saveFaceTopoProperty(icmd); f2->saveFaceTopoProperty(icmd); - f1->removeBlock(this); - f2->addBlock(this); + f1->remove(this); + f2->add(this); } } /*----------------------------------------------------------------------------*/ @@ -2631,10 +2631,10 @@ free(Internal::InfoCommand* icmd) setDestroyed(true); // suppression des relations remontantes des faces vers ce block - const std::vector& faces = getFaces(); - for (uint i=0; isaveFaceTopoProperty(icmd); - faces[i]->removeBlock(this); + for (Face* face : getFaces()) { + face->saveFaceTopoProperty(icmd); + if (Utils::contains(this, face->getBlocks())) + face->remove(this); } clearDependancy(); diff --git a/src/Core/Topo/CoEdge.cpp b/src/Core/Topo/CoEdge.cpp index a5d63ee5..3e0c4122 100644 --- a/src/Core/Topo/CoEdge.cpp +++ b/src/Core/Topo/CoEdge.cpp @@ -76,8 +76,8 @@ CoEdge(Internal::Context& ctx, m_topo_property->getVertexContainer().push_back(v2); // association remontante - v1->addCoEdge(this); - v2->addCoEdge(this); + v1->add(this); + v2->add(this); // om met une discrétisation par défaut if (m_mesh_property == 0){ @@ -142,12 +142,12 @@ CoEdge:: } } /*----------------------------------------------------------------------------*/ -void CoEdge::addEdge(Edge* e) +void CoEdge::add(Edge* e) { m_topo_property->getEdgeContainer().push_back(e); } /*----------------------------------------------------------------------------*/ -void CoEdge::removeEdge(Edge* e) +void CoEdge::remove(Edge* e) { Utils::remove(e, m_topo_property->getEdgeContainer()); } @@ -187,8 +187,8 @@ replace(Topo::Vertex* v1, Topo::Vertex* v2, bool propagate_up, bool propagate_do saveCoEdgeTopoProperty(icmd); m_topo_property->getVertexContainer()[i] = v2; - v1->removeCoEdge(this); - v2->addCoEdge(this); + v1->remove(this); + v2->add(this); } if (propagate_up && !found) @@ -293,13 +293,15 @@ free(Internal::InfoCommand* icmd) // on supprime l'arête des relations des sommets vers les arêtes communes for (Vertex* v : getVertices()) { v->saveVertexTopoProperty(icmd); - v->removeCoEdge(this); + if (Utils::contains(this, v->getCoEdges())) + v->remove(this); } // idem entre arêtes et arêtes communes for (Edge* e : getEdges()) { e->saveEdgeTopoProperty(icmd); - e->removeCoEdge(this); + if (Utils::contains(this, e->getCoEdges())) + e->remove(this); } clearDependancy(); @@ -432,11 +434,11 @@ std::vector CoEdge::split(Topo::Vertex* vtx, uint nbMeshingEdges, Inter edges[i]->setRatio(coedge2, ratio); } edges[i]->saveEdgeTopoProperty(icmd); - edges[i]->addCoEdge(coedge1); - edges[i]->addCoEdge(coedge2); + edges[i]->add(coedge1); + edges[i]->add(coedge2); - coedge1->addEdge(edges[i]); - coedge2->addEdge(edges[i]); + coedge1->add(edges[i]); + coedge2->add(edges[i]); } // on met de côté la liste des Edges touchées @@ -622,13 +624,13 @@ std::vector CoEdge::split(uint nbMeshingEdges1, uint nbMeshingEdg } edges[i]->saveEdgeTopoProperty(icmd); - edges[i]->addCoEdge(coedge1); - edges[i]->addCoEdge(coedge2); - edges[i]->addCoEdge(coedge3); + edges[i]->add(coedge1); + edges[i]->add(coedge2); + edges[i]->add(coedge3); - coedge1->addEdge(edges[i]); - coedge2->addEdge(edges[i]); - coedge3->addEdge(edges[i]); + coedge1->add(edges[i]); + coedge2->add(edges[i]); + coedge3->add(edges[i]); } // on met de côté la liste des Edges touchées diff --git a/src/Core/Topo/CoFace.cpp b/src/Core/Topo/CoFace.cpp index 85926de9..2b763fcb 100644 --- a/src/Core/Topo/CoFace.cpp +++ b/src/Core/Topo/CoFace.cpp @@ -206,7 +206,7 @@ init(std::vector &edges, // association remontante for (std::vector::iterator iter = edges.begin(); iter != edges.end(); ++iter) - (*iter)->addCoFace(this); + (*iter)->add(this); // on copie les arêtes m_topo_property->getEdgeContainer() = edges; @@ -232,7 +232,7 @@ init(std::vector &edges) // association remontante for (std::vector::iterator iter = edges.begin(); iter != edges.end(); ++iter) - (*iter)->addCoFace(this); + (*iter)->add(this); // on copie les arêtes m_topo_property->getEdgeContainer() = edges; @@ -537,8 +537,8 @@ replace(Edge* e1, Edge* e2, Internal::InfoCommand* icmd) e1->saveEdgeTopoProperty(icmd); e2->saveEdgeTopoProperty(icmd); - e1->removeCoFace(this); - e2->addCoFace(this); + e1->remove(this); + e2->add(this); } // pas de transmition aux blocs, ils n'ont pas la connaissance des arêtes @@ -574,7 +574,7 @@ merge(CoFace* coface, Internal::InfoCommand* icmd) for (std::vector::iterator iter = edges.begin(); iter != edges.end(); ++iter){ (*iter)->saveEdgeTopoProperty(icmd); - (*iter)->removeCoFace(coface); + (*iter)->remove(coface); if ((*iter)->getCoFaces().size() == 0){ // cas où l'arête peut être supprimée @@ -652,15 +652,17 @@ free(Internal::InfoCommand* icmd) setDestroyed(true); // on supprime la face commune des relations des faces vers les faces communes - for (uint i=0; isaveFaceTopoProperty(icmd); - getFaces()[i]->removeCoFace(this); + for (Face* face : getFaces()) { + face->saveFaceTopoProperty(icmd); + if (Utils::contains(this, face->getCoFaces())) + face->remove(this); } // idem entre arêtes et cette face commune - for (uint i=0; isaveEdgeTopoProperty(icmd); - getEdges()[i]->removeCoFace(this); + for (Edge* edge : getEdges()) { + edge->saveEdgeTopoProperty(icmd); + if (Utils::contains(this, edge->getCoFaces())) + edge->remove(this); } clearDependancy(); @@ -933,11 +935,11 @@ split2(eDirOnCoFace dir, std::vector& edges1, std::vector& edges3, // on ajoute les 2 CoFaces aux faces for (Face* f : getFaces()) { f->saveFaceTopoProperty(icmd); - f->addCoFace(coface1); - f->addCoFace(coface2); + f->add(coface1); + f->add(coface2); - coface1->addFace(f); - coface2->addFace(f); + coface1->add(f); + coface2->add(f); } // destruction de la face commune actuelle @@ -1187,13 +1189,13 @@ split3(eDirOnCoFace dir, std::vector& edges1, std::vector& edges3, // on ajoute les 3 CoFaces aux faces for (Face* f : getFaces()) { f->saveFaceTopoProperty(icmd); - f->addCoFace(coface1); - f->addCoFace(coface2); - f->addCoFace(coface3); + f->add(coface1); + f->add(coface2); + f->add(coface3); - coface1->addFace(f); - coface2->addFace(f); - coface3->addFace(f); + coface1->add(f); + coface2->add(f); + coface3->add(f); } // destruction de la face commune actuelle @@ -1693,12 +1695,12 @@ splitOgrid(eDirOnCoFace dir, return splitingEdges; } /*----------------------------------------------------------------------------*/ -void CoFace::addEdge(Edge* e) +void CoFace::add(Edge* e) { m_topo_property->getEdgeContainer().push_back(e); } /*----------------------------------------------------------------------------*/ -void CoFace::removeEdge(Edge* e) +void CoFace::remove(Edge* e) { Utils::remove(e, m_topo_property->getEdgeContainer()); } @@ -3575,12 +3577,12 @@ isEdited() const || m_save_mesh_data != 0; } /*----------------------------------------------------------------------------*/ -void CoFace::addFace(Face* f) +void CoFace::add(Face* f) { m_topo_property->getFaceContainer().push_back(f); } /*----------------------------------------------------------------------------*/ -void CoFace::removeFace(Face* f) +void CoFace::remove(Face* f) { Utils::remove(f, m_topo_property->getFaceContainer()); } diff --git a/src/Core/Topo/CommandDestroyTopo.cpp b/src/Core/Topo/CommandDestroyTopo.cpp index 5a856967..78790d31 100644 --- a/src/Core/Topo/CommandDestroyTopo.cpp +++ b/src/Core/Topo/CommandDestroyTopo.cpp @@ -401,9 +401,7 @@ void CommandDestroyTopo::checkInterpolates() deletedCoFaces[iter->first->getName()] = 1; } // parcours des arêtes existantes dans le manager - std::vector coedges; - getContext().getTopoManager().getCoEdges(coedges); - + auto coedges = getContext().getTopoManager().getCoEdgesObj(); for (std::vector::iterator iter=coedges.begin(); iter!=coedges.end(); ++iter){ Topo::CoEdge* coedge = *iter; diff --git a/src/Core/Topo/CommandMakeBlocksByRevol.cpp b/src/Core/Topo/CommandMakeBlocksByRevol.cpp index ad0ae79f..1aec7c1c 100644 --- a/src/Core/Topo/CommandMakeBlocksByRevol.cpp +++ b/src/Core/Topo/CommandMakeBlocksByRevol.cpp @@ -461,10 +461,7 @@ computeFiltersWithAllFaces(std::map& filtre_vertex, std::map& filtre_coedge, std::map& filtre_coface) { - std::vector cofaces; - getContext().getTopoManager().getCoFaces(cofaces); - - for (CoFace* coface : cofaces){ + for (CoFace* coface : getContext().getTopoManager().getCoFacesObj()){ filtre_coface[coface] = 3; for (CoEdge* coedge : coface->getCoEdges()){ filtre_coedge[coedge] = 3; diff --git a/src/Core/Topo/CommandModificationTopo.cpp b/src/Core/Topo/CommandModificationTopo.cpp index 4da56d19..47c6cc1c 100644 --- a/src/Core/Topo/CommandModificationTopo.cpp +++ b/src/Core/Topo/CommandModificationTopo.cpp @@ -636,8 +636,8 @@ void CommandModificationTopo::MAJCoFaces() coface2[0]->free(&getInfoCommand()); for (uint i=0; iaddCoFace(coface1[i]); - coface1[i]->addFace(face2); + face2->add(coface1[i]); + coface1[i]->add(face2); } updateGeomAssociation(coface1, 0, newEntities[0]); diff --git a/src/Core/Topo/CommandProjectEdgesOnCurves.cpp b/src/Core/Topo/CommandProjectEdgesOnCurves.cpp index 02509822..ccd874f1 100644 --- a/src/Core/Topo/CommandProjectEdgesOnCurves.cpp +++ b/src/Core/Topo/CommandProjectEdgesOnCurves.cpp @@ -47,8 +47,7 @@ CommandProjectEdgesOnCurves:: CommandProjectEdgesOnCurves(Internal::Context& c) :CommandEditTopo(c, "Projection automatique pour toutes les arêtes topologiques") { - std::vector edges; - c.getTopoManager().getCoEdges(edges); + std::vector edges = c.getTopoManager().getCoEdgesObj(); m_coedges.insert(m_coedges.end(), edges.begin(), edges.end()); } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Topo/CommandProjectFacesOnSurfaces.cpp b/src/Core/Topo/CommandProjectFacesOnSurfaces.cpp index 117d2a5b..f49ab53f 100644 --- a/src/Core/Topo/CommandProjectFacesOnSurfaces.cpp +++ b/src/Core/Topo/CommandProjectFacesOnSurfaces.cpp @@ -41,8 +41,7 @@ CommandProjectFacesOnSurfaces:: CommandProjectFacesOnSurfaces(Internal::Context& c) :CommandEditTopo(c, "Projection automatique pour toutes les faces topologiques") { - std::vector faces; - c.getTopoManager().getCoFaces(faces); + std::vector faces = c.getTopoManager().getCoFacesObj(); m_cofaces.insert(m_cofaces.end(), faces.begin(), faces.end()); } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Topo/CommandRefineAllCoEdges.cpp b/src/Core/Topo/CommandRefineAllCoEdges.cpp index f1235bf8..43ec1b2d 100644 --- a/src/Core/Topo/CommandRefineAllCoEdges.cpp +++ b/src/Core/Topo/CommandRefineAllCoEdges.cpp @@ -34,12 +34,7 @@ internalExecute() message << "CommandRefineAllCoEdges::execute pour la commande " << getName ( ) << " de nom unique " << getUniqueName ( ); - std::vector coedges; - getContext().getTopoManager().getCoEdges(coedges); - - for (std::vector::iterator iter=coedges.begin(); - iter!=coedges.end(); ++iter){ - CoEdge* coedge = *iter; + for (CoEdge* coedge : getContext().getTopoManager().getCoEdgesObj()){ CoEdgeMeshingProperty* mp = coedge->getMeshingProperty(); CoEdgeMeshingProperty* new_mp = mp->clone(); // on adapte la raison pour que le bras du début reste de la même longueur diff --git a/src/Core/Topo/CommandSnapProjectedVertices.cpp b/src/Core/Topo/CommandSnapProjectedVertices.cpp index 53c9bdaa..f66a6a59 100644 --- a/src/Core/Topo/CommandSnapProjectedVertices.cpp +++ b/src/Core/Topo/CommandSnapProjectedVertices.cpp @@ -42,10 +42,7 @@ CommandSnapProjectedVertices:: CommandSnapProjectedVertices(Internal::Context& c) :CommandEditTopo(c, "Déplace tous les sommets topologiques suivant la projection sur la géométrie") { - std::vector vertices; - - c.getTopoManager().getVertices(vertices); - + std::vector vertices = c.getTopoManager().getVerticesObj(); m_vertices.insert(m_vertices.end(), vertices.begin(), vertices.end()); } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Topo/CommandSplitBlocks.cpp b/src/Core/Topo/CommandSplitBlocks.cpp index 00250db6..cc794300 100644 --- a/src/Core/Topo/CommandSplitBlocks.cpp +++ b/src/Core/Topo/CommandSplitBlocks.cpp @@ -55,8 +55,7 @@ CommandSplitBlocks(Internal::Context& c, CoEdge* arete, double ratio) , m_ratio(ratio) , m_allBlocksMustBeCut(false) { - std::vector blocs; - c.getTopoManager().getBlocks(blocs, true); + std::vector blocs = c.getTopoManager().getBlocksObj(); validateRatio(); initBlocks(blocs, false); initCommentsAllBlocks(arete); @@ -70,9 +69,7 @@ CommandSplitBlocks(Internal::Context& c, CoEdge* arete, const Utils::Math::Point , m_allBlocksMustBeCut(false) { m_ratio = arete->computeRatio(pt); - std::vector blocs; - c.getTopoManager().getBlocks(blocs, true); - + std::vector blocs = c.getTopoManager().getBlocksObj(); validateRatio(); initBlocks(blocs, false); initCommentsAllBlocks(arete); diff --git a/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp b/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp index 65e794c3..3868a7ba 100644 --- a/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp +++ b/src/Core/Topo/CommandSplitBlocksWithOgrid.cpp @@ -1968,14 +1968,14 @@ freeUnused(std::map & filtre_vertex, TopoHelper::sortVertices(vtx0, vtx1); CoFace* newCoface = corr_2vtx_coface[std::pair(vtx0, vtx1)]; if (newCoface){ - faceToUpdate->addCoFace(newCoface); - newCoface->addFace(faceToUpdate); + faceToUpdate->add(newCoface); + newCoface->add(faceToUpdate); } } // end for i CoFace* newCoface = corr_coface[coface]; if (newCoface){ - faceToUpdate->addCoFace(newCoface); - newCoface->addFace(faceToUpdate); + faceToUpdate->add(newCoface); + newCoface->add(faceToUpdate); } } // if (cofaceToBeReplaced) diff --git a/src/Core/Topo/CommandSplitFaces.cpp b/src/Core/Topo/CommandSplitFaces.cpp index d82e740b..5b1e7465 100644 --- a/src/Core/Topo/CommandSplitFaces.cpp +++ b/src/Core/Topo/CommandSplitFaces.cpp @@ -81,9 +81,8 @@ CommandSplitFaces(Internal::Context& c, CoEdge* arete, double ratio_dec, double #ifdef _DEBUG_SPLIT std::cout<<"CommandSplitFaces::CommandSplitFaces("<getName()<<", "< cofaces; - getContext().getTopoManager().getCoFaces(cofaces); - init(cofaces); + std::vector cofaces = getContext().getTopoManager().getCoFacesObj(); + init(cofaces); } /*----------------------------------------------------------------------------*/ CommandSplitFaces:: @@ -98,8 +97,7 @@ CommandSplitFaces(Internal::Context& c, CoEdge* arete, const Point& pt, double r #ifdef _DEBUG_SPLIT std::cout<<"CommandSplitFaces::CommandSplitFaces("<getName()<<", "< cofaces; - getContext().getTopoManager().getCoFaces(cofaces); + std::vector cofaces = getContext().getTopoManager().getCoFacesObj(); init(cofaces); } /*----------------------------------------------------------------------------*/ @@ -109,9 +107,7 @@ void CommandSplitFaces::init(std::vector &cofaces) std::cout<<"init avec "<::iterator iter = cofaces.begin(); - iter != cofaces.end(); ++iter){ - Topo::CoFace* hcf = *iter; + for (Topo::CoFace* hcf : cofaces){ if (hcf->isStructured()){ m_cofaces.push_back(hcf); diff --git a/src/Core/Topo/CommandTransformTopo.cpp b/src/Core/Topo/CommandTransformTopo.cpp index d2d24162..6766427d 100644 --- a/src/Core/Topo/CommandTransformTopo.cpp +++ b/src/Core/Topo/CommandTransformTopo.cpp @@ -41,11 +41,9 @@ CommandTransformTopo(Internal::Context& c, std::string name) , m_all_topo(true) { // on prend tous les blocs et les faces - std::vector blocs; - std::vector cofaces; - - getTopoManager().getBlocks(blocs); - getTopoManager().getCoFaces(cofaces); + std::vector blocs = getTopoManager().getBlocksObj(); + std::vector cofaces = getTopoManager().getCoFacesObj(); + m_entities.insert(m_entities.end(), blocs.begin(), blocs.end()); m_entities.insert(m_entities.end(), cofaces.begin(), cofaces.end()); } diff --git a/src/Core/Topo/Edge.cpp b/src/Core/Topo/Edge.cpp index 5dca2e15..b6aa8f62 100644 --- a/src/Core/Topo/Edge.cpp +++ b/src/Core/Topo/Edge.cpp @@ -47,7 +47,7 @@ Edge(Internal::Context& ctx, , m_save_mesh_property (0) { // association remontante - ce->addEdge(this); + ce->add(this); m_topo_property->getVertexContainer() = ce->getVertices(); m_topo_property->getCoEdgeContainer().push_back(ce); @@ -73,7 +73,7 @@ Edge(Internal::Context& ctx, // association remontante for (CoEdge* ce : coedges) - ce->addEdge(this); + ce->add(this); ctx.newGraphicalRepresentation (*this); } /*----------------------------------------------------------------------------*/ @@ -229,8 +229,8 @@ void Edge::replace(CoEdge* e1, CoEdge* e2, Internal::InfoCommand* icmd) e1->saveCoEdgeTopoProperty(icmd); e2->saveCoEdgeTopoProperty(icmd); - e1->removeEdge(this); - e2->addEdge(this); + e1->remove(this); + e2->add(this); } } /*----------------------------------------------------------------------------*/ @@ -275,10 +275,10 @@ void Edge::replace(CoEdge* e1, std::vector& coedges, Internal::InfoComm ++iter; } - e1->removeEdge(this); + e1->remove(this); for (uint i=0; isaveCoEdgeTopoProperty(icmd); - coedges[i]->addEdge(this); + coedges[i]->add(this); } m_topo_property->getCoEdgeContainer() = new_edges; #ifdef _DEBUG2 @@ -384,15 +384,17 @@ free(Internal::InfoCommand* icmd) setDestroyed(true); // on supprime l'arête des relations des arêtes communes vers les arêtes - for (uint i=0; isaveCoEdgeTopoProperty(icmd); - getCoEdges()[i]->removeEdge(this); + for (CoEdge* coedge : getCoEdges()) { + coedge->saveCoEdgeTopoProperty(icmd); + if (Utils::contains(this, coedge->getEdges())) + coedge->remove(this); } // idem entre faces communes et cette arête - for (uint i=0; isaveCoFaceTopoProperty(icmd); - getCoFaces()[i]->removeEdge(this); + for (CoFace* coface : getCoFaces()) { + coface->saveCoFaceTopoProperty(icmd); + if (Utils::contains(this, coface->getEdges())) + coface->remove(this); } clearDependancy(); @@ -1179,22 +1181,22 @@ isEdited() const || m_save_mesh_property != 0; } /*----------------------------------------------------------------------------*/ -void Edge::addCoFace(CoFace* f) +void Edge::add(CoFace* f) { m_topo_property->getCoFaceContainer().push_back(f); } /*----------------------------------------------------------------------------*/ -void Edge::removeCoFace(CoFace* f) +void Edge::remove(CoFace* f) { Utils::remove(f, m_topo_property->getCoFaceContainer()); } /*----------------------------------------------------------------------------*/ -void Edge::addCoEdge(CoEdge* e) +void Edge::add(CoEdge* e) { m_topo_property->getCoEdgeContainer().push_back(e); } /*----------------------------------------------------------------------------*/ -void Edge::removeCoEdge(CoEdge* e) +void Edge::remove(CoEdge* e) { Utils::remove(e, m_topo_property->getCoEdgeContainer()); } diff --git a/src/Core/Topo/ExportBlocksImplementation.cpp b/src/Core/Topo/ExportBlocksImplementation.cpp index ecfb67ff..62b04355 100644 --- a/src/Core/Topo/ExportBlocksImplementation.cpp +++ b/src/Core/Topo/ExportBlocksImplementation.cpp @@ -31,20 +31,16 @@ void ExportBlocksImplementation::perform(Internal::InfoCommand* icmd) Mgx3D::Topo::TopoManager& tm = m_context.getTopoManager(); - std::vector vertices; - tm.getVertices(vertices); + std::vector vertices = tm.getVerticesObj(); writeNodes(str, vertices); - std::vector edges; - tm.getCoEdges(edges); + std::vector edges = tm.getCoEdgesObj(); writeEdges(str, edges); - std::vector faces; - tm.getCoFaces(faces); + std::vector faces = tm.getCoFacesObj(); writeFaces(str, faces); - std::vector blocks; - tm.getBlocks(blocks); + std::vector blocks = tm.getBlocksObj(); writeBlocks(str, blocks); str.close(); diff --git a/src/Core/Topo/Face.cpp b/src/Core/Topo/Face.cpp index f1dbe26a..7fd67e01 100644 --- a/src/Core/Topo/Face.cpp +++ b/src/Core/Topo/Face.cpp @@ -53,7 +53,7 @@ Face(Internal::Context& ctx, m_topo_property->getCoFaceContainer().push_back(coface); m_topo_property->getVertexContainer() = coface->getVertices(); - coface->addFace(this); + coface->add(this); ctx.newGraphicalRepresentation (*this); #ifdef _DEBUG_MEMORY @@ -81,7 +81,7 @@ Face(Internal::Context& ctx, m_topo_property->getCoFaceContainer() = cofaces; m_topo_property->getVertexContainer() = vertices; for (uint i=0; iaddFace(this); + getCoFaces()[i]->add(this); ctx.newGraphicalRepresentation (*this); #ifdef _DEBUG_MEMORY std::cout << "Face::Face( avec "<getBlockContainer().push_back(b); } /*----------------------------------------------------------------------------*/ -void Face::removeBlock(Block* b) +void Face::remove(Block* b) { Utils::remove(b, m_topo_property->getBlockContainer()); } /*----------------------------------------------------------------------------*/ -void Face::addCoFace(CoFace* f) +void Face::add(CoFace* f) { m_topo_property->getCoFaceContainer().push_back(f); } /*----------------------------------------------------------------------------*/ -void Face::removeCoFace(CoFace* f) +void Face::remove(CoFace* f) { Utils::remove(f, m_topo_property->getCoFaceContainer()); } @@ -229,8 +229,8 @@ replace(CoFace* cf1, CoFace* cf2, Internal::InfoCommand* icmd) cf1->saveCoFaceTopoProperty(icmd); cf2->saveCoFaceTopoProperty(icmd); - cf1->removeFace(this); - cf2->addFace(this); + cf1->remove(this); + cf2->add(this); } } /*---------------------------------------------------------------------------*/ @@ -1093,9 +1093,10 @@ free(Internal::InfoCommand* icmd) // on laisse les relation du bloc vers cette face // suppression des relations remontantes des faces communes vers cette face - for (uint i=0; isaveCoFaceTopoProperty(icmd); - getCoFaces()[i]->removeFace(this); + for (CoFace* coface : getCoFaces()) { + coface->saveCoFaceTopoProperty(icmd); + if (Utils::contains(this, coface->getFaces())) + coface->remove(this); } clearDependancy(); diff --git a/src/Core/Topo/TopoManager.cpp b/src/Core/Topo/TopoManager.cpp index 43062f8f..a73bc35f 100644 --- a/src/Core/Topo/TopoManager.cpp +++ b/src/Core/Topo/TopoManager.cpp @@ -143,98 +143,39 @@ TopoManager::~TopoManager() /*----------------------------------------------------------------------------*/ void TopoManager::clear() { - m_blocks.deleteAndClear(); - m_faces.deleteAndClear(); - m_cofaces.deleteAndClear(); - m_edges.deleteAndClear(); - m_coedges.deleteAndClear(); - m_vertices.deleteAndClear(); + Utils::deleteAndClear(m_blocks); + Utils::deleteAndClear(m_faces); + Utils::deleteAndClear(m_cofaces); + Utils::deleteAndClear(m_edges); + Utils::deleteAndClear(m_coedges); + Utils::deleteAndClear(m_vertices); m_geom_associations.clear(); m_defaultNbMeshingEdges = 10; } /*----------------------------------------------------------------------------*/ std::vector TopoManager::getBlocks() const { - std::vector entities_names; - - const std::vector& entities_all = m_blocks.get(); - for(auto e: entities_all) { - if(!e->isDestroyed()) { - entities_names.push_back(e->getName()); - } - } - std::sort(entities_names.begin(), entities_names.end()); - - return entities_names; + return Utils::toNames(getBlocksObj()); } /*----------------------------------------------------------------------------*/ std::vector TopoManager::getCoFaces() const { - std::vector entities_names; - - const std::vector& entities_all = m_cofaces.get(); - for(auto e: entities_all) { - if(!e->isDestroyed()) { - entities_names.push_back(e->getName()); - } - } - std::sort(entities_names.begin(), entities_names.end()); - - return entities_names; + return Utils::toNames(getCoFacesObj()); } /*----------------------------------------------------------------------------*/ std::vector TopoManager::getCoEdges() const { - std::vector entities_names; - - const std::vector& entities_all = m_coedges.get(); - for(auto e: entities_all) { - if(!e->isDestroyed()) { - entities_names.push_back(e->getName()); - } - } - std::sort(entities_names.begin(), entities_names.end()); - - return entities_names; + return Utils::toNames(getCoEdgesObj()); } /*----------------------------------------------------------------------------*/ -std::vector TopoManager::getVertices() const +std::vector TopoManager::getVertices() const { - std::vector entities_names; - - const std::vector& entities_all = m_vertices.get(); - for(auto e: entities_all) { - if(!e->isDestroyed()) { - entities_names.push_back(e->getName()); - } - } - std::sort(entities_names.begin(), entities_names.end()); - - return entities_names; + return Utils::toNames(getVerticesObj()); } /*----------------------------------------------------------------------------*/ -void TopoManager::getBlocks(std::vector &blocks, bool sort) const +std::vector TopoManager::getBlocksObj() const { - blocks.clear(); - - if (sort){ - std::list l_te; - const std::vector& blks = m_blocks.get(); - for (std::vector::const_iterator iter = blks.begin(); - iter != blks.end(); ++iter) - if (!(*iter)->isDestroyed()) - l_te.push_back(*iter); - l_te.sort(Utils::Entity::compareEntity); - l_te.unique(); - blocks.insert(blocks.end(), l_te.begin(), l_te.end()); - } - else { - const std::vector& blks = m_blocks.get(); - for (std::vector::const_iterator iter = blks.begin(); - iter != blks.end(); ++iter) - if (!(*iter)->isDestroyed()) - blocks.push_back(*iter); - } + return Utils::filterAndSort(m_blocks); } /*----------------------------------------------------------------------------*/ void TopoManager::add(Block* b) @@ -243,7 +184,7 @@ void TopoManager::add(Block* b) std::cout<<"TopoManager::add("<getName()<<")"<getName()<<")"<getName()<<")"<getName()<<")"<getName()<<")"<getName()<<")"<getName()<<")"<getName()<<")"<getName()<<")"<getName()<<")"<getName()<<")"<getName()<<")"<renameWithShiftingId(name); - else - new_name = name; - - const std::vector& blocks = m_blocks.get(); - for (std::vector::const_iterator iter = blocks.begin(); - iter != blocks.end(); ++iter) - if (new_name == (*iter)->getName()) - bloc = (*iter); - -#ifdef _DEBUG_TIMER - timer.stop(); - _cpuDuration += timer.cpuDuration(); -#endif - if (bloc != 0 && bloc->isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getBlock trouve l'entité \""<& blocks = m_blocks.get(); #ifdef _DEBUG TkUtil::UTF8String message (TkUtil::Charset::UTF_8); message << "TopoManager::getLastBlock ()\n"; - message << "m_blocks de taille:" << blocks.size() << "\n"; - for (uint i=0; igetName()<<(blocks[i]->isDestroyed()?" détruit":" non détruit")<<"\n"; + message << "m_blocks de taille:" << m_blocks.size() << "\n"; + for (uint i=0; igetName()<<(m_blocks[i]->isDestroyed()?" détruit":" non détruit")<<"\n"; log (TkUtil::TraceLog (message, TkUtil::Log::TRACE_4)); #endif @@ -411,333 +308,66 @@ std::string TopoManager::getLastBlock() return nom; // recherche du dernier non détruit, en partant de la fin int i; - for (i=blocks.size()-1; i>=0 && blocks[i]->isDestroyed(); i--) + for (i=m_blocks.size()-1; i>=0 && m_blocks[i]->isDestroyed(); i--) {} if (i>=0) - nom = blocks[i]->getName(); + nom = m_blocks[i]->getName(); return nom; } /*----------------------------------------------------------------------------*/ int TopoManager::getNbBlocks() const { - const std::vector& blocs = m_blocks.get(); - int nb = 0; - for (uint i=0; iisDestroyed()) - nb++; - return nb; + return getBlocksObj().size(); } /*----------------------------------------------------------------------------*/ int TopoManager::getNbFaces() const { - const std::vector& cofaces = m_cofaces.get(); - int nb = 0; - for (uint i=0; iisDestroyed()) - nb++; - return nb; + return getCoFacesObj().size(); } /*----------------------------------------------------------------------------*/ int TopoManager::getNbEdges() const { - const std::vector& coedges = m_coedges.get(); - int nb = 0; - for (uint i=0; iisDestroyed()) - nb++; - return nb; + return getCoEdgesObj().size(); } /*----------------------------------------------------------------------------*/ -void TopoManager::getCoFaces(std::vector& faces) const +std::vector TopoManager::getCoFacesObj() const { - faces.clear(); - - const std::vector& cofaces = m_cofaces.get(); - - std::list l_te; - for (std::vector::const_iterator iter = cofaces.begin(); - iter != cofaces.end(); ++iter) - if (!(*iter)->isDestroyed()) - l_te.push_back(*iter); - l_te.sort(Utils::Entity::compareEntity); - l_te.unique(); - faces.insert(faces.end(), l_te.begin(), l_te.end()); + return Utils::filterAndSort(m_cofaces); } /*----------------------------------------------------------------------------*/ CoFace* TopoManager::getCoFace(const std::string& name, const bool exceptionIfNotFound) const { -#ifdef _DEBUG_TIMER - TkUtil::Timer timer(true); -#endif - CoFace* face = 0; - - if (!CoFace::isA(name)){ - if (exceptionIfNotFound){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getCoEdge impossible, entité \""<renameWithShiftingId(name); - else - new_name = name; - - const std::vector& cofaces = m_cofaces.get(); - for (std::vector::const_iterator iter3 = cofaces.begin(); - iter3 != cofaces.end(); ++iter3) - if (new_name == (*iter3)->getName()) - face = (*iter3); - - #ifdef _DEBUG_TIMER - timer.stop(); - _cpuDuration += timer.cpuDuration(); -#endif - - if (face != 0 && face->isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getCoFace trouve l'entité \""<renameWithShiftingId(name); - else - new_name = name; - - if (Face::isA(new_name)){ - const std::vector& faces = m_faces.get(); - for (std::vector::const_iterator iter2 = faces.begin(); - iter2 != faces.end() && face == 0; ++iter2){ - if (new_name == (*iter2)->getName()) - face = (*iter2); - } - } - else if (exceptionIfNotFound){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getFace impossible, entité \""<isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getFace trouve l'entité \""<& edges) const +std::vector TopoManager::getCoEdgesObj() const { - edges.clear(); - - const std::vector& coedges = m_coedges.get(); - - std::list l_te; - for (std::vector::const_iterator iter = coedges.begin(); - iter != coedges.end(); ++iter) - if (!(*iter)->isDestroyed()) - l_te.push_back(*iter); - l_te.sort(Utils::Entity::compareEntity); - l_te.unique(); - edges.insert(edges.end(), l_te.begin(), l_te.end()); + return Utils::filterAndSort(m_coedges); } /*----------------------------------------------------------------------------*/ CoEdge* TopoManager::getCoEdge(const std::string& name, const bool exceptionIfNotFound) const { -#ifdef _DEBUG_TIMER - TkUtil::Timer timer(true); -#endif - CoEdge* edge = 0; - - if (!CoEdge::isA(name)){ - if (exceptionIfNotFound){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getCoEdge impossible, entité \""<renameWithShiftingId(name); - else - new_name = name; - - //std::cout<<"TopoManager::getCoEdge("<& coedges = m_coedges.get(); - for (std::vector::const_iterator iter4 = coedges.begin(); - iter4 != coedges.end(); ++iter4) - - if (new_name == (*iter4)->getName()) - edge = (*iter4); - -#ifdef _DEBUG_TIMER - timer.stop(); - _cpuDuration += timer.cpuDuration(); -#endif - - if (edge != 0 && edge->isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getCoEdge trouve l'entité \""<renameWithShiftingId(name); - else - new_name = name; - - if (Edge::isA(new_name)) { - const std::vector& edges = m_edges.get(); - for (std::vector::const_iterator iter4 = edges.begin(); - iter4 != edges.end(); ++iter4) - - if (new_name == (*iter4)->getName()) - edge = (*iter4); - } - else if (exceptionIfNotFound){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getEdge impossible, entité \""<isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getEdge trouve l'entité \""<& vertices) const +std::vector TopoManager::getVerticesObj() const { - vertices.clear(); - - const std::vector& vtx = m_vertices.get(); - - std::list l_te; - for (std::vector::const_iterator iter = vtx.begin(); - iter != vtx.end(); ++iter) - if (!(*iter)->isDestroyed()) - l_te.push_back(*iter); - l_te.sort(Utils::Entity::compareEntity); - l_te.unique(); - vertices.insert(vertices.end(), l_te.begin(), l_te.end()); + return Utils::filterAndSort(m_vertices); } /*----------------------------------------------------------------------------*/ Vertex* TopoManager::getVertex(const std::string& name, const bool exceptionIfNotFound) const { -#ifdef _DEBUG_TIMER - TkUtil::Timer timer(true); -#endif - Vertex* vertex = 0; - - if (!Vertex::isA(name)){ - if (exceptionIfNotFound){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getVertex impossible, entité \""<renameWithShiftingId(name); - else - new_name = name; - - const std::vector& vertices = m_vertices.get(); - for (std::vector::const_iterator iter2 = vertices.begin(); - iter2 != vertices.end(); ++iter2) - - if (new_name == (*iter2)->getName()) - vertex = (*iter2); - -#ifdef _DEBUG_TIMER - timer.stop(); - _cpuDuration += timer.cpuDuration(); -#endif - - if (vertex != 0 && vertex->isDestroyed()){ - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message <<"getVertex trouve l'entité \""< selected; - - const std::vector& all = m_vertices.get(); - for (std::vector::const_iterator iter = all.begin(); - iter != all.end(); ++iter) - if ((*iter)->getCoord() == pt1) - selected.push_back(*iter); + for (Vertex*v : m_vertices) + if (v->getCoord() == pt1) + selected.push_back(v); if (selected.size() == 1) return selected[0]->getName(); @@ -783,12 +410,9 @@ std::string TopoManager::getEdgeAt(const Point& pt1, const Point& pt2) const { // il pourrait y en avoir aucune ou plusieurs, on n'en veut qu'un std::vector selected; - - const std::vector& all = m_coedges.get(); - for (std::vector::const_iterator iter = all.begin(); - iter != all.end(); ++iter) - if ((*iter)->getVertices()[0]->getCoord() == pt1 && (*iter)->getVertices()[1]->getCoord() == pt2) - selected.push_back(*iter); + for (CoEdge*ce : m_coedges) + if (ce->getVertices()[0]->getCoord() == pt1 && ce->getVertices()[1]->getCoord() == pt2) + selected.push_back(ce); if (selected.size() == 1) return selected[0]->getName(); @@ -809,23 +433,20 @@ std::string TopoManager::getFaceAt(std::vector& pts) const std::cout< cofaces; - - const std::vector& all = m_cofaces.get(); - for (std::vector::const_iterator iter = all.begin(); - iter != all.end(); ++iter){ - std::vector vertices = (*iter)->getAllVertices(); + std::vector cofaces; + for (CoFace* cf : m_cofaces){ + std::vector vertices = cf->getAllVertices(); uint i; if (vertices.size() != pts.size()) continue; for (i=0; igetCoord() == pts[i]; i++){ } #ifdef _DEBUG2 - std::cout<<"Pour "<<(*iter)->getName()<<" vertices.size() = "<getName()<<" vertices.size() = "< coedges; - getCoEdges(coedges); + std::vector coedges = getCoEdgesObj(); Topo::CommandSetEdgeMeshingProperty* command = new Topo::CommandSetEdgeMeshingProperty(getContext(), emp, coedges); @@ -3318,8 +2935,7 @@ Mgx3D::Internal::M3DCommandResult* TopoManager::setAllMeshingProperty(CoFaceMesh <<"), toutes les faces)"; log (TkUtil::TraceLog (message, TkUtil::Log::TRACE_4)); - std::vector cofaces; - getCoFaces(cofaces); + std::vector cofaces = getCoFacesObj(); Topo::CommandSetFaceMeshingProperty* command = new Topo::CommandSetFaceMeshingProperty(getContext(), emp, cofaces); @@ -3373,8 +2989,7 @@ Mgx3D::Internal::M3DCommandResult* TopoManager::setAllMeshingProperty(BlockMeshi <<"), toutes les faces)"; log (TkUtil::TraceLog (message, TkUtil::Log::TRACE_4)); - std::vector blocks; - getBlocks(blocks); + std::vector blocks = getBlocksObj(); Topo::CommandSetBlockMeshingProperty* command = new Topo::CommandSetBlockMeshingProperty(getContext(), emp, blocks); @@ -3599,15 +3214,11 @@ std::vector > TopoManager:: getFusableEdgesObj() { // Récupérations de toutes les faces communes - std::vector all_cofaces; - getCoFaces(all_cofaces); - // On ne conserve que les CoFaces dans une topo 2D (non utilisées par une Face) std::vector cofaces; - for (std::vector::iterator iter = all_cofaces.begin(); - iter != all_cofaces.end(); ++iter) - if ((*iter)->getFaces().size() == 0) - cofaces.push_back(*iter); + for (Topo::CoFace* coface : getCoFacesObj()) + if (coface->getFaces().size() == 0) + cofaces.push_back(coface); // On fait une recherche des groupes de CoEdges partagées par les même CoFaces std::vector > l_coedges; @@ -3686,16 +3297,11 @@ getFusableEdgesObj() std::vector > TopoManager:: getFusableEdges() { - std::vector > fusable = getFusableEdgesObj(); std::vector > fusableNames; - - for (std::vector >::iterator iter1=fusable.begin(); - iter1!=fusable.end(); ++iter1){ + for (std::vector coedges : getFusableEdgesObj()){ std::vector names; - for (std::vector::iterator iter2=(*iter1).begin(); - iter2!=(*iter1).end(); ++iter2){ - names.push_back((*iter2)->getName()); - } + for (Topo::CoEdge* ce : coedges) + names.push_back(ce->getName()); fusableNames.push_back(names); } return fusableNames; @@ -3704,22 +3310,15 @@ getFusableEdges() std::vector TopoManager::getInvalidEdges() const { std::vector invalidEdges; - // on prend toutes les CoEdges disponibles - std::vector coedges; - getCoEdges(coedges); - - for (std::vector::iterator iter = coedges.begin(); - iter != coedges.end(); ++iter){ + for (Topo::CoEdge* ce : getCoEdgesObj()) try { - (*iter)->check(); + ce->check(); } catch (const TkUtil::Exception& exc) { - invalidEdges.push_back((*iter)->getName()); + invalidEdges.push_back(ce->getName()); } - } - return invalidEdges; } /*----------------------------------------------------------------------------*/ @@ -3727,9 +3326,8 @@ Mgx3D::Internal::M3DCommandResult* TopoManager:: fuseEdges(std::vector &coedges_names) { std::vector coedges; - for (std::vector::iterator iter = coedges_names.begin(); - iter != coedges_names.end(); ++iter) - coedges.push_back(getCoEdge(*iter)); + for (std::string name : coedges_names) + coedges.push_back(getCoEdge(name)); return fuseEdges(coedges); } /*----------------------------------------------------------------------------*/ @@ -4987,44 +4585,29 @@ Mgx3D::Internal::M3DCommandResult* TopoManager::setDefaultNbMeshingEdges(int nb) std::vector TopoManager::getBorderFaces() const { std::vector borderFaces; - // on prend toutes les CoFaces disponibles - std::vector cofaces; - getCoFaces(cofaces); - - for (std::vector::iterator iter = cofaces.begin(); - iter != cofaces.end(); ++iter) - if ((*iter)->getBlocks().size() == 1) - borderFaces.push_back((*iter)->getName()); - + for (Topo::CoFace* cf : getCoFacesObj()) + if (cf->getBlocks().size() == 1) + borderFaces.push_back(cf->getName()); return borderFaces; } /*----------------------------------------------------------------------------*/ std::vector TopoManager::getFacesWithoutBlock() const { std::vector facesWB; - // on prend toutes les CoFaces disponibles - std::vector cofaces; - getCoFaces(cofaces); - - for (std::vector::iterator iter = cofaces.begin(); - iter != cofaces.end(); ++iter) - if ((*iter)->getBlocks().size() == 0) - facesWB.push_back((*iter)->getName()); - + for (Topo::CoFace* cf : getCoFacesObj()) + if (cf->getBlocks().size() == 0) + facesWB.push_back(cf->getName()); return facesWB; } /*----------------------------------------------------------------------------*/ std::vector TopoManager::getSemiConformalFaces() const { - std::vector cofaces; - getCoFaces(cofaces); - // recherches parmis ces cofaces celles qui sont reliées à deux faces et pour lesquelles // il y a une semi-conformité std::vector semiConf; - for (CoFace* coface : cofaces){ + for (CoFace* coface : getCoFacesObj()){ bool isSemiConf = false; if (coface->getFaces().size() == 2 && coface->isStructured()) for (uint j=0; j<2; j++){ @@ -5043,126 +4626,77 @@ std::vector TopoManager::getSemiConformalFaces() const std::vector TopoManager::getInvalidFaces() const { std::vector invalidFaces; - // on prend toutes les CoFaces disponibles - std::vector cofaces; - getCoFaces(cofaces); - - for (std::vector::iterator iter = cofaces.begin(); - iter != cofaces.end(); ++iter){ + for (Topo::CoFace* cf : getCoFacesObj()) try { - (*iter)->check(); + cf->check(); } catch (const TkUtil::Exception& exc) { - invalidFaces.push_back((*iter)->getName()); + invalidFaces.push_back(cf->getName()); } - } - return invalidFaces; } /*----------------------------------------------------------------------------*/ std::vector TopoManager::getUnstructuredFaces() const { std::vector unstructuredFaces; - // on prend toutes les CoFaces disponibles - std::vector cofaces; - getCoFaces(cofaces); - - for (std::vector::iterator iter = cofaces.begin(); - iter != cofaces.end(); ++iter){ - if (!(*iter)->isStructured()) - unstructuredFaces.push_back((*iter)->getName()); - } - + for (Topo::CoFace* cf : getCoFacesObj()) + if (!cf->isStructured()) + unstructuredFaces.push_back(cf->getName()); return unstructuredFaces; } /*----------------------------------------------------------------------------*/ std::vector TopoManager::getTransfiniteMeshLawFaces() const { std::vector selectedFaces; - // on prend toutes les CoFaces disponibles - std::vector cofaces; - getCoFaces(cofaces); - - for (std::vector::iterator iter = cofaces.begin(); - iter != cofaces.end(); ++iter){ - if ((*iter)->getMeshLaw() == CoFaceMeshingProperty::transfinite) - selectedFaces.push_back((*iter)->getName()); - } - + for (Topo::CoFace* cf : getCoFacesObj()) + if (cf->getMeshLaw() == CoFaceMeshingProperty::transfinite) + selectedFaces.push_back(cf->getName()); return selectedFaces; } /*----------------------------------------------------------------------------*/ std::vector TopoManager::getInvalidBlocks() const { std::vector invalidBlocks; - // on prend tous les blocs disponibles - std::vector blocs; - getBlocks(blocs); - - for (std::vector::iterator iter = blocs.begin(); - iter != blocs.end(); ++iter){ + for (Topo::Block* b : getBlocksObj()) try { - (*iter)->check(); + b->check(); } catch (const TkUtil::Exception& exc) { - invalidBlocks.push_back((*iter)->getName()); + invalidBlocks.push_back(b->getName()); } - } - return invalidBlocks; } /*----------------------------------------------------------------------------*/ std::vector TopoManager::getVisibleBlocks() const { std::vector visibleBlocks; - - std::vector blocs; - getBlocks(blocs); - - for (std::vector::iterator iter = blocs.begin(); - iter != blocs.end(); ++iter){ - if ((*iter)->isVisible()) - visibleBlocks.push_back((*iter)->getName()); - } - + for (Topo::Block* b : getBlocksObj()) + if (b->isVisible()) + visibleBlocks.push_back(b->getName()); return visibleBlocks; } /*----------------------------------------------------------------------------*/ std::vector TopoManager::getUnstructuredBlocks() const { std::vector unstructuredBlocks; - - std::vector blocs; - getBlocks(blocs); - - for (std::vector::iterator iter = blocs.begin(); - iter != blocs.end(); ++iter){ - if (!(*iter)->isStructured()) - unstructuredBlocks.push_back((*iter)->getName()); - } - + for (Topo::Block* b : getBlocksObj()) + if (!b->isStructured()) + unstructuredBlocks.push_back(b->getName()); return unstructuredBlocks; } /*----------------------------------------------------------------------------*/ std::vector TopoManager::getTransfiniteMeshLawBlocks() const { std::vector selectedBlocks; - - std::vector blocs; - getBlocks(blocs); - - for (std::vector::iterator iter = blocs.begin(); - iter != blocs.end(); ++iter){ - if ((*iter)->getMeshLaw() == BlockMeshingProperty::transfinite) - selectedBlocks.push_back((*iter)->getName()); - } - + for (Topo::Block* b : getBlocksObj()) + if (b->getMeshLaw() == BlockMeshingProperty::transfinite) + selectedBlocks.push_back(b->getName()); return selectedBlocks; } /*----------------------------------------------------------------------------*/ diff --git a/src/Core/Topo/Vertex.cpp b/src/Core/Topo/Vertex.cpp index 070d4757..40a30a00 100644 --- a/src/Core/Topo/Vertex.cpp +++ b/src/Core/Topo/Vertex.cpp @@ -148,12 +148,12 @@ setCoord(const Utils::Math::Point & pt, bool acceptMeshed) updateCoEdgeModificationTime(); } /*----------------------------------------------------------------------------*/ -void Vertex::addCoEdge(CoEdge* e) +void Vertex::add(CoEdge* e) { m_topo_property->getCoEdgeContainer().push_back(e); } /*----------------------------------------------------------------------------*/ -void Vertex::removeCoEdge(CoEdge* e) +void Vertex::remove(CoEdge* e) { Utils::remove(e, m_topo_property->getCoEdgeContainer()); } @@ -291,9 +291,10 @@ free(Internal::InfoCommand* icmd) setDestroyed(true); // // on supprime les relations des arêtes vers ce sommet -// for (uint i=0; isaveCoEdgeTopoProperty(icmd); -// getCoEdge(i)->removeVertex(this, false); +// for (CpEdge* coedge : getCoEdges()) { +// coedge->saveCoEdgeTopoProperty(icmd); +// if (Utils::contains(this, coedge->getVertices())) +// coedge->remove(this, false); // } clearDependancy(); diff --git a/src/Core/protected/Geom/Curve.h b/src/Core/protected/Geom/Curve.h index d8d05701..3063ebe4 100644 --- a/src/Core/protected/Geom/Curve.h +++ b/src/Core/protected/Geom/Curve.h @@ -172,7 +172,7 @@ class Curve: public GeomEntity { * * \param v un pointeur sur un sommet */ - void add (Vertex* v); + void add(Vertex* v); /*------------------------------------------------------------------------*/ /** \brief Supprime s de la liste des surfaces incidentes. Si s n'apparait diff --git a/src/Core/protected/Internal/NameManager.h b/src/Core/protected/Internal/NameManager.h index 9e38f549..48e586b7 100644 --- a/src/Core/protected/Internal/NameManager.h +++ b/src/Core/protected/Internal/NameManager.h @@ -1,21 +1,11 @@ -/*----------------------------------------------------------------------------*/ -/* - * \file NameManager.h - * - * \author Eric Brière de l'Isle - * - * \date 17 janv. 2011 - */ -/*----------------------------------------------------------------------------*/ - - #ifndef NAMEMANAGER_H_ #define NAMEMANAGER_H_ - +/*----------------------------------------------------------------------------*/ #include "Utils/Entity.h" - +#include "Internal/EntitiesHelper.h" +#include "Utils/TypeDedicatedNameManager.h" +#include "Utils/MgxException.h" #include - /*----------------------------------------------------------------------------*/ namespace Mgx3D { @@ -69,6 +59,50 @@ class NameManager { /// retourne vrai si le décalage d'id (renommage) est actif bool isShiftingIdActivated() const {return m_is_name_shifting;} + /// recherche un objet par son nom (Geom, Topo et SysCoord. Mesh et Group gérés autrement) + template ::value>> + T* findByName(const std::string& name, const std::vector& entities, const bool exceptionIfNotFound) const + { + T* entity = 0; + + if (!T::isA(name)){ + if (exceptionIfNotFound){ + TkUtil::UTF8String message (TkUtil::Charset::UTF_8); + message << name << " n'est pas un nom correspondant à ce type d'entité"; + throw TkUtil::Exception(message); + } + else + return entity; + } + + std::string new_name; + if (isShiftingIdActivated()){ + TkUtil::UTF8String tkutil_name(name); + Utils::Entity::objectType t = EntitiesHelper::getObjectType(tkutil_name); + new_name = getTypeDedicatedNameManager(t)->renameWithShiftingId(name); + } else { + new_name = name; + } + + for (T* e : entities) + if (new_name == e->getName()) + entity = e; + + if (entity != 0 && entity->isDestroyed()){ + TkUtil::UTF8String message (TkUtil::Charset::UTF_8); + message << new_name << " existe mais elle est détruite"; + throw Utils::IsDestroyedException(message); + } + + if (exceptionIfNotFound && entity == 0){ + TkUtil::UTF8String message (TkUtil::Charset::UTF_8); + message << new_name << " n'a pas été trouvée"; + throw TkUtil::Exception(message); + } + + return entity; + } + private: /// id global pour les entités unsigned long m_global_id; diff --git a/src/Core/protected/Mesh/Cloud.h b/src/Core/protected/Mesh/Cloud.h index 2157d6cd..70fdb76d 100644 --- a/src/Core/protected/Mesh/Cloud.h +++ b/src/Core/protected/Mesh/Cloud.h @@ -3,7 +3,6 @@ /*----------------------------------------------------------------------------*/ #include "Mesh/MeshEntity.h" #include -#include "Utils/Container.h" #include "Topo/MeshCloudTopoProperty.h" namespace gmds { @@ -85,16 +84,6 @@ class Cloud : public MeshEntity { */ virtual Utils::Entity::objectType getType() const {return Utils::Entity::MeshCloud;} - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom court du type d'objet (pour le nommage des entités) - */ - static std::string getTinyName() {return "Nu";} - - /*------------------------------------------------------------------------*/ - /** \brief Test si l'entité est un Cloud suivant son nom - */ - static bool isA(std::string& name); - /*------------------------------------------------------------------------*/ /// pour l'affichage d'informations #ifndef SWIG @@ -104,12 +93,12 @@ class Cloud : public MeshEntity { /*------------------------------------------------------------------------*/ /// \brief Ajoute une relation vers une arête commune #ifndef SWIG - void addCoEdge(Topo::CoEdge* e); + void add(Topo::CoEdge* e); #endif /// Retire une relation vers une Edge #ifndef SWIG - void removeCoEdge(Topo::CoEdge* e); + void remove(Topo::CoEdge* e); #endif /// Fournit l'accès aux arêtes topologiques qui ont participées à la constitution du nuage @@ -122,12 +111,12 @@ class Cloud : public MeshEntity { /*------------------------------------------------------------------------*/ /// \brief Ajoute une relation vers un sommet #ifndef SWIG - void addVertex(Topo::Vertex* v); + void add(Topo::Vertex* v); #endif /// Retire une relation vers un Vertex #ifndef SWIG - void removeVertex(Topo::Vertex* v); + void remove(Topo::Vertex* v); #endif /// Fournit l'accès aux sommets topologiques qui ont participées à la constitution du nuage diff --git a/src/Core/protected/Mesh/CommandCreateMesh.h b/src/Core/protected/Mesh/CommandCreateMesh.h index dea53a36..0bc80a10 100644 --- a/src/Core/protected/Mesh/CommandCreateMesh.h +++ b/src/Core/protected/Mesh/CommandCreateMesh.h @@ -11,11 +11,11 @@ #define COMMANDCREATEMESH_H_ /*----------------------------------------------------------------------------*/ #include "Internal/MultiTaskedCommand.h" -#include "Utils/Container.h" #include "Mesh/Cloud.h" #include "Mesh/Line.h" #include "Mesh/Surface.h" #include "Mesh/Volume.h" +#include "Mesh/MeshManager.h" /*----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ @@ -81,13 +81,13 @@ class CommandCreateMesh: public Internal::MultiTaskedCommand { /*------------------------------------------------------------------------*/ /// Accesseur sur les noms des nuages créés par la commande - const std::vector& createdClouds () const {return m_created_clouds.get();} + const std::vector& createdClouds () const {return m_created_clouds;} /// Accesseur sur les noms des surfaces de maillage créés par la commande - const std::vector& createdSurfaces () const {return m_created_surfaces.get();} + const std::vector& createdSurfaces () const {return m_created_surfaces;} /// Accesseur sur les noms des volumes de maillage créés par la commande - const std::vector& createdVolumes () const {return m_created_volumes.get();} + const std::vector& createdVolumes () const {return m_created_volumes;} /*------------------------------------------------------------------------*/ /// Ajoute au vecteur le noeud créé par la commande, suivant la strategie @@ -311,16 +311,16 @@ class CommandCreateMesh: public Internal::MultiTaskedCommand { /// stockage des nuages créés par la commande - Utils::Container m_created_clouds; + std::vector m_created_clouds; /// stockage des lignes créées par la commande - Utils::Container m_created_lines; + std::vector m_created_lines; /// stockage des surfaces de maillage créés par la commande - Utils::Container m_created_surfaces; + std::vector m_created_surfaces; /// stockage des volumes de maillage créés par la commande - Utils::Container m_created_volumes; + std::vector m_created_volumes; /// Strategie de stockage pour cette commande diff --git a/src/Core/protected/Mesh/Line.h b/src/Core/protected/Mesh/Line.h index 6165f13b..97b48b54 100644 --- a/src/Core/protected/Mesh/Line.h +++ b/src/Core/protected/Mesh/Line.h @@ -3,7 +3,6 @@ /*----------------------------------------------------------------------------*/ #include "Mesh/MeshEntity.h" #include -#include "Utils/Container.h" #include "Topo/MeshLineTopoProperty.h" namespace gmds { @@ -86,31 +85,21 @@ class Line : public MeshEntity { */ virtual Utils::Entity::objectType getType() const {return Utils::Entity::MeshLine;} - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom court du type d'objet (pour le nommage des entités) - */ - static std::string getTinyName() {return "Li";} - - /*------------------------------------------------------------------------*/ - /** \brief Test si l'entité est un Line suivant son nom - */ - static bool isA(std::string& name); - /*------------------------------------------------------------------------*/ /// pour l'affichage d'informations #ifndef SWIG - friend TkUtil::UTF8String & operator << (TkUtil::UTF8String & , const Cloud &); + friend TkUtil::UTF8String & operator << (TkUtil::UTF8String & , const Line &); #endif /*------------------------------------------------------------------------*/ /// \brief Ajoute une relation vers une arête commune #ifndef SWIG - void addCoEdge(Topo::CoEdge* e); + void add(Topo::CoEdge* e); #endif /// Retire une relation vers une Edge #ifndef SWIG - void removeCoEdge(Topo::CoEdge* e); + void remove(Topo::CoEdge* e); #endif /// Fournit l'accès aux arêtes topologiques qui ont participées à la constitution de la ligne diff --git a/src/Core/protected/Mesh/MeshEntity.h b/src/Core/protected/Mesh/MeshEntity.h index dad299d1..942ba889 100644 --- a/src/Core/protected/Mesh/MeshEntity.h +++ b/src/Core/protected/Mesh/MeshEntity.h @@ -13,7 +13,6 @@ #include "Internal/InternalEntity.h" #include "Utils/Property.h" #include "Utils/DisplayProperties.h" -#include "Mesh/MeshManager.h" /*----------------------------------------------------------------------------*/ namespace Mgx3D { /*----------------------------------------------------------------------------*/ @@ -26,6 +25,7 @@ namespace Mgx3D { */ namespace Mesh { +class MeshManager; class CommandCreateMesh; /*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Mesh/MeshManager.h b/src/Core/protected/Mesh/MeshManager.h index 37fd14c7..9f85f63e 100644 --- a/src/Core/protected/Mesh/MeshManager.h +++ b/src/Core/protected/Mesh/MeshManager.h @@ -2,7 +2,7 @@ #define MGX3D_MESH_MESHMANAGER_H_ /*----------------------------------------------------------------------------*/ #include "Internal/CommandCreator.h" -#include "Utils/Container.h" +#include "Mesh/MeshEntity.h" #include "Utils/SwigCompletion.h" /*----------------------------------------------------------------------------*/ #include @@ -195,11 +195,11 @@ class MeshManager final : public Internal::CommandCreator { #endif /*------------------------------------------------------------------------*/ - int getNbClouds(bool onlyVisible = true) const; + int getNbClouds() const; SET_SWIG_COMPLETABLE_METHOD(getNbClouds) - int getNbSurfaces(bool onlyVisible = true) const; + int getNbSurfaces() const; SET_SWIG_COMPLETABLE_METHOD(getNbSurfaces) - int getNbVolumes(bool onlyVisible = true) const; + int getNbVolumes() const; SET_SWIG_COMPLETABLE_METHOD(getNbVolumes) int getNbNodes(); int getNbFaces(); @@ -225,7 +225,7 @@ class MeshManager final : public Internal::CommandCreator { Cloud* getCloud(const std::string& name, const bool exceptionIfNotFound=true) const; /** Retourne les Nuages */ - void getClouds(std::vector& AClouds) const; + std::vector getCloudsObj() const; /*------------------------------------------------------------------------*/ /** Ajoute une Ligne au manager */ @@ -238,7 +238,7 @@ class MeshManager final : public Internal::CommandCreator { Line* getLine(const std::string& name, const bool exceptionIfNotFound=true) const; /** Retourne les Lignes */ - void getLines(std::vector& ALines) const; + std::vector getLinesObj() const; /*------------------------------------------------------------------------*/ /** Ajoute une Surface au manager */ @@ -251,7 +251,7 @@ class MeshManager final : public Internal::CommandCreator { Surface* getSurface(const std::string& name, const bool exceptionIfNotFound=true) const; /** Retourne les Surfaces */ - void getSurfaces(std::vector& ASurfaces) const; + std::vector getSurfacesObj() const; /*------------------------------------------------------------------------*/ /** Ajoute un Volume au manager */ @@ -264,7 +264,7 @@ class MeshManager final : public Internal::CommandCreator { Volume* getVolume(const std::string& name, const bool exceptionIfNotFound=true) const; /** Retourne les Volumes */ - void getVolumes(std::vector& AVolumes) const; + std::vector getVolumesObj() const; /** Création d'un sous-volume ou réutilisation d'un existant */ SubVolume* getNewSubVolume(const std::string& gr_name, Internal::InfoCommand* icmd); @@ -277,20 +277,24 @@ class MeshManager final : public Internal::CommandCreator { #endif private: + /// retourne l'entité à partir du nom, une exception si elle n'existe pas + template ::value>> + T* findByName(const std::string& name, const std::vector entities, const bool exceptionIfNotFound) const; + /// Lien sur la structure de maillage et ses algos MeshItf* m_mesh_itf; // stockage des groupes de noeuds - Utils::Container m_clouds; + std::vector m_clouds; // stockage des groupes de lignes - Utils::Container m_lines; + std::vector m_lines; // stockage des groupes de polygones - Utils::Container m_surfaces; + std::vector m_surfaces; // stockage des groupes de polyèdres - Utils::Container m_volumes; + std::vector m_volumes; /// Stategie pour la conservation des créations et modifications de maillage diff --git a/src/Core/protected/Mesh/SubSurface.h b/src/Core/protected/Mesh/SubSurface.h index 794ee370..d7c3cbd9 100644 --- a/src/Core/protected/Mesh/SubSurface.h +++ b/src/Core/protected/Mesh/SubSurface.h @@ -58,22 +58,12 @@ class SubSurface : public Surface { */ virtual Utils::Entity::objectType getType() const {return Utils::Entity::MeshSubSurface;} - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom court du type d'objet (pour le nommage des entités) - */ - static std::string getTinyName() {return "SS";} - - /*------------------------------------------------------------------------*/ - /** \brief Test si l'entité est un Surface suivant son nom - */ - static bool isA(std::string& name); - /*------------------------------------------------------------------------*/ /// ajoute un polygone à la liste - void addFace(gmds::Face face); + void add(gmds::Face face); /// ajoute une liste de polygones à la liste - void addFace(std::vector face); + void add(std::vector face); /// Fournit l'accès aux faces GMDS virtual void getGMDSFaces(std::vector& faces) const; diff --git a/src/Core/protected/Mesh/SubVolume.h b/src/Core/protected/Mesh/SubVolume.h index b933ae02..f352b9d4 100644 --- a/src/Core/protected/Mesh/SubVolume.h +++ b/src/Core/protected/Mesh/SubVolume.h @@ -72,16 +72,6 @@ class SubVolume : public Volume { */ virtual Utils::Entity::objectType getType() const {return Utils::Entity::MeshSubVolume;} - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom court du type d'objet (pour le nommage des entités) - */ - static std::string getTinyName() {return "SV";} - - /*------------------------------------------------------------------------*/ - /** \brief Test si l'entité est un Volume suivant son nom - */ - static bool isA(std::string& name); - /*------------------------------------------------------------------------*/ /// ajoute un polyèdre à la liste void addRegion(gmds::Region& reg); diff --git a/src/Core/protected/Mesh/Surface.h b/src/Core/protected/Mesh/Surface.h index 07af9292..e68060f5 100644 --- a/src/Core/protected/Mesh/Surface.h +++ b/src/Core/protected/Mesh/Surface.h @@ -3,7 +3,6 @@ /*----------------------------------------------------------------------------*/ #include "Mesh/MeshEntity.h" #include -#include "Utils/Container.h" #include "Topo/MeshSurfaceTopoProperty.h" /*----------------------------------------------------------------------------*/ namespace gmds { @@ -89,16 +88,6 @@ class Surface : public MeshEntity { */ virtual Utils::Entity::objectType getType() const {return Utils::Entity::MeshSurface;} - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom court du type d'objet (pour le nommage des entités) - */ - static std::string getTinyName() {return "Su";} - - /*------------------------------------------------------------------------*/ - /** \brief Test si l'entité est une Surface suivant son nom - */ - static bool isA(std::string& name); - /*------------------------------------------------------------------------*/ /// pour l'affichage d'informations #ifndef SWIG @@ -108,13 +97,13 @@ class Surface : public MeshEntity { /*------------------------------------------------------------------------*/ /// \brief Ajoute une relation vers une face commune #ifndef SWIG - void addCoFace(Topo::CoFace* f); + void add(Topo::CoFace* f); #endif /*----------------------------------------------------------------------------*/ /// Retire une relation vers une Face commune #ifndef SWIG - void removeCoFace(Topo::CoFace* f); + void remove(Topo::CoFace* f); #endif /*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/Mesh/Volume.h b/src/Core/protected/Mesh/Volume.h index 3329b437..5c4811d0 100644 --- a/src/Core/protected/Mesh/Volume.h +++ b/src/Core/protected/Mesh/Volume.h @@ -3,7 +3,6 @@ /*----------------------------------------------------------------------------*/ #include "Mesh/MeshEntity.h" #include -#include "Utils/Container.h" #include "Topo/MeshVolumeTopoProperty.h" /*----------------------------------------------------------------------------*/ namespace gmds { @@ -89,16 +88,6 @@ class Volume : public MeshEntity { */ virtual Utils::Entity::objectType getType() const {return Utils::Entity::MeshVolume;} - /*------------------------------------------------------------------------*/ - /** \brief Donne le nom court du type d'objet (pour le nommage des entités) - */ - static std::string getTinyName() {return "Vo";} - - /*------------------------------------------------------------------------*/ - /** \brief Test si l'entité est un Volume suivant son nom - */ - static bool isA(std::string& name); - /*------------------------------------------------------------------------*/ /// pour l'affichage d'informations #ifndef SWIG @@ -108,13 +97,13 @@ class Volume : public MeshEntity { /*------------------------------------------------------------------------*/ /// \brief Ajoute une relation vers un bloc #ifndef SWIG - void addBlock(Topo::Block* b); + void add(Topo::Block* b); #endif /*----------------------------------------------------------------------------*/ /// Retire une relation vers un bloc #ifndef SWIG - void removeBlock(Topo::Block* b); + void remove(Topo::Block* b); #endif /*----------------------------------------------------------------------------*/ diff --git a/src/Core/protected/SysCoord/SysCoordManager.h b/src/Core/protected/SysCoord/SysCoordManager.h index 0f3456a1..f9f92250 100644 --- a/src/Core/protected/SysCoord/SysCoordManager.h +++ b/src/Core/protected/SysCoord/SysCoordManager.h @@ -11,7 +11,6 @@ /*----------------------------------------------------------------------------*/ #include "Internal/CommandCreator.h" #include "Internal/M3DCommandResult.h" -#include "Utils/Container.h" #include "Utils/Constants.h" #include "Utils/SwigCompletion.h" /*----------------------------------------------------------------------------*/ @@ -176,8 +175,8 @@ class SysCoordManager final : public Internal::CommandCreator { /// retourne le repère à partir de son nom SysCoord* getSysCoord (const std::string& name, const bool exceptionIfNotFound=true) const; - void add(SysCoord* rep) {m_reperes.add(rep);} - void remove(SysCoord* rep) {m_reperes.remove(rep, true);} + void add(SysCoord* rep); + void remove(SysCoord* rep); #endif private: @@ -188,7 +187,7 @@ class SysCoordManager final : public Internal::CommandCreator { SysCoordManager& operator = (const SysCoordManager&); /** repères accessibles depuis le manager */ - Utils::Container m_reperes; + std::vector m_reperes; }; /*----------------------------------------------------------------------------*/ } // end namespace CoordinateSystem diff --git a/src/Core/protected/Topo/CoEdge.h b/src/Core/protected/Topo/CoEdge.h index 84444933..0aa79979 100644 --- a/src/Core/protected/Topo/CoEdge.h +++ b/src/Core/protected/Topo/CoEdge.h @@ -90,10 +90,10 @@ class CoEdge : public TopoEntity { /*------------------------------------------------------------------------*/ /// ajoute une relation vers une arête - void addEdge(Edge* e); + void add(Edge* e); /// enlève une relation vers une arête - void removeEdge(Edge* e); + void remove(Edge* e); /// Fournit l'accès aux arêtes topologiques qui utilisent cette CoEdge sans copie const std::vector & getEdges() const diff --git a/src/Core/protected/Topo/CoFace.h b/src/Core/protected/Topo/CoFace.h index 031a4526..70859406 100644 --- a/src/Core/protected/Topo/CoFace.h +++ b/src/Core/protected/Topo/CoFace.h @@ -93,10 +93,10 @@ class CoFace : public TopoEntity { /*------------------------------------------------------------------------*/ /// ajoute une relation vers une face - void addFace(Face* f); + void add(Face* f); /// enlève une relation vers une face - void removeFace(Face* f); + void remove(Face* f); /** \brief Fournit l'accès aux faces topologiques incidentes sans copie */ @@ -201,10 +201,10 @@ class CoFace : public TopoEntity { {return m_topo_property->getEdgeContainer();} /// ajoute une relation vers une arête - void addEdge(Edge* e); + void add(Edge* e); /// enlève une relation vers une arête - void removeEdge(Edge* e); + void remove(Edge* e); /// accès à l'une des arêtes suivant 2 sommets Edge* getEdge(Topo::Vertex* v1, Topo::Vertex* v2) const; diff --git a/src/Core/protected/Topo/Edge.h b/src/Core/protected/Topo/Edge.h index 27307328..2ed44494 100644 --- a/src/Core/protected/Topo/Edge.h +++ b/src/Core/protected/Topo/Edge.h @@ -118,10 +118,10 @@ class Edge : public TopoEntity { /*------------------------------------------------------------------------*/ /// ajoute une relation vers une face - void addCoFace(CoFace* f); + void add(CoFace* f); /// enlève une relation vers une face - void removeCoFace(CoFace* f); + void remove(CoFace* f); /** Fournit l'accès aux faces topologiques incidentes sans copie */ @@ -193,10 +193,10 @@ class Edge : public TopoEntity { /*------------------------------------------------------------------------*/ /// ajoute une relation vers une arête - void addCoEdge(CoEdge* e); + void add(CoEdge* e); /// enlève une relation vers une arête - void removeCoEdge(CoEdge* e); + void remove(CoEdge* e); /// Fournit l'accès aux arêtes topologiques qui utilisent cette CoEdge sans copie const std::vector& getCoEdges() const diff --git a/src/Core/protected/Topo/Face.h b/src/Core/protected/Topo/Face.h index c0f6eb2f..836dfb6b 100644 --- a/src/Core/protected/Topo/Face.h +++ b/src/Core/protected/Topo/Face.h @@ -87,10 +87,10 @@ class Face : public TopoEntity { /*------------------------------------------------------------------------*/ /// ajoute une relation vers un bloc - void addBlock(Block* b); + void add(Block* b); /// enlève une relation vers un bloc - void removeBlock(Block* b); + void remove(Block* b); /// Fournit l'accès aux blocs topologiques incidents sans copie const std::vector& getBlocks() const @@ -107,10 +107,10 @@ class Face : public TopoEntity { /*------------------------------------------------------------------------*/ /// ajoute une relation vers une coface - void addCoFace(CoFace* f); + void add(CoFace* f); /// enlève une relation vers une coface - void removeCoFace(CoFace* f); + void remove(CoFace* f); /** Fournit l'accès aux faces topologiques incidentes sans copie */ diff --git a/src/Core/protected/Topo/TopoManager.h b/src/Core/protected/Topo/TopoManager.h index 8d52834d..bb43a59d 100644 --- a/src/Core/protected/Topo/TopoManager.h +++ b/src/Core/protected/Topo/TopoManager.h @@ -13,7 +13,6 @@ #include "Topo/Edge.h" #include "Topo/CoEdge.h" #include "Topo/Vertex.h" -#include "Utils/Container.h" #include "Utils/Plane.h" #include "Utils/Constants.h" #include "Utils/SwigCompletion.h" @@ -1739,7 +1738,7 @@ class TopoManager final : public Internal::CommandCreator { /** \brief retourne la liste des blocs gérées par le manager, * optionnellement triés par id * */ - void getBlocks(std::vector& blocks, bool sort=false) const; + std::vector getBlocksObj() const; /*------------------------------------------------------------------------*/ /** Retourne le Block suivant le nom en argument */ @@ -1765,7 +1764,7 @@ class TopoManager final : public Internal::CommandCreator { /** \brief retourne la liste des faces communes (non détruites) accessibles depuis le manager * Les faces sont ordonnés suivant l'id * */ - void getCoFaces(std::vector& faces) const; + std::vector getCoFacesObj() const; /** Retourne la Face commune suivant le nom en argument */ CoFace* getCoFace(const std::string& name, const bool exceptionIfNotFound=true) const; @@ -1788,7 +1787,7 @@ class TopoManager final : public Internal::CommandCreator { /*------------------------------------------------------------------------*/ /** \brief retourne la liste des arêtes communes (non détruites) accessibles depuis les blocs */ - void getCoEdges(std::vector& edges) const; + std::vector getCoEdgesObj() const; /** Retourne l'arête suivant le nom en argument */ CoEdge* getCoEdge(const std::string& name, const bool exceptionIfNotFound=true) const; @@ -1801,7 +1800,7 @@ class TopoManager final : public Internal::CommandCreator { /*------------------------------------------------------------------------*/ /** \brief retourne la liste des vertex (non détruits) accessibles depuis le manager */ - void getVertices(std::vector& vertices) const; + std::vector getVerticesObj() const; /** Retourne le sommet suivant le nom en argument */ Vertex* getVertex(const std::string& name, const bool exceptionIfNotFound=true) const; @@ -1923,22 +1922,22 @@ class TopoManager final : public Internal::CommandCreator { const char* nom_fonction); /** blocs accessibles depuis le manager */ - Utils::Container m_blocks; + std::vector m_blocks; /** faces accessibles depuis le manager */ - Utils::Container m_faces; + std::vector m_faces; /** faces communes accessibles depuis le manager */ - Utils::Container m_cofaces; + std::vector m_cofaces; /** arêtes accessibles depuis le manager */ - Utils::Container m_edges; + std::vector m_edges; /** arêtes communes accessibles depuis le manager */ - Utils::Container m_coedges; + std::vector m_coedges; /** sommets accessibles depuis le manager */ - Utils::Container m_vertices; + std::vector m_vertices; /// Nombre de bras par défaut pour une arête int m_defaultNbMeshingEdges; diff --git a/src/Core/protected/Topo/Vertex.h b/src/Core/protected/Topo/Vertex.h index eb18ac42..9da9dbad 100644 --- a/src/Core/protected/Topo/Vertex.h +++ b/src/Core/protected/Topo/Vertex.h @@ -109,7 +109,7 @@ class Vertex : public TopoEntity { * \see saveVertexTopoProperty */ - void addCoEdge(CoEdge* e); + void add(CoEdge* e); /*------------------------------------------------------------------------*/ /** \brief Enlève une relation vers une arête commune @@ -118,7 +118,7 @@ class Vertex : public TopoEntity { * Attention à sauvegarder pour le undo * \see saveVertexTopoProperty */ - void removeCoEdge(CoEdge* e); + void remove(CoEdge* e); /*------------------------------------------------------------------------*/ /// Fournit l'accès aux arêtes topologiques communes incidentes sans copie diff --git a/src/QtComponents/QtGroupsPanel.cpp b/src/QtComponents/QtGroupsPanel.cpp index 5b0239e2..9607e676 100644 --- a/src/QtComponents/QtGroupsPanel.cpp +++ b/src/QtComponents/QtGroupsPanel.cpp @@ -2033,33 +2033,27 @@ void QtGroupsPanel::selectAllCallback ( ) entities.insert(entities.end(), ge.begin(), ge.end()); } if (types & FilterEntity::TopoBlock){ - std::vector te; - getContext ( ).getTopoManager().getBlocks(te); + std::vector te = getContext ( ).getTopoManager().getBlocksObj(); entities.insert(entities.end(), te.begin(), te.end()); } if (types & FilterEntity::TopoCoFace){ - std::vector te; - getContext ( ).getTopoManager().getCoFaces(te); + std::vector te = getContext ( ).getTopoManager().getCoFacesObj(); entities.insert(entities.end(), te.begin(), te.end()); } if (types & FilterEntity::TopoCoEdge){ - std::vector te; - getContext ( ).getTopoManager().getCoEdges(te); + std::vector te = getContext ( ).getTopoManager().getCoEdgesObj(); entities.insert(entities.end(), te.begin(), te.end()); } if (types & FilterEntity::TopoVertex){ - std::vector te; - getContext ( ).getTopoManager().getVertices(te); + std::vector te = getContext ( ).getTopoManager().getVerticesObj(); entities.insert(entities.end(), te.begin(), te.end()); } if (types & FilterEntity::MeshSurface){ - std::vector ms; - getContext ( ).getMeshManager().getSurfaces(ms); + std::vector ms = getContext ( ).getMeshManager().getSurfacesObj(); entities.insert(entities.end(), ms.begin(), ms.end()); } if (types & FilterEntity::MeshVolume){ - std::vector me; - getContext ( ).getMeshManager().getVolumes(me); + std::vector me = getContext ( ).getMeshManager().getVolumesObj(); entities.insert(entities.end(), me.begin(), me.end()); } diff --git a/src/QtComponents/QtMeshInformationOperationAction.cpp b/src/QtComponents/QtMeshInformationOperationAction.cpp index 9d283b78..abbbda00 100644 --- a/src/QtComponents/QtMeshInformationOperationAction.cpp +++ b/src/QtComponents/QtMeshInformationOperationAction.cpp @@ -234,8 +234,7 @@ void QtMeshInformationOperationPanel::autoUpdate ( ) QtMgx3DOperationPanel::autoUpdate ( ); - std::vector blocks; - manager->getBlocks(blocks); + std::vector blocks = manager->getBlocksObj(); uint nb_blocs = blocks.size(); uint nb_bl_mailles = 0; @@ -278,8 +277,7 @@ void QtMeshInformationOperationPanel::autoUpdate ( ) _nbProvideRegionLabel->setText (UTF8TOQSTRING (text)); } - std::vector cofaces; - manager->getCoFaces(cofaces); + std::vector cofaces = manager->getCoFacesObj(); uint nb_cofaces = cofaces.size(); uint nb_cf_mailles = 0; diff --git a/src/QtComponents/QtMeshQualityDividerOperationAction.cpp b/src/QtComponents/QtMeshQualityDividerOperationAction.cpp index 2ebc0a60..48f60f39 100644 --- a/src/QtComponents/QtMeshQualityDividerOperationAction.cpp +++ b/src/QtComponents/QtMeshQualityDividerOperationAction.cpp @@ -266,10 +266,10 @@ void QtMeshQualityDividerOperationPanel::autoUpdate ( ) // s'il n'y a rien de sélectionné, on prend tout [EB] if (volumes.empty()) - getContext ( ).getMeshManager().getVolumes(volumes); + volumes = getContext ( ).getMeshManager().getVolumesObj(); if (volumes.empty() && surfaces.empty()) - getContext ( ).getMeshManager().getSurfaces(surfaces); + surfaces = getContext ( ).getMeshManager().getSurfacesObj(); for (std::vector ::const_iterator iter = surfaces.begin ( ); surfaces.end() != iter; iter++) { diff --git a/src/QtComponents/QtMeshQualityOperationAction.cpp b/src/QtComponents/QtMeshQualityOperationAction.cpp index e002bb6b..92c83bdc 100644 --- a/src/QtComponents/QtMeshQualityOperationAction.cpp +++ b/src/QtComponents/QtMeshQualityOperationAction.cpp @@ -310,10 +310,10 @@ void QtMeshQualityOperationPanel::autoUpdate ( ) // s'il n'y a rien de sélectionné, on prend tout [EB] if (volumes.empty()) - getContext ( ).getMeshManager().getVolumes(volumes); + volumes = getContext ( ).getMeshManager().getVolumesObj(); if (volumes.empty() && surfaces.empty()) - getContext ( ).getMeshManager().getSurfaces(surfaces); + surfaces = getContext ( ).getMeshManager().getSurfacesObj(); for (std::vector ::const_iterator iter = surfaces.begin ( ); surfaces.end() != iter; iter++) @@ -562,7 +562,7 @@ void QtMeshQualityOperationPanel::displayCellsCallback ( ) for (size_t i = 0; i < (*its)->size ( ); i++) { gmds::Face face = gmdsMesh.get(gmdsSurface [i]); - surface->addFace (face); + surface->add (face); } // for (size_t i = 0; i < (*its)->size ( ); i++) context->newGraphicalRepresentation (*surface); _meshEntities.push_back (surface); diff --git a/src/QtComponents/QtMgx3DMainWindow.cpp b/src/QtComponents/QtMgx3DMainWindow.cpp index eb6b64a4..2f894f66 100644 --- a/src/QtComponents/QtMgx3DMainWindow.cpp +++ b/src/QtComponents/QtMgx3DMainWindow.cpp @@ -5259,31 +5259,23 @@ log (t5); if (update0D) { - std::vector vertices; - getContext ( ).getTopoManager ( ).getVertices (vertices); - for (std::vector::iterator itv = vertices.begin ( ); vertices.end ( ) != itv; itv++) - (*itv)->updateDisplayPropertiesColor ( ); + for (Topo::Vertex* v : getContext ( ).getTopoManager ( ).getVerticesObj ( )) + v->updateDisplayPropertiesColor ( ); } // if (true == update0D) if (update1D) { - std::vector edges; - getContext ( ).getTopoManager ( ).getCoEdges (edges); - for (std::vector::iterator ite = edges.begin ( ); edges.end ( ) != ite; ite++) - (*ite)->updateDisplayPropertiesColor ( ); + for (Topo::CoEdge* ce : getContext ( ).getTopoManager ( ).getCoEdgesObj ( )) + ce->updateDisplayPropertiesColor ( ); } // if (true == update1D) if (update2D) { - std::vector faces; - getContext ( ).getTopoManager ( ).getCoFaces (faces); - for (std::vector::iterator itf = faces.begin ( ); faces.end ( ) != itf; itf++) - (*itf)->updateDisplayPropertiesColor ( ); + for (Topo::CoFace* cf : getContext ( ).getTopoManager ( ).getCoFacesObj ( )) + cf->updateDisplayPropertiesColor ( ); } // if (true == update2D) if (update3D) { - std::vector blocks; - getContext ( ).getTopoManager ( ).getBlocks (blocks); - for (std::vector::iterator itb = blocks.begin ( ); blocks.end ( ) != itb; itb++) - (*itb)->updateDisplayPropertiesColor ( ); + for (Topo::Block* b : getContext ( ).getTopoManager ( ).getBlocksObj ( )) + b->updateDisplayPropertiesColor ( ); } // if (true == update3D) if (updateAll || update0D || update1D || update2D || update3D) getGraphicalWidget ( ).getRenderingManager ( ).updateRepresentations ( ); diff --git a/src/QtComponents/QtMgx3DQualityDividerWidget.cpp b/src/QtComponents/QtMgx3DQualityDividerWidget.cpp index edee2d37..bd81171a 100644 --- a/src/QtComponents/QtMgx3DQualityDividerWidget.cpp +++ b/src/QtComponents/QtMgx3DQualityDividerWidget.cpp @@ -160,7 +160,7 @@ void QtMgx3DQualityDividerWidget::displayExtraction (size_t i, bool display) for (size_t i = 0; i < gmdsSurface->size ( ); i++) { gmds::Face face = gmdsMesh.get((*gmdsSurface)[i]); - surface->addFace (face); + surface->add (face); } // for (size_t i = 0; i < gmdsSurface->size ( ); i++) meshManager->add (surface); entity = surface; diff --git a/src/QtComponents/QtTopoInformationOperationAction.cpp b/src/QtComponents/QtTopoInformationOperationAction.cpp index 906c6554..226f28f3 100644 --- a/src/QtComponents/QtTopoInformationOperationAction.cpp +++ b/src/QtComponents/QtTopoInformationOperationAction.cpp @@ -316,12 +316,7 @@ void QtTopoInformationOperationPanel::autoUpdate ( ) QtMgx3DOperationPanel::autoUpdate ( ); - std::vector blocks; - std::vector cofaces; - manager->getBlocks(blocks); - manager->getCoFaces(cofaces); - - uint nb_blocs = blocks.size(); + uint nb_blocs = 0; uint nb_dom_str_dir = 0; uint nb_dom_str_rot = 0; uint nb_dom_str_trans = 0; @@ -345,9 +340,8 @@ void QtTopoInformationOperationPanel::autoUpdate ( ) uint nb_faces_str_trans = 0; uint nb_faces_unstr = 0; - for (std::vector::iterator iter = blocks.begin(); - iter != blocks.end(); ++iter){ - Topo::Block* bloc = *iter; + for (Topo::Block* bloc : manager->getBlocksObj()){ + nb_blocs += 1; size_t nb = bloc->getMeshingData()->regions().size(); nb_regions_tot += nb; if (bloc->getMeshLaw() == Topo::BlockMeshingProperty::transfinite){ @@ -360,10 +354,8 @@ void QtTopoInformationOperationPanel::autoUpdate ( ) } } - for (std::vector::iterator iter = cofaces.begin(); - iter != cofaces.end(); ++iter){ - Topo::CoFace* coface = *iter; - nb_cofaces +=1; + for (Topo::CoFace* coface : manager->getCoFacesObj()){ + nb_cofaces += 1; size_t nb = coface->getMeshingData()->faces().size(); nb_faces_tot += nb; if (coface->getMeshLaw() == Topo::CoFaceMeshingProperty::transfinite){ diff --git a/src/QtComponents/QtTopologySplitBlockAction.cpp b/src/QtComponents/QtTopologySplitBlockAction.cpp index dd3dd8b8..9dc8b45f 100644 --- a/src/QtComponents/QtTopologySplitBlockAction.cpp +++ b/src/QtComponents/QtTopologySplitBlockAction.cpp @@ -274,11 +274,8 @@ vector QtTopologySplitBlockPanel::getBlocksNames ( ) const CHECK_NULL_PTR_ERROR (_blocksPanel) if (true == allBlocks ( )) { - vector blocks; - getContext ( ).getTopoManager ( ).getBlocks (blocks); - for (vector::iterator it = blocks.begin ( ); - blocks.end ( ) != it; it++) - names.push_back ((*it)->getUniqueName ( )); + for (Block* b : getContext ( ).getTopoManager ( ).getBlocksObj ()) + names.push_back (b->getUniqueName ( )); } // if (true == allBlocks ( )) else names = _blocksPanel->getUniqueNames ( ); @@ -429,20 +426,15 @@ vector QtTopologySplitBlockPanel::getInvolvedEntities ( ) if (true == allBlocks ( )) { - vector blocks; - getContext ( ).getTopoManager ( ).getBlocks (blocks); - for (vector::iterator it = blocks.begin ( ); - blocks.end ( ) != it; it++) - entities.push_back (*it); + for (Block* b : getContext ( ).getTopoManager ( ).getBlocksObj ( )) + entities.push_back (b); } // if (true == allBlocks ( )) else { - const vector blocksNames = getBlocksNames ( ); - for (vector::const_iterator it = blocksNames.begin ( ); - blocksNames.end ( ) != it; it++) + for (string name : getBlocksNames ( )) { TopoEntity* te = - getContext( ).getTopoManager( ).getBlock(*it, false); + getContext( ).getTopoManager( ).getBlock(name, false); if (0 != te) entities.push_back (te); } // for (vector::const_iterator it = ... diff --git a/src/QtComponents/QtTopologySplitFacesAction.cpp b/src/QtComponents/QtTopologySplitFacesAction.cpp index 865ca562..d5cab6da 100644 --- a/src/QtComponents/QtTopologySplitFacesAction.cpp +++ b/src/QtComponents/QtTopologySplitFacesAction.cpp @@ -301,11 +301,8 @@ vector QtTopologySplitFacesPanel::getFacesNames ( ) const CHECK_NULL_PTR_ERROR (_facesPanel) if (true == allFaces ( )) { - vector faces; - getContext ( ).getTopoManager ( ).getCoFaces (faces); - for (vector::iterator it = faces.begin ( ); - faces.end ( ) != it; it++) - names.push_back ((*it)->getUniqueName ( )); + for (CoFace* cf : getContext ( ).getTopoManager ( ).getCoFacesObj ( )) + names.push_back (cf->getUniqueName ( )); } else names = _facesPanel->getUniqueNames ( ); diff --git a/src/Utils/protected/Utils/Container.h b/src/Utils/protected/Utils/Container.h deleted file mode 100644 index d67ce978..00000000 --- a/src/Utils/protected/Utils/Container.h +++ /dev/null @@ -1,225 +0,0 @@ -/*----------------------------------------------------------------------------*/ -/* - * \file Container.h - * - * \author Eric Brière de l'Isle - * - * \date Mars 2013 - * - * Comme pour Container, mais sans les Handles - * */ -/*----------------------------------------------------------------------------*/ -#ifndef UTILS_CONTAINER_H_ -#define UTILS_CONTAINER_H_ -/*----------------------------------------------------------------------------*/ -#include -#include -#include -#include -#include -/*----------------------------------------------------------------------------*/ -namespace Mgx3D { -/*----------------------------------------------------------------------------*/ -namespace Utils { -/*----------------------------------------------------------------------------*/ - -/*----------------------------------------------------------------------------*/ -/** \class Container - * \brief Conteneur (du type vector) sur des pointeurs - */ -/*----------------------------------------------------------------------------*/ -template -class Container{ - -public: - /// ajoute une entité - void add(T* entity) - { - m_entities.push_back(entity); - } - - /*----------------------------------------------------------------------------*/ - /// ajoute un vecteur d'entités - void add(const std::vector& entities) - { - m_entities.insert(m_entities.end(), entities.begin(), entities.end()); - } - - /// ajoute une liste d'entités - void add(const std::list& entities) - { - m_entities.insert(m_entities.end(), entities.begin(), entities.end()); - } - - /*----------------------------------------------------------------------------*/ - /// recherche et enlève l'entité - void remove(T* entity, const bool exceptionIfNotFound=true) - { - uint i = 0; - for (; igetName(); - throw TkUtil::Exception (message); - } - } - - /*----------------------------------------------------------------------------*/ - /// copie le contenu du conteneur - void get(std::vector& entities) const - { - entities.clear(); - entities.insert(entities.end(), m_entities.begin(), m_entities.end()); - } - - /*----------------------------------------------------------------------------*/ - /// copie le contenu du conteneur - void get(std::list& entities) const - { - entities.clear(); - entities.insert(entities.end(), m_entities.begin(), m_entities.end()); - } - - /*----------------------------------------------------------------------------*/ - /// accès directe au contenu du conteneur - const std::vector& get() const - { - return m_entities; - } - - /*----------------------------------------------------------------------------*/ - /// copie le contenu du conteneur - void clone(Container& cont) - { - m_entities.insert(m_entities.end(), cont.m_entities.begin(), cont.m_entities.end()); - } - - /*----------------------------------------------------------------------------*/ - /// retourne la ième entité - T* get(uint ind) const - { -#ifdef _DEBUG2 - if (ind>=m_entities.size()) - throw TkUtil::Exception(TkUtil::UTF8String ("Erreur interne (indice trop élevé), avec Container::get", TkUtil::Charset::UTF_8)); -#endif - - return m_entities[ind]; - } - - /*----------------------------------------------------------------------------*/ - /// modifie la ième entité - void set(uint ind, T* entity) - { -#ifdef _DEBUG2 - if (ind>=m_entities.size()) - throw TkUtil::Exception(TkUtil::UTF8String ("Erreur interne (indice trop élevé), avec Container::set", TkUtil::Charset::UTF_8)); -#endif - - m_entities[ind] = entity; - } - - /*----------------------------------------------------------------------------*/ - /// \return Le nombre d'entités - uint getNb() const - { - return m_entities.size(); - } - uint size() const - { - return m_entities.size(); - } - - /// \return Le nombre d'entités non détruites - uint getVisibleNb() const - { - uint nb = 0; - for (uint i = 0; iisDestroyed()) - nb++; - - return nb; - } - - /*----------------------------------------------------------------------------*/ - /// \return vrai s'il est vide - bool empty() const - { - return m_entities.empty(); - } - - /*----------------------------------------------------------------------------*/ - /// vide le conteneur - void clear() - { - m_entities.clear(); - } - - /*----------------------------------------------------------------------------*/ - /// détruit les entités du conteneur et le vide - void deleteAndClear() - { - for (uint i = 0; iisDestroyed()){ - TkUtil::UTF8String message; - message << "Une des entités est marquée à détruite: " - << m_entities[i]->getName(); - throw TkUtil::Exception (message); - } - } - - -private: - std::vector m_entities; -}; -/*----------------------------------------------------------------------------*/ -} // end namespace Utils -/*----------------------------------------------------------------------------*/ -} // end namespace Mgx3D -/*----------------------------------------------------------------------------*/ - -#endif /* UTILS_CONTAINER_H_ */ diff --git a/src/Utils/protected/Utils/Entity.h b/src/Utils/protected/Utils/Entity.h index 1988adee..2f69bd9f 100644 --- a/src/Utils/protected/Utils/Entity.h +++ b/src/Utils/protected/Utils/Entity.h @@ -434,13 +434,14 @@ void append(std::vector& to, const std::vector& from) } template::value>> -bool remove(T* e, std::vector& entities) +void remove(T* e, std::vector& entities) { if (auto it = std::find(entities.begin(), entities.end(), e); it != entities.end()) { entities.erase(it); - return true; } else { - return false; + TkUtil::UTF8String message; + message << e->getName() << " n'existe pas dans la liste des entités"; + throw TkUtil::Exception (message); } } @@ -454,6 +455,24 @@ void checkIfDestroyed(const std::vector& entities) throw TkUtil::Exception (message); } } + +template::value>> +void deleteAndClear(std::vector& entities) +{ + for (uint i = 0; i::value>> +std::vector filterAndSort(const std::vector& entities) +{ + Utils::EntitySet result(Utils::Entity::compareEntity); + for (T* e : entities) + if (!e->isDestroyed()) + result.insert(e); + return Utils::toVect(result); +} #endif /*----------------------------------------------------------------------------*/ } // end namespace Utils From 804ef2df7e303fb023f0d168612b71168c674a1c Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Fri, 21 Nov 2025 16:31:46 +0100 Subject: [PATCH 14/18] Code refactoring --- src/Core/Geom/GeomManager.cpp | 242 ++++-------------- src/Core/Mesh/CommandAddRemoveGroupName.cpp | 155 +++-------- src/Core/Topo/TopoManager.cpp | 183 +++---------- src/Core/protected/Geom/GeomManager.h | 9 +- .../Mesh/CommandAddRemoveGroupName.h | 94 +------ src/Core/protected/Topo/TopoManager.h | 3 + 6 files changed, 133 insertions(+), 553 deletions(-) diff --git a/src/Core/Geom/GeomManager.cpp b/src/Core/Geom/GeomManager.cpp index 038744d8..6b108ace 100644 --- a/src/Core/Geom/GeomManager.cpp +++ b/src/Core/Geom/GeomManager.cpp @@ -4778,58 +4778,22 @@ void GeomManager::remove (Vertex* v) /*----------------------------------------------------------------------------*/ std::string GeomManager::getLastVolume() const { - std::string nom(""); - if (m_volumes.empty()) - return nom; - // recherche du dernier non détruit, en partant de la fin - int i; - for (i=m_volumes.size()-1; i>=0 && m_volumes[i]->isDestroyed(); i--) - {} - if (i>=0) - nom = m_volumes[i]->getName(); - return nom; + return getLastEntityName(m_volumes); } /*----------------------------------------------------------------------------*/ std::string GeomManager::getLastSurface() const { - std::string nom(""); - if (m_surfaces.empty()) - return nom; - // recherche du dernier non détruit, en partant de la fin - int i; - for (i=m_surfaces.size()-1; i>=0 && m_surfaces[i]->isDestroyed(); i--) - {} - if (i>=0) - nom = m_surfaces[i]->getName(); - return nom; + return getLastEntityName(m_surfaces); } /*----------------------------------------------------------------------------*/ std::string GeomManager::getLastCurve() const { - std::string nom(""); - if (m_curves.empty()) - return nom; - // recherche du dernier non détruit, en partant de la fin - int i; - for (i=m_curves.size()-1; i>=0 && m_curves[i]->isDestroyed(); i--) - {} - if (i>=0) - nom = m_curves[i]->getName(); - return nom; + return getLastEntityName(m_curves); } /*----------------------------------------------------------------------------*/ std::string GeomManager::getLastVertex() const { - std::string nom(""); - if (m_vertices.empty()) - return nom; - // recherche du dernier non détruit, en partant de la fin - int i; - for (i=m_vertices.size()-1; i>=0 && m_vertices[i]->isDestroyed(); i--) - {} - if (i>=0) - nom = m_vertices[i]->getName(); - return nom; + return getLastEntityName(m_vertices); } /*----------------------------------------------------------------------------*/ Internal::M3DCommandResult* GeomManager::addToGroup(std::vector& ve, int dim, const std::string& groupName) @@ -4845,57 +4809,8 @@ Internal::M3DCommandResult* GeomManager::addToGroup(std::vector& ve message << "], "<<(short)dim<<", "< vertices; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - vertices.push_back(getVertex(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), vertices, groupName, Mesh::CommandAddRemoveGroupName::add); - } - break; - case(1):{ - // reconstitue le vecteur de courbes - std::vector curves; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - curves.push_back(getCurve(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), curves, groupName, Mesh::CommandAddRemoveGroupName::add); - } - break; - case(2):{ - // reconstitue le vecteur de surfaces - std::vector surfaces; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - surfaces.push_back(getSurface(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), surfaces, groupName, Mesh::CommandAddRemoveGroupName::add); - } - break; - case(3):{ - // reconstitue le vecteur de volumes - std::vector volumes; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - volumes.push_back(getVolume(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), volumes, groupName, Mesh::CommandAddRemoveGroupName::add); - } - break; - default:{ - TkUtil::Exception ("Dimension erronée"); - } - break; - } - - CHECK_NULL_PTR_ERROR(command); + std::vector entities = getEntitiesFromNames(ve, dim); + Mesh::CommandAddRemoveGroupName* command = new Mesh::CommandAddRemoveGroupName(getContext(), entities, dim, groupName, Mesh::CommandAddRemoveGroupName::add); // trace dans le script TkUtil::UTF8String cmd (TkUtil::Charset::UTF_8); @@ -4930,57 +4845,8 @@ Internal::M3DCommandResult* GeomManager::removeFromGroup(std::vector vertices; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - vertices.push_back(getVertex(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), vertices, groupName, Mesh::CommandAddRemoveGroupName::remove); - } - break; - case(1):{ - // reconstitue le vecteur de courbes - std::vector curves; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - curves.push_back(getCurve(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), curves, groupName, Mesh::CommandAddRemoveGroupName::remove); - } - break; - case(2):{ - // reconstitue le vecteur de surfaces - std::vector surfaces; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - surfaces.push_back(getSurface(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), surfaces, groupName, Mesh::CommandAddRemoveGroupName::remove); - } - break; - case(3):{ - // reconstitue le vecteur de volumes - std::vector volumes; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - volumes.push_back(getVolume(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), volumes, groupName, Mesh::CommandAddRemoveGroupName::remove); - } - break; - default:{ - TkUtil::Exception ("Dimension erronée"); - } - break; - } - - CHECK_NULL_PTR_ERROR(command); + std::vector entities = getEntitiesFromNames(ve, dim); + Mesh::CommandAddRemoveGroupName* command = new Mesh::CommandAddRemoveGroupName(getContext(), entities, dim, groupName, Mesh::CommandAddRemoveGroupName::remove); // trace dans le script TkUtil::UTF8String cmd (TkUtil::Charset::UTF_8); @@ -5015,57 +4881,8 @@ Internal::M3DCommandResult* GeomManager::setGroup(std::vector& ve, message << "], "<<(short)dim<<", "< vertices; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - vertices.push_back(getVertex(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), vertices, groupName, Mesh::CommandAddRemoveGroupName::set); - } - break; - case(1):{ - // reconstitue le vecteur de courbes - std::vector curves; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - curves.push_back(getCurve(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), curves, groupName, Mesh::CommandAddRemoveGroupName::set); - } - break; - case(2):{ - // reconstitue le vecteur de surfaces - std::vector surfaces; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - surfaces.push_back(getSurface(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), surfaces, groupName, Mesh::CommandAddRemoveGroupName::set); - } - break; - case(3):{ - // reconstitue le vecteur de volumes - std::vector volumes; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - volumes.push_back(getVolume(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), volumes, groupName, Mesh::CommandAddRemoveGroupName::set); - } - break; - default:{ - TkUtil::Exception ("Dimension erronée"); - } - break; - } - - CHECK_NULL_PTR_ERROR(command); + std::vector entities = getEntitiesFromNames(ve, dim); + Mesh::CommandAddRemoveGroupName* command = new Mesh::CommandAddRemoveGroupName(getContext(), entities, dim, groupName, Mesh::CommandAddRemoveGroupName::set); // trace dans le script TkUtil::UTF8String cmd (TkUtil::Charset::UTF_8); @@ -5114,6 +4931,45 @@ hasRefTopo(std::vector& entities) return false; } /*----------------------------------------------------------------------------*/ +template ::value>> +std::string GeomManager::getLastEntityName(const std::vector& entities) const +{ + std::string nom(""); + if (entities.empty()) + return nom; + // recherche du dernier non détruit, en partant de la fin + int i; + for (i=entities.size()-1; i>=0 && entities[i]->isDestroyed(); i--) + {} + if (i>=0) + nom = entities[i]->getName(); + return nom; +} +/*----------------------------------------------------------------------------*/ +std::vector GeomManager::getEntitiesFromNames(const std::vector& names, const int dim) const +{ + std::vector entities; + + switch(dim){ + case(0): + for (std::string name : names) entities.push_back(getVertex(name)); + break; + case(1): + for (std::string name : names) entities.push_back(getCurve(name)); + break; + case(2): + for (std::string name : names) entities.push_back(getSurface(name)); + break; + case(3): + for (std::string name : names) entities.push_back(getVolume(name)); + break; + default: + throw TkUtil::Exception ("Dimension erronée"); + } + + return entities; +} +/*----------------------------------------------------------------------------*/ } // end namespace Geom /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/Mesh/CommandAddRemoveGroupName.cpp b/src/Core/Mesh/CommandAddRemoveGroupName.cpp index 8e1e7a43..e7ddffcd 100644 --- a/src/Core/Mesh/CommandAddRemoveGroupName.cpp +++ b/src/Core/Mesh/CommandAddRemoveGroupName.cpp @@ -23,113 +23,33 @@ namespace Mgx3D { namespace Mesh { /*----------------------------------------------------------------------------*/ CommandAddRemoveGroupName::CommandAddRemoveGroupName(Internal::Context& c, - std::vector& volumes, + std::vector& entities, + const int dim, const std::string& groupName, groupOperation ope) : CommandCreateMesh(c, (std::string("Modifie le groupe ")+groupName),0) , m_group_helper(getInfoCommand(), c.getGroupManager()) -, m_geom_entities(volumes.begin(), volumes.end()) +, m_geom_entities(entities.begin(), entities.end()) , m_groupName(groupName) -, m_dim(3) +, m_dim(dim) , m_ope(ope) { } /*----------------------------------------------------------------------------*/ CommandAddRemoveGroupName::CommandAddRemoveGroupName(Internal::Context& c, - std::vector& surfaces, + std::vector& entities, + const int dim, const std::string& groupName, groupOperation ope) : CommandCreateMesh(c, (std::string("Modifie le groupe ")+groupName),0) , m_group_helper(getInfoCommand(), c.getGroupManager()) -, m_geom_entities(surfaces.begin(), surfaces.end()) +, m_topo_entities(entities.begin(), entities.end()) , m_groupName(groupName) -, m_dim(2) +, m_dim(dim) , m_ope(ope) { } /*----------------------------------------------------------------------------*/ -CommandAddRemoveGroupName::CommandAddRemoveGroupName(Internal::Context& c, - std::vector& curves, - const std::string& groupName, - groupOperation ope) -: CommandCreateMesh(c, (std::string("Modifie le groupe ")+groupName),0) -, m_group_helper(getInfoCommand(), c.getGroupManager()) -, m_geom_entities(curves.begin(), curves.end()) -, m_groupName(groupName) -, m_dim(1) -, m_ope(ope) -{ -} -/*----------------------------------------------------------------------------*/ -CommandAddRemoveGroupName::CommandAddRemoveGroupName(Internal::Context& c, - std::vector& vertices, - const std::string& groupName, - groupOperation ope) -: CommandCreateMesh(c, (std::string("Modifie le groupe ")+groupName),0) -, m_group_helper(getInfoCommand(), c.getGroupManager()) -, m_geom_entities(vertices.begin(), vertices.end()) -, m_groupName(groupName) -, m_dim(0) -, m_ope(ope) -{ -} -/*----------------------------------------------------------------------------*/ -CommandAddRemoveGroupName::CommandAddRemoveGroupName(Internal::Context& c, - std::vector& blocks, - const std::string& groupName, - groupOperation ope) -: CommandCreateMesh(c, (std::string("Modifie le groupe ")+groupName),0) -, m_group_helper(getInfoCommand(), c.getGroupManager()) -, m_topo_entities(blocks.begin(), blocks.end()) -, m_groupName(groupName) -, m_dim(3) -, m_ope(ope) -{ -} -/*----------------------------------------------------------------------------*/ -CommandAddRemoveGroupName::CommandAddRemoveGroupName(Internal::Context& c, - std::vector& cofaces, - const std::string& groupName, - groupOperation ope) -: CommandCreateMesh(c, (std::string("Modifie le groupe ")+groupName),0) -, m_group_helper(getInfoCommand(), c.getGroupManager()) -, m_topo_entities(cofaces.begin(), cofaces.end()) -, m_groupName(groupName) -, m_dim(2) -, m_ope(ope) -{ -} -/*----------------------------------------------------------------------------*/ -CommandAddRemoveGroupName::CommandAddRemoveGroupName(Internal::Context& c, - std::vector& coedges, - const std::string& groupName, - groupOperation ope) -: CommandCreateMesh(c, (std::string("Modifie le groupe ")+groupName),0) -, m_group_helper(getInfoCommand(), c.getGroupManager()) -, m_topo_entities(coedges.begin(), coedges.end()) -, m_groupName(groupName) -, m_dim(1) -, m_ope(ope) -{ -} -/*----------------------------------------------------------------------------*/ -CommandAddRemoveGroupName::CommandAddRemoveGroupName(Internal::Context& c, - std::vector& vertices, - const std::string& groupName, - groupOperation ope) -: CommandCreateMesh(c, (std::string("Modifie le groupe ")+groupName),0) -, m_group_helper(getInfoCommand(), c.getGroupManager()) -, m_topo_entities(vertices.begin(), vertices.end()) -, m_groupName(groupName) -, m_dim(0) -, m_ope(ope) -{ -} -/*----------------------------------------------------------------------------*/ -CommandAddRemoveGroupName::~CommandAddRemoveGroupName() -{ -} -/*----------------------------------------------------------------------------*/ void CommandAddRemoveGroupName::internalExecute() { Group::GroupManager& gm = getContext().getGroupManager(); @@ -253,12 +173,25 @@ void CommandAddRemoveGroupName::internalRedo() void CommandAddRemoveGroupName:: updateMesh(Geom::GeomEntity* e, std::string grpName, bool add) { + Topo::TopoManager& tm = getContext().getTopoManager(); switch (e->getDim()) { - case 1: return updateMesh(dynamic_cast(e), grpName, add); - case 2: return updateMesh(dynamic_cast(e), grpName, add); - case 3: return updateMesh(dynamic_cast(e), grpName, add); - default: return; // rien à faire en 0D + case 1: { + std::vector coedges = tm.getFilteredRefTopos(e); + updateMesh(coedges, grpName, add); + break; + } + case 2: { + std::vector cofaces = tm.getFilteredRefTopos(e); + updateMesh(cofaces, grpName, add); + break; + } + case 3: { + std::vector blocs = tm.getFilteredRefTopos(e); + updateMesh(blocs, grpName, add); + break; + } + default: break; // rien à faire en 0D } } /*----------------------------------------------------------------------------*/ @@ -269,30 +202,24 @@ updateMesh(Topo::TopoEntity* e, std::string grpName, bool add) { case 1: { std::vector v = { dynamic_cast(e) }; - return updateMesh(v, grpName, add); + updateMesh(v, grpName, add); + break; } case 2: { std::vector v = { dynamic_cast(e) }; - return updateMesh(v, grpName, add); + updateMesh(v, grpName, add); + break; } case 3: { std::vector v = { dynamic_cast(e) }; - return updateMesh(v, grpName, add); + updateMesh(v, grpName, add); + break; } - default: return; // rien à faire en 0D + default: break; // rien à faire en 0D } } /*----------------------------------------------------------------------------*/ void CommandAddRemoveGroupName:: -updateMesh(Geom::Volume* vol, std::string grpName, bool add) -{ - // récupération de la liste des blocs - Topo::TopoManager& tm = getContext().getTopoManager(); - std::vector blocs = tm.getFilteredRefTopos(vol); - updateMesh(blocs, grpName, add); -} -/*----------------------------------------------------------------------------*/ -void CommandAddRemoveGroupName:: updateMesh(std::vector& blocs, std::string grpName, bool add) { #ifdef _DEBUG_UPDATE @@ -351,15 +278,6 @@ updateMesh(std::vector& blocs, std::string grpName, bool add) } /*----------------------------------------------------------------------------*/ void CommandAddRemoveGroupName:: -updateMesh(Geom::Surface* surf, std::string grpName, bool add) -{ - // récupération de la liste des CoFaces - Topo::TopoManager& tm = getContext().getTopoManager(); - std::vector cofaces = tm.getFilteredRefTopos(surf); - updateMesh(cofaces, grpName, add); -} -/*----------------------------------------------------------------------------*/ -void CommandAddRemoveGroupName:: updateMesh(std::vector& cofaces, std::string grpName, bool add) { #ifdef _DEBUG_UPDATE @@ -416,15 +334,6 @@ updateMesh(std::vector& cofaces, std::string grpName, bool add) } /*----------------------------------------------------------------------------*/ void CommandAddRemoveGroupName:: -updateMesh(Geom::Curve* crv, std::string grpName, bool add) -{ - // récupération de la liste des CoEdges - Topo::TopoManager& tm = getContext().getTopoManager(); - std::vector coedges = tm.getFilteredRefTopos(crv); - updateMesh(coedges, grpName, add); -} -/*----------------------------------------------------------------------------*/ -void CommandAddRemoveGroupName:: updateMesh(std::vector& coedges, std::string grpName, bool add) { #ifdef _DEBUG_UPDATE diff --git a/src/Core/Topo/TopoManager.cpp b/src/Core/Topo/TopoManager.cpp index a73bc35f..2a8a0ca5 100644 --- a/src/Core/Topo/TopoManager.cpp +++ b/src/Core/Topo/TopoManager.cpp @@ -4756,57 +4756,8 @@ Internal::M3DCommandResult* TopoManager::addToGroup(std::vector& ve message << "], "<<(short)dim<<", "< vertices; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - vertices.push_back(getVertex(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), vertices, groupName, Mesh::CommandAddRemoveGroupName::add); - } - break; - case(1):{ - // reconstitue le vecteur de coedges - std::vector coedges; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - coedges.push_back(getCoEdge(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), coedges, groupName, Mesh::CommandAddRemoveGroupName::add); - } - break; - case(2):{ - // reconstitue le vecteur de surfaces - std::vector cofaces; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - cofaces.push_back(getCoFace(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), cofaces, groupName, Mesh::CommandAddRemoveGroupName::add); - } - break; - case(3):{ - // reconstitue le vecteur de blocs - std::vector blocks; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - blocks.push_back(getBlock(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), blocks, groupName, Mesh::CommandAddRemoveGroupName::add); - } - break; - default:{ - TkUtil::Exception ("Dimension erronée"); - } - break; - } - - CHECK_NULL_PTR_ERROR(command); + std::vector entities = getEntitiesFromNames(ve, dim); + Mesh::CommandAddRemoveGroupName* command = new Mesh::CommandAddRemoveGroupName(getContext(), entities, dim, groupName, Mesh::CommandAddRemoveGroupName::add); // trace dans le script TkUtil::UTF8String cmd (TkUtil::Charset::UTF_8); @@ -4841,57 +4792,8 @@ Internal::M3DCommandResult* TopoManager::removeFromGroup(std::vector vertices; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - vertices.push_back(getVertex(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), vertices, groupName, Mesh::CommandAddRemoveGroupName::remove); - } - break; - case(1):{ - // reconstitue le vecteur de coedges - std::vector coedges; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - coedges.push_back(getCoEdge(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), coedges, groupName, Mesh::CommandAddRemoveGroupName::remove); - } - break; - case(2):{ - // reconstitue le vecteur de cofaces - std::vector cofaces; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - cofaces.push_back(getCoFace(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), cofaces, groupName, Mesh::CommandAddRemoveGroupName::remove); - } - break; - case(3):{ - // reconstitue le vecteur de blocks - std::vector blocks; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - blocks.push_back(getBlock(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), blocks, groupName, Mesh::CommandAddRemoveGroupName::remove); - } - break; - default:{ - TkUtil::Exception ("Dimension erronée"); - } - break; - } - - CHECK_NULL_PTR_ERROR(command); + std::vector entities = getEntitiesFromNames(ve, dim); + Mesh::CommandAddRemoveGroupName* command = new Mesh::CommandAddRemoveGroupName(getContext(), entities, dim, groupName, Mesh::CommandAddRemoveGroupName::remove); // trace dans le script TkUtil::UTF8String cmd (TkUtil::Charset::UTF_8); @@ -4926,57 +4828,8 @@ Internal::M3DCommandResult* TopoManager::setGroup(std::vector& ve, message << "], "<<(short)dim<<", "< vertices; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - vertices.push_back(getVertex(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), vertices, groupName, Mesh::CommandAddRemoveGroupName::set); - } - break; - case(1):{ - // reconstitue le vecteur de coedges - std::vector coedges; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - coedges.push_back(getCoEdge(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), coedges, groupName, Mesh::CommandAddRemoveGroupName::set); - } - break; - case(2):{ - // reconstitue le vecteur de cofaces - std::vector cofaces; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - cofaces.push_back(getCoFace(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), cofaces, groupName, Mesh::CommandAddRemoveGroupName::set); - } - break; - case(3):{ - // reconstitue le vecteur de blocks - std::vector blocks; - for (std::vector::const_iterator iter = ve.begin(); - iter != ve.end(); ++iter) - blocks.push_back(getBlock(*iter, true)); - - command = new Mesh::CommandAddRemoveGroupName(getContext(), blocks, groupName, Mesh::CommandAddRemoveGroupName::set); - } - break; - default:{ - TkUtil::Exception ("Dimension erronée"); - } - break; - } - - CHECK_NULL_PTR_ERROR(command); + std::vector entities = getEntitiesFromNames(ve, dim); + Mesh::CommandAddRemoveGroupName* command = new Mesh::CommandAddRemoveGroupName(getContext(), entities, dim, groupName, Mesh::CommandAddRemoveGroupName::set); // trace dans le script TkUtil::UTF8String cmd (TkUtil::Charset::UTF_8); @@ -5126,6 +4979,30 @@ void TopoManager::removeRefTopo(const Geom::GeomEntity* ge, TopoEntity* te) v.erase(std::remove(v.begin(), v.end(), te), v.end()); } /*----------------------------------------------------------------------------*/ +std::vector TopoManager::getEntitiesFromNames(const std::vector& names, const int dim) const +{ + std::vector entities; + + switch(dim){ + case(0): + for (std::string name : names) entities.push_back(getVertex(name)); + break; + case(1): + for (std::string name : names) entities.push_back(getCoEdge(name)); + break; + case(2): + for (std::string name : names) entities.push_back(getCoFace(name)); + break; + case(3): + for (std::string name : names) entities.push_back(getBlock(name)); + break; + default: + throw TkUtil::Exception ("Dimension erronée"); + } + + return entities; +} +/*----------------------------------------------------------------------------*/ } // end namespace Topo /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/protected/Geom/GeomManager.h b/src/Core/protected/Geom/GeomManager.h index 553852c6..df1d3d0b 100644 --- a/src/Core/protected/Geom/GeomManager.h +++ b/src/Core/protected/Geom/GeomManager.h @@ -1457,7 +1457,14 @@ class GeomManager final : public Internal::CommandCreator { #endif private: - /// Retourne vrai si l'une des entités géométriques a un lien sur une entité topologique + /// Retourne les entités topologiques filtrées + template ::value>> + std::string getLastEntityName(const std::vector& entities) const; + + /// Retourne une liste d'entités en fonction du nom et de la dimension + std::vector getEntitiesFromNames(const std::vector& names, const int dim) const; + + /// Retourne vrai si l'une des entités géométriques a un lien sur une entité topologique bool hasRefTopo(std::vector& entities); /** volumes gérés par le manager */ diff --git a/src/Core/protected/Mesh/CommandAddRemoveGroupName.h b/src/Core/protected/Mesh/CommandAddRemoveGroupName.h index d7cc6626..0b9fb4a0 100644 --- a/src/Core/protected/Mesh/CommandAddRemoveGroupName.h +++ b/src/Core/protected/Mesh/CommandAddRemoveGroupName.h @@ -54,107 +54,39 @@ class CommandAddRemoveGroupName: public CommandCreateMesh } groupOperation; /*------------------------------------------------------------------------*/ - /** \brief Constructeur avec une liste de volumes + /** \brief Constructeur avec une liste d'entités géométriques de même dimension * * \param c le contexte - * \param volumes les volumes à ajouter au groupe + * \param entities les entités géométriques à ajouter au groupe + * \param dim la dimension des entités * \param groupName le nom du groupe auquel on ajoute les entités * \param ope le type d'opération */ CommandAddRemoveGroupName(Internal::Context& c, - std::vector& volumes, - const std::string& groupName, - groupOperation ope); - - /** \brief Constructeur avec une liste de surfaces - * - * \param c le contexte - * \param surfaces les surfaces à ajouter au groupe - * \param groupName le nom du groupe auquel on ajoute les entités - * \param add si on est dans le cas d'un ajout - */ - CommandAddRemoveGroupName(Internal::Context& c, - std::vector& surfaces, - const std::string& groupName, - groupOperation ope); - - /** \brief Constructeur avec une liste de courbes - * - * \param c le contexte - * \param curves les courbes à ajouter au groupe - * \param groupName le nom du groupe auquel on ajoute les entités - * \param add si on est dans le cas d'un ajout - */ - CommandAddRemoveGroupName(Internal::Context& c, - std::vector& curves, - const std::string& groupName, - groupOperation ope); - - /** \brief Constructeur avec une liste de sommets géométriques - * - * \param c le contexte - * \param vertices les sommets à ajouter au groupe - * \param groupName le nom du groupe auquel on ajoute les entités - * \param add si on est dans le cas d'un ajout - */ - CommandAddRemoveGroupName(Internal::Context& c, - std::vector& vertices, + std::vector& entities, + const int dim, const std::string& groupName, groupOperation ope); /*------------------------------------------------------------------------*/ - /** \brief Constructeur avec une liste de blocs - * - * \param c le contexte - * \param blocks les blocs à ajouter au groupe - * \param groupName le nom du groupe auquel on ajoute les entités - * \param ope le type d'opération - */ - CommandAddRemoveGroupName(Internal::Context& c, - std::vector& blocks, - const std::string& groupName, - groupOperation ope); - - /** \brief Constructeur avec une liste de cofaces - * - * \param c le contexte - * \param cofaces les cofaces à ajouter au groupe - * \param groupName le nom du groupe auquel on ajoute les entités - * \param ope le type d'opération - */ - CommandAddRemoveGroupName(Internal::Context& c, - std::vector& cofaces, - const std::string& groupName, - groupOperation ope); - - /** \brief Constructeur avec une liste de coedges + /** \brief Constructeur avec une liste d'entités topologiques de même dimension * * \param c le contexte - * \param coedges les coedges à ajouter au groupe + * \param entities les entités topologiques à ajouter au groupe + * \param dim la dimension des entités * \param groupName le nom du groupe auquel on ajoute les entités * \param ope le type d'opération */ CommandAddRemoveGroupName(Internal::Context& c, - std::vector& coedges, - const std::string& groupName, - groupOperation ope); - - /** \brief Constructeur avec une liste de sommets topologiques - * - * \param c le contexte - * \param vertices les sommets à ajouter au groupe - * \param groupName le nom du groupe auquel on ajoute les entités - * \param ope le type d'opération - */ - CommandAddRemoveGroupName(Internal::Context& c, - std::vector& vertices, + std::vector& entities, + const int dim, const std::string& groupName, groupOperation ope); /*------------------------------------------------------------------------*/ /** \brief Destructeur */ - virtual ~CommandAddRemoveGroupName(); + ~CommandAddRemoveGroupName() = default; /*------------------------------------------------------------------------*/ /** \brief exécute la commande @@ -174,10 +106,6 @@ class CommandAddRemoveGroupName: public CommandCreateMesh /*------------------------------------------------------------------------*/ /// met à jour les relation entre volumes de maillage et la topologie void updateMesh(Geom::GeomEntity* e, std::string grpName, bool add); - void updateMesh(Geom::Volume* e, std::string grpName, bool add); - void updateMesh(Geom::Surface* e, std::string grpName, bool add); - void updateMesh(Geom::Curve* e, std::string grpName, bool add); - void updateMesh(Topo::TopoEntity* e, std::string grpName, bool add); void updateMesh(std::vector& blocs, std::string grpName, bool add); void updateMesh(std::vector& cofaces, std::string grpName, bool add); diff --git a/src/Core/protected/Topo/TopoManager.h b/src/Core/protected/Topo/TopoManager.h index bb43a59d..ed051805 100644 --- a/src/Core/protected/Topo/TopoManager.h +++ b/src/Core/protected/Topo/TopoManager.h @@ -1921,6 +1921,9 @@ class TopoManager final : public Internal::CommandCreator { std::vector & topo_entities, const char* nom_fonction); + /// Retourne une liste d'entités en fonction du nom et de la dimension + std::vector getEntitiesFromNames(const std::vector& names, const int dim) const; + /** blocs accessibles depuis le manager */ std::vector m_blocks; From ca02c4229ced5b574fea83bea14aabcce4e17d25 Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Wed, 26 Nov 2025 16:17:13 +0100 Subject: [PATCH 15/18] Minor modificiations --- src/Core/Geom/CommandEditGeom.cpp | 2 +- src/Core/Topo/Block.cpp | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/Core/Geom/CommandEditGeom.cpp b/src/Core/Geom/CommandEditGeom.cpp index f9600c8b..cd758dbf 100644 --- a/src/Core/Geom/CommandEditGeom.cpp +++ b/src/Core/Geom/CommandEditGeom.cpp @@ -70,7 +70,6 @@ void CommandEditGeom::internalExecute() std::vector mod_entities = getKeepedEntities(); std::vector mov_entities = getMovedEntities(); std::vector& rem_entities = getRemovedEntities(); - std::map >& rep_entities = getReplacedEntities(); for(int i=0;i >& rep_entities = getReplacedEntities(); for (std::map >::iterator iter1 = rep_entities.begin(); iter1!=rep_entities.end(); ++iter1){ std::cerr<<"Remplace "<first->getName()<<" par"; diff --git a/src/Core/Topo/Block.cpp b/src/Core/Topo/Block.cpp index 93e0b5f3..2b03e2c1 100644 --- a/src/Core/Topo/Block.cpp +++ b/src/Core/Topo/Block.cpp @@ -3320,17 +3320,14 @@ unsigned long Block::getNbInternalMeshingNodes() else { unsigned short res = m_mesh_data->nodes().size(); - std::vector vertices = getVertices(); - for (uint i=0;igetNbInternalMeshingNodes(); + for (Vertex* v : getVertices()) + res -= v->getNbInternalMeshingNodes(); - std::vector coedges = getCoEdges(); - for (uint i=0;igetNbInternalMeshingNodes(); + for (CoEdge* ce : getCoEdges()) + res -= ce->getNbInternalMeshingNodes(); - std::vector cofaces = getCoFaces(); - for (uint i=0;igetNbInternalMeshingNodes(); + for (CoFace* cf : getCoFaces()) + res -= cf->getNbInternalMeshingNodes(); return res; } From d6fc489b763ed86589ca2c9c7f62594d31b83277 Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Thu, 27 Nov 2025 09:27:52 +0100 Subject: [PATCH 16/18] Modifications due to rebase on main --- .../Mesh/ExportBlocksCGNSImplementation.cpp | 85 +++++++------------ 1 file changed, 33 insertions(+), 52 deletions(-) diff --git a/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp b/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp index e3b6c297..11ad9162 100644 --- a/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp +++ b/src/Core/Mesh/ExportBlocksCGNSImplementation.cpp @@ -9,6 +9,7 @@ #include "Mesh/ExportBlocksCGNSImplementation.h" #include "Mesh/MeshItf.h" #include "Mesh/Surface.h" +#include "Group/GroupManager.h" /*----------------------------------------------------------------------------*/ #include #include @@ -39,11 +40,6 @@ namespace Mgx3D { /*----------------------------------------------------------------------------*/ void ExportBlocksCGNSImplementation::perform3D() { - std::vector topo_vertices; - std::vector topo_blocs; - std::vector topo_faces; - - gmds::Mesh mesh(gmds::MeshModel(gmds::DIM3 | gmds::N | gmds::F | gmds::R | gmds::R2N | gmds::N2R | gmds::R2F | gmds::F2R | gmds::F2N | gmds::N2F)); @@ -58,10 +54,10 @@ namespace Mgx3D { std::vector topo_faces = m_context.getTopoManager().getCoFacesObj(); std::map topoF_2_gmdsF; for (auto cf : topo_faces) { - int n0 = cf->getVertex(0)->getNode(); - int n1 = cf->getVertex(1)->getNode(); - int n2 = cf->getVertex(2)->getNode(); - int n3 = cf->getVertex(3)->getNode(); + int n0 = cf->getVertices()[0]->getNode(); + int n1 = cf->getVertices()[1]->getNode(); + int n2 = cf->getVertices()[2]->getNode(); + int n3 = cf->getVertices()[3]->getNode(); gmds::Face f = mesh.newQuad(n0,n1,n2,n3); @@ -100,16 +96,16 @@ namespace Mgx3D { gmds::Region r = mesh.newHex(ids[0],ids[1],ids[2],ids[3], ids[4],ids[5],ids[6],ids[7]); - if(topo_blocs[iBlock]->getNbCoFaces() != 6 ){ + if(topo_blocs[iBlock]->getCoFaces().size() != 6 ){ throw TkUtil::Exception(TkUtil::UTF8String ("Le bloc "+topo_blocs[iBlock]->getName()+" n'est pas conforme.", TkUtil::Charset::UTF_8)); } - int iface0 = topoF_2_gmdsF[block->getFace(vertices[0],vertices[1],vertices[2],vertices[3])->getCoFace(0)->getName()]; - int iface1 = topoF_2_gmdsF[block->getFace(vertices[0],vertices[1],vertices[5],vertices[4])->getCoFace(0)->getName()]; - int iface2 = topoF_2_gmdsF[block->getFace(vertices[1],vertices[2],vertices[6],vertices[5])->getCoFace(0)->getName()]; - int iface3 = topoF_2_gmdsF[block->getFace(vertices[2],vertices[3],vertices[7],vertices[6])->getCoFace(0)->getName()]; - int iface4 = topoF_2_gmdsF[block->getFace(vertices[3],vertices[0],vertices[4],vertices[7])->getCoFace(0)->getName()]; - int iface5 = topoF_2_gmdsF[block->getFace(vertices[4],vertices[5],vertices[6],vertices[7])->getCoFace(0)->getName()]; + int iface0 = topoF_2_gmdsF[block->getFace(vertices[0],vertices[1],vertices[2],vertices[3])->getCoFaces()[0]->getName()]; + int iface1 = topoF_2_gmdsF[block->getFace(vertices[0],vertices[1],vertices[5],vertices[4])->getCoFaces()[0]->getName()]; + int iface2 = topoF_2_gmdsF[block->getFace(vertices[1],vertices[2],vertices[6],vertices[5])->getCoFaces()[0]->getName()]; + int iface3 = topoF_2_gmdsF[block->getFace(vertices[2],vertices[3],vertices[7],vertices[6])->getCoFaces()[0]->getName()]; + int iface4 = topoF_2_gmdsF[block->getFace(vertices[3],vertices[0],vertices[4],vertices[7])->getCoFaces()[0]->getName()]; + int iface5 = topoF_2_gmdsF[block->getFace(vertices[4],vertices[5],vertices[6],vertices[7])->getCoFaces()[0]->getName()]; r.add(iface0); r.add(iface1); @@ -169,9 +165,7 @@ namespace Mgx3D { //gmds::Variable* sym = mesh.newVariable("Symetrie"); - std::vector groups2D; - getStdContext()->getGroupManager().getGroups(groups2D, Internal::SelectionManager::DIM::D2); - + std::vector groups2D = getStdContext()->getGroupManager().getGroups(Internal::SelectionManager::DIM::D2); std::vector groupsname; for(auto g : groups2D){ std::string name = g->getName(); @@ -226,8 +220,7 @@ namespace Mgx3D { //gmds::Variable* fluide = mesh.newVariable(gmds::GMDS_NODE,"Fluide"); //Valeur par défaut //gmds::Variable* solide = mesh.newVariable("Solide"); - std::vector groups3D; - getStdContext()->getGroupManager().getGroups(groups3D, Internal::SelectionManager::DIM::D3); + std::vector groups3D = getStdContext()->getGroupManager().getGroups(Internal::SelectionManager::DIM::D3); groupsname.clear(); for(auto g : groups3D){ @@ -263,11 +256,6 @@ namespace Mgx3D { /*----------------------------------------------------------------------------*/ void ExportBlocksCGNSImplementation::perform2D() { - std::vector topo_vertices; - std::vector topo_faces; - std::vector topo_edges; - - gmds::Mesh mesh(gmds::MeshModel(gmds::DIM2 | gmds::N | gmds::E | gmds::F | gmds::F2N | gmds::N2F | gmds::F2E | gmds::E2F | gmds::E2N | gmds::N2E)); @@ -279,14 +267,11 @@ namespace Mgx3D { gmds::Node n = mesh.newNode(n_local.X(),n_local.Y(),n_local.Z()); } - m_context.getTopoManager().getCoFaces(topo_faces); - m_context.getTopoManager().getCoEdges(topo_edges); - std::map topoE_2_gmdsE; - + const std::vector& topo_edges = m_context.getTopoManager().getCoEdgesObj(); for (auto ce : topo_edges) { - int n0 = ce->getVertex(0)->getNode(); - int n1 = ce->getVertex(1)->getNode(); + int n0 = ce->getVertices()[0]->getNode(); + int n1 = ce->getVertices()[1]->getNode(); gmds::Edge e = mesh.newEdge(n0,n1); @@ -294,35 +279,35 @@ namespace Mgx3D { } std::map topoF_2_gmdsF; - + const std::vector& topo_faces = m_context.getTopoManager().getCoFacesObj(); for(int iFace = 0; iFace < topo_faces.size(); iFace++){ Topo::CoFace* face = topo_faces[iFace]; std::vector ids; std::vector vertices; vertices.resize(4); - vertices[0] = face->getVertex(0); - vertices[1] = face->getVertex(1); - vertices[2] = face->getVertex(2); - vertices[3] = face->getVertex(3); + vertices[0] = face->getVertices()[0]; + vertices[1] = face->getVertices()[1]; + vertices[2] = face->getVertices()[2]; + vertices[3] = face->getVertices()[3]; - ids.push_back(topo_faces[iFace]->getVertex(0)->getNode()); - ids.push_back(topo_faces[iFace]->getVertex(1)->getNode()); - ids.push_back(topo_faces[iFace]->getVertex(2)->getNode()); - ids.push_back(topo_faces[iFace]->getVertex(3)->getNode()); + ids.push_back(topo_faces[iFace]->getVertices()[0]->getNode()); + ids.push_back(topo_faces[iFace]->getVertices()[1]->getNode()); + ids.push_back(topo_faces[iFace]->getVertices()[2]->getNode()); + ids.push_back(topo_faces[iFace]->getVertices()[3]->getNode()); gmds::Face f = mesh.newQuad(ids[0],ids[1],ids[2],ids[3]); - if(topo_faces[iFace]->getNbEdges()!= 4 ){ + if(topo_faces[iFace]->getEdges().size()!= 4 ){ throw TkUtil::Exception(TkUtil::UTF8String ("La face "+topo_faces[iFace]->getName()+" n'est pas conforme.", TkUtil::Charset::UTF_8)); } - int iedge0 = topoE_2_gmdsE[face->getEdge(vertices[0],vertices[1])->getCoEdge(0)->getName()]; - int iedge1 = topoE_2_gmdsE[face->getEdge(vertices[1],vertices[2])->getCoEdge(0)->getName()]; - int iedge2 = topoE_2_gmdsE[face->getEdge(vertices[2],vertices[3])->getCoEdge(0)->getName()]; - int iedge3 = topoE_2_gmdsE[face->getEdge(vertices[3],vertices[0])->getCoEdge(0)->getName()]; + int iedge0 = topoE_2_gmdsE[face->getEdge(vertices[0],vertices[1])->getCoEdges()[0]->getName()]; + int iedge1 = topoE_2_gmdsE[face->getEdge(vertices[1],vertices[2])->getCoEdges()[0]->getName()]; + int iedge2 = topoE_2_gmdsE[face->getEdge(vertices[2],vertices[3])->getCoEdges()[0]->getName()]; + int iedge3 = topoE_2_gmdsE[face->getEdge(vertices[3],vertices[0])->getCoEdges()[0]->getName()]; f.add(iedge0); f.add(iedge1); @@ -362,9 +347,7 @@ namespace Mgx3D { } } - std::vector groups1D; - getStdContext()->getGroupManager().getGroups(groups1D, Internal::SelectionManager::DIM::D1); - + std::vector groups1D = getStdContext()->getGroupManager().getGroups(Internal::SelectionManager::DIM::D1); std::vector groupsname; for(auto g : groups1D){ std::string name = g->getName(); @@ -388,9 +371,7 @@ namespace Mgx3D { } } - std::vector groups2D; - getStdContext()->getGroupManager().getGroups(groups2D, Internal::SelectionManager::DIM::D2); - + std::vector groups2D = getStdContext()->getGroupManager().getGroups(Internal::SelectionManager::DIM::D2); groupsname.clear(); for(auto g : groups2D){ std::string name = g->getName(); From e9d0a270e38d6ec1614b26c5600277bc9eb34fa9 Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Thu, 27 Nov 2025 14:27:00 +0100 Subject: [PATCH 17/18] Remove internalSpecificUndo and internalSpecificRedo methods --- src/Core/Geom/CommandEditGeom.cpp | 6 ++---- src/Core/Geom/CommandMirroring.cpp | 10 ---------- src/Core/Geom/CommandRemove.cpp | 4 ++-- src/Core/Geom/CommandRotation.cpp | 10 ---------- src/Core/Geom/CommandScaling.cpp | 10 ---------- src/Core/Geom/CommandTranslation.cpp | 10 ---------- src/Core/protected/Geom/CommandEditGeom.h | 6 ------ src/Core/protected/Geom/CommandMirroring.h | 7 ------- src/Core/protected/Geom/CommandRotation.h | 6 ------ src/Core/protected/Geom/CommandScaling.h | 6 ------ src/Core/protected/Geom/CommandTranslation.h | 6 ------ 11 files changed, 4 insertions(+), 77 deletions(-) diff --git a/src/Core/Geom/CommandEditGeom.cpp b/src/Core/Geom/CommandEditGeom.cpp index cd758dbf..d677b0d6 100644 --- a/src/Core/Geom/CommandEditGeom.cpp +++ b/src/Core/Geom/CommandEditGeom.cpp @@ -163,8 +163,7 @@ void CommandEditGeom::internalUndo() // les entités détruites sont dites créées et inversement getInfoCommand().permCreatedDeleted(); - // Annulation de la commande pour les entités dont l'état n'est pas mémorisé (cas des FcetedSurface) - internalSpecificUndo(); + if (m_impl) m_impl->performUndo(); log (TkUtil::TraceLog (message, TkUtil::Log::TRACE_1)); } @@ -185,8 +184,7 @@ void CommandEditGeom::internalRedo() // les entités détruites sont dites créées et inversement getInfoCommand().permCreatedDeleted(); - // Rejoue la commande pour les entités dont l'état n'est pas mémorisé (cas des FcetedSurface) - internalSpecificRedo(); + if (m_impl) m_impl->performRedo(); startingOrcompletionLog (false); diff --git a/src/Core/Geom/CommandMirroring.cpp b/src/Core/Geom/CommandMirroring.cpp index 0df804ab..a0182b1e 100644 --- a/src/Core/Geom/CommandMirroring.cpp +++ b/src/Core/Geom/CommandMirroring.cpp @@ -51,16 +51,6 @@ void CommandMirroring::internalSpecificPreExecute() { m_impl->prePerform(); } /*----------------------------------------------------------------------------*/ -void CommandMirroring::internalSpecificUndo() -{ - m_impl->performUndo(); -} -/*----------------------------------------------------------------------------*/ -void CommandMirroring::internalSpecificRedo() -{ - m_impl->performRedo(); -} -/*----------------------------------------------------------------------------*/ } // end namespace Geom /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/Geom/CommandRemove.cpp b/src/Core/Geom/CommandRemove.cpp index 806a2f71..586fe6ff 100644 --- a/src/Core/Geom/CommandRemove.cpp +++ b/src/Core/Geom/CommandRemove.cpp @@ -33,12 +33,12 @@ CommandRemove::~CommandRemove() if(m_impl) delete m_impl; } - /*----------------------------------------------------------------------------*/ void CommandRemove::internalSpecificPreExecute() { m_impl->prePerform(); -}/*----------------------------------------------------------------------------*/ +} +/*----------------------------------------------------------------------------*/ void CommandRemove:: internalSpecificExecute() { diff --git a/src/Core/Geom/CommandRotation.cpp b/src/Core/Geom/CommandRotation.cpp index 79f49641..f7c4d52f 100644 --- a/src/Core/Geom/CommandRotation.cpp +++ b/src/Core/Geom/CommandRotation.cpp @@ -83,16 +83,6 @@ void CommandRotation::internalSpecificPreExecute() m_impl->prePerform(); } /*----------------------------------------------------------------------------*/ -void CommandRotation::internalSpecificUndo() -{ - m_impl->performUndo(); -} -/*----------------------------------------------------------------------------*/ -void CommandRotation::internalSpecificRedo() -{ - m_impl->performRedo(); -} -/*----------------------------------------------------------------------------*/ } // end namespace Geom /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/Geom/CommandScaling.cpp b/src/Core/Geom/CommandScaling.cpp index db341f82..7cb1699b 100644 --- a/src/Core/Geom/CommandScaling.cpp +++ b/src/Core/Geom/CommandScaling.cpp @@ -173,16 +173,6 @@ void CommandScaling::internalSpecificPreExecute() { m_impl->prePerform(); } /*----------------------------------------------------------------------------*/ -void CommandScaling::internalSpecificUndo() -{ - m_impl->performUndo(); -} -/*----------------------------------------------------------------------------*/ -void CommandScaling::internalSpecificRedo() -{ - m_impl->performRedo(); -} -/*----------------------------------------------------------------------------*/ } // end namespace Geom /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/Geom/CommandTranslation.cpp b/src/Core/Geom/CommandTranslation.cpp index 1e0f5dcf..b48b86f7 100644 --- a/src/Core/Geom/CommandTranslation.cpp +++ b/src/Core/Geom/CommandTranslation.cpp @@ -78,16 +78,6 @@ void CommandTranslation::internalSpecificPreExecute() m_impl->prePerform(); } /*----------------------------------------------------------------------------*/ -void CommandTranslation::internalSpecificUndo() -{ - m_impl->performUndo(); -} -/*----------------------------------------------------------------------------*/ -void CommandTranslation::internalSpecificRedo() -{ - m_impl->performRedo(); -} -/*----------------------------------------------------------------------------*/ } // end namespace Geom /*----------------------------------------------------------------------------*/ } // end namespace Mgx3D diff --git a/src/Core/protected/Geom/CommandEditGeom.h b/src/Core/protected/Geom/CommandEditGeom.h index f9237f85..06a98272 100644 --- a/src/Core/protected/Geom/CommandEditGeom.h +++ b/src/Core/protected/Geom/CommandEditGeom.h @@ -63,12 +63,6 @@ class CommandEditGeom: public Geom::CommandCreateGeom { */ virtual void internalSpecificExecute()=0; - /*------------------------------------------------------------------------*/ - /** \brief Traitement spécifique délégué aux classes filles - */ - virtual void internalSpecificUndo(){} - virtual void internalSpecificRedo(){} - /*------------------------------------------------------------------------*/ /** \brief retourne une référence sur les entités supprimées. N'a de sens * qu'une fois l'opération perform() appelée. diff --git a/src/Core/protected/Geom/CommandMirroring.h b/src/Core/protected/Geom/CommandMirroring.h index 36fb61d4..4f8bc85d 100644 --- a/src/Core/protected/Geom/CommandMirroring.h +++ b/src/Core/protected/Geom/CommandMirroring.h @@ -63,13 +63,6 @@ class CommandMirroring: public Geom::CommandEditGeom{ /** \brief initialisation de la commande */ void internalSpecificPreExecute(); - - /*------------------------------------------------------------------------*/ - /** \brief Traitement spécifique délégué aux classes filles - */ - void internalSpecificUndo(); - void internalSpecificRedo(); - }; /*----------------------------------------------------------------------------*/ } // end namespace Geom diff --git a/src/Core/protected/Geom/CommandRotation.h b/src/Core/protected/Geom/CommandRotation.h index cd0fa252..4ee25377 100644 --- a/src/Core/protected/Geom/CommandRotation.h +++ b/src/Core/protected/Geom/CommandRotation.h @@ -66,12 +66,6 @@ class CommandRotation: public CommandEditGeom{ */ void internalSpecificPreExecute(); - /*------------------------------------------------------------------------*/ - /** \brief Traitement spécifique délégué aux classes filles - */ - void internalSpecificUndo(); - void internalSpecificRedo(); - protected: /// valide les paramètres diff --git a/src/Core/protected/Geom/CommandScaling.h b/src/Core/protected/Geom/CommandScaling.h index 753392f5..e2aa640e 100644 --- a/src/Core/protected/Geom/CommandScaling.h +++ b/src/Core/protected/Geom/CommandScaling.h @@ -119,12 +119,6 @@ class CommandScaling: public Geom::CommandEditGeom{ */ void internalSpecificPreExecute(); - /*------------------------------------------------------------------------*/ - /** \brief Traitement spécifique délégué aux classes filles - */ - void internalSpecificUndo(); - void internalSpecificRedo(); - protected: /// valide les paramètres void validate(); diff --git a/src/Core/protected/Geom/CommandTranslation.h b/src/Core/protected/Geom/CommandTranslation.h index eb6d1f0b..2e6e2437 100644 --- a/src/Core/protected/Geom/CommandTranslation.h +++ b/src/Core/protected/Geom/CommandTranslation.h @@ -68,12 +68,6 @@ class CommandTranslation: public CommandEditGeom{ */ void internalSpecificPreExecute(); - /*------------------------------------------------------------------------*/ - /** \brief Traitement spécifique délégué aux classes filles - */ - void internalSpecificUndo(); - void internalSpecificRedo(); - protected: /// valide les paramètres From bcf13ece13e6ba7a6bcff05cde706b47b19d531b Mon Sep 17 00:00:00 2001 From: Benoit LELANDAIS Date: Fri, 28 Nov 2025 10:13:31 +0100 Subject: [PATCH 18/18] Rebase with main --- src/Core/Geom/Curve.cpp | 74 -------------------- src/Core/Group/GroupHelperForCommand.cpp | 1 + src/Core/Group/GroupManager.cpp | 15 +++- src/Core/protected/Group/GroupManager.h | 4 +- src/Core/protected/Internal/EntitiesHelper.h | 26 ------- 5 files changed, 15 insertions(+), 105 deletions(-) diff --git a/src/Core/Geom/Curve.cpp b/src/Core/Geom/Curve.cpp index a51c2d78..e2108731 100644 --- a/src/Core/Geom/Curve.cpp +++ b/src/Core/Geom/Curve.cpp @@ -634,80 +634,6 @@ bool Curve::isA(const std::string& name) return (name.compare(0,getTinyName().size(),getTinyName()) == 0); } /*----------------------------------------------------------------------------*/ -<<<<<<< HEAD -void Curve::add(Group::Group1D* grp) -{ - //std::cout<<"Curve::add("<getName()<<") à "< groups = Internal::groupsFromTypedGroups (m_groups); - if (true == getContext ( ).getGroupColor (groups, color)) - { - getDisplayProperties ( ).setCloudColor (color); - getDisplayProperties ( ).setWireColor (color); - getDisplayProperties ( ).setSurfacicColor (color); - getDisplayProperties ( ).setFontColor (color); - } // if (true == getContext ( ).getGroupColor (groups, color)) -} -/*----------------------------------------------------------------------------*/ -void Curve::remove(Group::Group1D* grp) -{ - uint i = 0; - for (; i& gn) const -{ - gn.clear(); - for (uint i = 0; igetName()); -} -/*----------------------------------------------------------------------------*/ -void Curve::getGroups(std::vector& grp) const -{ - grp.insert(grp.end(), m_groups.begin(), m_groups.end()); -} -/*----------------------------------------------------------------------------*/ -int Curve::getNbGroups() const -{ - return m_groups.size(); -} -/*----------------------------------------------------------------------------*/ -void Curve::setDestroyed(bool b) -{ - if (isDestroyed() == b) - return; - - // supprime la relation du groupe vers la courbe en cas de destruction - if (b) - for (uint i = 0; iremove(this); - else - // et inversement en cas de ressurection - for (uint i = 0; iadd(this); - - Entity::setDestroyed(b); -} -/*----------------------------------------------------------------------------*/ -======= ->>>>>>> 3e32643 (Reduce dependencencies Geom --> Group) bool Curve::isLinear() const { if (m_occ_edges.size() == 1) diff --git a/src/Core/Group/GroupHelperForCommand.cpp b/src/Core/Group/GroupHelperForCommand.cpp index fcc6173c..b302a634 100644 --- a/src/Core/Group/GroupHelperForCommand.cpp +++ b/src/Core/Group/GroupHelperForCommand.cpp @@ -36,6 +36,7 @@ addToGroup(const std::string& group_name, Geom::GeomEntity* e) if (! (m_group_manager.getGroupsFor(e).size() > 0 && group->isDefaultGroup())) { group->add(e); m_group_manager.addGroupFor(e, group); + m_info_command.addGeomInfoEntity (e, Internal::InfoCommand::DISPMODIFIED); m_info_command.addGroupInfoEntity(group, Internal::InfoCommand::DISPMODIFIED); } diff --git a/src/Core/Group/GroupManager.cpp b/src/Core/Group/GroupManager.cpp index d8d577ce..7b9dd7cf 100644 --- a/src/Core/Group/GroupManager.cpp +++ b/src/Core/Group/GroupManager.cpp @@ -1920,18 +1920,27 @@ const std::vector& GroupManager::getGroupsFor(const Geom::GeomEnti return m_entities_groups[e]; } /*----------------------------------------------------------------------------*/ -void GroupManager::addGroupFor(const Geom::GeomEntity* e, GroupEntity* g) +void GroupManager::addGroupFor(Geom::GeomEntity* e, GroupEntity* g) { if (e->getDim() != g->getDim()) { TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8); messErr << e->getName() << " doit être de même dimension que " << g->getName(); throw TkUtil::Exception(messErr); } - if (!hasGroupFor(e, g)) + if (!hasGroupFor(e, g)) { m_entities_groups[e].push_back(g); + + TkUtil::Color color (0, 0, 0); + if (true == getContext().getGroupColor(m_entities_groups[e], color)) { + e->getDisplayProperties().setCloudColor(color); + e->getDisplayProperties().setWireColor(color); + e->getDisplayProperties().setSurfacicColor(color); + e->getDisplayProperties().setFontColor(color); + } // if (true == getContext ( ).getGroupColor (groups, color)) + } } /*----------------------------------------------------------------------------*/ -void GroupManager::setGroupsFor(const Geom::GeomEntity* e, const std::vector& gs) +void GroupManager::setGroupsFor(Geom::GeomEntity* e, const std::vector& gs) { m_entities_groups[e].clear(); for (GroupEntity* g : gs) addGroupFor(e, g); diff --git a/src/Core/protected/Group/GroupManager.h b/src/Core/protected/Group/GroupManager.h index 219a9400..cb0b1915 100644 --- a/src/Core/protected/Group/GroupManager.h +++ b/src/Core/protected/Group/GroupManager.h @@ -501,9 +501,9 @@ class GroupManager final : public Internal::CommandCreator { /// Retourne les groupes associés à une entité const std::vector& getGroupsFor(const Geom::GeomEntity* e); /// Ajoute une association Entité-->Group - void addGroupFor(const Geom::GeomEntity* e, GroupEntity* g); + void addGroupFor(Geom::GeomEntity* e, GroupEntity* g); /// Positionne les associations Entité-->Group - void setGroupsFor(const Geom::GeomEntity* e, const std::vector& gs); + void setGroupsFor(Geom::GeomEntity* e, const std::vector& gs); /// Enlève une association Entité-->Group void removeGroupFor(const Geom::GeomEntity* e, GroupEntity* g); /// Enlève toutes les associations Entité-->Group diff --git a/src/Core/protected/Internal/EntitiesHelper.h b/src/Core/protected/Internal/EntitiesHelper.h index 82a42984..28a1ec14 100644 --- a/src/Core/protected/Internal/EntitiesHelper.h +++ b/src/Core/protected/Internal/EntitiesHelper.h @@ -172,32 +172,6 @@ template < typename E > inline std::vector< Mgx3D::Utils::Entity* > entitiesFrom return entities; } // entitiesFromTypedEntities -/** - * \return Une liste de groupes issue d'une liste de groupes typés. - */ -template < typename G > inline std::vector< Mgx3D::Group::GroupEntity* > groupsFromTypedGroups ( - const std::vector< G* >& typedGroups, bool strict = true) -{ - std::vector< Mgx3D::Group::GroupEntity* > groups; - - for (typename std::vector< G* >::const_iterator it = typedGroups.begin ( ); - typedGroups.end ( ) != it; it++) - { - Mgx3D::Group::GroupEntity* group = dynamic_cast(*it); - if ((0 == group) && (true == strict)) - { - TkUtil::UTF8String message (TkUtil::Charset::UTF_8); - message << "Erreur, le groupe " << (*it)->getName ( ) - << " n'est pas du bon type."; - INTERNAL_ERROR (exc, message, "groupsFromTypedGroups") - throw exc; - } // if ((0 == group) && (true == strict)) - groups.push_back (group); - } - - return groups; -} // groupsFromTypedGroups - /** * \return La différence entre les 2 listes d'entités reçues en premiers arguments. * \param before et after représentent la même liste d'entités avant et après un évènement, par exemple l'exécution d'une commande