*/
bool HYDROData_LandCoverMap::ExportTelemac( const QString& theFileName, Standard_Real theDeflection ) const
{
- TopoDS_Shell aShell; //TODO: unite all the faces of land covers into the shell
+ TopoDS_Shape aLandCoverMapShape = GetShape();
+ TopTools_ListOfShape aListOfFaces;
+ TopExp_Explorer anExp( aLandCoverMapShape, TopAbs_FACE );
+ for( ; anExp.More(); anExp.Next() )
+ aListOfFaces.Append( anExp.Current() );
+
+ TopoDS_Shape aShape = MergeFaces( aListOfFaces, false );
NCollection_IndexedMap<gp_Pnt> aVerticesMap;
NCollection_IndexedDataMap< TopoDS_Edge, QList<int> > anEdgesMap;
NCollection_IndexedDataMap< TopoDS_Face, QList<int> > aFacesMap;
// add into the map all edges existing in the shell
- TopExp_Explorer anExp1( aShell, TopAbs_EDGE );
+ TopExp_Explorer anExp1( aShape, TopAbs_EDGE );
for( ; anExp1.More(); anExp1.Next() )
{
TopoDS_Edge anEdge = TopoDS::Edge( anExp1.Current() );
}
// add into the map all faces existing in the shell and correspondence between face and edges ids
- TopExp_Explorer anExp2( aShell, TopAbs_FACE );
+ TopExp_Explorer anExp2( aShape, TopAbs_FACE );
for( ; anExp2.More(); anExp2.Next() )
{
TopoDS_Face aFace = TopoDS::Face( anExp2.Current() );
bool HYDROData_LandCoverMap::Merge( const TopTools_ListOfShape& theFaces, const QString& theType )
{
// 1. to fuse the faces into the new face
- TopoDS_Shape aMergedFace;
- if( MergeFaces( theFaces, true, aMergedFace ) )
+ TopoDS_Shape aMergedFace = MergeFaces( theFaces, true );
+ if( aMergedFace.ShapeType()==TopAbs_FACE )
{
- if( aMergedFace.ShapeType()==TopAbs_FACE )
- {
- // 2. to remove the merged faces from the current map
- Remove( theFaces );
+ // 2. to remove the merged faces from the current map
+ Remove( theFaces );
- // 3. to add the face into the map
- return LocalPartition( TopoDS::Face( aMergedFace ), theType );
- }
+ // 3. to add the face into the map
+ return LocalPartition( TopoDS::Face( aMergedFace ), theType );
}
return false;
}
-bool HYDROData_LandCoverMap::MergeFaces(const TopTools_ListOfShape& theFaces, bool IsToUnify, TopoDS_Shape& outSh)
+TopoDS_Shape HYDROData_LandCoverMap::MergeFaces( const TopTools_ListOfShape& theFaces,
+ bool IsToUnify, double theTolerance )
{
- int iErr;
- TopTools_ListIteratorOfListOfShape aIt;
+ int anError;
+ TopTools_ListIteratorOfListOfShape anIt;
BOPCol_ListOfShape aLC;
- aIt.Initialize(theFaces);
- for (; aIt.More(); aIt.Next()) {
- const TopoDS_Shape& aS=aIt.Value();
- aLC.Append(aS);
- }
+ anIt.Initialize(theFaces);
+ for( ; anIt.More(); anIt.Next() )
+ aLC.Append( anIt.Value() );
+
BOPAlgo_PaveFiller aPF;
- aPF.SetArguments(aLC);
- aPF.SetRunParallel(Standard_False);
- aPF.SetFuzzyValue(1e-02);
+ aPF.SetArguments( aLC );
+ aPF.SetRunParallel( Standard_False );
+ aPF.SetFuzzyValue( theTolerance );
aPF.Perform();
- iErr=aPF.ErrorStatus();
- if (iErr)
- return false;
+ anError = aPF.ErrorStatus();
+ if( anError )
+ return TopoDS_Shape();
- BOPAlgo_Builder aBuilder;
- aIt.Initialize(theFaces);
- for (; aIt.More(); aIt.Next()) {
- const TopoDS_Shape& aS=aIt.Value();
- aBuilder.AddArgument(aS);
- }
+ BOPAlgo_Builder anAlgo;
+ anIt.Initialize( theFaces );
+ for( ; anIt.More(); anIt.Next() )
+ anAlgo.AddArgument( anIt.Value() );
- aBuilder.PerformWithFiller(aPF);
- iErr = aBuilder.ErrorStatus();
- if (iErr)
- return false;
- const TopoDS_Shape& aMergedShape=aBuilder.Shape();
-
- //
- BRep_Builder BB;
- TopoDS_Shell she;
- BB.MakeShell(she);
- she.Closed(Standard_False);
- TopExp_Explorer ff(aMergedShape, TopAbs_FACE);
- for(; ff.More(); ff.Next())
+ anAlgo.PerformWithFiller( aPF );
+ anError = anAlgo.ErrorStatus();
+ if( anError )
+ return TopoDS_Shape();
+
+ const TopoDS_Shape& aMergedShape = anAlgo.Shape();
+
+ BRep_Builder aBuilder;
+ TopoDS_Shell aShell;
+ aBuilder.MakeShell( aShell );
+ aShell.Closed( Standard_False );
+ TopExp_Explorer anExplorer( aMergedShape, TopAbs_FACE );
+ for( ; anExplorer.More(); anExplorer.Next() )
{
- const TopoDS_Face& F = TopoDS::Face(ff.Current());
- if (F.IsNull())
+ const TopoDS_Face& aFace = TopoDS::Face(anExplorer.Current());
+ if( aFace.IsNull() )
continue;
- if (F.ShapeType() == TopAbs_FACE) {
- BB.Add(she, F);
- she.Closed (Standard_False);
+ if( aFace.ShapeType() == TopAbs_FACE )
+ {
+ aBuilder.Add( aShell, aFace );
+ aShell.Closed( Standard_False );
}
}
- if (IsToUnify)
+ TopoDS_Shape aResult;
+ if( IsToUnify )
{
- ShapeUpgrade_UnifySameDomain USD;
- USD.Initialize(she);
- USD.Build();
- outSh = USD.Shape();
+ ShapeUpgrade_UnifySameDomain aUSD;
+ aUSD.Initialize( aShell );
+ aUSD.Build();
+ aResult = aUSD.Shape();
}
else
- {
- outSh = she;
- }
+ aResult = aShell;
- ff.Init(outSh, TopAbs_FACE);
+ anExplorer.Init( aResult, TopAbs_FACE );
int i = 0;
- TopoDS_Face OneF;
- for(; ff.More(); ff.Next(), i++)
- OneF = TopoDS::Face(ff.Current());
- if (i == 1)
- outSh = OneF;
+ TopoDS_Face anOneFace;
+ for( ; anExplorer.More(); anExplorer.Next(), i++ )
+ anOneFace = TopoDS::Face( anExplorer.Current() );
- return true;
+ if( i == 1 )
+ aResult = anOneFace;
+ return aResult;
}
/**