Skip to content

Commit 5653072

Browse files
committed
Fix 3rd part of issue#208: undo/redo
1 parent 9a20edc commit 5653072

File tree

5 files changed

+54
-47
lines changed

5 files changed

+54
-47
lines changed

src/Core/Geom/CommandEditGeom.cpp

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -45,36 +45,18 @@ void CommandEditGeom::internalExecute()
4545
internalSpecificPreExecute();
4646

4747
// on recupere toutes les entites concernes par l'opération géométrique
48-
std::map<GeomEntity*,MementoEntity> ref;
49-
std::vector<std::list<GeomEntity*>*> refEntities;
48+
std::map<GeomEntity*, MementoEntity> mementos_by_entity;
49+
std::set<GeomEntity*> to_mem_entities[4];
5050

51-
refEntities.push_back(&(getRefEntities(0))); //sommets
52-
refEntities.push_back(&(getRefEntities(1))); //courbes
53-
refEntities.push_back(&(getRefEntities(2))); //surfaces
54-
refEntities.push_back(&(getRefEntities(3))); //volumes
55-
56-
// MODIF - LES ENTITES ADJ NE SONT PAS DES ENTITES DE REF
57-
// refEntities[0]->insert(refEntities[0]->begin(),getAdjEntities(0).begin(),getAdjEntities(0).end());
58-
// refEntities[1]->insert(refEntities[1]->begin(),getAdjEntities(1).begin(),getAdjEntities(1).end());
59-
// refEntities[2]->insert(refEntities[2]->begin(),getAdjEntities(2).begin(),getAdjEntities(2).end());
60-
// refEntities[3]->insert(refEntities[3]->begin(),getAdjEntities(3).begin(),getAdjEntities(3).end());
61-
62-
#ifdef _DEBUG2
63-
std::cerr<<"nb refs sommets = "<<getRefEntities(0).size()<<std::endl;
64-
std::cerr<<"nb refs curves = "<<getRefEntities(1).size()<<std::endl;
65-
std::cerr<<"nb refs surfaces= "<<getRefEntities(2).size()<<std::endl;
66-
std::cerr<<"nb refs volumes = "<<getRefEntities(3).size()<<std::endl;
67-
#endif
68-
for(unsigned int i=0;i<4;i++){
69-
std::list<GeomEntity*>* refList = refEntities[i];
70-
std::list<GeomEntity*>::iterator it;
71-
for(it=refList->begin();it!=refList->end();it++){
72-
GeomEntity* e = *it;
51+
for(unsigned int i=0;i<4;i++) {
52+
to_mem_entities[i].insert(getRefEntities(i).begin(), getRefEntities(i).end());
53+
to_mem_entities[i].insert(getAdjEntities(i).begin(), getAdjEntities(i).end());
54+
for (GeomEntity* e : to_mem_entities[i]) {
7355
MementoEntity mem = m_memento_manager.createMemento(e);
7456
#ifdef _DEBUG2
7557
std::cerr<<"Memento cree pour "<<e->getName()<<std::endl;
7658
#endif
77-
ref.insert({e, mem});
59+
mementos_by_entity.insert({e, mem});
7860
}
7961
}
8062
// gmds::Timer t2;
@@ -134,19 +116,27 @@ void CommandEditGeom::internalExecute()
134116
}
135117
#endif
136118

137-
//sauvegarde des mementos pour le undo/redo
119+
// Sauvegarde des mementos pour le undo/redo
120+
// Utiliser at en lecture pour avoir une exception si
121+
// la clef est absente (ne pas utiliser l'opérateur [])
138122
std::map<GeomEntity*,MementoEntity> keeped_ref;
139123
for(unsigned int i=0;i<mod_entities.size();i++){
140124
GeomEntity* e = mod_entities[i];
141-
keeped_ref[e] = ref[e];
125+
if (mementos_by_entity.find(e) == mementos_by_entity.end())
126+
std::cout << "*** MOD les mementos ne contiennent pas " << e->getName() << std::endl;
127+
keeped_ref[e] = mementos_by_entity.at(e);
142128
}
143129
for(unsigned int i=0;i<mov_entities.size();i++){
144130
GeomEntity* e = mov_entities[i];
145-
keeped_ref[e] = ref[e];
131+
if (mementos_by_entity.find(e) == mementos_by_entity.end())
132+
std::cout << "*** MOV les mementos ne contiennent pas " << e->getName() << std::endl;
133+
keeped_ref[e] = mementos_by_entity.at(e);
146134
}
147135
for(unsigned int i=0;i<rem_entities.size();i++){
148136
GeomEntity* e = rem_entities[i];
149-
keeped_ref[e] = ref[e];
137+
if (mementos_by_entity.find(e) == mementos_by_entity.end())
138+
std::cout << "*** REM les mementos ne contiennent pas " << e->getName() << std::endl;
139+
keeped_ref[e] = mementos_by_entity.at(e);
150140
}
151141
saveMementos(keeped_ref);
152142
getInfoCommand().setDestroyAndUpdateConnectivity(rem_entities);

src/Core/Geom/CommandJoinEntities.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ std::list<GeomEntity*>& CommandJoinEntities::getRefEntities(const int dim)
9090
return m_ref_entities[dim];
9191
}
9292
/*----------------------------------------------------------------------------*/
93+
std::list<GeomEntity*>& CommandJoinEntities::getAdjEntities(const int dim)
94+
{
95+
return m_adj_entities[dim];
96+
}
97+
/*----------------------------------------------------------------------------*/
9398
std::map<GeomEntity*,std::vector<GeomEntity*> >& CommandJoinEntities::getReplacedEntities()
9499
{
95100
return m_replacedEntities;

src/Core/Geom/GeomModificationBaseClass.cpp

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,22 +69,20 @@ void GeomModificationBaseClass::init(std::vector<GeomEntity*>& es)
6969
{
7070
// pour chacune des entités passées en argument, on ajoute les entités de
7171
// dimension inférieure et supérieure ou égale en référence.
72-
for(unsigned int i=0;i<es.size();i++){
73-
GeomEntity* esi = es[i];
72+
for(GeomEntity* esi : es){
7473
m_init_entities.push_back(esi);
7574
addReference(esi);
7675
addDownIncidentReference(esi);
7776
addUpIncidentReference(esi);
7877
}
7978

80-
for(unsigned int i=0;i<es.size();i++){
81-
GeomEntity* esi = es[i];
82-
addAdjacencyReference(esi);
83-
}
79+
for(int i=0 ; i<4 ; i++)
80+
for(GeomEntity* esi : m_ref_entities[i])
81+
addAdjacencyReference(esi);
8482

8583
// une entité a pu être ajoutée plusieurs fois, on élimine maintenant les
8684
// occurrences multiples
87-
for(int i=0;i<4;i++){
85+
for(int i=0 ; i<4 ; i++){
8886
m_ref_entities[i].sort(Utils::Entity::compareEntity);
8987
m_ref_entities[i].unique();
9088
m_adj_entities[i].sort(Utils::Entity::compareEntity);
@@ -165,8 +163,28 @@ addAdjacencyReference(GeomEntity* e)
165163
for (auto ei : va.get())
166164
{
167165
int dim = ei->getDim();
168-
if (dim > 0 && std::find(m_ref_entities[dim].begin(),m_ref_entities[dim].end(),ei)==m_ref_entities[dim].end())
166+
auto& ref = m_ref_entities[dim];
167+
if (std::find(ref.begin(), ref.end(), ei) == ref.end()) {
169168
m_adj_entities[dim].push_back(ei);
169+
170+
// issue#208 : split d'un volume Vol0 à gauche collé (glue) à un volume Vol1 à droite
171+
// la surface Surf0007 de droite de Vol1 n'est pas adjacente à Vol0 mais ses relations
172+
// géométriques vont être changées car elle est adjacente à des surfaces
173+
// qui vont être recréées (changement nb arêtes et shape OCC).
174+
// Il faut donc que Surf0007 soit prise en compte par les mementos en cas de undo
175+
// => on garde les objets "down incident" aux objets adjacents car Surf0007 est
176+
// "down incidente" de Vol1.
177+
GetDownIncidentGeomEntitiesVisitor v_down;
178+
ei->accept(v_down);
179+
for (auto e_down : v_down.get())
180+
{
181+
int dim_down = e_down->getDim();
182+
auto& ref_down = m_ref_entities[dim_down];
183+
if (std::find(ref_down.begin(), ref_down.end(), e_down) == ref_down.end()) {
184+
m_adj_entities[dim_down].push_back(e_down);
185+
}
186+
}
187+
}
170188
}
171189
}
172190
/*----------------------------------------------------------------------------*/
@@ -598,13 +616,6 @@ createGeomEntities(const TopoDS_Shape& shape, const bool replaceVolumes, const b
598616
//===================================================================
599617
rebuildAdjacencyEntities(shape);
600618

601-
602-
// std::vector<Volume*>::iterator it_vKeep = m_toKeepVolumes.begin();
603-
// while(it_vKeep!=m_toKeepVolumes.end()){
604-
// Volume* v = *it_vKeep;
605-
// std::cout<<"\t keep "<<v->getName()<<std::endl;
606-
// it_vKeep++;
607-
// }
608619
std::vector<GeomEntity*>::iterator it_rem = m_removedEntities.begin();
609620
std::vector<GeomEntity*> toErase;
610621
while(it_rem!=m_removedEntities.end()){
@@ -2048,7 +2059,7 @@ void GeomModificationBaseClass::createNewSurfaces(
20482059
#endif
20492060
}
20502061

2051-
} // end for i
2062+
}
20522063

20532064
}
20542065
/*----------------------------------------------------------------------------*/

src/Core/Geom/GeomSectionByPlaneImplementation.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,6 @@ void GeomSectionByPlaneImplementation::split(std::vector<GeomEntity*>& res)
139139
rep_ei.push_back(m_newVolumes[j]);
140140
}
141141

142-
// res.insert(res.end(),new_volumes.begin(),new_volumes.end());
143-
144142
res.insert(res.end(), m_newEntities.begin(), m_newEntities.end());
145143
}
146144
/*----------------------------------------------------------------------------*/

src/Core/protected/Geom/CommandJoinEntities.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ class CommandJoinEntities: public CommandEditGeom
7272
* l'algorithme travaille
7373
*/
7474
virtual std::list<GeomEntity*>& getRefEntities(const int dim);
75+
virtual std::list<GeomEntity*>& getAdjEntities(const int dim);
7576

7677
/*------------------------------------------------------------------------*/
7778
/** \brief retourne une référence sur une map indiquant par quelles
@@ -119,6 +120,8 @@ class CommandJoinEntities: public CommandEditGeom
119120

120121
/// référence sur toutes les entités sur lesquelles l'algorithme travaille
121122
std::list<GeomEntity*> m_ref_entities[4];
123+
/// liste inutilisée : juste pour répondre à la méthode get de la classe mère
124+
std::list<GeomEntity*> m_adj_entities[4];
122125

123126
/* entités que l'on a conservées (modifiées ou non)*/
124127
std::vector<Vertex*> m_toKeepVertices;

0 commit comments

Comments
 (0)