X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_DataModel.cxx;h=6f1adada33b9121c81a475262fb6489338014aa0;hb=e84c3bdbce884a7e150fff690f0c1a3e0b12ed90;hp=837548ac6a0037517516ce37da92c52f81ce9f02;hpb=0f7ec873f64be4eb6559187084b83310f7c4e83d;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_DataModel.cxx b/src/HYDROGUI/HYDROGUI_DataModel.cxx index 837548ac..6f1adada 100644 --- a/src/HYDROGUI/HYDROGUI_DataModel.cxx +++ b/src/HYDROGUI/HYDROGUI_DataModel.cxx @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -47,8 +48,6 @@ #include #include -#include -#include #include #include @@ -56,11 +55,11 @@ #include #include -#include #include #include #include #include +#include #include @@ -77,6 +76,9 @@ static HYDROData_SequenceOfObjects myCopyingObjects; +const int ENTRY_COLUMN = 2; + + HYDROGUI_DataModel::HYDROGUI_DataModel( CAM_Module* theModule ) : LightApp_DataModel( theModule ) { @@ -95,17 +97,19 @@ bool HYDROGUI_DataModel::open( const QString& theURL, const int aStudyId = theStudy->id(); Data_DocError res = DocError_UnknownProblem; - if( theFileList.count() == 2 ) + if( theFileList.count() >= 2 ) { QString aTmpDir = theFileList[0]; - QString aFileName = theFileList[1]; + QString aDataFileName = theFileList[1]; + QString aStatesFileName = theFileList.count() == 3 ? theFileList[2] : ""; myStudyURL = theURL; - QString aFullPath = SUIT_Tools::addSlash( aTmpDir ) + aFileName; + QString aDataFullPath = SUIT_Tools::addSlash( aTmpDir ) + aDataFileName; + QString aStatesFullPath = aStatesFileName.isEmpty() ? "" : SUIT_Tools::addSlash( aTmpDir ) + aStatesFileName; try { - res = HYDROData_Document::Load( (char*)aFullPath.toLatin1().constData(), aStudyId ); + res = HYDROData_Document::Load( (char*)aDataFullPath.toLatin1().constData(), aStudyId ); } catch(...) { @@ -116,6 +120,16 @@ bool HYDROGUI_DataModel::open( const QString& theURL, module()->application()->putInfo( tr( "LOAD_ERROR" ) ); return false; } + + if( !aStatesFullPath.isEmpty() ) + { + QFile aFile( aStatesFullPath ); + if( aFile.open( QFile::ReadOnly ) ) + { + myStates = aFile.readAll(); + aFile.close(); + } + } } // if the document open was successful, the data model update happens @@ -134,27 +148,41 @@ bool HYDROGUI_DataModel::save( QStringList& theFileList ) LightApp_DataModel::save( theFileList ); QString aTmpDir; - QString aFileName; SUIT_ResourceMgr* resMgr = module()->application()->resourceMgr(); bool isMultiFile = false; if( resMgr ) isMultiFile = resMgr->booleanValue( "Study", "multi_file", false ); - // save data to temporary files + // save module data to temporary files LightApp_Study* aStudy = dynamic_cast( module()->application()->activeStudy() ); aTmpDir = aStudy->GetTmpDir( myStudyURL.toLatin1().constData(), isMultiFile ).c_str(); - aFileName = SUIT_Tools::file( myStudyURL, false ) + "_HYDRO.cbf"; - - QString aFullPath = aTmpDir + aFileName; - Data_DocError res = getDocument()->Save( (char*)aFullPath.toLatin1().constData() ); + + // save OCAF data to a temporary file + QString aDataFileName = SUIT_Tools::file( myStudyURL, false ) + "_HYDRO.cbf"; + QString aDataFullPath = aTmpDir + aDataFileName; + Data_DocError res = getDocument()->Save( (char*)aDataFullPath.toLatin1().constData() ); if( res != DocError_OK ) { module()->application()->putInfo( tr( "SAVE_ERROR" ) ); return false; } + // save tree state data to a temporary file + LightApp_Application* anApp = dynamic_cast( module()->application() ); + QByteArray aStatesData = anApp->objectBrowser()->getOpenStates( ENTRY_COLUMN ); + QString aStatesFileName = SUIT_Tools::file( myStudyURL, false ) + "_HYDRO_tree_states.txt"; + QString aStatesFullPath = aTmpDir + aStatesFileName; + QFile aFile( aStatesFullPath ); + if( aFile.open( QFile::WriteOnly ) ) + { + aFile.write( aStatesData ); + aFile.close(); + } + + // add temporary files to the list theFileList.append( aTmpDir ); - theFileList.append( aFileName ); + theFileList.append( aDataFileName ); + theFileList.append( aStatesFileName ); return true; } @@ -186,13 +214,13 @@ bool HYDROGUI_DataModel::dumpPython( const QString& theURL, if ( aDocument.IsNull() || !aStudy ) return false; - QString aFileToExport = aStudy->GetTmpDir( theURL.toLatin1().constData(), isMultiFile ).c_str(); - aFileToExport += QString( QDir::separator() ) + "HYDRO.py"; - - bool aRes = aDocument->DumpToPython( aFileToExport ); + QString aDir = aStudy->GetTmpDir( theURL.toLatin1().constData(), isMultiFile ).c_str(); + QString aFileToExport = aDir + QString( QDir::separator() ) + "HYDRO.py"; + bool aRes = aDocument->DumpToPython( aFileToExport, isMultiFile ); if ( aRes ) { + theListOfFiles.append( aDir ); theListOfFiles.append( aFileToExport ); } @@ -219,19 +247,8 @@ void HYDROGUI_DataModel::update( const int theStudyId ) if( !aStudyRoot ) return; - // create root object if not exist - CAM_DataObject* aRootObj = root(); - if( !aRootObj ) - aRootObj = createRootModuleObject( aStudyRoot ); - - if( !aRootObj ) - return; - - DataObjectList aList; - aRootObj->children( aList ); - QListIterator anIter( aList ); - while( anIter.hasNext() ) - removeChild( aRootObj, anIter.next() ); + // create a new root object + CAM_DataObject* aNewRootObj = new CAM_DataObject(); Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( theStudyId ); if( aDocument.IsNull() ) @@ -240,34 +257,34 @@ void HYDROGUI_DataModel::update( const int theStudyId ) // Create root objects: // IMAGES - LightApp_DataObject* anImageRootObj = createObject( aRootObj, tr( partitionName( KIND_IMAGE ).toAscii() ) ); + LightApp_DataObject* anImageRootObj = createObject( aNewRootObj, tr( partitionName( KIND_IMAGE ).toAscii() ) ); // BATHYMETRY - LightApp_DataObject* aBathymetryRootObj = createObject( aRootObj, tr( partitionName( KIND_BATHYMETRY ).toAscii() ) ); + LightApp_DataObject* aBathymetryRootObj = createObject( aNewRootObj, tr( partitionName( KIND_BATHYMETRY ).toAscii() ) ); // ARTIFICIAL OBJECTS - LightApp_DataObject* anArtificialObjectsRootObj = createObject( aRootObj, tr( partitionName( KIND_ARTIFICIAL_OBJECT ).toAscii() ) ); + LightApp_DataObject* anArtificialObjectsRootObj = createObject( aNewRootObj, tr( partitionName( KIND_ARTIFICIAL_OBJECT ).toAscii() ) ); // NATURAL OBJECTS - LightApp_DataObject* aNaturalObjectsRootObj = createObject( aRootObj, tr( partitionName( KIND_NATURAL_OBJECT ).toAscii() ) ); + LightApp_DataObject* aNaturalObjectsRootObj = createObject( aNewRootObj, tr( partitionName( KIND_NATURAL_OBJECT ).toAscii() ) ); // OBSTACLES - LightApp_DataObject* anObstaclesRootObj = createObject( aRootObj, tr( partitionName( KIND_OBSTACLE ).toAscii() ) ); + LightApp_DataObject* anObstaclesRootObj = createObject( aNewRootObj, tr( partitionName( KIND_OBSTACLE ).toAscii() ) ); // CALCULATION CASES - LightApp_DataObject* aCalculRootObj = createObject( aRootObj, tr( partitionName( KIND_CALCULATION ).toAscii() ) ); + LightApp_DataObject* aCalculRootObj = createObject( aNewRootObj, tr( partitionName( KIND_CALCULATION ).toAscii() ) ); // POLYLINES - LightApp_DataObject* aPolylineRootObj = createObject( aRootObj, tr( partitionName( KIND_POLYLINEXY ).toAscii() ) ); + LightApp_DataObject* aPolylineRootObj = createObject( aNewRootObj, tr( partitionName( KIND_POLYLINEXY ).toAscii() ) ); // POLYLINES - LightApp_DataObject* aPolyline3DRootObj = createObject( aRootObj, tr( partitionName( KIND_POLYLINE ).toAscii() ) ); + LightApp_DataObject* aPolyline3DRootObj = createObject( aNewRootObj, tr( partitionName( KIND_POLYLINE ).toAscii() ) ); // PROFILES - LightApp_DataObject* aProfileRootObj = createObject( aRootObj, tr( partitionName( KIND_PROFILE ).toAscii() ) ); + LightApp_DataObject* aProfileRootObj = createObject( aNewRootObj, tr( partitionName( KIND_PROFILE ).toAscii() ) ); // VISUAL STATES - LightApp_DataObject* aVisualStateRootObj = createObject( aRootObj, tr( partitionName( KIND_VISUAL_STATE ).toAscii() ) ); + LightApp_DataObject* aVisualStateRootObj = createObject( aNewRootObj, tr( partitionName( KIND_VISUAL_STATE ).toAscii() ) ); HYDROData_Iterator anIterator( aDocument, KIND_UNKNOWN ); for( ; anIterator.More(); anIterator.Next() ) { @@ -410,10 +427,27 @@ void HYDROGUI_DataModel::update( const int theStudyId ) } } - if( SUIT_DataBrowser* anObjectBrowser = anApp->objectBrowser() ) + //if( SUIT_DataBrowser* anObjectBrowser = anApp->objectBrowser() ) + //{ + // anObjectBrowser->setAutoOpenLevel( 3 ); + // anObjectBrowser->openLevels(); + //} + + HYDROGUI_DataModelSync aSync( aNewRootObj ); + SUIT_DataObject* aRoot = root(); + bool isNewDoc = aRoot==0; + if( isNewDoc ) + aRoot = createRootModuleObject( aStudyRoot ); + ::synchronize < suitPtr, suitPtr, HYDROGUI_DataModelSync > + ( aNewRootObj, aRoot, aSync ); + + + if( !myStates.isEmpty() ) { - anObjectBrowser->setAutoOpenLevel( 3 ); - anObjectBrowser->openLevels(); + LightApp_Application* anApp = dynamic_cast( module()->application() ); + anApp->objectBrowser()->updateTree(); + anApp->objectBrowser()->setOpenStates( myStates, ENTRY_COLUMN ); + myStates.clear(); } } @@ -601,6 +635,9 @@ bool HYDROGUI_DataModel::paste() anObject->CopyTo( aClone ); anIsChanged = true; + // remove Z layer + aClone->RemoveZLevel(); + // generate a new unique name for the clone object: // case 1: Image_1 -> Image_2 // case 2: ImageObj -> ImageObj_1 @@ -832,6 +869,13 @@ void HYDROGUI_DataModel::buildObjectTree( SUIT_DataObject* theParent, Handle(HYDROData_CalculationCase) aCaseObj = Handle(HYDROData_CalculationCase)::DownCast( aDataObj ); + LightApp_DataObject* aPolylineSect = + createObject( aGuiObj, tr( "CASE_BOUNDARY" ), aGuiObj->entry() ); + + Handle(HYDROData_PolylineXY) aPolyline = aCaseObj->GetBoundaryPolyline(); + if ( !aPolyline.IsNull() && !aPolyline->IsRemoved() ) + createObject( aPolylineSect, aPolyline, aGuiObj->entry(), false ); + LightApp_DataObject* aCaseAOSect = createObject( aGuiObj, tr( partitionName( KIND_ARTIFICIAL_OBJECT ).toAscii() ), aGuiObj->entry() ); @@ -873,7 +917,7 @@ void HYDROGUI_DataModel::buildObjectTree( SUIT_DataObject* theParent, } #ifdef DEB_GROUPS - HYDROData_SequenceOfObjects aCalcGroups = aCaseObj->GetSplittedGroups(); + HYDROData_SequenceOfObjects aCalcGroups = aCaseObj->GetGeometryGroups(); buildObjectPartition( aGuiObj, aCalcGroups, tr( "OBJECT_GROUPS" ), false ); HYDROData_SequenceOfObjects aCalcSplitGroups = aCaseObj->GetSplittedGroups();