Skip to content

Commit d93f46b

Browse files
committed
Merge branch 'main' into write-tests-temp-files-in-dev-shm
2 parents c23015e + 2afd1a9 commit d93f46b

10 files changed

Lines changed: 351 additions & 238 deletions

src/Core/Topo/CommandModificationTopo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1214,7 +1214,7 @@ fuseInternalCoEdgesAndVertices(Geom::GeomEntity* ge, std::vector<Geom::GeomEntit
12141214
// si la fusion se fait avec une autre surface sans topo, alors on ne fait rien
12151215
// (on ne supprime pas les associations)
12161216
if (newEntities.size() == 1){
1217-
if (tm.getRefTopos(newEntities[0]).empty());
1217+
if (tm.getRefTopos(newEntities[0]).empty())
12181218
return;
12191219
}
12201220

src/Core/Topo/CommandSetGeomAssociation.cpp

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -147,16 +147,12 @@ void CommandSetGeomAssociation::validGeomEntity()
147147
/*----------------------------------------------------------------------------*/
148148
void CommandSetGeomAssociation::project(Block* bloc)
149149
{
150-
getInfoCommand().addTopoInfoEntity(bloc, Internal::InfoCommand::DISPMODIFIED);
151-
bloc->saveTopoProperty();
152-
bloc->setGeomAssociation(m_geom_entity);
150+
setGeomAssociation(bloc, [bloc](Internal::InfoCommand* icmd) { bloc->saveBlockTopoProperty(icmd); });
153151
}
154152
/*----------------------------------------------------------------------------*/
155153
void CommandSetGeomAssociation::project(CoFace* coface)
156154
{
157-
getInfoCommand().addTopoInfoEntity(coface, Internal::InfoCommand::DISPMODIFIED);
158-
coface->saveTopoProperty();
159-
coface->setGeomAssociation(m_geom_entity);
155+
setGeomAssociation(coface, [coface](Internal::InfoCommand* icmd) { coface->saveCoFaceTopoProperty(icmd); });
160156

161157
std::vector<CoEdge*> coedges = coface->getCoEdges();
162158

@@ -210,9 +206,7 @@ void CommandSetGeomAssociation::project(CoFace* coface)
210206
/*----------------------------------------------------------------------------*/
211207
void CommandSetGeomAssociation::project(CoEdge* coedge)
212208
{
213-
getInfoCommand().addTopoInfoEntity(coedge, Internal::InfoCommand::DISPMODIFIED);
214-
coedge->saveTopoProperty();
215-
coedge->setGeomAssociation(m_geom_entity);
209+
setGeomAssociation(coedge, [coedge](Internal::InfoCommand* icmd) { coedge->saveCoEdgeTopoProperty(icmd); });
216210

217211
const std::vector<Vertex*>& vertices = coedge->getVertices();
218212
for (auto iter = vertices.begin(); iter != vertices.end(); ++iter){
@@ -229,8 +223,7 @@ void CommandSetGeomAssociation::project(CoEdge* coedge)
229223
/*----------------------------------------------------------------------------*/
230224
void CommandSetGeomAssociation::project(Vertex* vtx)
231225
{
232-
vtx->saveTopoProperty();
233-
vtx->setGeomAssociation(m_geom_entity);
226+
setGeomAssociation(vtx, [vtx](Internal::InfoCommand* icmd) { vtx->saveVertexTopoProperty(icmd); });
234227

235228
// déplace le sommet topologique si la projection implique un déplacement
236229
if (m_geom_entity && m_move_vertices){
@@ -258,14 +251,44 @@ void CommandSetGeomAssociation::project(Vertex* vtx)
258251
}
259252
}
260253
}
261-
getInfoCommand().addTopoInfoEntity(vtx, Internal::InfoCommand::DISPMODIFIED);
262254
}
263255
/*----------------------------------------------------------------------------*/
264256
void CommandSetGeomAssociation::getPreviewRepresentation(Utils::DisplayRepresentation& dr)
265257
{
266258
return getPreviewRepresentationCoedgeDisplayModified(dr);
267259
}
268260
/*----------------------------------------------------------------------------*/
261+
void CommandSetGeomAssociation::setGeomAssociation(TopoEntity* e, std::function<void(Internal::InfoCommand* icmd)> saveGroups)
262+
{
263+
getInfoCommand().addTopoInfoEntity(e, Internal::InfoCommand::DISPMODIFIED);
264+
e->saveTopoProperty();
265+
e->setGeomAssociation(m_geom_entity);
266+
267+
// si m_geom_entity est dans le même groupe que e => e sort du groupe
268+
// 1. les groupes géométriques
269+
Group::GroupManager& gm = e->getContext().getGroupManager();
270+
std::vector<std::string> geom_groups = Utils::toNames(gm.getGroupsFor(m_geom_entity));
271+
std::sort(geom_groups.begin(), geom_groups.end());
272+
// 2. les groupes topologiques
273+
Group::GroupHelperForCommand helper(getInfoCommand(), gm);
274+
std::vector<std::string> topo_groups = Utils::toNames(helper.getGroupsFor(e));
275+
std::sort(topo_groups.begin(), topo_groups.end());
276+
// 3. l'intersection
277+
std::vector<std::string> common_groups;
278+
std::set_intersection(
279+
geom_groups.begin(), geom_groups.end(),
280+
topo_groups.begin(), topo_groups.end(),
281+
std::back_inserter(common_groups)
282+
);
283+
// 4. suppression des groupes
284+
if (common_groups.size() > 0) {
285+
// au moins un groupe à supprimer, il faut sauvegarder les listes de groupes
286+
saveGroups(&getInfoCommand());
287+
for (std::string gn : common_groups)
288+
helper.removeFromGroup(gn, e);
289+
}
290+
}
291+
/*----------------------------------------------------------------------------*/
269292
} // end namespace Topo
270293
/*----------------------------------------------------------------------------*/
271294
} // end namespace Mgx3D

0 commit comments

Comments
 (0)