1 // File: SalomeApp_DataModel.cxx
2 // Created: 10/25/2004 10:36:06 AM
3 // Author: Sergey LITONIN
4 // Copyright (C) CEA 2004
6 #include "SalomeApp_DataModel.h"
7 #include "SalomeApp_Study.h"
8 #include "SalomeApp_DataObject.h"
9 #include "SalomeApp_Module.h"
10 #include "SalomeApp_Application.h"
11 #include "SalomeApp_Engine_i.hxx"
13 #include "LightApp_RootObject.h"
15 #include <CAM_DataObject.h>
17 #include <SUIT_Application.h>
18 #include <SUIT_ResourceMgr.h>
19 #include <SUIT_Session.h>
21 #include "SALOMEDS_Tool.hxx"
23 #include <SALOMEconfig.h>
24 #include CORBA_SERVER_HEADER(SALOME_Exception)
26 //=======================================================================
28 /*!Purpose : static method used by SalomeApp_Study and SalomeApp_DataModel classes
29 * to create default SALOMEDS-based data object tree
31 //=======================================================================
32 SUIT_DataObject* SalomeApp_DataModel::BuildTree( const _PTR(SObject)& obj,
33 SUIT_DataObject* parent,
34 SalomeApp_Study* study,
37 SalomeApp_DataObject* aDataObj = 0;
42 if ( obj->GetName().size() || obj->ReferencedObject( refObj ) ) // skip nameless non references SObjects
44 _PTR(SComponent) aSComp( obj );
46 // patch for bug IPAL9313
47 if ( aSComp && parent && skip )
49 QString aSName( aSComp->GetName().c_str() );
50 DataObjectList allComponents = parent->children( /*recursive=*/false );
51 for ( DataObjectListIterator it( allComponents ); it.current(); ++it ) {
52 SUIT_DataObject* componentObj = it.current();
53 if ( componentObj->name() == aSName ) {
54 // mkr : modifications for update of already published in
55 // object browser, but not loaded yet components
56 LightApp_Application* anApp = dynamic_cast<LightApp_Application*>
57 (SUIT_Session::session()->activeApplication() );
58 // asv : corresponding DataObjects are DELETED before update (so they are re-built).
59 if (anApp && !anApp->module(aSName)) { // if module is not loaded, delete it's DataObject
60 // jfa: remove children before DataObject deletion
61 DataObjectList chilren = componentObj->children(/*recursive=*/true);
62 for (DataObjectListIterator itc (chilren); itc.current(); ++itc)
63 componentObj->removeChild(itc.current());
65 // delete DataObject itself and re-create it and all its sub-objects
67 // don't do anything here, because iterator may be corrupted (deleted object inside it)
68 break; // proceed to build_a_data_object code below
76 aDataObj = aSComp ? new SalomeApp_ModuleObject( aSComp, parent ) :
77 new SalomeApp_DataObject ( obj, parent );
79 _PTR(ChildIterator) it ( study->studyDS()->NewChildIterator( obj ) );
80 for ( ; it->More(); it->Next() ) {
81 // don't use shared_ptr here, for Data Object will take
82 // ownership of this pointer
83 _PTR(SObject) aSO( it->Value() );
84 BuildTree( aSO, aDataObj, study );
90 //=======================================================================
91 // name : SalomeApp_DataModel::SalomeApp_DataModel
92 /*!Purpose : Constructor*/
93 //=======================================================================
94 SalomeApp_DataModel::SalomeApp_DataModel( CAM_Module* theModule )
95 : LightApp_DataModel( theModule )
99 //=======================================================================
100 // name : SalomeApp_DataModel::~SalomeApp_DataModel
101 /*! Purpose : Destructor*/
102 //=======================================================================
103 SalomeApp_DataModel::~SalomeApp_DataModel()
107 //================================================================
109 /*! Purpose : Open data model*/
110 //================================================================
111 bool SalomeApp_DataModel::open( const QString& name, CAM_Study* study, QStringList )
113 SalomeApp_Study* aDoc = dynamic_cast<SalomeApp_Study*>( study );
117 QString anId = getRootEntry( aDoc );
118 if ( anId.isEmpty() )
119 return true; // Probably nothing to load
121 _PTR(Study) aStudy ( aDoc->studyDS() ); // shared_ptr cannot be used here
122 _PTR(SComponent) aSComp ( aStudy->FindComponentID( std::string( anId.latin1() ) ) );
124 buildTree( aSComp, 0, aDoc );
126 QStringList listOfFiles;
127 LightApp_DataModel::open(name, study, listOfFiles);
131 //================================================================
133 /*! Purpose : Update application.*/
134 //================================================================
135 void SalomeApp_DataModel::update( LightApp_DataObject*, LightApp_Study* study )
137 SalomeApp_Study* aSStudy = dynamic_cast<SalomeApp_Study*>(study);
138 LightApp_RootObject* studyRoot = 0;
140 SalomeApp_DataObject* modelRoot = dynamic_cast<SalomeApp_DataObject*>( root() );
141 if ( !modelRoot ){ // not yet connected to a study -> try using <study> argument
143 aSStudy = dynamic_cast<SalomeApp_Study*>( getModule()->getApp()->activeStudy() );
145 studyRoot = dynamic_cast<LightApp_RootObject*>( aSStudy->root() );
146 QString anId = getRootEntry( aSStudy );
147 if ( !anId.isEmpty() ){ // if nothing is published in the study for this module -> do nothing
148 _PTR(Study) aStudy ( aSStudy->studyDS() );
149 sobj = aStudy->FindComponentID( std::string( anId.latin1() ) );
154 studyRoot = dynamic_cast<LightApp_RootObject*>( modelRoot->root() );
156 aSStudy = dynamic_cast<SalomeApp_Study*>( studyRoot->study() ); // <study> value should not change here theoretically, but just to make sure
158 _PTR(Study) aStudy ( aSStudy->studyDS() );
159 // modelRoot->object() cannot be reused here: it is about to be deleted by buildTree() soon
160 sobj = aStudy->FindComponentID( std::string( modelRoot->entry().latin1() ) );
164 buildTree( sobj, studyRoot, aSStudy );
167 //================================================================
168 // Function : buildTree
169 /*! Purpose : private method, build tree.*/
170 //================================================================
171 void SalomeApp_DataModel::buildTree( const _PTR(SObject)& obj,
172 SUIT_DataObject* parent,
173 SalomeApp_Study* study )
177 //if ( !root() ){ // Build default SALOMEDS-based data object tree and insert it into study
178 SalomeApp_ModuleObject* aNewRoot = dynamic_cast<SalomeApp_ModuleObject*>( BuildTree( obj, parent, study ) );
180 aNewRoot->setDataModel( this );
186 //================================================================
187 // Function : getModule
188 /*! Purpose : gets module*/
189 //================================================================
191 SalomeApp_Module* SalomeApp_DataModel::getModule() const
193 return dynamic_cast<SalomeApp_Module*>( module() );
196 //================================================================
197 // Function : getStudy
198 /*! Purpose : gets study */
199 //================================================================
200 SalomeApp_Study* SalomeApp_DataModel::getStudy() const
202 if(!root()) return 0;
203 LightApp_RootObject* aRoot = dynamic_cast<LightApp_RootObject*>( root()->root() );
206 SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( aRoot->study() );
212 //================================================================
213 // Function : getRootEntry
214 /*! Purpose : returns study entry corresponding to this data model*/
215 //================================================================
216 QString SalomeApp_DataModel::getRootEntry( SalomeApp_Study* study ) const
219 if ( root() && root()->root() ) { // data model already in a study
220 SalomeApp_DataObject* anObj = dynamic_cast<SalomeApp_DataObject*>( root() );
222 anEntry = anObj->entry();
224 else if ( study && study->studyDS() ) { // this works even if <myRoot> is null
225 _PTR(SComponent) aSComp( study->studyDS()->FindComponent( module()->name() ) );
227 anEntry = aSComp->GetID().c_str();