X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_DataModel.cxx;h=8f3178629fb188c5ff9719fa74500636f5272b0f;hb=8efd8a9de91110a5f6200cf0f637607e0e3e399e;hp=129384322c050ed4b7e82cbc83a746f381318dc8;hpb=c3aaf9774d926aa6095597b4d52a8858dc0898c5;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_DataModel.cxx b/src/HYDROGUI/HYDROGUI_DataModel.cxx index 12938432..8f317862 100644 --- a/src/HYDROGUI/HYDROGUI_DataModel.cxx +++ b/src/HYDROGUI/HYDROGUI_DataModel.cxx @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -59,6 +60,7 @@ #include #include #include +#include #include @@ -73,23 +75,29 @@ #include #endif +//#define _DEVDEBUG_ +#include "HYDRO_trace.hxx" + static HYDROData_SequenceOfObjects myCopyingObjects; const int ENTRY_COLUMN = 2; HYDROGUI_DataModel::HYDROGUI_DataModel( CAM_Module* theModule ) -: LightApp_DataModel( theModule ) +: LightApp_DataModel( theModule ), myIsAboutToClose(false) { + DEBTRACE("HYDROGUI_DataModel"); update( module()->application()->activeStudy()->id() ); } HYDROGUI_DataModel::~HYDROGUI_DataModel() { + DEBTRACE("~HYDROGUI_DataModel"); } bool HYDROGUI_DataModel::create( CAM_Study* theStudy ) { + DEBTRACE("create"); bool status = LightApp_DataModel::create( theStudy ); if ( status ) updateDocument(); @@ -100,6 +108,7 @@ bool HYDROGUI_DataModel::open( const QString& theURL, CAM_Study* theStudy, QStringList theFileList ) { + DEBTRACE("open"); LightApp_DataModel::open( theURL, theStudy, theFileList ); const int aStudyId = theStudy->id(); @@ -116,7 +125,7 @@ bool HYDROGUI_DataModel::open( const QString& theURL, try { - res = HYDROData_Document::Load( (char*)aDataFullPath.toLatin1().constData(), aStudyId ); + res = HYDROData_Document::Load( (char*)aDataFullPath.toLatin1().constData() ); } catch(...) { @@ -152,6 +161,7 @@ bool HYDROGUI_DataModel::open( const QString& theURL, bool HYDROGUI_DataModel::save( QStringList& theFileList ) { + DEBTRACE("save"); if( !module()->application()->activeStudy() ) return false; @@ -201,29 +211,39 @@ bool HYDROGUI_DataModel::saveAs( const QString& theURL, CAM_Study*, QStringList& theFileList ) { + DEBTRACE("saveAs"); myStudyURL = theURL; return save( theFileList ); } bool HYDROGUI_DataModel::close() { + DEBTRACE("close"); + myIsAboutToClose = true; HYDROGUI_Module* aModule = dynamic_cast( module() ); if ( aModule ) aModule->clearCache(); return true; } +bool HYDROGUI_DataModel::isAboutToClose() +{ + DEBTRACE("isAboutToClose " << myIsAboutToClose); + return myIsAboutToClose; +} + bool HYDROGUI_DataModel::dumpPython( const QString& theURL, CAM_Study* theStudy, bool isMultiFile, QStringList& theListOfFiles ) { + DEBTRACE("dumpPython"); LightApp_DataModel::dumpPython( theURL, theStudy, isMultiFile, theListOfFiles ); int aStudyId = theStudy->id(); LightApp_Study* aStudy = ::qobject_cast( theStudy ); - Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( aStudyId ); + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document(); if ( aDocument.IsNull() || !aStudy ) return false; @@ -252,6 +272,7 @@ bool HYDROGUI_DataModel::isSaved() const void HYDROGUI_DataModel::update( const int theStudyId ) { + DEBTRACE("update"); LightApp_Application* anApp = dynamic_cast( module()->application() ); if( !anApp ) return; @@ -263,53 +284,64 @@ void HYDROGUI_DataModel::update( const int theStudyId ) // create a new root object CAM_DataObject* aNewRootObj = new CAM_DataObject(); - Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( theStudyId ); + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document(); if( aDocument.IsNull() ) return; // Create root objects: // IMAGES - LightApp_DataObject* anImageRootObj = createObject( aNewRootObj, tr( partitionName( KIND_IMAGE ).toAscii() ) ); + LightApp_DataObject* anImageRootObj = createObject( aNewRootObj, tr( partitionName( KIND_IMAGE ).toLatin1() ) ); // BATHYMETRY - LightApp_DataObject* aBathymetryRootObj = createObject( aNewRootObj, tr( partitionName( KIND_BATHYMETRY ).toAscii() ) ); + LightApp_DataObject* aBathymetryRootObj = createObject( aNewRootObj, tr( partitionName( KIND_BATHYMETRY ).toLatin1() ) ); - // ARTIFICIAL OBJECTS - LightApp_DataObject* anArtificialObjectsRootObj = createObject( aNewRootObj, tr( partitionName( KIND_ARTIFICIAL_OBJECT ).toAscii() ) ); + // POLYLINES + LightApp_DataObject* aPolylineRootObj = createObject( aNewRootObj, tr( partitionName( KIND_POLYLINEXY ).toLatin1() ) ); + + // PROFILES + LightApp_DataObject* aProfileRootObj = createObject( aNewRootObj, tr( partitionName( KIND_PROFILE ).toLatin1() ) ); + + // POLYLINES 3D + LightApp_DataObject* aPolyline3DRootObj = createObject( aNewRootObj, tr( partitionName( KIND_POLYLINE ).toLatin1() ) ); // NATURAL OBJECTS - LightApp_DataObject* aNaturalObjectsRootObj = createObject( aNewRootObj, tr( partitionName( KIND_NATURAL_OBJECT ).toAscii() ) ); + LightApp_DataObject* aNaturalObjectsRootObj = createObject( aNewRootObj, tr( partitionName( KIND_NATURAL_OBJECT ).toLatin1() ) ); + + // ARTIFICIAL OBJECTS + LightApp_DataObject* anArtificialObjectsRootObj = createObject( aNewRootObj, tr( partitionName( KIND_ARTIFICIAL_OBJECT ).toLatin1() ) ); // OBSTACLES - LightApp_DataObject* anObstaclesRootObj = createObject( aNewRootObj, tr( partitionName( KIND_OBSTACLE ).toAscii() ) ); + LightApp_DataObject* anObstaclesRootObj = createObject( aNewRootObj, tr( partitionName( KIND_OBSTACLE ).toLatin1() ) ); + + //BC Polygons + LightApp_DataObject* aBCPolygonRootObj = createObject( aNewRootObj, tr( partitionName( KIND_BC_POLYGON ).toLatin1() ) ); // STRICKLER TABLES - LightApp_DataObject* aStricklerTablesRootObj = createObject( aNewRootObj, tr( partitionName( KIND_STRICKLER_TABLE ).toAscii() ) ); + LightApp_DataObject* aStricklerTablesRootObj = createObject( aNewRootObj, tr( partitionName( KIND_STRICKLER_TABLE ).toLatin1() ) ); // LAND COVER MAPS - LightApp_DataObject* aLandCoversRootObj = createObject( aNewRootObj, tr( partitionName( KIND_LAND_COVER_MAP ).toAscii() ) ); + LightApp_DataObject* aLandCoversRootObj = createObject( aNewRootObj, tr( partitionName( KIND_LAND_COVER_MAP ).toLatin1() ) ); // CALCULATION CASES - LightApp_DataObject* aCalculRootObj = createObject( aNewRootObj, tr( partitionName( KIND_CALCULATION ).toAscii() ) ); - - // POLYLINES - LightApp_DataObject* aPolylineRootObj = createObject( aNewRootObj, tr( partitionName( KIND_POLYLINEXY ).toAscii() ) ); - - // POLYLINES - LightApp_DataObject* aPolyline3DRootObj = createObject( aNewRootObj, tr( partitionName( KIND_POLYLINE ).toAscii() ) ); - - // PROFILES - LightApp_DataObject* aProfileRootObj = createObject( aNewRootObj, tr( partitionName( KIND_PROFILE ).toAscii() ) ); + LightApp_DataObject* aCalculRootObj = createObject( aNewRootObj, tr( partitionName( KIND_CALCULATION ).toLatin1() ) ); // VISUAL STATES - LightApp_DataObject* aVisualStateRootObj = createObject( aNewRootObj, tr( partitionName( KIND_VISUAL_STATE ).toAscii() ) ); + LightApp_DataObject* aVisualStateRootObj = createObject( aNewRootObj, tr( partitionName( KIND_VISUAL_STATE ).toLatin1() ) ); + int aNoStricklerTableObj = 0; + HYDROData_Iterator anIterator( aDocument, KIND_UNKNOWN ); - for( ; anIterator.More(); anIterator.Next() ) { + std::vector ents; + + for( ; anIterator.More(); anIterator.Next() ) + ents.push_back(anIterator.Current()); + + for (int i = 0; i< ents.size();i++) + { LightApp_DataObject* obj = 0; - Handle(HYDROData_Entity) anObj = anIterator.Current(); + Handle(HYDROData_Entity) anObj = ents[i]; if ( !anObj.IsNull() ) { @@ -463,6 +495,16 @@ void HYDROGUI_DataModel::update( const int theStudyId ) obj = createObject( aVisualStateRootObj, aVisualStateObj ); } + break; + } + case KIND_BC_POLYGON: + { + Handle(HYDROData_BCPolygon) aBCPolygonObj = + Handle(HYDROData_BCPolygon)::DownCast( anObj ); + if( !aBCPolygonObj.IsNull() ) { + obj = createObject( aBCPolygonRootObj, aBCPolygonObj ); + } + break; } } @@ -479,8 +521,79 @@ void HYDROGUI_DataModel::update( const int theStudyId ) // anObjectBrowser->openLevels(); //} - HYDROGUI_DataModelSync aSync( aNewRootObj ); SUIT_DataObject* aRoot = root(); + + if (aRoot) + { + std::map entry2ObjNewRoot; + SUIT_DataObjectIterator::DetourType dt = SUIT_DataObjectIterator::DepthLeft; + for ( SUIT_DataObjectIterator it( aNewRootObj, dt ); it.current(); ++it ) + { + LightApp_DataObject* aCurObjN = dynamic_cast(it.current()); + if (aCurObjN) + entry2ObjNewRoot[aCurObjN->entry().toStdString()] = it.current(); + } + + for ( SUIT_DataObjectIterator it( aRoot, dt ); it.current(); ++it ) + { + LightApp_DataObject* aCurObjO = dynamic_cast(it.current()); + if (aCurObjO && aCurObjO->childCount() > 0) + { + std::string entry = aCurObjO->entry().toStdString(); + SUIT_DataObject* newNode = entry2ObjNewRoot[entry]; + if (newNode && aCurObjO->childCount() > 0) + { + DataObjectList newchildren; + newNode->children(newchildren); + //new root - remove children + std::map newNode2Entries; + for ( DataObjectList::const_iterator it = newchildren.begin(); it != newchildren.end(); ++it ) + { + SUIT_DataObject* cc = *it; + LightApp_DataObject* obj = dynamic_cast(cc); + newNode2Entries[obj->entry().toStdString()] = cc; + newNode->removeChild(cc); + } + // + std::set objtemp; + + DataObjectList oldchildren; + aCurObjO->children(oldchildren); + for ( DataObjectList::const_iterator it = oldchildren.begin(); it != oldchildren.end(); ++it ) + { + SUIT_DataObject* old_ch = *it; + std::string entr = dynamic_cast(old_ch)->entry().toStdString(); + if (newNode2Entries.count(entr) > 0) + { + SUIT_DataObject* obj = newNode2Entries[entr]; + newNode->appendChild(obj); + objtemp.insert(obj); + } + } + // + for ( DataObjectList::const_iterator it = newchildren.begin(); it != newchildren.end(); ++it ) + { + SUIT_DataObject* ch = *it; + if (objtemp.count(ch) == 0) + newNode->appendChild(ch); + } + { //IF DEBUG + //add. check + DataObjectList newchildren2; + newNode->children(newchildren2); + std::set entries2, entries1; + for ( DataObjectList::const_iterator it = newchildren2.begin(); it != newchildren2.end(); ++it ) + entries2.insert((dynamic_cast(*it))->entry().toStdString()); + for ( DataObjectList::const_iterator it = newchildren.begin(); it != newchildren.end(); ++it ) + entries1.insert((dynamic_cast(*it))->entry().toStdString()); + assert(entries1 == entries2); + } + } + } + } + } + + HYDROGUI_DataModelSync aSync( aNewRootObj ); bool isNewDoc = aRoot==0; if( isNewDoc ) aRoot = createRootModuleObject( aStudyRoot ); @@ -492,7 +605,8 @@ void HYDROGUI_DataModel::update( const int theStudyId ) if ( !myStates.isEmpty() ) { ob->updateTree(); - ob->setOpenStates( myStates, ENTRY_COLUMN ); + ob->setAutoOpenLevel( 1 ); + //ob->setOpenStates( myStates, ENTRY_COLUMN ); myStates.clear(); } } @@ -534,6 +648,7 @@ CAM_DataObject* HYDROGUI_DataModel::createRootModuleObject( SUIT_DataObject* the void HYDROGUI_DataModel::updateModel() { + DEBTRACE("updateModel"); HYDROGUI_Module* aModule = dynamic_cast( module() ); if( aModule ) update( aModule->getStudyId() ); @@ -712,6 +827,8 @@ QString HYDROGUI_DataModel::partitionName( const ObjectKind theObjectKind ) case KIND_NATURAL_OBJECT: return "NATURAL_OBJECTS"; case KIND_STRICKLER_TABLE: return "STRICKLER_TABLES"; case KIND_LAND_COVER_MAP: return "LAND_COVER_MAPS"; + case KIND_REGION: return "REGIONS"; + case KIND_BC_POLYGON: return "BOUNDARY_POLYGONS"; default: break; } return QString(); @@ -720,7 +837,7 @@ QString HYDROGUI_DataModel::partitionName( const ObjectKind theObjectKind ) Handle(HYDROData_Document) HYDROGUI_DataModel::getDocument() const { int aStudyId = module()->application()->activeStudy()->id(); - return HYDROData_Document::Document( aStudyId ); + return HYDROData_Document::Document(); } LightApp_DataObject* HYDROGUI_DataModel::createObject( SUIT_DataObject* theParent, @@ -735,7 +852,8 @@ LightApp_DataObject* HYDROGUI_DataModel::createObject( SUIT_DataObject* aKind == KIND_SHAPES_GROUP || aKind == KIND_SPLIT_GROUP || aKind == KIND_ZONE || aKind == KIND_IMMERSIBLE_ZONE || aKind == KIND_REGION || aKind == KIND_BATHYMETRY || aKind == KIND_OBSTACLE || aKind == KIND_STREAM || aKind == KIND_CHANNEL || - aKind == KIND_DIGUE || aKind == KIND_DUMMY_3D || aKind == KIND_LAND_COVER_MAP; + aKind == KIND_DIGUE || aKind == KIND_DUMMY_3D || aKind == KIND_LAND_COVER_MAP || + aKind == KIND_BC_POLYGON; if ( !visibility ) { Handle(HYDROData_Profile) aProfObj = Handle(HYDROData_Profile)::DownCast( theModelObject ); @@ -964,10 +1082,10 @@ void HYDROGUI_DataModel::buildObjectTree( SUIT_DataObject* theParent, createObject( aPolylineSect, aPolyline, aGuiObj->entry(), false ); LightApp_DataObject* aCaseAOSect = - createObject( aGuiObj, tr( partitionName( KIND_ARTIFICIAL_OBJECT ).toAscii() ), + createObject( aGuiObj, tr( partitionName( KIND_ARTIFICIAL_OBJECT ).toLatin1() ), aGuiObj->entry() ); LightApp_DataObject* aCaseNOSect = - createObject( aGuiObj, tr( partitionName( KIND_NATURAL_OBJECT ).toAscii() ), + createObject( aGuiObj, tr( partitionName( KIND_NATURAL_OBJECT ).toLatin1() ), aGuiObj->entry() ); HYDROData_SequenceOfObjects aSeq = aCaseObj->GetGeometryObjects(); @@ -988,9 +1106,15 @@ void HYDROGUI_DataModel::buildObjectTree( SUIT_DataObject* theParent, aNObject = Handle(HYDROData_NaturalObject)::DownCast( anEntity ); if ( !aNObject.IsNull() ) createObject( aCaseNOSect, aNObject, aGuiObj->entry(), false ); - } + } } + LightApp_DataObject* aBoundaryPolygonSect = + createObject( aGuiObj, tr( "CASE_BOUNDARY_POLYGONS" ), aGuiObj->entry() ); + HYDROData_SequenceOfObjects aBCPolygons = aCaseObj->GetBoundaryPolygons(); + for (int i = 1; i <= aBCPolygons.Size(); i++ ) + createObject( aBoundaryPolygonSect, aBCPolygons(i), aGuiObj->entry(), false ); + LightApp_DataObject* aLandCoverMapSect = createObject( aGuiObj, tr( "CASE_LAND_COVER_MAP" ), aGuiObj->entry() ); @@ -1090,7 +1214,18 @@ void HYDROGUI_DataModel::buildObjectTree( SUIT_DataObject* theParent, HYDROData_SequenceOfObjects aPolylines = aLandCoverMapObj->GetPolylines(); buildObjectPartition( aGuiObj, aPolylines, tr( "LAND_COVER_POLYLINES" ), true );*/ } - + else if ( anObjectKind == KIND_BC_POLYGON ) + { + Handle(HYDROData_BCPolygon) aBCObj = + Handle(HYDROData_BCPolygon)::DownCast( aDataObj ); + + LightApp_DataObject* aPolylineSect = + createObject( aGuiObj, tr( "BC_POLYGON_POLYLINE" ), aGuiObj->entry() ); + + Handle(HYDROData_PolylineXY) aPolyline = aBCObj->GetPolyline(); + if ( !aPolyline.IsNull() && !aPolyline->IsRemoved() ) + createObject( aPolylineSect, aPolyline, aGuiObj->entry(), false ); + } HYDROGUI_Module* aModule = dynamic_cast( module() ); if( aModule ) aModule->enableLCMActions(); @@ -1236,6 +1371,7 @@ bool HYDROGUI_DataModel::rename( Handle(HYDROData_Entity) theEntity, const QStri void HYDROGUI_DataModel::updateDocument() { + DEBTRACE("updateDocument"); // Sets the default strickler coefficient from preferences to document. Handle(HYDROData_Document) aDoc = getDocument(); SUIT_ResourceMgr* resMgr = module()->application()->resourceMgr();