Skip to content

Commit e610d0c

Browse files
mpoudotlelandaisb
authored andcommitted
Check if nbMeshingEdges are compatible when splitting faces
1 parent b7a85e8 commit e610d0c

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

src/Core/Topo/TopoHelper.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -827,9 +827,19 @@ void TopoHelper::splitFaces(std::vector<CoFace* > cofaces,
827827

828828
// réciproque: recherche la CoEdge touchée par le noeud
829829
if (0 != edge_ar){
830+
if (edge_dep->getNbMeshingEdges() != edge_ar->getNbMeshingEdges())
831+
{
832+
TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8);
833+
messErr << "Echec lors du découpage de la face "<<coface->getName()
834+
<<", le nombre d'arêtes de maillage est différent de part et d'autre de la face (" << (short)edge_dep->getNbMeshingEdges()
835+
<< " vs " << (short)edge_ar->getNbMeshingEdges() << ")";
836+
throw TkUtil::Exception(messErr);
837+
}
838+
830839
edge_ar->computeCorrespondingCoEdgeAndNbMeshingEdges(vertex2, nbMeshingEdges_edge, coedge_after_cut,
831840
coedge_ar, nbMeshingEdges_ar, sens_coedge_ar);
832841

842+
833843
#ifdef _DEBUG_SPLIT
834844
std::cout<<"nbMeshingEdges_ar = "<<nbMeshingEdges_ar<<std::endl;
835845
std::cout<<"coedge_ar = "<<coedge_ar->getName()<<std::endl;
@@ -844,7 +854,6 @@ void TopoHelper::splitFaces(std::vector<CoFace* > cofaces,
844854
std::cout<<"edge_ar et coedge_ar == 0\n";
845855
#endif
846856
}
847-
848857
// on recherche si cette face est déjà coupée
849858
InfoSplit* is = cofaceInfoSplit[coface->getUniqueId()];
850859

test_link/test_issue78.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import pyMagix3D as Mgx3D
2+
import pytest
3+
4+
def test_issue78(capfd):
5+
ctx = Mgx3D.getStdContext()
6+
ctx.clearSession() # Clean the session after the previous test
7+
8+
# Création du sommet Pt0000
9+
ctx.getGeomManager().newVertex (Mgx3D.Point(0, 0, 0))
10+
# Création du sommet Pt0001
11+
ctx.getGeomManager().newVertex (Mgx3D.Point(1, 0, 0))
12+
# Création du sommet Pt0002
13+
ctx.getGeomManager().newVertex (Mgx3D.Point(1, 2, 0))
14+
# Création du sommet Pt0003
15+
ctx.getGeomManager().newVertex (Mgx3D.Point(0, 2, 0))
16+
# Création du segment Crb0000
17+
ctx.getGeomManager().newSegment("Pt0000", "Pt0001")
18+
# Création du segment Crb0001
19+
ctx.getGeomManager().newSegment("Pt0001", "Pt0002")
20+
# Création du segment Crb0002
21+
ctx.getGeomManager().newSegment("Pt0002", "Pt0003")
22+
# Création du segment Crb0003
23+
ctx.getGeomManager().newSegment("Pt0003", "Pt0000")
24+
# Création de la surface Surf0000
25+
ctx.getGeomManager().newPlanarSurface( ["Crb0000", "Crb0001", "Crb0002", "Crb0003"] , "")
26+
# Création d'une face topologique structurée sur une géométrie (Surf0000)
27+
ctx.getTopoManager().newStructuredTopoOnGeometry ("Surf0000")
28+
# Découpage de l'arête Ar0000
29+
ctx.getTopoManager().splitEdge ("Ar0000", .4)
30+
# Découpage de la face Fa0000 par prolongation
31+
ctx.getTopoManager().extendSplitFace ("Fa0000", "Som0004")
32+
assert ctx.getTopoManager().getNbFaces()==2
33+
ctx.undo()
34+
assert ctx.getTopoManager().getNbFaces()==1
35+
# Changement de discrétisation pour les arêtes Ar0002
36+
emp = Mgx3D.EdgeMeshingPropertyUniform(3)
37+
ctx.getTopoManager().setMeshingProperty (emp,["Ar0002"])
38+
with pytest.raises(RuntimeError) as excinfo:
39+
# Impossible car les discrétisations ne sont pas compatibles
40+
ctx.getTopoManager().extendSplitFace ("Fa0000", "Som0004")
41+
expected = "Echec lors du découpage de la face Fa0000, le nombre d'arêtes de maillage est différent de part et d'autre de la face (10 vs 3)"
42+
assert expected in str(excinfo.value)

0 commit comments

Comments
 (0)