From 93964cc239ce20e6aaada467065d62391f673ea9 Mon Sep 17 00:00:00 2001 From: emv Date: Fri, 3 Nov 2017 12:12:34 +0300 Subject: [PATCH] 0029293: Boolean Operations algorithm does not preserve the orientations of the faces While building splits of faces (BOPAlgo_Builder::FillImagesFaces()) make sure that the orientation of the input face will be passed to its splits. Extend draw command "normals" with new key "[-print]" which allows printing values of the normal vector. --- src/BOPAlgo/BOPAlgo_Builder_2.cxx | 8 +++--- src/DBRep/DBRep.cxx | 28 +++++++++++++++++--- tests/bugs/modalg_7/bug29293_1 | 33 ++++++++++++++++++++++++ tests/bugs/modalg_7/bug29293_2 | 43 +++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 tests/bugs/modalg_7/bug29293_1 create mode 100644 tests/bugs/modalg_7/bug29293_2 diff --git a/src/BOPAlgo/BOPAlgo_Builder_2.cxx b/src/BOPAlgo/BOPAlgo_Builder_2.cxx index 293841bc3a..c818e1620e 100644 --- a/src/BOPAlgo/BOPAlgo_Builder_2.cxx +++ b/src/BOPAlgo/BOPAlgo_Builder_2.cxx @@ -265,7 +265,7 @@ void BOPAlgo_Builder::BuildSplitFaces() // // Build temporary map of faces images to avoid rebuilding // of the faces without any IN or section edges - BOPCol_IndexedDataMapOfShapeListOfShape aFacesIm; + NCollection_IndexedDataMap aFacesIm; // aNbS=myDS->NbSourceShapes(); // @@ -312,7 +312,7 @@ void BOPAlgo_Builder::BuildSplitFaces() TopoDS_Face aFD = BuildDraftFace(aF, myImages, myContext); if (!aFD.IsNull()) { - aFacesIm(aFacesIm.Add(aF, BOPCol_ListOfShape())).Append(aFD); + aFacesIm(aFacesIm.Add(i, BOPCol_ListOfShape())).Append(aFD); continue; } } @@ -457,13 +457,13 @@ void BOPAlgo_Builder::BuildSplitFaces() for (k = 0; k < aNbBF; ++k) { BOPAlgo_BuilderFace& aBF = aVBF(k); - aFacesIm.Add(aBF.Face(), aBF.Areas()); + aFacesIm.Add(myDS->Index(aBF.Face()), aBF.Areas()); } aNbBF = aFacesIm.Extent(); for (k = 1; k <= aNbBF; ++k) { - const TopoDS_Face& aF = TopoDS::Face(aFacesIm.FindKey(k)); + const TopoDS_Face& aF = TopoDS::Face(myDS->Shape(aFacesIm.FindKey(k))); anOriF = aF.Orientation(); const BOPCol_ListOfShape& aLFR = aFacesIm(k); // diff --git a/src/DBRep/DBRep.cxx b/src/DBRep/DBRep.cxx index dfe37e3648..8537c0a01d 100644 --- a/src/DBRep/DBRep.cxx +++ b/src/DBRep/DBRep.cxx @@ -1140,6 +1140,7 @@ static Standard_Integer normals (Draw_Interpretor& theDI, Standard_Boolean toUseMesh = Standard_False; Standard_Real aLength = 10.0; Standard_Integer aNbAlongU = 1, aNbAlongV = 1; + Standard_Boolean bPrint = Standard_False; for (Standard_Integer anArgIter = 2; anArgIter< theArgNum; ++anArgIter) { TCollection_AsciiString aParam (theArgs[anArgIter]); @@ -1204,9 +1205,13 @@ static Standard_Integer normals (Draw_Interpretor& theDI, return 1; } } + else if (aParam == "-print") + { + bPrint = Standard_True; + } else { - std::cout << "Syntax error: unknwon argument '" << aParam << "'\n"; + std::cout << "Syntax error: unknown argument '" << aParam << "'\n"; return 1; } } @@ -1225,12 +1230,29 @@ static Standard_Integer normals (Draw_Interpretor& theDI, for (NCollection_DataMap > >::Iterator aFaceIt (aNormals); aFaceIt.More(); aFaceIt.Next()) { - const Draw_Color aColor = DBRep_ColorOrientation (aFaceIt.Key().Orientation()); + Standard_Boolean bReverse = Standard_False; + TopAbs_Orientation aFaceOri = aFaceIt.Key().Orientation(); + const Draw_Color aColor = DBRep_ColorOrientation (aFaceOri); + if (aFaceOri == TopAbs_REVERSED) + bReverse = Standard_True; + for (NCollection_Vector >::Iterator aNormalsIt (aFaceIt.Value()); aNormalsIt.More(); aNormalsIt.Next()) { const std::pair& aVec = aNormalsIt.Value(); Handle(Draw_Segment3D) aSeg = new Draw_Segment3D(aVec.first, aVec.second, aColor); dout << aSeg; + if (bPrint) + { + // Make the normal vector from the points + gp_Vec aV(aVec.first, aVec.second); + if (bReverse) + aV.Reverse(); + + // Print values of the vector avoiding printing "-0" values + theDI << "(" << (aV.X() == 0 ? 0 : aV.X()) << ", " + << (aV.Y() == 0 ? 0 : aV.Y()) << ", " + << (aV.Z() == 0 ? 0 : aV.Z()) << ")\n"; + } } } @@ -1406,7 +1428,7 @@ void DBRep::BasicCommands(Draw_Interpretor& theCommands) theCommands.Add("treverse","treverse name1 name2 ...",__FILE__,orientation,g); theCommands.Add("complement","complement name1 name2 ...",__FILE__,orientation,g); theCommands.Add("invert","invert name, reverse subshapes",__FILE__,invert,g); - theCommands.Add("normals","normals shape [Length {10}] [-NbAlongU {1}] [-NbAlongV {1}] [-UseMesh], display normals",__FILE__,normals,g); + theCommands.Add("normals","normals shape [Length {10}] [-NbAlongU {1}] [-NbAlongV {1}] [-UseMesh] [-print], display normals",__FILE__,normals,g); theCommands.Add("nbshapes", "\n nbshapes s - shows the number of sub-shapes in ;\n nbshapes s -t - shows the number of sub-shapes in counting the same sub-shapes with different location as different sub-shapes.", __FILE__,nbshapes,g); diff --git a/tests/bugs/modalg_7/bug29293_1 b/tests/bugs/modalg_7/bug29293_1 new file mode 100644 index 0000000000..7dc43f5f23 --- /dev/null +++ b/tests/bugs/modalg_7/bug29293_1 @@ -0,0 +1,33 @@ +puts "========" +puts "OCC29293" +puts "========" +puts "" +################################################# +# Boolean Operations algorithm does not preserve the orientations of the faces +################################################# + +brestore [locate_data_file bug29293_etchable_face_compound.brep] a +brestore [locate_data_file bug29293_top_shell.brep] b + +bclearobjects +bcleartools +baddcompound a +baddtools b +bfillds +bbop result 0 + +checkshape result +checkprops result -s 411200 +checknbshapes result -vertex 588 -edge 588 -wire 147 -face 147 -shell 147 + + +# Check that the normal directions have been preserved. +# All faces from input shapes which could pass into result have normals +# directed stricly to the top (0, 0, 1). So, it is necessary to check +# that all faces from the result have the same normal direction. + +foreach f [explode result f] { + if {![regexp "(0, 0, 1)" [normals $f -length 1 -print]]} { + puts "Error: the orientation is changed" + } +} diff --git a/tests/bugs/modalg_7/bug29293_2 b/tests/bugs/modalg_7/bug29293_2 new file mode 100644 index 0000000000..119bf04252 --- /dev/null +++ b/tests/bugs/modalg_7/bug29293_2 @@ -0,0 +1,43 @@ +puts "========" +puts "OCC29293" +puts "========" +puts "" +################################################# +# Boolean Operations algorithm does not preserve the orientations of the faces +################################################# + +brestore [locate_data_file bug29293_etchable_face_compound.brep] a +brestore [locate_data_file bug29293_top_shell.brep] b + +explode a f +explode b f + +shape bsh Sh +add b_25 bsh + +bclearobjects +bcleartools +baddobjects a_7 +baddtools bsh +bfillds +bbop result 0 + +checkshape result +checkprops result -s 13460 +checknbshapes result -vertex 4 -edge 4 -wire 1 -face 1 -shell 1 + + +smallview +don result +fit + +# Check that the normal directions have been preserved. +# Both input faces faces have normals +# directed stricly to the top (0, 0, 1). So, it is necessary to check +# that the reuslting face has the same normal direction. + +if {![regexp "(0, 0, 100)" [normals result -length 100 -print]]} { + puts "Error: the orientation is changed" +} + +checkview -screenshot -2d -path ${imagedir}/${test_image}_1.png \ No newline at end of file