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 : SMESH_Swig.cxx
25 // Author : Nicolas REJNERI
30 #include "SMESHGUI_Swig.hxx"
32 #include "Utils_ORB_INIT.hxx"
33 #include "Utils_SINGLETON.hxx"
36 #include "QAD_Application.h"
37 #include "QAD_Desktop.h"
38 #include "QAD_ResourceMgr.h"
40 #include "utilities.h"
42 // Open CASCADE Includes
46 #include <SALOMEconfig.h>
47 #include CORBA_SERVER_HEADER(SMESH_Gen)
48 #include CORBA_SERVER_HEADER(SMESH_Mesh)
49 #include CORBA_SERVER_HEADER(SMESH_Hypothesis)
50 #include CORBA_SERVER_HEADER(GEOM_Shape)
52 static CORBA::ORB_var _orb;
54 static char* ObjectToString (CORBA::Object_ptr obj)
56 return _orb->object_to_string(obj);
59 static CORBA::Object_ptr StringToObject (const char* ior)
61 return _orb->string_to_object(ior);
64 SMESH_Swig::SMESH_Swig()
66 MESSAGE("Constructeur");
70 void SMESH_Swig::Init(int studyID)
73 Engines::Component_var comp = QAD_Application::getDesktop()->getEngine("FactoryServer", "SMESH");
74 SMESH::SMESH_Gen_var CompMesh = SMESH::SMESH_Gen::_narrow(comp);
76 QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
79 if (!resMgr->loadResources( "SMESH", msg ))
83 CORBA::Object_var obj = QAD_Application::getDesktop()->getNameService()->Resolve("/myStudyManager");
84 SALOMEDS::StudyManager_var myStudyMgr = SALOMEDS::StudyManager::_narrow(obj);
85 myStudy = myStudyMgr->GetStudyByID(studyID);
86 myStudyBuilder = myStudy->NewBuilder();
87 SALOMEDS::GenericAttribute_var anAttr;
88 SALOMEDS::AttributeName_var aName;
89 SALOMEDS::AttributePixMap_var aPixmap;
91 SALOMEDS::SComponent_var father = myStudy->FindComponent("MESH");
93 if (father->_is_nil()) {
94 bool aLocked = myStudy->GetProperties()->IsLocked();
95 if (aLocked) myStudy->GetProperties()->SetLocked(false);
96 father = myStudyBuilder->NewComponent("MESH");
97 anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributeName");
98 aName = SALOMEDS::AttributeName::_narrow(anAttr);
99 //NRI aName->SetValue(QObject::tr("SMESH_MEN_COMPONENT"));
100 aName->SetValue( QAD_Application::getDesktop()->getComponentUserName( "SMESH" ) );
101 anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributePixMap");
102 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
103 aPixmap->SetPixMap( "ICON_OBJBROWSER_SMESH" );
104 myStudyBuilder->DefineComponentInstance(father, CompMesh );
105 if (aLocked) myStudy->GetProperties()->SetLocked(true);
108 Tag_HypothesisRoot = 1;
109 Tag_AlgorithmsRoot = 2;
112 Tag_RefOnAppliedHypothesis = 2;
113 Tag_RefOnAppliedAlgorithms = 3;
115 Tag_SubMeshOnVertex = 4;
116 Tag_SubMeshOnEdge = 5;
117 Tag_SubMeshOnFace = 6;
118 Tag_SubMeshOnSolid = 7;
119 Tag_SubMeshOnCompound = 8;
122 SMESH_Swig::~SMESH_Swig()
124 MESSAGE("Destructeur");
128 const char* SMESH_Swig::AddNewMesh(const char* IOR)
130 MESSAGE("AddNewMesh");
131 //Find or Create Hypothesis root
132 SALOMEDS::GenericAttribute_var anAttr;
133 SALOMEDS::AttributeName_var aName;
134 SALOMEDS::AttributeIOR_var anIOR;
135 SALOMEDS::AttributeSelectable_var aSelAttr;
136 SALOMEDS::AttributePixMap_var aPixmap;
138 SALOMEDS::SObject_var HypothesisRoot;
139 if (!mySComponentMesh->FindSubObject (Tag_HypothesisRoot, HypothesisRoot)) {
140 HypothesisRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot);
141 anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeName");
142 aName = SALOMEDS::AttributeName::_narrow(anAttr);
143 aName->SetValue(QObject::tr("SMESH_MEN_HYPOTHESIS"));
144 anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributePixMap");
145 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
146 aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" );
147 anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable");
148 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
149 aSelAttr->SetSelectable(false);
152 SALOMEDS::SObject_var AlgorithmsRoot;
153 if (!mySComponentMesh->FindSubObject (Tag_AlgorithmsRoot, AlgorithmsRoot)) {
154 AlgorithmsRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot);
155 anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeName");
156 aName = SALOMEDS::AttributeName::_narrow(anAttr);
157 aName->SetValue(QObject::tr("SMESH_MEN_ALGORITHMS"));
158 anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap");
159 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
160 aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" );
161 anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable");
162 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
163 aSelAttr->SetSelectable(false);
167 SALOMEDS::SObject_var newMesh = myStudyBuilder->NewObject(mySComponentMesh);
168 anAttr = myStudyBuilder->FindOrCreateAttribute(newMesh, "AttributePixMap");
169 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
170 aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH" );
171 anAttr = myStudyBuilder->FindOrCreateAttribute(newMesh, "AttributeIOR");
172 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
173 anIOR->SetValue(IOR);
174 return SALOMEDS::SObject::_narrow( newMesh )->GetID();
177 const char* SMESH_Swig::AddNewHypothesis(const char* IOR)
179 MESSAGE("AddNewHypothesis");
180 //Find or Create Hypothesis root
181 SALOMEDS::SObject_var HypothesisRoot;
182 SALOMEDS::GenericAttribute_var anAttr;
183 SALOMEDS::AttributeName_var aName;
184 SALOMEDS::AttributeIOR_var anIOR;
185 SALOMEDS::AttributeSelectable_var aSelAttr;
186 SALOMEDS::AttributePixMap_var aPixmap;
188 if (!mySComponentMesh->FindSubObject (Tag_HypothesisRoot, HypothesisRoot)) {
189 HypothesisRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot);
190 anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeName");
191 aName = SALOMEDS::AttributeName::_narrow(anAttr);
192 aName->SetValue(QObject::tr("SMESH_MEN_HYPOTHESIS"));
193 anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable");
194 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
195 aSelAttr->SetSelectable(false);
196 anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributePixMap");
197 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
198 aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" );
200 // Add New Hypothesis
201 SALOMEDS::SObject_var newHypo = myStudyBuilder->NewObject(HypothesisRoot);
202 anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributePixMap");
203 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
204 SMESH::SMESH_Hypothesis_var H = SMESH::SMESH_Hypothesis::_narrow( StringToObject(IOR) );
205 QString aType = H->GetName();
206 aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_" + aType );
207 // if ( aType.compare("LocalLength") == 0 )
208 // aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_LENGTH" );
209 // else if ( aType.compare("NumberOfSegments") == 0 )
210 // aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_SEGMENT" );
211 // else if ( aType.compare("MaxElementArea") == 0 )
212 // aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_AREA" );
213 // else if ( aType.compare("MaxElementVolume") == 0 )
214 // aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_VOLUME" );
215 anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributeIOR");
216 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
217 anIOR->SetValue(IOR);
218 return SALOMEDS::SObject::_narrow(newHypo)->GetID();
221 const char* SMESH_Swig::AddNewAlgorithms(const char* IOR)
223 MESSAGE("AddNewAlgorithms");
224 //Find or Create Algorithms root
225 SALOMEDS::SObject_var AlgorithmsRoot;
226 SALOMEDS::GenericAttribute_var anAttr;
227 SALOMEDS::AttributeName_var aName;
228 SALOMEDS::AttributeIOR_var anIOR;
229 SALOMEDS::AttributeSelectable_var aSelAttr;
230 SALOMEDS::AttributePixMap_var aPixmap;
232 if (!mySComponentMesh->FindSubObject (Tag_AlgorithmsRoot, AlgorithmsRoot)) {
233 AlgorithmsRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot);
234 anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeName");
235 aName = SALOMEDS::AttributeName::_narrow(anAttr);
236 aName->SetValue(QObject::tr("SMESH_MEN_ALGORITHMS"));
237 anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable");
238 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
239 aSelAttr->SetSelectable(false);
240 anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap");
241 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
242 aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" );
244 // Add New Algorithms
245 SALOMEDS::SObject_var newHypo = myStudyBuilder->NewObject(AlgorithmsRoot);
246 anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributePixMap");
247 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
248 SMESH::SMESH_Hypothesis_var H = SMESH::SMESH_Hypothesis::_narrow( StringToObject(IOR) );
249 QString aType = H->GetName();
250 aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_" + aType );
251 // if ( aType.compare("Regular_1D") == 0 )
252 // aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_REGULAR" );
253 // else if ( aType.compare("MEFISTO_2D") == 0 )
254 // aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_MEFISTO" );
255 // else if ( aType.compare("Quadrangle_2D") == 0 )
256 // aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_QUAD" );
257 // else if ( aType.compare("Hexa_3D") == 0 )
258 // aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_HEXA" );
259 anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributeIOR");
260 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
261 anIOR->SetValue(IOR);
262 return SALOMEDS::SObject::_narrow(newHypo)->GetID();
265 void SMESH_Swig::SetShape(const char* ShapeEntry, const char* MeshEntry)
267 SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( MeshEntry );
268 SALOMEDS::SObject_var SO_GeomShape = myStudy->FindObjectID( ShapeEntry );
270 if ( !SO_MorSM->_is_nil() && !SO_GeomShape->_is_nil() ) {
271 SALOMEDS::SObject_var SO = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnShape);
272 myStudyBuilder->Addreference (SO,SO_GeomShape);
276 void SMESH_Swig::SetHypothesis(const char* Mesh_Or_SubMesh_Entry, const char* Hypothesis_Entry)
278 SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( Mesh_Or_SubMesh_Entry );
279 SALOMEDS::SObject_var SO_Hypothesis = myStudy->FindObjectID( Hypothesis_Entry );
280 SALOMEDS::GenericAttribute_var anAttr;
281 SALOMEDS::AttributeName_var aName;
282 SALOMEDS::AttributeSelectable_var aSelAttr;
283 SALOMEDS::AttributePixMap_var aPixmap;
285 if ( !SO_MorSM->_is_nil() && !SO_Hypothesis->_is_nil() ) {
287 //Find or Create Applied Hypothesis root
288 SALOMEDS::SObject_var AHR;
289 if (!SO_MorSM->FindSubObject (Tag_RefOnAppliedHypothesis, AHR)) {
290 AHR = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnAppliedHypothesis);
291 anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeName");
292 aName = SALOMEDS::AttributeName::_narrow(anAttr);
293 aName->SetValue(QObject::tr("SMESH_MEN_APPLIED_HYPOTHESIS"));
294 anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeSelectable");
295 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
296 aSelAttr->SetSelectable(false);
297 anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributePixMap");
298 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
299 aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" );
301 SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR);
302 myStudyBuilder->Addreference (SO,SO_Hypothesis);
305 void SMESH_Swig::SetAlgorithms(const char* Mesh_Or_SubMesh_Entry, const char* Algorithms_Entry)
307 SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( Mesh_Or_SubMesh_Entry );
308 SALOMEDS::SObject_var SO_Algorithms = myStudy->FindObjectID( Algorithms_Entry );
309 SALOMEDS::GenericAttribute_var anAttr;
310 SALOMEDS::AttributeName_var aName;
311 SALOMEDS::AttributeSelectable_var aSelAttr;
312 SALOMEDS::AttributePixMap_var aPixmap;
314 if ( !SO_MorSM->_is_nil() && !SO_Algorithms->_is_nil() ) {
315 //Find or Create Applied Algorithms root
316 SALOMEDS::SObject_var AHR;
317 if (!SO_MorSM->FindSubObject (Tag_RefOnAppliedAlgorithms, AHR)) {
318 AHR = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnAppliedAlgorithms);
319 anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeName");
320 aName = SALOMEDS::AttributeName::_narrow(anAttr);
321 aName->SetValue(QObject::tr("SMESH_MEN_APPLIED_ALGORIHTMS"));
322 anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeSelectable");
323 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
324 aSelAttr->SetSelectable(false);
325 anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributePixMap");
326 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
327 aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" );
329 SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR);
330 myStudyBuilder->Addreference (SO,SO_Algorithms);
334 void SMESH_Swig::UnSetHypothesis(const char* Applied_Hypothesis_Entry )
336 SALOMEDS::SObject_var SO_Applied_Hypothesis = myStudy->FindObjectID( Applied_Hypothesis_Entry );
337 if ( !SO_Applied_Hypothesis->_is_nil() )
338 myStudyBuilder->RemoveObject(SO_Applied_Hypothesis);
342 const char* SMESH_Swig::AddSubMesh(const char* SO_Mesh_Entry, const char* SM_IOR, int ST)
344 SALOMEDS::SObject_var SO_Mesh = myStudy->FindObjectID( SO_Mesh_Entry );
345 if ( !SO_Mesh->_is_nil() ) {
348 Standard_CString Name;
350 if (ST == TopAbs_SOLID) {Tag_Shape = Tag_SubMeshOnSolid; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnSolid"));}
351 else if (ST == TopAbs_FACE) {Tag_Shape = Tag_SubMeshOnFace; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnFace"));}
352 else if (ST == TopAbs_EDGE) {Tag_Shape = Tag_SubMeshOnEdge; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnEdge"));}
353 else if (ST == TopAbs_VERTEX){Tag_Shape = Tag_SubMeshOnVertex; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnVertex"));}
355 Tag_Shape = Tag_SubMeshOnCompound; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnCompound"));
357 SALOMEDS::SObject_var SubmeshesRoot;
358 SALOMEDS::GenericAttribute_var anAttr;
359 SALOMEDS::AttributeName_var aName;
360 SALOMEDS::AttributeIOR_var anIOR;
361 SALOMEDS::AttributeSelectable_var aSelAttr;
362 if (!SO_Mesh->FindSubObject (Tag_Shape,SubmeshesRoot )) {
363 SubmeshesRoot = myStudyBuilder->NewObjectToTag (SO_Mesh, Tag_Shape);
364 anAttr = myStudyBuilder->FindOrCreateAttribute(SubmeshesRoot, "AttributeName");
365 aName = SALOMEDS::AttributeName::_narrow(anAttr);
366 aName->SetValue(Name);
367 anAttr = myStudyBuilder->FindOrCreateAttribute(SubmeshesRoot, "AttributeSelectable");
368 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
369 aSelAttr->SetSelectable(false);
371 SALOMEDS::SObject_var SO = myStudyBuilder->NewObject (SubmeshesRoot);
372 anAttr = myStudyBuilder->FindOrCreateAttribute(SO, "AttributeIOR");
373 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
374 anIOR->SetValue(SM_IOR);
375 return SALOMEDS::SObject::_narrow( SO )->GetID();
380 const char* SMESH_Swig::AddSubMeshOnShape(const char* Mesh_Entry, const char* GeomShape_Entry,
381 const char* SM_IOR, int ST)
383 SALOMEDS::SObject_var SO_GeomShape = myStudy->FindObjectID( GeomShape_Entry );
384 if ( !SO_GeomShape->_is_nil() ) {
385 const char * SM_Entry = AddSubMesh (Mesh_Entry,SM_IOR,ST);
386 SALOMEDS::SObject_var SO_SM = myStudy->FindObjectID( SM_Entry );
387 if ( !SO_SM->_is_nil() ) {
388 SetShape (GeomShape_Entry, SM_Entry);
389 return SALOMEDS::SObject::_narrow( SO_SM )->GetID();
395 void SMESH_Swig::CreateAndDisplayActor( const char* Mesh_Entry )
397 // SMESH_Actor* Mesh = smeshGUI->ReadScript(aM);
400 void SMESH_Swig::SetName(const char* Entry, const char* Name)
402 SALOMEDS::SObject_var SO = myStudy->FindObjectID( Entry );
403 SALOMEDS::GenericAttribute_var anAttr;
404 SALOMEDS::AttributeName_var aName;
405 if ( !SO->_is_nil() ) {
406 anAttr = myStudyBuilder->FindOrCreateAttribute(SO, "AttributeName");
407 aName = SALOMEDS::AttributeName::_narrow(anAttr);
408 aName->SetValue(Name);
413 void SMESH_Swig::setOrb()
416 ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance();
417 ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
418 _orb = init( 0 , 0 );
420 INFOS("internal error : orb not found");
423 ASSERT(! CORBA::is_nil(_orb));