Skip to content

Commit 130c539

Browse files
committed
Fix issue#265: crash after two identical setGroup commands
1 parent 345f539 commit 130c539

2 files changed

Lines changed: 38 additions & 8 deletions

File tree

src/Core/Mesh/CommandAddRemoveGroupName.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,18 @@ void CommandAddRemoveGroupName::internalExecute()
7070
updateMesh(ge, grp->getName(), false);
7171
} else if (m_ope == set){
7272
// on retire tous les groupes
73+
bool ge_already_in_group = false;
7374
for (Group::GroupEntity* grp : groups)
74-
m_group_helper.removeFromGroup(grp->getName(), ge);
75+
if (grp->getName() == m_groupName)
76+
ge_already_in_group = true;
77+
else
78+
m_group_helper.removeFromGroup(grp->getName(), ge);
7579

76-
// on ajoute le groupe
77-
Group::GroupEntity* grp = m_group_helper.addToGroup(m_groupName, ge);
78-
updateMesh(ge, grp->getName(), true);
80+
// on ajoute le groupe s'il n'était pas déjà présent
81+
if (!ge_already_in_group) {
82+
Group::GroupEntity* grp = m_group_helper.addToGroup(m_groupName, ge);
83+
updateMesh(ge, grp->getName(), true);
84+
}
7985
} else {
8086
TkUtil::Exception ("[Erreur interne] Opération non prévue");
8187
}
@@ -97,12 +103,18 @@ void CommandAddRemoveGroupName::internalExecute()
97103
updateMesh(te, grp->getName(), false);
98104
} else if (m_ope == set){
99105
// on retire tous les groupes
106+
bool te_already_in_group = false;
100107
for (Group::GroupEntity* grp : groups)
101-
m_group_helper.removeFromGroup(grp->getName(), te);
108+
if (grp->getName() == m_groupName)
109+
te_already_in_group = true;
110+
else
111+
m_group_helper.removeFromGroup(grp->getName(), te);
102112

103-
// on ajoute le groupe
104-
Group::GroupEntity* grp = m_group_helper.addToGroup(m_groupName, te);
105-
updateMesh(te, grp->getName(), true);
113+
// on ajoute le groupe s'il n'était pas déjà présent
114+
if (!te_already_in_group) {
115+
Group::GroupEntity* grp = m_group_helper.addToGroup(m_groupName, te);
116+
updateMesh(te, grp->getName(), true);
117+
}
106118
} else {
107119
TkUtil::Exception ("[Erreur interne] Opération non prévue");
108120
}

test_link/test_groups.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,3 +334,21 @@ def test_topo_surface():
334334
assert ctx.getGroupManager().getTopoFaces("aaa", 2) == ["Fa0000"]
335335
ctx.undo()
336336
assert ctx.getGroupManager().getTopoFaces("aaa", 2) == []
337+
338+
# issue#265: crash after two identical setGroup commands
339+
def test_issue265():
340+
ctx = Mgx3D.getStdContext()
341+
ctx.clearSession() # Clean the session after the previous test
342+
gm = ctx.getGeomManager()
343+
344+
gm.newBox (Mgx3D.Point(0, 0, 0), Mgx3D.Point(1, 1, 1))
345+
gm.setGroup(["Vol0000"], 3, "bbb")
346+
assert gm.getInfos("Vol0000", 3).groups() == ["bbb"]
347+
gm.setGroup(["Vol0000"], 3, "aaa")
348+
assert gm.getInfos("Vol0000", 3).groups() == ["aaa"]
349+
gm.setGroup(["Vol0000"], 3, "aaa")
350+
assert gm.getInfos("Vol0000", 3).groups() == ["aaa"]
351+
gm.newBox (Mgx3D.Point(1, 0, 0), Mgx3D.Point(2, 1, 1))
352+
gm.setGroup(["Vol0001"], 3, "aaa")
353+
assert gm.getInfos("Vol0000", 3).groups() == ["aaa"]
354+
assert gm.getInfos("Vol0001", 3).groups() == ["aaa"]

0 commit comments

Comments
 (0)