HYDROData_SplitToZonesTool::SplitDataList aZonesList, anEdgesList;
Handle(HYDROData_PolylineXY) aBoundaryPolyline = GetBoundaryPolyline();
+
+ HYDROData_SequenceOfObjects InterPolys = GetInterPolyObjects();
+
HYDROData_SequenceOfObjects aGeomObjects = GetGeometryObjects();
if ( !aGeomObjects.IsEmpty() ) {
HYDROData_SequenceOfObjects aGeomGroups = GetGeometryGroups();
HYDROData_SplitToZonesTool::SplitDataList aSplitObjects =
- HYDROData_SplitToZonesTool::Split( aGeomObjects, aGeomGroups, aBoundaryPolyline );
+ HYDROData_SplitToZonesTool::Split( aGeomObjects, aGeomGroups, aBoundaryPolyline, InterPolys );
if ( !aSplitObjects.isEmpty() ) {
HYDROData_SplitToZonesTool::SplitDataListIterator anIter( aSplitObjects );
while( anIter.hasNext() ) {
return HYDROData_PriorityQueue::GetRule( aRulesLab, theIndex,
theObject1, thePriority, theObject2, theMergeType );
}
+
+bool HYDROData_CalculationCase::AddInterPoly( const Handle(HYDROData_PolylineXY)& theInterPolyline )
+{
+ HYDROData_CalculationCase::DataTag aDataTag = DataTag_InterPoly;
+
+ if ( HasReference( theInterPolyline, aDataTag ) )
+ return false;
+
+ AddReferenceObject( theInterPolyline, aDataTag );
+
+ return true;
+}
+
+HYDROData_SequenceOfObjects HYDROData_CalculationCase::GetInterPolyObjects() const
+{
+ return GetReferenceObjects( DataTag_InterPoly );
+}
+
+void HYDROData_CalculationCase::RemoveInterPolyObject( const Handle(HYDROData_PolylineXY)& theInterPolyline )
+{
+ if ( theInterPolyline.IsNull() )
+ return;
+
+ RemoveReferenceObject( theInterPolyline->Label(), DataTag_InterPoly );
+
+}
+
+
+
DataTag_CustomRules, ///< custom rules
DataTag_AssignmentMode, ///< assignment mode
DataTag_StricklerTable, ///< reference Strickler table
+ DataTag_InterPoly, ///< intersection polyline
DataTag_LandCover_Obsolete, ///< reference land covers
DataTag_CustomLandCoverRules_Obsolete, ///< custom rules for land covers priority
*/
HYDRODATA_EXPORT virtual void RemoveSplitGroups();
+ HYDRODATA_EXPORT virtual bool AddInterPoly( const Handle(HYDROData_PolylineXY)& theInterPolyline );
+
+ HYDRODATA_EXPORT virtual void RemoveInterPolyObject( const Handle(HYDROData_PolylineXY)& theInterPolyline );
+
+ HYDRODATA_EXPORT virtual HYDROData_SequenceOfObjects GetInterPolyObjects() const;
+
/**
* Exports the calculation case data (shell and groups) to GEOM module.
* \param theStudyId the id of the study where the GEOM module should be used for export
#include <Geom_Plane.hxx>
#include <BRepBuilderAPI_FindPlane.hxx>
+#include <BOPAlgo_BOP.hxx>
+#include <BOPAlgo_Builder.hxx>
+
//#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))
HYDROData_SplitToZonesTool::SplitDataList
HYDROData_SplitToZonesTool::Split( const HYDROData_SequenceOfObjects& theObjectList,
const HYDROData_SequenceOfObjects& theGroupsList,
- const Handle(HYDROData_PolylineXY)& thePolyline )
+ const Handle(HYDROData_PolylineXY)& thePolyline,
+ const HYDROData_SequenceOfObjects& InterPolys)
{
DEBTRACE("Split");
SplitDataList anOutputSplitDataList;
}
}
}
+
+ AddInternalEdges(aDM2, InterPolys);
+
// Step 4. Fill output structure.
#ifdef DEB_SPLIT_TO_ZONES
TCollection_AsciiString aNam4 ("SC_");
{
HYDROData_SequenceOfObjects aGeomGroups;
Handle(HYDROData_PolylineXY) aPolyline;
+ HYDROData_SequenceOfObjects InterPolys;
+
+ return Split( theObjectList, aGeomGroups, aPolyline, InterPolys );
+}
+
+void HYDROData_SplitToZonesTool::AddInternalEdges(HYDROData_DataMapOfShapeListOfShape& DM,
+ const HYDROData_SequenceOfObjects& thePolylines)
+{
+
+ HYDROData_SequenceOfObjects::Iterator it(thePolylines);
+ TopTools_ListOfShape Wires;
+ for (;it.More();it.Next())
+ {
+ Handle(HYDROData_PolylineXY) P = Handle(HYDROData_PolylineXY)::DownCast(it.Value());
+ Wires.Append(P->GetShape());
+ //Handle(TopTools_HSequenceOfShape) aConnectedWires = new TopTools_HSequenceOfShape;
+ //if (P->GetNbConnectedWires(aConnectedWires) > 0)
+ // Wires.Append(aConnectedWires->Value(1));
+ }
+
+ HYDROData_DataMapOfShapeListOfShape newDM;
+
+ for (int i = 1; i <= DM.Extent();i++)
+ {
+ const TopoDS_Shape& K = DM.FindKey(i);
+ const TopTools_ListOfShape& V = DM.FindFromIndex(i);
+ TopTools_ListOfShape out;
+ if (K.ShapeType() == TopAbs_FACE)
+ {
+ CutByEdges(K, Wires, out);
+ TopTools_ListIteratorOfListOfShape it(out);
+ for (;it.More(); it.Next())
+ {
+ const TopoDS_Shape& NF = it.Value();
+ if (!NF.IsNull())
+ newDM.Add(NF, V);
+ }
+ }
+ else
+ newDM.Add(K, V); // ignore edges, wires...
+ }
+
+ DM = newDM;
+}
+
+
+int HYDROData_SplitToZonesTool::CutByEdges(const TopoDS_Shape& InSh, const TopTools_ListOfShape& InEdges,
+ TopTools_ListOfShape& outShs)
+{
+ int anError;
+ if (InSh.IsNull())
+ return -1;
+ if (InEdges.IsEmpty())
+ {
+ outShs.Clear();
+ outShs.Append(InSh);
+ return 0;
+ }
+ TopTools_ListIteratorOfListOfShape anIt;
+ BOPAlgo_Builder anAlgo;
+ anAlgo.AddArgument(InSh);
+ anIt.Initialize( InEdges );
+ for( ; anIt.More(); anIt.Next() )
+ anAlgo.AddArgument( anIt.Value() );
+
+ anAlgo.Perform();
+ anError = anAlgo.ErrorStatus();
+ if (anError)
+ return anError;
- return Split( theObjectList, aGeomGroups, aPolyline );
+ outShs = anAlgo.Modified( InSh );
+ if (outShs.IsEmpty())
+ outShs.Append(InSh);
+ return 0;
}
static SplitDataList Split( const HYDROData_SequenceOfObjects& theObjectList,
const HYDROData_SequenceOfObjects& theGroupsList,
- const Handle(HYDROData_PolylineXY)& thePolyline );
+ const Handle(HYDROData_PolylineXY)& thePolyline,
+ const HYDROData_SequenceOfObjects& InterPolys );
static SplitDataList Split( const HYDROData_SequenceOfObjects& theObjectList );
+ static void AddInternalEdges(HYDROData_DataMapOfShapeListOfShape& DM,
+ const HYDROData_SequenceOfObjects& thePolylines);
+
+ static int CutByEdges(const TopoDS_Shape& InSh, const TopTools_ListOfShape& InEdges,
+ TopTools_ListOfShape& outShs);
+
static void SetFileNames(const QString& theNameBefore, const QString& theNameAfter);
private:
QStringList anEntryList;
HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetGeometryObjects( module() );
getNamesAndEntries( aSeq, aList, anEntryList );
+
+ QStringList List1;
+ QStringList EList1;
+
+ //add intersection polylines
+ AddInterPolylinesToList(aList, anEntryList);
+
aPanel->setAllGeomObjects( aList, anEntryList );
// Get all polylines
createPreview( false );
}
+void HYDROGUI_CalculationOp::AddInterPolylinesToList(QStringList& theList, QStringList& theEntryList)
+{
+ HYDROData_Iterator anIter( doc(), KIND_POLYLINEXY );
+ Handle(HYDROData_PolylineXY) aPolylineObj;
+ QString aPolylineName;
+ for ( ; anIter.More(); anIter.Next() )
+ {
+ aPolylineObj = Handle(HYDROData_PolylineXY)::DownCast( anIter.Current() );
+ if ( !aPolylineObj.IsNull())
+ {
+ aPolylineName = aPolylineObj->GetName();
+ if ( !aPolylineName.isEmpty() && !theList.contains(aPolylineName) )
+ {
+ theList.append( aPolylineName );
+ theEntryList.append(HYDROGUI_DataObject::dataObjectEntry( aPolylineObj ));
+ }
+ }
+ }
+}
+
void HYDROGUI_CalculationOp::getNamesAndEntries( const HYDROData_SequenceOfObjects& theSeq,
QStringList& theNames, QStringList& theEntries ) const
{
anAddedList.append( anObject->GetName() );
}
+ for (int i = 0; i < aSelectedList.length(); i++)
+ {
+ Handle(HYDROData_PolylineXY) aPoly = Handle(HYDROData_PolylineXY)::DownCast(
+ HYDROGUI_Tool::FindObjectByName( module(), aSelectedList.at( i ) ) );
+ if ( aPoly.IsNull() )
+ continue;
+
+ if ( myEditedObject->AddInterPoly( aPoly ) )
+ anAddedList.append( aPoly->GetName() );
+ }
+
if ( !anAddedList.isEmpty() )
{
aPanel->includeGeomObjects( anAddedList );
myEditedObject->RemoveGeometryObject( anObject );
}
+ for (int i = 0; i < aSelectedList.length(); i++)
+ {
+ Handle(HYDROData_PolylineXY) aPoly = Handle(HYDROData_PolylineXY)::DownCast(
+ HYDROGUI_Tool::FindObjectByName( module(), aSelectedList.at(i) ) );
+ if ( aPoly.IsNull() )
+ continue;
+
+ setObjectVisibility( aPoly, false );
+ myEditedObject->RemoveInterPolyObject ( aPoly );
+ }
+
module()->update( UF_OCCViewer );
aPanel->excludeGeomObjects( aSelectedList );
}
else if ( !theLandCoverMap && myShowGeomObjects )
{
HYDROData_SequenceOfObjects aSeqGO = myEditedObject->GetGeometryObjects();
+ HYDROData_SequenceOfObjects aSeqP = myEditedObject->GetInterPolyObjects();
aSeq.Append( aSeqGO );
+ aSeq.Append( aSeqP );
}
Handle(HYDROData_Entity) anEntity;
bool createRegion( const QList<SUIT_DataObject*>& theZonesList );
+ void AddInterPolylinesToList(QStringList& theList, QStringList& theEntryList);
+
bool confirmRegionsChange() const;
bool confirmModeChange() const;
bool confirmOrderChange() const;
#include <BRep_Builder.hxx>
#include <BRepCheck_Analyzer.hxx>
#include <OSD_Timer.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
#define _DEVDEBUG_
#include "HYDRO_trace.hxx"
}
+void test_HYDROData_LandCoverMap::test_add_int_edges_1()
+{
+ TopoDS_Shape out;
+ TopTools_ListOfShape Wires;
+
+ BRep_Builder B;
+ TopoDS_Shape InF;
+ TopoDS_Shape InP;
+ BRepTools::Read(InP, "d:/p2.brep", B); //TODO
+ BRepTools::Read(InF, "d:/r2.brep", B);
+ Wires.Append(InP);
+
+ TopTools_ListOfShape OutSh;
+ HYDROData_SplitToZonesTool::CutByEdges(InF, Wires, OutSh);
+ TopTools_ListIteratorOfListOfShape it(OutSh);
+ for (;it.More();it.Next())
+ {
+ TopoDS_Shape Sh = it.Value();
+ }
+}
+
CPPUNIT_TEST( test_shp_loop_back );
CPPUNIT_TEST( test_shp_clc_classification_perf );
CPPUNIT_TEST( test_shp_clc_classification_check );
+ CPPUNIT_TEST( test_add_int_edges_1 );
#endif
CPPUNIT_TEST_SUITE_END();
void test_copy();
void test_shp_clc_classification_perf();
void test_shp_clc_classification_check();
+ void test_add_int_edges_1();
};
CPPUNIT_TEST_SUITE_REGISTRATION( test_HYDROData_LandCoverMap );