X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_Region.cxx;h=a381e208358302290c6d044ebfe52abe73e59ee6;hb=f09552db523068b952c3e6e64c5f8acb165d243d;hp=582357e8dc2f33fce07215099e70dd3bfe9105ef;hpb=e744ba34fd38d6744d11b54cd15b6f86350695b2;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_Region.cxx b/src/HYDROData/HYDROData_Region.cxx index 582357e8..a381e208 100644 --- a/src/HYDROData/HYDROData_Region.cxx +++ b/src/HYDROData/HYDROData_Region.cxx @@ -38,16 +38,24 @@ #include #include + #include #include #include #include +#include + +#include "Geom_Plane.hxx" +#include "gp_Pln.hxx" +#include "BRepTools_ReShape.hxx" + +//#define _DEVDEBUG_ +#include "HYDRO_trace.hxx" //#define DEB_GET_REGION_SHAPE -IMPLEMENT_STANDARD_HANDLE(HYDROData_Region, HYDROData_Entity) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_Region, HYDROData_Entity) @@ -93,7 +101,7 @@ HYDROData_SequenceOfObjects HYDROData_Region::GetAllReferenceObjects() const bool HYDROData_Region::AddZone( const Handle(HYDROData_Zone)& theZone ) { - Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( myLab ); + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document(); if ( theZone.IsNull() ) return false; @@ -129,7 +137,7 @@ HYDROData_SequenceOfObjects HYDROData_Region::GetZones() const return GetReferenceObjects( DataTag_Zone ); } -void HYDROData_Region::RemoveZone( const Handle(HYDROData_Zone)& theZone ) +void HYDROData_Region::RemoveZone( const Handle(HYDROData_Zone)& theZone, bool removeRegion ) { if ( theZone.IsNull() ) return; @@ -142,10 +150,13 @@ void HYDROData_Region::RemoveZone( const Handle(HYDROData_Zone)& theZone ) if ( !aFatherRegion.IsNull() && aFatherRegion->Label() == myLab ) theZone->Remove(); - // If the last zone has been removed from region we remove this region - HYDROData_SequenceOfObjects aRefZones = GetZones(); - if ( aRefZones.IsEmpty() ) - Remove(); + if (removeRegion) + { + // If the last zone has been removed from region we remove this region + HYDROData_SequenceOfObjects aRefZones = GetZones(); + if ( aRefZones.IsEmpty() ) + Remove(); + } } void HYDROData_Region::RemoveZones() @@ -177,7 +188,7 @@ Handle(HYDROData_Zone) HYDROData_Region::addNewZone( const Handle(HYDROData_Docu Handle(HYDROData_Entity) aRefObject = theDoc->FindObjectByName( anObjName ); if ( aRefObject.IsNull() ) continue; - + DEBTRACE("aRefObject name: " << aRefObject->GetName()); aNewZone->AddObject( aRefObject ); } @@ -238,8 +249,10 @@ void getUsedGroups( const TopoDS_Shape& theShape, } } -TopoDS_Shape HYDROData_Region::GetShape( HYDROData_ShapesGroup::SeqOfGroupsDefs* theSeqOfGroups ) const + +TopoDS_Shape HYDROData_Region::GetShape( HYDROData_ShapesGroup::SeqOfGroupsDefs* theSeqOfGroups, const TopTools_SequenceOfShape* IntSh ) const { + DEBTRACE("GetShape"); HYDROData_ShapesGroup::SeqOfGroupsDefs aSeqOfGroups; HYDROData_ShapesGroup::SeqOfGroupsDefs aSeqOfUsedGroups; if ( theSeqOfGroups ) @@ -259,6 +272,9 @@ TopoDS_Shape HYDROData_Region::GetShape( HYDROData_ShapesGroup::SeqOfGroupsDefs* HYDROData_SequenceOfObjects aZones = GetZones(); HYDROData_SequenceOfObjects::Iterator aZoneIter( aZones ); + TopTools_IndexedMapOfShape AllE; + TopTools_IndexedMapOfShape IE; //int edges + for ( ; aZoneIter.More(); aZoneIter.Next() ) { Handle(HYDROData_Zone) aZone = @@ -272,19 +288,30 @@ TopoDS_Shape HYDROData_Region::GetShape( HYDROData_ShapesGroup::SeqOfGroupsDefs* TopoDS_Face aZoneFace = TopoDS::Face( aZoneShape ); aRegionFacesList.Append( aZoneFace ); - + TopExp::MapShapes(aZoneFace, TopAbs_EDGE, AllE); // collect all edges getUsedGroups( aZoneFace, aSeqOfGroups, aSeqOfUsedGroups ); } // zones iterator + + DEBTRACE("--- IntSh->Length():" << IntSh->Length()); + if (IntSh) + { + for (int i = 1; i <= IntSh->Length(); i++) + { + const TopoDS_Shape& CS = (*IntSh)(i); + if (AllE.Contains(CS)) + IE.Add(CS); + } + } if ( aRegionFacesList.IsEmpty() ) return aResShape; - // The unite region face TopoDS_Face aRegionFace; if ( aRegionFacesList.Extent() == 1 ) { - aRegionFace = TopoDS::Face( aRegionFacesList.First() ); + DEBTRACE("--- aRegionFacesList.Extent() == 1 "); + aResShape = TopoDS::Face( aRegionFacesList.First() ); } else { @@ -311,6 +338,36 @@ TopoDS_Shape HYDROData_Region::GetShape( HYDROData_ShapesGroup::SeqOfGroupsDefs* } aFuseShape = aFuse.Shape(); + + //update history of internal edges + TopTools_IndexedMapOfShape DIE; + TopTools_ListOfShape newSh1, newSh2; + DEBTRACE("IE.Extent():" << IE.Extent()); + for (int i = 1; i <= IE.Extent(); i++) + { + const TopoDS_Shape& CSH = IE(i); + newSh1.Clear(); + newSh2.Clear(); + newSh1 = aFuse.Modified(CSH); + if (newSh1.IsEmpty()) + { + newSh2 = aFuse.Generated(CSH); + if (newSh2.IsEmpty()) + DIE.Add(CSH); + else + for (TopTools_ListIteratorOfListOfShape lt(newSh2); lt.More(); lt.Next()) + if (!lt.Value().IsNull()) + DIE.Add(lt.Value()); + } + else + { + for (TopTools_ListIteratorOfListOfShape lt(newSh1); lt.More(); lt.Next()) + if (!lt.Value().IsNull()) + DIE.Add(lt.Value()); + } + } + IE = DIE; + //update groups HYDROData_ShapesGroup::GroupDefinition::Update( &aSeqOfUsedGroups, &aFuse ); } // faces iterator @@ -318,82 +375,82 @@ TopoDS_Shape HYDROData_Region::GetShape( HYDROData_ShapesGroup::SeqOfGroupsDefs* HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Fused face edges:", aFuseShape, TopAbs_EDGE ); #endif - // Check the result of fuse operation - if ( !aFuseShape.IsNull() ) + aFuseShape = HYDROData_Tool::RebuildCmp(aFuseShape); + + ShapeUpgrade_UnifySameDomain unif( aFuseShape, Standard_False, Standard_True, Standard_False ); + if (!IE.IsEmpty()) { - ShapeUpgrade_UnifySameDomain anUnifier( aFuseShape ); - anUnifier.Build(); + TopTools_MapOfShape IEM; + for (int i = 1; i <= IE.Extent(); i++) + IEM.Add(IE(i)); + unif.KeepShapes(IEM); + } - const TopoDS_Shape& anUnitedShape = anUnifier.Shape(); + unif.Build(); + TopoDS_Shape anUnitedShape; + anUnitedShape = unif.Shape(); - TopTools_SequenceOfShape aShapeFaces; - HYDROData_ShapesTool::ExploreShapeToShapes( anUnitedShape, TopAbs_FACE, aShapeFaces ); - if ( aShapeFaces.Length() == 1 ) - { - aRegionFace = TopoDS::Face( aShapeFaces.Value( 1 ) ); + HYDROData_ShapesGroup::GroupDefinition::Update( &aSeqOfUsedGroups, &unif ); + //cout << "inif: fuseshape: " << aFuseShape.TShape().get() << "unifS " << anUnitedShape.TShape().get() << endl; #ifdef DEB_GET_REGION_SHAPE - HYDROData_ShapesTool::DumpShapeSubShapes( std::cout, "Result face edges:", aRegionFace, TopAbs_EDGE ); + HYDROData_ShapesGroup::GroupDefinition::Dump( std::cout, aSeqOfUsedGroups ); #endif - HYDROData_ShapesGroup::GroupDefinition::Update( &aSeqOfUsedGroups, &anUnifier ); + TopTools_SequenceOfShape aShapeFaces; + HYDROData_ShapesTool::ExploreShapeToShapes( anUnitedShape, TopAbs_FACE, aShapeFaces ); + if ( aShapeFaces.Length() == 1 ) //it should be either face or compound of faces (?) + { + const TopoDS_Face& CF = TopoDS::Face( aShapeFaces.Value( 1 )); + aResShape = CF; + } + else + { + TopTools_SequenceOfShape aShapeShells; + HYDROData_ShapesTool::ExploreShapeToShapes( anUnitedShape, TopAbs_SHELL, aShapeShells ); + if (aShapeShells.Length() == 1) + aResShape = TopoDS::Shell(aShapeShells(1)); + else + aResShape = anUnitedShape; + } + + // 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; - // Update the sequence of groups - if ( theSeqOfGroups ) + HYDROData_ShapesGroup::SeqOfGroupsDefs::Iterator anOriIter( aSeqOfGroups ); + for ( ; anOriIter.More(); anOriIter.Next() ) { - 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; + HYDROData_ShapesGroup::GroupDefinition& anOriGroupDef = anOriIter.ChangeValue(); + if ( anOriGroupDef.Name != aUsedGroupDef.Name ) + continue; + + HYDROData_ShapesTool::AddShapes( anOriGroupDef.Shapes, aUsedGroupDef.Shapes ); + break; } } - } - } - if ( !aRegionFace.IsNull() ) - { - // result shape is a face - aResShape = aRegionFace; - } - else - { - // result shape is a shell - TopoDS_Shell aShell; - BRep_Builder aBuilder; - aBuilder.MakeShell( aShell ); - - TopTools_ListIteratorOfListOfShape aFaceIter( aRegionFacesList ); - for ( ; aFaceIter.More(); aFaceIter.Next() ) - aBuilder.Add( aShell, aFaceIter.Value() ); - - aResShape = aShell; + *theSeqOfGroups = aSeqOfGroups; + } } - + return aResShape; } -QStringList HYDROData_Region::DumpToPython( MapOfTreatedObjects& theTreatedObjects ) const +QStringList HYDROData_Region::DumpToPython( const QString& thePyScriptPath, + MapOfTreatedObjects& theTreatedObjects, + QString defRegName ) const { QStringList aResList; // Find region - findPythonReferenceObject( theTreatedObjects, aResList ); + findPythonReferenceObject( aResList, defRegName ); // Add zones HYDROData_SequenceOfObjects aZones = GetZones(); @@ -406,7 +463,7 @@ QStringList HYDROData_Region::DumpToPython( MapOfTreatedObjects& theTreatedObjec } // find zone - aZone->findPythonReferenceObject( theTreatedObjects, aResList ); + aZone->findPythonReferenceObject( aResList ); theTreatedObjects.insert( aZone->GetName(), aZone ); // set zone merge type @@ -426,14 +483,18 @@ QStringList HYDROData_Region::DumpToPython( MapOfTreatedObjects& theTreatedObjec if ( aMergeType == HYDROData_Zone::Merge_Object ) { Handle(HYDROData_Entity) aMergeObject = aZone->GetMergeObject(); if ( !aMergeObject.IsNull() ) { - aMergeObject->findPythonReferenceObject( theTreatedObjects, aResList ); + aMergeObject->findPythonReferenceObject( aResList ); aResList << QString( "%1.SetMergeObject( %2 )" ).arg( aZone->GetObjPyName() ) .arg( aMergeObject->GetObjPyName() ); } } - + // set color + QColor zoneColor = aZone->GetColor(Qt::darkBlue); + aResList << QString( "%1.SetColor( QColor( %2, %3, %4 ))" ) + .arg( aZone->GetObjPyName() ).arg( zoneColor.red() ).arg( zoneColor.green() ).arg( zoneColor.blue() ); // add zone - setPythonReferenceObject( theTreatedObjects, aResList, aZone, "AddZone" ); + setPythonReferenceObject( thePyScriptPath, theTreatedObjects, aResList, aZone, "AddZone" ); + } return aResList;