X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_SplitToZonesTool.cxx;h=8784a1e5f31f9a008241221c5e86ac2e7e652b30;hb=0f4c16e80e5c9160fb6e240e3f09b151701a1e5b;hp=0990ef4c1ddfee9d748ebd502834ff7e3c843b93;hpb=d84fadb6fba0d9ef3926995eab878175cc24e291;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_SplitToZonesTool.cxx b/src/HYDROData/HYDROData_SplitToZonesTool.cxx index 0990ef4c..8784a1e5 100644 --- a/src/HYDROData/HYDROData_SplitToZonesTool.cxx +++ b/src/HYDROData/HYDROData_SplitToZonesTool.cxx @@ -1,16 +1,60 @@ +// Copyright (C) 2014-2015 EDF-R&D +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "HYDROData_SplitToZonesTool.h" #include "HYDROData_PolylineXY.h" - -#include +#include "HYDROData_ShapesGroup.h" +#include #include +#include #include - +#include #include #include -#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +//#define DEB_SPLIT_TO_ZONES 1 +//#define DEB_SPLIT_TO_ZONES_CHECK_PARTITION 1 +#if (defined (DEB_SPLIT_TO_ZONES) || defined(DEB_SPLIT_TO_ZONES_CHECK_PARTITION)) +#include +static TCollection_AsciiString fileNameBefore("BeforeTranslation"); +#endif + +#define _DEVDEBUG_ +#include "HYDRO_trace.hxx" TopoDS_Face HYDROData_SplitToZonesTool::SplitData::Face() const { @@ -34,166 +78,796 @@ TopoDS_Face HYDROData_SplitToZonesTool::SplitData::Face() const return aResFace; } +Standard_Boolean buildLimFace(const TopoDS_Wire& theBndWire, TopoDS_Face& outFace) +{ + GProp_GProps G; + BRepGProp::LinearProperties(theBndWire,G); + const gp_Pnt& aCPnt = G.CentreOfMass(); + gp_Pln aPln; + BRepBuilderAPI_FindPlane fndPlane (theBndWire, Precision::Confusion()); + if(fndPlane.Found()) + aPln = fndPlane.Plane()->Pln(); + else + aPln = gp_Pln(aCPnt, gp::OZ().Direction()); + BRepBuilderAPI_MakeFace aMkFace(aPln, theBndWire); + if(aMkFace.IsDone()) { + outFace = aMkFace.Face(); + if(!outFace.IsNull()) { +#ifdef DEB_SPLIT_TO_ZONES +// BRepTools::Write(limFace,"FL.brep"); +#endif + return Standard_True; + } + } + return Standard_False; +} +//====================================================================================== + +void HYDROData_SplitToZonesTool::SetFileNames(const QString& theNameBefore, const QString& theNameAfter) +{ +#ifdef DEB_SPLIT_TO_ZONES_CHECK_PARTITION + if(!theNameBefore.isNull() && !theNameBefore.isEmpty()) + { + TCollection_AsciiString aName (theNameBefore.toStdString().data()); + fileNameBefore = aName; + } + if(!theNameAfter.isNull() && !theNameAfter.isEmpty()) + { + TCollection_AsciiString aName (theNameAfter.toStdString().data()); + HYDROData_Transform::SetFileName (aName); + } +#endif +} +//====================================================================================== +Standard_Integer HYDROData_SplitToZonesTool::SplitFaces(const TopoDS_Compound& theComp, + HYDROData_Transform& theTool) +{ + theTool.Clear(); + theTool.SetArgument(theComp); + theTool.Detect(); + const Standard_Boolean bToTransform = theTool.ToTransform(); + theTool.SetToTransform(bToTransform); + theTool.Perform(); + Standard_Integer anErr = theTool.ErrorStatus(); + return anErr; +} + +//====================================================================================== HYDROData_SplitToZonesTool::SplitDataList -HYDROData_SplitToZonesTool::SplitToZones( const HYDROData_SequenceOfObjects& theObjectList, - const Handle(HYDROData_PolylineXY)& thePolyline ) + HYDROData_SplitToZonesTool::Split( const HYDROData_SequenceOfObjects& theObjectList, + const HYDROData_SequenceOfObjects& theGroupsList, + const Handle(HYDROData_PolylineXY)& thePolyline, + const HYDROData_SequenceOfObjects& InterPolys) { +#ifndef NDEBUG + DEBTRACE("Split"); +#endif SplitDataList anOutputSplitDataList; - - // Preparation. Collect the object shapes to split. + NCollection_DataMap OutNE; + if(theObjectList.IsEmpty()) + return anOutputSplitDataList; + // Preparation. + // Collect the object shapes to split. InputDataList will contain elements which will hold shape & name_of_shape. SplitDataList anInputSplitDataList; +#ifdef DEB_SPLIT_TO_ZONES + TCollection_AsciiString aNam("Faces_"); +#endif for( int anIndex = 1, aLength = theObjectList.Length(); anIndex <= aLength; anIndex++ ) { - Handle(HYDROData_Object) aGeomObj = - Handle(HYDROData_Object)::DownCast( theObjectList.Value( anIndex ) ); - if( !aGeomObj.IsNull() ) - { - TopoDS_Shape aShape = aGeomObj->GetTopShape(); - if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_COMPOUND ) { - // Create split data for each face contained in the compound - TopExp_Explorer anExp( aShape, TopAbs_FACE ); + Handle(HYDROData_Entity) anObj = theObjectList.Value( anIndex ); + TopoDS_Shape aShape; + + Handle(HYDROData_Object) aGeomObj = Handle(HYDROData_Object)::DownCast( anObj ); + if( !aGeomObj.IsNull() ) { + aShape = aGeomObj->GetTopShape(); + } + + if ( aShape.IsNull() ) + continue; +#ifdef DEB_SPLIT_TO_ZONES + TCollection_AsciiString aName = aNam + anIndex + "_a.brep"; + BRepTools::Write(aShape, aName.ToCString()); +#endif + if ( aShape.ShapeType() == TopAbs_COMPOUND ) { + // Create split data for each face contained in the compound + TopExp_Explorer anExp( aShape, TopAbs_FACE ); + for ( ; anExp.More(); anExp.Next() ) { + const TopoDS_Face& aFace = TopoDS::Face( anExp.Current() ); + if ( !aFace.IsNull() ) { + SplitData aSplitData( SplitData::Data_Zone, aFace, anObj->GetName() ); + anInputSplitDataList.append( aSplitData ); + } + } + } else { + SplitData aSplitData( SplitData::Data_Zone, aShape, anObj->GetName() ); + anInputSplitDataList.append( aSplitData ); + } + } + // + SplitDataList anInputGroupList; + for( int anIndex = 1, aLength = theGroupsList.Length(); anIndex <=aLength; anIndex++ ) + { + Handle(HYDROData_ShapesGroup) aGeomGroup = + Handle(HYDROData_ShapesGroup)::DownCast( theGroupsList.Value( anIndex ) ); + if( aGeomGroup.IsNull() ) + continue; + + TopTools_SequenceOfShape aGroupShapes; + aGeomGroup->GetShapes( aGroupShapes ); + for( int i = 1, aNbShapes = aGroupShapes.Length(); i <= aNbShapes; i++ ) { + const TopoDS_Shape& aGroupShape = aGroupShapes.Value( i ); + if ( aGroupShape.IsNull() ) + continue; + + if ( aGroupShape.ShapeType() == TopAbs_COMPOUND ) { + TopExp_Explorer anExp( aGroupShape, TopAbs_EDGE ); for ( ; anExp.More(); anExp.Next() ) { - TopoDS_Face aFace = TopoDS::Face( anExp.Current() ); - if ( !aFace.IsNull() ) { - SplitData aSplitData( aFace, aGeomObj->GetName() ); - anInputSplitDataList.append( aSplitData ); + const TopoDS_Edge& anEdge = TopoDS::Edge( anExp.Current() ); + if ( !anEdge.IsNull() ) { + SplitData aSplitData( SplitData::Data_Edge, anEdge, aGeomGroup->GetName() ); + anInputGroupList.append( aSplitData ); } } } else { - SplitData aSplitData( aShape, aGeomObj->GetName() ); - anInputSplitDataList.append( aSplitData ); + SplitData aSplitData( SplitData::Data_Edge, aGroupShape, aGeomGroup->GetName() ); + anInputGroupList.append( aSplitData ); +#ifdef DEB_SPLIT_TO_ZONES + QString aStr = aSplitData.ObjectNames.join(" "); + DEBTRACE("Group# = " < 1) { + HYDROData_Transform splitTool; + const Standard_Integer anErr = SplitFaces(aCmp, splitTool); + if(anErr) + return anOutputSplitDataList; + aResult = splitTool.Shape(); + if (aResult.IsNull()) + return anOutputSplitDataList; + BRepCheck_Analyzer aCheck (aResult); + if(!aCheck.IsValid()) { + #ifdef DEB_SPLIT_TO_ZONES + DEBTRACE("result is not valid"); + BRepTools::Write(aResult, "SplitFacesNV.brep"); + #endif + return anOutputSplitDataList; + } + #ifdef DEB_SPLIT_TO_ZONES + BRepTools::Write(aResult, "SplitFacesV.brep"); + #endif + + // Step 3. Collect history + //HYDROData_DataMapOfShapeListOfShape aDM1; + BOPCol_ListIteratorOfListOfShape anIt(aLS); + #ifdef DEB_SPLIT_TO_ZONES + TCollection_AsciiString aNamM ("EdgM_"); + TCollection_AsciiString aNamG ("EdgG_"); + #endif + for (int i =1;anIt.More();anIt.Next(),i++) { + Standard_Boolean foundF(Standard_False); + const TopTools_ListOfShape& aListOfNew = splitTool.Modified(anIt.Value()); + if(!aListOfNew.IsEmpty()) + foundF = Standard_True; + + TopTools_ListOfShape aList; + + TopTools_ListIteratorOfListOfShape it(aListOfNew); + for(;it.More();it.Next()) + aList.Append(it.Value()); + /* ********************************************************************* + // Bug in History: partition should give only modified entities! => temporary solution is used + //const TopTools_ListOfShape& aListOfGen = splitTool.Generated(anIt.Value()); + //if(!aListOfGen.IsEmpty()) + //foundF = Standard_True; + //it.Initialize(aListOfGen); + //for(;it.More();it.Next()) + // aList.Append(it.Value()); + ********************************************************************* */ + if(!foundF) // face is not modified + aList.Append (anIt.Value()); + aDM1.Add(anIt.Value(), aList); + #ifdef DEB_SPLIT_TO_ZONES + TCollection_AsciiString aName; + #endif + if(!anInputGroupList.isEmpty() ) { // 1 + TopExp_Explorer exp (anIt.Value(), TopAbs_EDGE); + for (int j =1;exp.More();exp.Next(),j++) { + aList.Clear(); + Standard_Boolean foundE(Standard_False); + const TopTools_ListOfShape& aListM = splitTool.Modified(exp.Current()); +#ifndef NDEBUG + DEBTRACE("NB_EDGE_M = " << aListM.Extent()); +#endif + if(aListM.Extent()) foundE = Standard_True; + it.Initialize(aListM); + for(int k=1;it.More();it.Next(),k++) { + aList.Append(it.Value()); + #ifdef DEB_SPLIT_TO_ZONES + aName = aNamM + i + j +k +"_d.brep"; + BRepTools::Write(it.Value(),aName.ToCString()); + #endif + } + /* ********************************************************************* + //const TopTools_ListOfShape& aListG = splitTool.Generated(exp.Current()); + //if(aListG.Extent()) foundE = Standard_True; + //it.Initialize(aListG); + //for(int k=1;it.More();it.Next(),k++) + //aList.Append(it.Value()); + //cout << "NB_EDGE = " << aList.Extent() <GetName(); + hasLimits = Standard_True; // DM2 should be filled here + TopExp_Explorer exp (limFace, TopAbs_EDGE); + for (int i =1;exp.More();exp.Next(),i++) { + const TopoDS_Shape& anEdge = exp.Current(); + if(anEdge.IsNull()) continue; + aBndView.Add(anEdge); + QStringList aListOfNames; + aListOfNames.append(aBndName); + aDM3.Add(anEdge, aListOfNames); + TopTools_ListOfShape aList; + aList.Append(anEdge); + aDM1.Add(anEdge,aList); + } + HYDROData_MapOfShape aView; + exp.Init (aResult, TopAbs_FACE); + for (int i =1;exp.More();exp.Next(),i++) { + const TopoDS_Shape& aFace = exp.Current(); + if(!aFace.IsNull()) { + const TopTools_ListOfShape& aListOfNew = mkCom.Modified(aFace); +#ifndef NDEBUG + DEBTRACE("Modified: " << aListOfNew.Extent()); +#endif + if(!aListOfNew.IsEmpty()) { + aDM4.Add(aFace, aListOfNew); +#ifdef DEB_SPLIT_TO_ZONES + TCollection_AsciiString aName = aNam + i + "_f.brep"; + BRepTools::Write(aListOfNew.Last(), aName.ToCString()); +#endif + } + else { + if(!mkCom.IsDeleted(aFace)) { + const TopTools_ListOfShape& aListOfGen = mkCom.Generated(aFace); + if(!aListOfGen.IsEmpty()) { + /* aDM4.Bind(aFace, aListOfGen); ??? */ +#ifdef DEB_SPLIT_TO_ZONES + TCollection_AsciiString aName = aNam + i + "_g.brep"; + BRepTools::Write(aListOfGen.Last(), aName.ToCString()); +#endif + } + else { + TopTools_ListOfShape aList; + aList.Append(aFace); + aDM4.Add(aFace, aList); //the same face - not modified + } + } + } + TopExp_Explorer exp2 (aFace, TopAbs_EDGE); + for (int j =1;exp2.More();exp2.Next(),j++) { + const TopoDS_Shape& anEdge = exp2.Current(); + if(!anEdge.IsNull()) { + if(aView.Contains(anEdge)) continue; + aView.Add(anEdge); + const TopTools_ListOfShape& aListOfNewEd = mkCom.Modified(anEdge); + if(!aListOfNewEd.IsEmpty()) + aDM4.Add(anEdge, aListOfNewEd); + else { + if(!mkCom.IsDeleted(anEdge)) { + const TopTools_ListOfShape& aListOfGenEd = mkCom.Generated(anEdge); + if(!aListOfGenEd.IsEmpty()) { + /* aDM4.Bind(anEdge, aListOfGenEd); ???*/ + } else { + TopTools_ListOfShape aList; + aList.Append(anEdge); + aDM4.Add(anEdge, aList);//the same edge - not modified + } + } + } + } + } + } + } //end DM4 filling (phase 1) + //cout << "DM4 Ext = " <::Iterator spit(OutNE); + for (;spit.More();spit.Next()) { - const SplitData& anOutputSplitData = anOutputIter.next(); - anExtractedSplitDataList.append( ExtractSeparateData( anOutputSplitData ) ); + const TopoDS_Edge& E = TopoDS::Edge(spit.Key()); + if (E.IsNull()) + continue; + SplitData SDI(SplitData::Data_IntEdge, E, spit.Value()->GetName()); + anOutputSplitDataList.append(SDI); + } + + // Step 4. Fill output structure. +#ifdef DEB_SPLIT_TO_ZONES + TCollection_AsciiString aNam4 ("SC_"); +#endif + HYDROData_DataMapIteratorOfDataMapOfShapeListOfShape aMIt(aDM2); + for(int i =1;aMIt.More();aMIt.Next(),i++) { + SplitData aDestSplitData; + const TopoDS_Shape& aKey = aMIt.Key(); //new + aDestSplitData.Shape = aKey; + if(aKey.ShapeType() == TopAbs_FACE) + aDestSplitData.Type = SplitData::Data_Zone; + else { + aDestSplitData.Type = SplitData::Data_Edge; +#ifdef DEB_SPLIT_TO_ZONES + TCollection_AsciiString aName = aNam4 + i + "_k.brep"; + BRepTools::Write(aKey,aName.ToCString()); +#endif + } + + QStringList aListOfNames; // names processing + const TopTools_ListOfShape& aListOfOld = aMIt.Value(); + TopTools_ListIteratorOfListOfShape it(aListOfOld); + for(int j =1;it.More();it.Next(),j++) { + const TopoDS_Shape& aSh = it.Value(); //old + if(aDM3.Contains(aSh)) { + const QStringList& ObjectNames = aDM3.FindFromKey(aSh); + aListOfNames.append(ObjectNames); +#ifdef DEB_SPLIT_TO_ZONES + TCollection_AsciiString aName = aNam4 + i +"_" + j + "_l.brep"; + BRepTools::Write(aSh ,aName.ToCString()); +#endif + } else { +#ifdef DEB_SPLIT_TO_ZONES + TCollection_AsciiString aName = aNam4 +"__" + i +"_" + j + "_m.brep"; + BRepTools::Write(aSh ,aName.ToCString()); + DEBTRACE(aName.ToCString()<<" = "<< aSh.TShape()); +#endif + if(aBndView.Contains(aSh) && hasLimits) { + aListOfNames.append(aBndName); +#ifdef DEB_SPLIT_TO_ZONES + DEBTRACE(" BndName = "<