#include <TopTools_ListOfShape.hxx>
#include <TopTools_SequenceOfShape.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
#include <BRep_Builder.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
#include <QStringList>
+//#define DEB_GET_REGION_SHAPE
+
IMPLEMENT_STANDARD_HANDLE(HYDROData_Region, HYDROData_Entity)
IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Region, HYDROData_Entity)
Handle(HYDROData_Zone) aNewZone = addNewZone();
theZone->CopyTo( aNewZone );
+ // To prevent changing of stored shape
+ aNewZone->SetShape( theZone->GetShape() );
+
aFatherRegion->RemoveZone( theZone );
theZone->SetLabel( aNewZone->Label() );
return aNewZone;
}
+void getUsedGroups( const TopoDS_Shape& theShape,
+ HYDROData_ShapesGroup::SeqOfGroupsDefs& theOriGroups,
+ HYDROData_ShapesGroup::SeqOfGroupsDefs& theUsedGroups )
+{
+#ifdef DEB_GET_REGION_SHAPE
+ HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Zone face edges:", theShape, TopAbs_EDGE );
+#endif
+
+ TopTools_IndexedMapOfShape aMapOfSubShapes;
+ TopExp::MapShapes( theShape, TopAbs_EDGE, aMapOfSubShapes );
+
+ HYDROData_ShapesGroup::SeqOfGroupsDefs::Iterator anIter( theOriGroups );
+ for ( ; anIter.More(); anIter.Next() )
+ {
+ HYDROData_ShapesGroup::GroupDefinition& anOriGroupDef = anIter.ChangeValue();
+ if ( anOriGroupDef.Shapes.IsEmpty() )
+ continue;
+
+ for ( int i = 1; i <= anOriGroupDef.Shapes.Length(); ++i )
+ {
+ TopoDS_Shape aGroupEdge = anOriGroupDef.Shapes.Value( i );
+
+ bool anIsFound = false;
+ for ( int anIndex = 1; anIndex <= aMapOfSubShapes.Extent(); anIndex++ )
+ {
+ if ( aGroupEdge.IsPartner( aMapOfSubShapes.FindKey( anIndex ) ) )
+ {
+ anIsFound = true;
+ break;
+ }
+ }
+
+ if ( !anIsFound )
+ continue;
+
+ anOriGroupDef.Shapes.Remove( i );
+ --i;
+
+ bool anIsAdded = false;
+
+ HYDROData_ShapesGroup::SeqOfGroupsDefs::Iterator aUsedIter( theUsedGroups );
+ for ( ; aUsedIter.More(); aUsedIter.Next() )
+ {
+ HYDROData_ShapesGroup::GroupDefinition& aUsedGroupDef = aUsedIter.ChangeValue();
+ if ( aUsedGroupDef.Name != anOriGroupDef.Name )
+ continue;
+
+ aUsedGroupDef.Shapes.Append( aGroupEdge );
+ anIsAdded = true;
+ break;
+ }
+
+ if ( !anIsAdded )
+ {
+ HYDROData_ShapesGroup::GroupDefinition aUsedGroupDef;
+ aUsedGroupDef.Name = anOriGroupDef.Name;
+ aUsedGroupDef.Shapes.Append( aGroupEdge );
+ theUsedGroups.Append( aUsedGroupDef );
+ }
+ }
+ }
+}
+
TopoDS_Shape HYDROData_Region::GetShape( HYDROData_ShapesGroup::SeqOfGroupsDefs* theSeqOfGroups ) const
{
HYDROData_ShapesGroup::SeqOfGroupsDefs aSeqOfGroups;
+ HYDROData_ShapesGroup::SeqOfGroupsDefs aSeqOfUsedGroups;
if ( theSeqOfGroups )
aSeqOfGroups = *theSeqOfGroups;
+#ifdef DEB_GET_REGION_SHAPE
+ HYDROData_ShapesGroup::GroupDefinition::Dump( std::cout, aSeqOfGroups );
+#endif
+
TopoDS_Shape aResShape;
// Unite the region zones (each zone is a face) into one face (united face)
TopoDS_Face aZoneFace = TopoDS::Face( aZoneShape );
aRegionFacesList.Append( aZoneFace );
+
+ getUsedGroups( aZoneFace, aSeqOfGroups, aSeqOfUsedGroups );
} // zones iterator
if ( aRegionFacesList.IsEmpty() )
}
else
{
+#ifdef DEB_GET_REGION_SHAPE
+ HYDROData_ShapesGroup::GroupDefinition::Dump( std::cout, aSeqOfUsedGroups );
+#endif
+
// Try to fuse all region faces into one common face
TopoDS_Shape aFuseShape;
TopTools_ListIteratorOfListOfShape aFaceIter( aRegionFacesList );
}
aFuseShape = aFuse.Shape();
- HYDROData_ShapesGroup::GroupDefinition::Update( &aSeqOfGroups, &aFuse );
+ HYDROData_ShapesGroup::GroupDefinition::Update( &aSeqOfUsedGroups, &aFuse );
} // faces iterator
+#ifdef DEB_GET_REGION_SHAPE
+ HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Fused face edges:", aFuseShape, TopAbs_EDGE );
+#endif
+
// Check the result of fuse operation
if ( !aFuseShape.IsNull() )
{
if ( aShapeFaces.Length() == 1 )
{
aRegionFace = TopoDS::Face( aShapeFaces.Value( 1 ) );
- HYDROData_ShapesGroup::GroupDefinition::Update( &aSeqOfGroups, &anUnifier );
- // temporary commented because of needs of testing
- //if ( theSeqOfGroups )
- //*theSeqOfGroups = aSeqOfGroups;
+#ifdef DEB_GET_REGION_SHAPE
+ HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Result face edges:", aRegionFace, TopAbs_EDGE );
+#endif
+
+ HYDROData_ShapesGroup::GroupDefinition::Update( &aSeqOfUsedGroups, &anUnifier );
+
+ // Update the sequence of groups
+ if ( theSeqOfGroups )
+ {
+ HYDROData_ShapesGroup::SeqOfGroupsDefs::Iterator aUsedIter( aSeqOfUsedGroups );
+ for ( ; aUsedIter.More(); aUsedIter.Next() )
+ {
+ const HYDROData_ShapesGroup::GroupDefinition& aUsedGroupDef = aUsedIter.Value();
+ if ( aUsedGroupDef.Shapes.IsEmpty() )
+ continue;
+
+ HYDROData_ShapesGroup::SeqOfGroupsDefs::Iterator anOriIter( aSeqOfGroups );
+ for ( ; anOriIter.More(); anOriIter.Next() )
+ {
+ HYDROData_ShapesGroup::GroupDefinition& anOriGroupDef = anOriIter.ChangeValue();
+ if ( anOriGroupDef.Name != aUsedGroupDef.Name )
+ continue;
+
+ HYDROData_ShapesTool::AddShapes( anOriGroupDef.Shapes, aUsedGroupDef.Shapes );
+ break;
+ }
+ }
+
+ *theSeqOfGroups = aSeqOfGroups;
+ }
}
}
}
for ( int i = 1; i <= aGroupDef.Shapes.Length(); ++i )
{
TopoDS_Shape aShape = aGroupDef.Shapes.Value( i );
- /*
- if ( theAlgo->IsDeleted( aShape ) )
+
+ const TopTools_ListOfShape& aModifiedByAlgo = theAlgo->Modified( aShape );
+ if ( !aModifiedByAlgo.IsEmpty() )
{
+ HYDROData_ShapesTool::AddShapes( aShapesToAdd, aModifiedByAlgo );
aGroupDef.Shapes.Remove( i );
--i;
}
- else
- {*/
- const TopTools_ListOfShape& aModifiedByAlgo = theAlgo->Modified( aShape );
- if ( !aModifiedByAlgo.IsEmpty() )
+ else
+ {
+ const TopTools_ListOfShape& aGeneratedByAlgo = theAlgo->Generated( aShape );
+ if ( !aGeneratedByAlgo.IsEmpty() )
{
- HYDROData_ShapesTool::AddShapes( aShapesToAdd, aModifiedByAlgo );
+ HYDROData_ShapesTool::AddShapes( aShapesToAdd, aGeneratedByAlgo );
aGroupDef.Shapes.Remove( i );
--i;
}
- else
- {
- const TopTools_ListOfShape& aGeneratedByAlgo = theAlgo->Generated( aShape );
- if ( !aGeneratedByAlgo.IsEmpty() )
- {
- HYDROData_ShapesTool::AddShapes( aShapesToAdd, aGeneratedByAlgo );
- aGroupDef.Shapes.Remove( i );
- --i;
- }
- }
- //}
+ }
}
HYDROData_ShapesTool::AddShapes( aGroupDef.Shapes, aShapesToAdd );
TopoDS_Shape aShape = aGroupDef.Shapes.Value( i );
TopoDS_Shape aGeneratedByAlgo = theAlgo->Generated( aShape );
- if ( aGeneratedByAlgo.IsNull() || aShape.IsEqual( aGeneratedByAlgo ) )
- continue;
-
- aShapesToAdd.Append( aGeneratedByAlgo );
- aGroupDef.Shapes.Remove( i );
- --i;
+ if ( aGeneratedByAlgo.IsNull() )
+ {
+ // Edge has been removed
+ aGroupDef.Shapes.Remove( i );
+ --i;
+ }
+ else if ( !aShape.IsEqual( aGeneratedByAlgo ) )
+ {
+ // Edge has been modified
+ aShapesToAdd.Append( aGeneratedByAlgo );
+ aGroupDef.Shapes.Remove( i );
+ --i;
+ }
}
HYDROData_ShapesTool::AddShapes( aGroupDef.Shapes, aShapesToAdd );
}
}
+void HYDROData_ShapesGroup::GroupDefinition::Dump( std::ostream& theStream ) const
+{
+ theStream << "Name: " << Name.ToCString() << "\n";
+ HYDROData_ShapesTool::DumpSequenceOfShapes( theStream, Shapes );
+}
+
+void HYDROData_ShapesGroup::GroupDefinition::Dump( std::ostream& theStream,
+ const SeqOfGroupsDefs& theGroups )
+{
+ SeqOfGroupsDefs::Iterator anIter( theGroups );
+ for ( ; anIter.More(); anIter.Next() )
+ {
+ const GroupDefinition& aGroupDef = anIter.Value();
+ aGroupDef.Dump( theStream );
+ }
+}
+
+
+
HYDROData_ShapesGroup::HYDROData_ShapesGroup()
: HYDROData_Entity()
{