1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #include "LightApp_Study.h"
25 #include "CAM_DataModel.h"
26 #include "CAM_Module.h"
27 #include "LightApp_Application.h"
28 #include "LightApp_DataModel.h"
29 #include "LightApp_DataObject.h"
30 #include "LightApp_HDFDriver.h"
32 #include "SUIT_ResourceMgr.h"
33 #include "SUIT_DataObjectIterator.h"
34 #include "SUIT_DataBrowser.h"
35 #include "SUIT_TreeModel.h"
42 LightApp_Study::LightApp_Study( SUIT_Application* app )
46 myDriver = new LightApp_HDFDriver();
47 //myDriver = new LightApp_Driver();
53 LightApp_Study::~LightApp_Study()
55 delete myDriver; myDriver = 0;
61 bool LightApp_Study::createDocument( const QString& theStr )
64 setRoot( new LightApp_RootObject( this ) );
66 bool aRet = CAM_Study::createDocument( theStr );
76 bool LightApp_Study::openDocument( const QString& theFileName )
78 myDriver->ClearDriverContents();
79 // create files for models from theFileName
80 if( !openStudyData(theFileName))
83 setRoot( new LightApp_RootObject( this ) ); // create myRoot
85 // update loaded data models: call open() and update() on them.
88 QListIterator<CAM_DataModel*> it( dm_s );
89 while ( it.hasNext() )
90 openDataModel( studyName(), it.next() );
91 // this will build a SUIT_DataObject-s tree under myRoot member field
92 // passing "false" in order NOT to rebuild existing data models' trees - it was done in previous step
93 // but tree that corresponds to not-loaded data models will be updated any way.
94 ((LightApp_Application*)application())->updateObjectBrowser( false );
96 bool res = CAM_Study::openDocument( theFileName );
105 bool LightApp_Study::loadDocument( const QString& theStudyName )
107 myDriver->ClearDriverContents();
108 if( !openStudyData(theStudyName))
111 setRoot( new LightApp_RootObject( this ) ); // create myRoot
113 //SRN: BugID IPAL9021, put there the same code as in a method openDocument
115 // update loaded data models: call open() and update() on them.
119 QListIterator<CAM_DataModel*> it( dm_s );
120 while ( it.hasNext() )
121 openDataModel( studyName(), it.next() );
123 // this will build a SUIT_DataObject-s tree under myRoot member field
124 // passing "false" in order NOT to rebuild existing data models' trees - it was done in previous step
125 // but tree that corresponds to not-loaded data models will be updated any way.
126 ((LightApp_Application*)application())->updateObjectBrowser( false );
128 bool res = CAM_Study::openDocument( theStudyName );
130 //SRN: BugID IPAL9021: End
137 bool LightApp_Study::saveDocumentAs( const QString& theFileName )
139 SUIT_ResourceMgr* resMgr = application()->resourceMgr();
146 QStringList listOfFiles;
147 bool isMultiFile = resMgr->booleanValue( "Study", "multi_file", false );
148 QListIterator<CAM_DataModel*> itList( list );
149 while ( itList.hasNext() )
151 LightApp_DataModel* aModel = (LightApp_DataModel*)itList.next();
152 if ( !aModel ) continue;
154 std::vector<std::string> anOldList = myDriver->GetListOfFiles( aModel->module()->name().toLatin1().constData() );
156 aModel->saveAs( theFileName, this, listOfFiles );
157 if ( !listOfFiles.isEmpty() )
158 saveModuleData(aModel->module()->name(), listOfFiles);
160 // Remove files if necessary. File is removed if it was in the list of files before
161 // saving and it is not contained in the list after saving. This provides correct
162 // removing previous temporary files. These files are not removed before saving
163 // because they may be required for it.
165 std::vector<std::string> aNewList = myDriver->GetListOfFiles( aModel->module()->name().toLatin1().constData() );
167 std::set<std::string> aNewNames;
168 std::set<std::string> toRemove;
170 for( i = 0, n = aNewList.size(); i < n; i++ )
171 aNewNames.insert( aNewList[ i ] );
172 for( i = 0, n = anOldList.size(); i < n; i++ )
174 if ( i == 0 ) // directory is always inserted in list
175 toRemove.insert( anOldList[ i ] );
176 else if ( aNewNames.find( anOldList[ i ] ) == aNewNames.end() )
177 toRemove.insert( anOldList[ i ] );
180 std::vector<std::string> toRemoveList( toRemove.size() );
181 std::set<std::string>::iterator anIter;
182 for( anIter = toRemove.begin(), i = 0; anIter != toRemove.end(); ++anIter, ++i )
183 toRemoveList[ i ] = *anIter;
186 myDriver->RemoveFiles( toRemoveList, isMultiFile );
189 bool res = saveStudyData(theFileName);
190 res = res && CAM_Study::saveDocumentAs( theFileName );
191 //SRN: BugID IPAL9377, removed usage of uninitialized variable <res>
201 bool LightApp_Study::saveDocument()
203 ModelList list; dataModels( list );
205 myDriver->ClearDriverContents();
206 QStringList listOfFiles;
207 QListIterator<CAM_DataModel*> itList( list );
208 while ( itList.hasNext() ) {
209 LightApp_DataModel* aModel = (LightApp_DataModel*)itList.next();
210 if ( !aModel ) continue;
213 aModel->save( listOfFiles );
214 saveModuleData(aModel->module()->name(), listOfFiles);
217 bool res = saveStudyData(studyName());
218 res = res && CAM_Study::saveDocument();
228 void LightApp_Study::closeDocument(bool permanently)
230 // Inform everybody that this study is going to close when it's most safe to,
231 // i.e. in the very beginning
234 CAM_Study::closeDocument(permanently);
236 // Remove temporary files
237 myDriver->ClearDriverContents();
241 \return real entry by entry of reference
242 \param entry - entry of reference object
244 QString LightApp_Study::referencedToEntry( const QString& entry ) const
250 \return entries of object children
252 void LightApp_Study::children( const QString&, QStringList& ) const
257 \return true if entry corresponds to component
259 bool LightApp_Study::isComponent( const QString& entry ) const
265 root()->children( ch );
266 DataObjectList::const_iterator anIt = ch.begin(), aLast = ch.end();
267 for( ; anIt!=aLast; anIt++ )
269 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>( *anIt );
270 if( obj && obj->entry()==entry )
277 \return component data type for entry
279 QString LightApp_Study::componentDataType( const QString& entry ) const
281 LightApp_DataObject* aCurObj;
282 for ( SUIT_DataObjectIterator it( root(), SUIT_DataObjectIterator::DepthLeft ); it.current(); ++it ) {
283 aCurObj = dynamic_cast<LightApp_DataObject*>( it.current() );
284 if ( aCurObj && aCurObj->entry() == entry ) {
285 return aCurObj->componentDataType();
292 \return true if study is modified
294 bool LightApp_Study::isModified() const
296 bool isAnyChanged = CAM_Study::isModified();
297 ModelList list; dataModels( list );
299 LightApp_DataModel* aModel = 0;
300 QListIterator<CAM_DataModel*> it( list );
301 while ( it.hasNext() && !isAnyChanged ) {
302 aModel = dynamic_cast<LightApp_DataModel*>( it.next() );
304 isAnyChanged = aModel->isModified();
310 \return true if data model is saved
312 bool LightApp_Study::isSaved() const
314 return CAM_Study::isSaved();
318 Creates SComponent for module, necessary for SalomeApp study
320 void LightApp_Study::addComponent(const CAM_DataModel* dm)
325 Saves list file for module 'theModuleName'
327 void LightApp_Study::saveModuleData(QString theModuleName, QStringList theListOfFiles)
329 int aNb = theListOfFiles.count();
333 std::vector<std::string> aListOfFiles ( aNb );
335 for ( QStringList::Iterator it = theListOfFiles.begin(); it != theListOfFiles.end(); ++it ) {
336 if ( (*it).isEmpty() )
338 aListOfFiles[anIndex] = (*it).toLatin1().constData();
341 myDriver->SetListOfFiles(theModuleName.toLatin1().constData(), aListOfFiles);
345 Gets list of file for module 'theModuleNam'
347 void LightApp_Study::openModuleData(QString theModuleName, QStringList& theListOfFiles)
349 std::vector<std::string> aListOfFiles = myDriver->GetListOfFiles(theModuleName.toLatin1().constData());
350 int i, aLength = aListOfFiles.size() - 1;
354 //Get a temporary directory for saved a file
355 theListOfFiles.append(aListOfFiles[0].c_str());
356 for(i = 0; i < aLength; i++)
357 theListOfFiles.append(aListOfFiles[i+1].c_str());
361 Saves data from study
363 bool LightApp_Study::saveStudyData( const QString& theFileName )
365 ModelList list; dataModels( list );
366 SUIT_ResourceMgr* resMgr = application()->resourceMgr();
369 bool isMultiFile = resMgr->booleanValue( "Study", "multi_file", false );
371 bool aRes = myDriver->SaveDatasInFile(theFileName.toLatin1(), isMultiFile);
378 bool LightApp_Study::openStudyData( const QString& theFileName )
380 SUIT_ResourceMgr* resMgr = application()->resourceMgr();
383 bool isMultiFile = resMgr->booleanValue( "Study", "multi_file", false );
385 bool aRes = myDriver->ReadDatasFromFile(theFileName.toLatin1(), isMultiFile);
392 bool LightApp_Study::openDataModel( const QString& studyName, CAM_DataModel* dm )
397 QStringList listOfFiles;
398 openModuleData(dm->module()->name(), listOfFiles);
399 if (dm && dm->open(studyName, this, listOfFiles)) {
400 // Something has been read -> create data model tree
401 LightApp_DataModel* aDM = dynamic_cast<LightApp_DataModel*>( dm );
403 aDM->update(NULL, this);
410 \return temporary directory for saving files of modules
412 std::string LightApp_Study::GetTmpDir (const char* theURL,
413 const bool isMultiFile)
415 return myDriver->GetTmpDir(theURL, isMultiFile);
419 \return list of files necessary for module
420 \param theModuleName - name of module
422 std::vector<std::string> LightApp_Study::GetListOfFiles(const char* theModuleName) const
424 std::vector<std::string> aListOfFiles;
425 aListOfFiles = myDriver->GetListOfFiles(theModuleName);
430 Sets list of files necessary for module
431 \param theModuleName - name of module
432 \param theListOfFiles - list of files
434 void LightApp_Study::SetListOfFiles (const char* theModuleName, const std::vector<std::string> theListOfFiles)
436 myDriver->SetListOfFiles(theModuleName, theListOfFiles);
440 Removes temporary files
442 void LightApp_Study::RemoveTemporaryFiles (const char* theModuleName, const bool isMultiFile) const
446 bool isDirDeleted = true;
447 myDriver->RemoveTemporaryFiles(theModuleName, isDirDeleted);
451 Virtual method that creates the root object (module object) for the given data model.
452 The type of the created object depends on the study class, therefore data model classes
453 should not create their module objects directly and should instead use
454 LightApp_DataModel::createModuleObject() that in its turn relies on this method.
456 \param theDataModel - data model instance to create a module object for
457 \param theParent - the module object's parent (normally it's the study root)
458 \return the module object instance
459 \sa LightApp_DataModel class, SalomeApp_Study class, LightApp_ModuleObject class
461 CAM_ModuleObject* LightApp_Study::createModuleObject( LightApp_DataModel* theDataModel,
462 SUIT_DataObject* theParent ) const
464 // Calling addComponent() for symmetry with SalomeApp_Study
465 // Currently it has empty implementation, but maybe in the future things will change...
466 LightApp_Study* that = const_cast<LightApp_Study*>( this );
467 that->addComponent( theDataModel );
469 // Avoid creating multiple module objects for the same module
470 CAM_ModuleObject* res = 0;
472 DataObjectList children = root()->children();
473 DataObjectList::const_iterator anIt = children.begin(), aLast = children.end();
474 for( ; !res && anIt!=aLast; anIt++ )
476 LightApp_ModuleObject* obj = dynamic_cast<LightApp_ModuleObject*>( *anIt );
477 if ( obj && obj->name() == theDataModel->module()->moduleName() )
482 res = new LightApp_ModuleObject( theDataModel, theParent );
489 Fills list with components names
490 \param comp - list to be filled
492 void LightApp_Study::components( QStringList& comp ) const
494 DataObjectList children = root()->children();
495 DataObjectList::const_iterator anIt = children.begin(), aLast = children.end();
496 for( ; anIt!=aLast; anIt++ )
498 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>( *anIt );
499 if ( obj && obj->entry() != getVisualComponentName() )
500 comp.append( obj->entry() );
505 Get the entry for the given module
506 \param comp - list to be filled
507 \return module root's entry
509 QString LightApp_Study::centry( const QString& comp ) const
513 dataModels( dmlist );
514 QListIterator<CAM_DataModel*> it( dmlist );
515 while ( it.hasNext() && e.isEmpty() ) {
516 CAM_DataModel* dm = it.next();
517 if ( dm->module() && dm->module()->name() == comp ) {
518 LightApp_DataObject* r = dynamic_cast<LightApp_DataObject*>( dm->root() );
519 if ( r ) e = r->entry();
526 \return a name of the component where visual parameters are stored
528 QString LightApp_Study::getVisualComponentName() const
530 return "Interface Applicative";
534 Set a visual property of the object
535 \param theViewMgrId - Id of the viewer namager
536 \param theEntry - Entry of the object
537 \param thePropName - the name of the visual property
538 \param theValue - the value of the visual property
540 void LightApp_Study::setObjectProperty( int theViewMgrId,
541 const QString& theEntry,
542 const QString& thePropName,
543 const QVariant& theValue )
545 myViewMgrMap[theViewMgrId][theEntry][thePropName] = theValue;
549 Get a visual property of the object identified by theViewMgrId, theEntry and thePropName.
550 \param theViewMgrId - Id of the viewer manager.
551 \param theEntry - Entry of the object.
552 \param thePropName - the name of the visual property.
553 \param theDefValue - the default value of the visual property.
554 \return value of the visual propetry. If value is't found then return theDefValue.
556 QVariant LightApp_Study::getObjectProperty( int theViewMgrId,
557 const QString& theEntry,
558 const QString& thePropName,
559 const QVariant& theDefValue ) const
561 QVariant aResult = theDefValue;
562 ViewMgrMap::ConstIterator v_it = myViewMgrMap.find( theViewMgrId );
563 if ( v_it != myViewMgrMap.end() ) {
564 const ObjMap& anObjectMap = v_it.value();
565 ObjMap::ConstIterator o_it = anObjectMap.find( theEntry );
566 if ( o_it != anObjectMap.end() ) {
567 const PropMap& aPropMap = o_it.value();
568 PropMap::ConstIterator p_it = aPropMap.find( thePropName );
569 if ( p_it != aPropMap.end() ) {
570 aResult = p_it.value();
578 Set a visual property of the object for all registered viewers
579 \param theEntry - Entry of the object
580 \param thePropName - the name of the visual property
581 \param theValue - the value of the visual property
583 void LightApp_Study::setObjectProperty( const QString& theEntry,
584 const QString& thePropName,
585 const QVariant& theValue )
587 const ViewMgrMap& vm = getObjectProperties();
588 ViewMgrMap::ConstIterator v_it;
589 for ( v_it = vm.begin(); v_it != vm.end(); ++v_it ) {
590 setObjectProperty( v_it.key(), theEntry, thePropName, theValue );
595 Set a visual property for all registered objects for given viewer
596 \param theViewMgrId - Id of the viewer manager.
597 \param thePropName - the name of the visual property
598 \param theValue - the value of the visual property
600 void LightApp_Study::setObjectProperty( int theViewMgrId,
601 const QString& thePropName,
602 const QVariant& theValue )
604 const ObjMap& om = getObjectProperties( theViewMgrId );
605 ObjMap::ConstIterator o_it;
606 for ( o_it = om.begin(); o_it != om.end(); ++o_it ) {
607 setObjectProperty( theViewMgrId, o_it.key(), thePropName, theValue );
612 Get a map of the properties of the object identified by theViewMgrId and theEntry.
613 \param theViewMgrId - Id of the viewer manager.
614 \param theEntry - Entry of the object.
615 \return a map of the properties of the object.
617 const PropMap& LightApp_Study::getObjectProperties( int theViewMgrId, const QString& theEntry )
619 ViewMgrMap::Iterator v_it = myViewMgrMap.find( theViewMgrId );
620 if ( v_it == myViewMgrMap.end() )
621 v_it = myViewMgrMap.insert( theViewMgrId, ObjMap() );
623 ObjMap& anObjectMap = v_it.value();
624 ObjMap::Iterator o_it = anObjectMap.find( theEntry );
625 if ( o_it == anObjectMap.end() )
626 o_it = anObjectMap.insert( theEntry, PropMap() );
632 Set a map of the properties of the object identified by theViewMgrId and theEntry.
633 \param theViewMgrId - Id of the viewer manager.
634 \param theEntry - Entry of the object.
636 void LightApp_Study::setObjectProperties( int theViewMgrId,
637 const QString& theEntry,
638 const PropMap& thePropMap )
640 myViewMgrMap[theViewMgrId][theEntry] = thePropMap;
644 Remove view manager with all objects.
645 \param theViewMgrId - Id of the viewer manager.
647 void LightApp_Study::removeObjectProperties( int theViewMgrId )
649 myViewMgrMap.remove( theViewMgrId );
654 Remove object's properties from all view managers.
655 \param theEntry - Entry of the object.
657 void LightApp_Study::removeObjectProperties( const QString& theEntry )
659 ViewMgrMap::Iterator v_it;
660 for ( v_it = myViewMgrMap.begin(); v_it != myViewMgrMap.end(); v_it++ )
661 v_it.value().remove( theEntry );
665 Get all objects and it's properties from view manager identified by theViewMgrId.
666 \param theEntry - Entry of the object.
668 const ObjMap& LightApp_Study::getObjectProperties( int theViewMgrId )
670 ViewMgrMap::Iterator v_it = myViewMgrMap.find( theViewMgrId );
671 if ( v_it == myViewMgrMap.end() )
672 v_it = myViewMgrMap.insert( theViewMgrId, ObjMap() );
677 Get global properties map
679 const ViewMgrMap& LightApp_Study::getObjectProperties() const
685 Set 'visibility state' property of the object.
686 \param theEntry - Entry of the object.
687 \param theState - visibility status
689 void LightApp_Study::setVisibilityState( const QString& theEntry, Qtx::VisibilityState theState )
691 LightApp_Application* app = (LightApp_Application*)application();
693 SUIT_DataBrowser* db = app->objectBrowser();
695 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( db->model() );
697 treeModel->setVisibilityState( theEntry, theState );
698 emit objVisibilityChanged( theEntry, theState );
703 Set 'visibility state' property for all object.
704 \param theEntry - Entry of the object.
706 void LightApp_Study::setVisibilityStateForAll( Qtx::VisibilityState theState )
708 LightApp_Application* app = (LightApp_Application*)application();
710 SUIT_DataBrowser* db = app->objectBrowser();
712 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( db->model() );
714 treeModel->setVisibilityStateForAll( theState );
718 Get 'visibility state' property of the object.
719 \param theEntry - Entry of the object.
720 \return 'visibility state' property of the object.
722 Qtx::VisibilityState LightApp_Study::visibilityState( const QString& theEntry ) const
724 Qtx::VisibilityState state = Qtx::UnpresentableState;
725 LightApp_Application* app = (LightApp_Application*)application();
727 SUIT_DataBrowser* db = app->objectBrowser();
729 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( db->model() );
731 state = treeModel->visibilityState( theEntry );
738 Find a data object by the specified entry.
739 \param theEntry - Entry of the object.
742 LightApp_DataObject* LightApp_Study::findObjectByEntry( const QString& theEntry )
744 LightApp_DataObject* aCurObj;
745 for ( SUIT_DataObjectIterator it( root(), SUIT_DataObjectIterator::DepthLeft ); it.current(); ++it ) {
746 aCurObj = dynamic_cast<LightApp_DataObject*>( it.current() );
747 if ( aCurObj && aCurObj->entry() == theEntry )