#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
+
#include <BRep_Builder.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
#include <ShapeUpgrade_UnifySameDomain.hxx>
#include <QStringList>
+#include <QColor>
+
+#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)
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;
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;
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()
Handle(HYDROData_Entity) aRefObject = theDoc->FindObjectByName( anObjName );
if ( aRefObject.IsNull() )
continue;
-
+ DEBTRACE("aRefObject name: " << aRefObject->GetName());
aNewZone->AddObject( aRefObject );
}
}
}
-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 )
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 =
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
{
}
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
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();
}
// find zone
- aZone->findPythonReferenceObject( theTreatedObjects, aResList );
+ aZone->findPythonReferenceObject( aResList );
theTreatedObjects.insert( aZone->GetName(), aZone );
// set zone merge type
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;