1 // SMESH SMESHGUI : GUI for SMESH component
3 // Copyright (C) 2003 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.
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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SMESHGUI_StudyAPI.cxx
25 // Author : Yves FRICAUD
30 #include "SMESHGUI_StudyAPI.h"
31 #include "utilities.h"
32 #include "Utils_ORB_INIT.hxx"
33 #include "Utils_SINGLETON.hxx"
35 #include "QAD_MessageBox.h"
36 #include "QAD_Desktop.h"
37 #include "QAD_Application.h"
42 // Open CASCADE Includes
43 #include "Standard_CString.hxx"
45 static CORBA::ORB_var _orb;
48 long Tag_HypothesisRoot = 1;
49 long Tag_AlgorithmsRoot = 2;
51 long Tag_RefOnShape = 1;
52 long Tag_RefOnAppliedHypothesis = 2;
53 long Tag_RefOnAppliedAlgorithms = 3;
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;
63 static char* IORToString (CORBA::Object_ptr obj)
65 // MESSAGE ( " IORToString " << _orb->object_to_string(obj) )
66 return _orb->object_to_string(obj);
69 CORBA::Object_ptr SMESHGUI_StudyAPI::StringToIOR (const char* IOR)
71 // MESSAGE ( " StringToIOR " << _orb->string_to_object(IOR) )
72 return _orb->string_to_object(IOR);
74 //=======================================================================
76 // purpose : Constructor
77 //=======================================================================
78 SMESHGUI_StudyAPI::SMESHGUI_StudyAPI ()
82 SMESHGUI_StudyAPI::SMESHGUI_StudyAPI ( SALOMEDS::Study_ptr aStudy,
83 SMESH::SMESH_Gen_ptr CompMesh)
89 //=======================================================================
91 // purpose : Destructor
92 //=======================================================================
93 SMESHGUI_StudyAPI::~SMESHGUI_StudyAPI ()
97 //=======================================================================
100 //=======================================================================
101 void SMESHGUI_StudyAPI::Update(SALOMEDS::Study_ptr aStudy)
103 myStudy = SALOMEDS::Study::_duplicate( aStudy );
104 myStudyBuilder = aStudy->NewBuilder();
107 //=======================================================================
108 // function : SetShape
110 //=======================================================================
111 void SMESHGUI_StudyAPI::SetShape (SALOMEDS::SObject_ptr SO_MorSM,
112 SALOMEDS::SObject_ptr SO_GeomShape )
114 // NRI : Temporary added
115 if ( myStudy->GetProperties()->IsLocked() ) {
119 SALOMEDS::SObject_var SO = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnShape);
120 myStudyBuilder->Addreference (SO,SO_GeomShape);
123 //=======================================================================
124 // function : GetShapeOnMeshOrSubMesh
126 //=======================================================================
127 GEOM::GEOM_Shape_ptr SMESHGUI_StudyAPI::GetShapeOnMeshOrSubMesh(SALOMEDS::SObject_ptr SO_Mesh_Or_SubMesh)
129 // NRI : Temporary added
130 if ( myStudy->GetProperties()->IsLocked() ) {
131 return GEOM::GEOM_Shape::_nil();
135 if ( SO_Mesh_Or_SubMesh->_is_nil() )
136 return GEOM::GEOM_Shape::_nil();
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()) );
150 return GEOM::GEOM_Shape::_nil();
153 //=======================================================================
154 // function : AddSubMeshOnShape
156 //=======================================================================
157 SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::AddSubMeshOnShape (SALOMEDS::SObject_ptr SO_Mesh,
158 SMESH::SMESH_subMesh_ptr SM,
161 // NRI : Temporary added
162 if ( myStudy->GetProperties()->IsLocked() ) {
163 return SALOMEDS::SObject::_nil();
168 Standard_CString Name;
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"));}
175 Tag_Shape = Tag_SubMeshOnCompound; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnCompound"));
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;
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);
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 );
200 //=======================================================================
201 // function : AddSubMeshOnShape
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,
209 // NRI : Temporary added
210 if ( myStudy->GetProperties()->IsLocked() ) {
211 return SALOMEDS::SObject::_nil();
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 );
222 //=======================================================================
223 // function : SetHypothesis
225 //=======================================================================
226 void SMESHGUI_StudyAPI::SetHypothesis (SALOMEDS::SObject_ptr SO_MorSM,
227 SALOMEDS::SObject_ptr SO_Hypothesis)
229 // NRI : Temporary added
230 if ( myStudy->GetProperties()->IsLocked() ) {
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;
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" );
254 SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR);
255 myStudyBuilder->Addreference (SO,SO_Hypothesis);
258 //=======================================================================
259 // function : SetAlgorithms
261 //=======================================================================
262 void SMESHGUI_StudyAPI::SetAlgorithms (SALOMEDS::SObject_ptr SO_MorSM,
263 SALOMEDS::SObject_ptr SO_Algorithms)
265 // NRI : Temporary added
266 if ( myStudy->GetProperties()->IsLocked() ) {
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;
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" );
290 SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR);
291 myStudyBuilder->Addreference (SO,SO_Algorithms);
295 //=======================================================================
298 //=======================================================================
299 SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::FindObject( CORBA::Object_ptr theObject )
301 // NRI : Temporary added
302 if ( myStudy->GetProperties()->IsLocked() ) {
303 return SALOMEDS::SObject::_nil();
306 if ( !CORBA::is_nil ( theObject ) ) {
307 string anIOR = IORToString( theObject );
309 return myStudy->FindObjectIOR( anIOR.c_str() );
311 return SALOMEDS::SObject::_nil();
314 //=======================================================================
317 //=======================================================================
318 void SMESHGUI_StudyAPI::setOrb()
321 ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance();
322 ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
323 _orb = init( 0 , 0 );
325 INFOS("internal error : orb not found");
328 ASSERT(! CORBA::is_nil(_orb));
331 //=======================================================================
334 //=======================================================================
335 void SMESHGUI_StudyAPI::SetName( SALOMEDS::SObject_ptr SO, const char* Name )
337 // NRI : Temporary added
338 if ( myStudy->GetProperties()->IsLocked() ) {
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);
350 //=======================================================================
353 //=======================================================================
354 void SMESHGUI_StudyAPI::UnSetHypothesis (SALOMEDS::SObject_ptr SO_Applied_Hypothesis)
356 // NRI : Temporary added
357 if ( myStudy->GetProperties()->IsLocked() ) {
361 myStudyBuilder->RemoveObject(SO_Applied_Hypothesis);
364 //=======================================================================
367 //=======================================================================
368 void SMESHGUI_StudyAPI::UnSetAlgorithm (SALOMEDS::SObject_ptr SO_Applied_Algorithm)
370 // NRI : Temporary added
371 if ( myStudy->GetProperties()->IsLocked() ) {
375 myStudyBuilder->RemoveObject(SO_Applied_Algorithm);
378 //=======================================================================
381 //=======================================================================
382 SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::GetMeshOrSubmesh (SALOMEDS::SObject_ptr SO)
384 // NRI : Temporary added
385 if ( myStudy->GetProperties()->IsLocked() ) {
386 return SALOMEDS::SObject::_nil();
390 SALOMEDS::SObject_var MorSM,SB;
391 SALOMEDS::GenericAttribute_var anAttr;
392 SALOMEDS::AttributeName_var aName;
393 SALOMEDS::AttributeIOR_var anIOR;
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()) {
400 MorSM = SO->GetFather();
401 // MESSAGE ( " MorSM shape " << MorSM->GetID() )
402 return SALOMEDS::SObject::_narrow( MorSM);
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);
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);
418 void SMESHGUI_StudyAPI::ModifiedMesh( SALOMEDS::SObject_ptr MorSM, bool right)
420 // NRI : Temporary added
421 if ( myStudy->GetProperties()->IsLocked() ) {
426 SALOMEDS::GenericAttribute_var anAttr;
427 SALOMEDS::AttributePixMap_var aPixmap;
429 anAttr = myStudyBuilder->FindOrCreateAttribute(MorSM, "AttributePixMap");
430 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
432 aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH" );
434 aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_WARN" );
438 SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(MorSM);
439 for (; it->More();it->Next()) {
440 SALOMEDS::SObject_var Obj = it->Value();
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);
449 aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH" );
451 aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_WARN" );