Salome HOME
DCQ:prepare 2.0.0
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_StudyAPI.cxx
1 //  SMESH SMESHGUI : GUI for SMESH component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
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. 
10 // 
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. 
15 // 
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 
19 // 
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
24 //  File   : SMESHGUI_StudyAPI.cxx
25 //  Author : Yves FRICAUD 
26 //  Module : SMESH
27 //  $Header: 
28
29 using namespace std;
30 #include "SMESHGUI_StudyAPI.h"
31 #include "utilities.h"
32 #include "Utils_ORB_INIT.hxx"
33 #include "Utils_SINGLETON.hxx"
34
35 #include "QAD_MessageBox.h"
36 #include "QAD_Desktop.h"
37 #include "QAD_Application.h"
38
39 // QT Includes
40 #include <qobject.h>
41
42 // Open CASCADE Includes
43 #include "Standard_CString.hxx"
44
45 static CORBA::ORB_var _orb;
46
47 // Tags definition 
48 long Tag_HypothesisRoot  = 1;
49 long Tag_AlgorithmsRoot  = 2;
50
51 long Tag_RefOnShape      = 1;
52 long Tag_RefOnAppliedHypothesis = 2;
53 long Tag_RefOnAppliedAlgorithms = 3;
54
55 long Tag_SubMeshOnVertex = 4;
56 long Tag_SubMeshOnEdge = 5;
57 long Tag_SubMeshOnFace = 6;
58 long Tag_SubMeshOnSolid = 7;
59 long Tag_SubMeshOnCompound = 8;
60
61
62
63 static char* IORToString (CORBA::Object_ptr obj)
64 {
65   //  MESSAGE ( " IORToString " << _orb->object_to_string(obj) )
66   return _orb->object_to_string(obj);
67 }
68
69 CORBA::Object_ptr SMESHGUI_StudyAPI::StringToIOR (const char* IOR)
70 {
71   //  MESSAGE ( " StringToIOR " << _orb->string_to_object(IOR) )
72   return _orb->string_to_object(IOR);
73 }
74 //=======================================================================
75 // function :
76 // purpose  : Constructor
77 //=======================================================================
78 SMESHGUI_StudyAPI::SMESHGUI_StudyAPI ()
79 {
80 }
81
82 SMESHGUI_StudyAPI::SMESHGUI_StudyAPI ( SALOMEDS::Study_ptr aStudy,
83                                        SMESH::SMESH_Gen_ptr CompMesh)
84 {
85   setOrb();
86   Update( aStudy );
87 }
88
89 //=======================================================================
90 // function :
91 // purpose  : Destructor
92 //=======================================================================
93 SMESHGUI_StudyAPI::~SMESHGUI_StudyAPI ()
94 {
95 }
96
97 //=======================================================================
98 // function :
99 // purpose  : Update
100 //=======================================================================
101 void SMESHGUI_StudyAPI::Update(SALOMEDS::Study_ptr aStudy)
102 {
103   myStudy = SALOMEDS::Study::_duplicate( aStudy );
104   myStudyBuilder = aStudy->NewBuilder();
105 }
106
107 //=======================================================================
108 // function : SetShape
109 // purpose  :
110 //=======================================================================
111 void SMESHGUI_StudyAPI::SetShape (SALOMEDS::SObject_ptr SO_MorSM, 
112                                   SALOMEDS::SObject_ptr SO_GeomShape )
113 {
114   // NRI : Temporary added
115   if ( myStudy->GetProperties()->IsLocked() ) {
116     return;
117   }
118   // NRI
119   SALOMEDS::SObject_var SO = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnShape);
120   myStudyBuilder->Addreference (SO,SO_GeomShape);
121 }
122   
123 //=======================================================================
124 // function : GetShapeOnMeshOrSubMesh
125 // purpose  :
126 //=======================================================================
127 GEOM::GEOM_Shape_ptr SMESHGUI_StudyAPI::GetShapeOnMeshOrSubMesh(SALOMEDS::SObject_ptr SO_Mesh_Or_SubMesh)
128 {
129   // NRI : Temporary added
130   if ( myStudy->GetProperties()->IsLocked() ) {
131     return GEOM::GEOM_Shape::_nil();
132   }
133   // NRI
134
135   if ( SO_Mesh_Or_SubMesh->_is_nil() )
136     return GEOM::GEOM_Shape::_nil();
137
138   GEOM::GEOM_Shape_var Shape;
139   SALOMEDS::SObject_var aSO, aGeom;
140   SALOMEDS::GenericAttribute_var anAttr;
141   SALOMEDS::AttributeIOR_var     anIOR;
142   if ( SO_Mesh_Or_SubMesh->FindSubObject( Tag_RefOnShape, aSO ) ) {
143     if ( aSO->ReferencedObject(aGeom) ) {
144       if (aGeom->FindAttribute(anAttr, "AttributeIOR")) {
145         anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
146         return GEOM::GEOM_Shape::_narrow( _orb->string_to_object(anIOR->Value()) );
147       }
148     }
149   }
150   return GEOM::GEOM_Shape::_nil();
151 }
152
153 //=======================================================================
154 // function : AddSubMeshOnShape
155 // purpose  :
156 //=======================================================================
157 SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::AddSubMeshOnShape (SALOMEDS::SObject_ptr SO_Mesh, 
158                                                             SMESH::SMESH_subMesh_ptr SM, 
159                                                             GEOM::shape_type ST)
160 {
161   // NRI : Temporary added
162   if ( myStudy->GetProperties()->IsLocked() ) {
163     return SALOMEDS::SObject::_nil();
164   }
165   // NRI
166
167   long Tag_Shape ;
168   Standard_CString Name;
169
170   if      (ST == GEOM::SOLID) {Tag_Shape = Tag_SubMeshOnSolid;    Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnSolid"));}
171   else if (ST == GEOM::FACE)  {Tag_Shape = Tag_SubMeshOnFace;     Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnFace"));}
172   else if (ST == GEOM::EDGE)  {Tag_Shape = Tag_SubMeshOnEdge;     Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnEdge"));}
173   else if (ST == GEOM::VERTEX){Tag_Shape = Tag_SubMeshOnVertex;   Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnVertex"));}
174   else {
175     Tag_Shape = Tag_SubMeshOnCompound; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnCompound"));
176   }
177
178   SALOMEDS::SObject_var              SubmeshesRoot;
179   SALOMEDS::GenericAttribute_var     anAttr;
180   SALOMEDS::AttributeName_var        aName;
181   SALOMEDS::AttributeIOR_var         anIOR;
182   SALOMEDS::AttributeSelectable_var  aSelAttr;
183
184   if (!SO_Mesh->FindSubObject (Tag_Shape,SubmeshesRoot )) {
185     SubmeshesRoot = myStudyBuilder->NewObjectToTag (SO_Mesh, Tag_Shape);
186     anAttr = myStudyBuilder->FindOrCreateAttribute(SubmeshesRoot, "AttributeName");
187     aName = SALOMEDS::AttributeName::_narrow(anAttr);
188     aName->SetValue(Name);
189     anAttr = myStudyBuilder->FindOrCreateAttribute(SubmeshesRoot, "AttributeSelectable");
190     aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
191     aSelAttr->SetSelectable(false);
192   }
193   SALOMEDS::SObject_var SO = myStudyBuilder->NewObject (SubmeshesRoot);
194   anAttr = myStudyBuilder->FindOrCreateAttribute(SO, "AttributeIOR");
195   anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
196   anIOR->SetValue(IORToString(SM));
197   return SALOMEDS::SObject::_narrow( SO );
198 }
199
200 //=======================================================================
201 // function : AddSubMeshOnShape 
202 // purpose  :
203 //=======================================================================
204 SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::AddSubMeshOnShape (SALOMEDS::SObject_ptr SO_Mesh, 
205                                                             SALOMEDS::SObject_ptr SO_GeomShape, 
206                                                             SMESH::SMESH_subMesh_ptr SM,
207                                                             GEOM::shape_type ST)
208 {
209   // NRI : Temporary added
210   if ( myStudy->GetProperties()->IsLocked() ) {
211     return SALOMEDS::SObject::_nil();
212   }
213   // NRI
214
215   SALOMEDS::SObject_var SO_SM = AddSubMeshOnShape (SO_Mesh,SM,ST);
216   SetShape (SO_SM,SO_GeomShape);
217   //  SetShapeOnSubMesh (SO_SM,SO_GeomShape);
218   return SALOMEDS::SObject::_narrow( SO_SM );
219 }
220
221
222 //=======================================================================
223 // function : SetHypothesis 
224 // purpose  : 
225 //=======================================================================
226 void SMESHGUI_StudyAPI::SetHypothesis     (SALOMEDS::SObject_ptr SO_MorSM, 
227                                            SALOMEDS::SObject_ptr SO_Hypothesis)
228 {
229   // NRI : Temporary added
230   if ( myStudy->GetProperties()->IsLocked() ) {
231     return;
232   }
233   // NRI
234
235   //Find or Create Applied Hypothesis root
236   SALOMEDS::SObject_var             AHR;
237   SALOMEDS::GenericAttribute_var    anAttr;
238   SALOMEDS::AttributeName_var       aName;
239   SALOMEDS::AttributeSelectable_var aSelAttr;
240   SALOMEDS::AttributePixMap_var     aPixmap;
241
242   if (!SO_MorSM->FindSubObject (Tag_RefOnAppliedHypothesis, AHR)) {
243     AHR = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnAppliedHypothesis);
244     anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeName");
245     aName = SALOMEDS::AttributeName::_narrow(anAttr);
246     aName->SetValue(QObject::tr("SMESH_MEN_APPLIED_HYPOTHESIS"));
247     anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeSelectable");
248     aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
249     aSelAttr->SetSelectable(false);
250     anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributePixMap");
251     aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
252     aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" );
253   }
254   SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR);
255   myStudyBuilder->Addreference (SO,SO_Hypothesis);
256 }   
257
258 //=======================================================================
259 // function : SetAlgorithms 
260 // purpose  : 
261 //=======================================================================
262 void SMESHGUI_StudyAPI::SetAlgorithms     (SALOMEDS::SObject_ptr SO_MorSM, 
263                                            SALOMEDS::SObject_ptr SO_Algorithms)
264 {
265   // NRI : Temporary added
266   if ( myStudy->GetProperties()->IsLocked() ) {
267     return;
268   }
269   // NRI
270
271   //Find or Create Applied Algorithms root
272   SALOMEDS::SObject_var             AHR;
273   SALOMEDS::GenericAttribute_var    anAttr;
274   SALOMEDS::AttributeName_var       aName;
275   SALOMEDS::AttributeSelectable_var aSelAttr;
276   SALOMEDS::AttributePixMap_var     aPixmap;
277
278   if (!SO_MorSM->FindSubObject (Tag_RefOnAppliedAlgorithms, AHR)) {
279     AHR = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnAppliedAlgorithms);
280     anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeName");
281     aName = SALOMEDS::AttributeName::_narrow(anAttr);
282     aName->SetValue(QObject::tr("SMESH_MEN_APPLIED_ALGORIHTMS"));
283     anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeSelectable");
284     aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
285     aSelAttr->SetSelectable(false);
286     anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributePixMap");
287     aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
288     aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" );
289   }
290   SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR);
291   myStudyBuilder->Addreference (SO,SO_Algorithms);
292 }   
293
294
295 //=======================================================================
296 // function :
297 // purpose  : 
298 //=======================================================================
299 SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::FindObject( CORBA::Object_ptr theObject )
300 {
301   // NRI : Temporary added
302   if ( myStudy->GetProperties()->IsLocked() ) {
303     return SALOMEDS::SObject::_nil();
304   }
305   // NRI
306   if ( !CORBA::is_nil ( theObject ) ) {
307     string anIOR = IORToString( theObject );
308     if ( anIOR != "" )
309       return myStudy->FindObjectIOR( anIOR.c_str() );
310   }
311   return SALOMEDS::SObject::_nil();
312 }   
313
314 //=======================================================================
315 // function :
316 // purpose  : 
317 //=======================================================================
318 void SMESHGUI_StudyAPI::setOrb()
319 {
320   try {
321     ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance();
322     ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
323     _orb = init( 0 , 0 );
324   } catch (...) {
325     INFOS("internal error : orb not found");
326     _orb = 0;
327   }
328   ASSERT(! CORBA::is_nil(_orb));
329 }
330
331 //=======================================================================
332 // function :
333 // purpose  : 
334 //=======================================================================
335 void SMESHGUI_StudyAPI::SetName( SALOMEDS::SObject_ptr SO, const char* Name )
336 {
337   // NRI : Temporary added
338   if ( myStudy->GetProperties()->IsLocked() ) {
339     return;
340   }
341   // NRI
342
343   SALOMEDS::GenericAttribute_var anAttr;
344   SALOMEDS::AttributeName_var    aName;
345   anAttr = myStudyBuilder->FindOrCreateAttribute(SO, "AttributeName");
346   aName = SALOMEDS::AttributeName::_narrow(anAttr);
347   aName->SetValue(Name);
348 }
349
350 //=======================================================================
351 // function :
352 // purpose  : 
353 //=======================================================================
354 void SMESHGUI_StudyAPI::UnSetHypothesis    (SALOMEDS::SObject_ptr SO_Applied_Hypothesis)
355 {
356   // NRI : Temporary added
357   if ( myStudy->GetProperties()->IsLocked() ) {
358     return;
359   }
360   // NRI
361   myStudyBuilder->RemoveObject(SO_Applied_Hypothesis);
362 }
363
364 //=======================================================================
365 // function :
366 // purpose  : 
367 //=======================================================================
368 void SMESHGUI_StudyAPI::UnSetAlgorithm      (SALOMEDS::SObject_ptr SO_Applied_Algorithm)
369 {
370   // NRI : Temporary added
371   if ( myStudy->GetProperties()->IsLocked() ) {
372     return;
373   }
374   // NRI
375   myStudyBuilder->RemoveObject(SO_Applied_Algorithm);
376 }
377
378 //=======================================================================
379 // function :
380 // purpose  : 
381 //=======================================================================
382 SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::GetMeshOrSubmesh  (SALOMEDS::SObject_ptr SO)
383 {
384   // NRI : Temporary added
385   if ( myStudy->GetProperties()->IsLocked() ) {
386     return SALOMEDS::SObject::_nil();
387   }
388   // NRI
389
390   SALOMEDS::SObject_var MorSM,SB;
391   SALOMEDS::GenericAttribute_var anAttr;
392   SALOMEDS::AttributeName_var    aName;
393   SALOMEDS::AttributeIOR_var     anIOR;
394   
395   if (SO->FindAttribute(anAttr, "AttributeIOR")) {
396     anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
397     GEOM::GEOM_Shape_var Shape = GEOM::GEOM_Shape::_narrow( _orb->string_to_object(anIOR->Value()) );
398     if (!Shape->_is_nil()) {
399       //It s a shape
400       MorSM = SO->GetFather();
401       //      MESSAGE ( " MorSM  shape " << MorSM->GetID() )
402       return SALOMEDS::SObject::_narrow( MorSM);
403     }
404   }
405   
406   if (SO->ReferencedObject(SB)) {
407     //It's Reference on Hypothesis or Algorithm
408     MorSM = SO->GetFather()->GetFather();
409     //    MESSAGE ( " MorSM reference " << MorSM->GetID() )
410     return SALOMEDS::SObject::_narrow( MorSM);
411   }
412   // It's  SMESH_MEN_APPLIED_HYPOTHESIS or SMESH_MEN_APPLIED_ALGORITHMS or SubMeshesOnFace etc...
413   MorSM = SO->GetFather();
414   //  MESSAGE ( " MorSM  banniere " << MorSM->GetID() )
415   return SALOMEDS::SObject::_narrow( MorSM);
416 }
417
418 void SMESHGUI_StudyAPI::ModifiedMesh( SALOMEDS::SObject_ptr MorSM, bool right)
419 {
420   // NRI : Temporary added
421   if ( myStudy->GetProperties()->IsLocked() ) {
422     return ;
423   }
424   // NRI
425
426   SALOMEDS::GenericAttribute_var anAttr;
427   SALOMEDS::AttributePixMap_var  aPixmap;
428   
429   anAttr = myStudyBuilder->FindOrCreateAttribute(MorSM, "AttributePixMap");
430   aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
431   if (right) {
432     aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH" );
433   } else {
434     aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_WARN" );
435   }
436   
437   int i = 1;
438   SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(MorSM);
439   for (; it->More();it->Next()) {
440     SALOMEDS::SObject_var Obj = it->Value();
441     if ( i >= 4 ) {
442       int j = 1;
443       SALOMEDS::ChildIterator_var it1 = myStudy->NewChildIterator(Obj);
444       for (; it1->More();it1->Next()) {
445         SALOMEDS::SObject_var Obj1 = it1->Value();
446         anAttr = myStudyBuilder->FindOrCreateAttribute(Obj1, "AttributePixMap");
447         aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
448         if (right) {
449           aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH" );
450         } else {
451           aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_WARN" );
452         }
453       }
454     }
455     i++;
456   }
457 }