Salome HOME
Join BR-D5-38-2003
[modules/geom.git] / src / GEOMGUI / GeometryGUI_Swig.cxx
1 //  GEOM GEOMGUI : GUI for Geometry 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   : GeometryGUI_Swig.cxx
25 //  Author : Nicolas REJNERI, Paul RASCLE
26 //  Module : GEOM
27 //  $Header$
28
29 #include "GeometryGUI_Swig.hxx"
30 #include "SALOMEGUI_Swig.hxx"
31
32 #include "GeometryGUI.h"
33
34 #include "SUIT_Session.h"
35 #include "SalomeApp_Application.h"
36 #include "SalomeApp_Study.h"
37 #include "SalomeApp_ImportOperation.h"
38
39 #include "OB_Browser.h"
40
41 #include "OCCViewer_ViewWindow.h"
42 #include "OCCViewer_ViewManager.h"
43 #include "SOCC_ViewModel.h"
44
45 #include "SVTK_ViewModel.h"
46 #include "SVTK_ViewWindow.h"
47 #include "SVTK_View.h"
48
49 #include "GEOM_Actor.h"
50 #include "GEOM_Client.hxx"
51 #include "GEOM_AISShape.hxx"
52 #include "GEOM_AssemblyBuilder.h"
53 #include "GEOM_InteractiveObject.hxx"
54
55 #include "SALOME_Event.hxx"
56
57 #include "utilities.h"
58
59 #include "SALOMEDSClient.hxx"
60
61 // OCCT Includes
62 #include <TopExp_Explorer.hxx>
63 #include <TopTools_MapOfShape.hxx>
64 #include <TopTools_ListOfShape.hxx>
65 #include <TopTools_ListIteratorOfListOfShape.hxx>
66 #include <BRepAdaptor_Surface.hxx>
67 #include <BRepAdaptor_Curve.hxx>
68 #include <GeomAbs_CurveType.hxx>
69 #include <GeomAbs_SurfaceType.hxx>
70 #include <TopoDS.hxx>
71 #include <TopoDS_Edge.hxx>
72 #include <TopoDS_Face.hxx>
73 #include <TopoDS_Iterator.hxx>
74 #include <AIS_ListOfInteractive.hxx>
75 #include <AIS_ListIteratorOfListOfInteractive.hxx>
76 #include <V3d_Viewer.hxx>
77
78 using namespace std;
79
80
81 static GEOM_Client ShapeReader;
82
83 inline OCCViewer_Viewer* GetOCCViewer(SUIT_Application* theApp){
84   SUIT_ViewWindow* window = theApp->desktop()->activeWindow();
85   if(window && window->getViewManager()->getType() == OCCViewer_Viewer::Type()){
86     OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
87     if ( vw ) {
88       OCCViewer_ViewManager* vm = dynamic_cast<OCCViewer_ViewManager*>( vw->getViewManager() );
89       if ( vm )
90         return vm->getOCCViewer();
91     }
92   }
93
94   return 0;
95 }
96
97 inline SVTK_ViewWindow* GetSVTKViewWindow(SUIT_Application* theApp){
98   SUIT_ViewWindow* window = theApp->desktop()->activeWindow();
99   if(window && window->getViewManager()->getType() == SVTK_Viewer::Type())
100     return dynamic_cast<SVTK_ViewWindow*>( window );
101
102   return 0;
103 }
104
105 GEOM_Swig::GEOM_Swig()
106 {
107   // MESSAGE("Constructeur");
108 }
109
110 GEOM_Swig::~GEOM_Swig()
111 {
112   // MESSAGE("Destructeur");
113 }
114
115 void GEOM_Swig::createAndDisplayGO (const char* Entry)
116 {
117   class TEvent: public SALOME_Event
118   {
119     std::string myEntry;
120   public:
121     TEvent(const char* theEntry):
122       myEntry(theEntry)
123     {}
124     virtual void Execute()
125     {
126       SUIT_Application* app = SUIT_Session::session()->activeApplication();
127       if (!app) return;
128
129       SalomeApp_Study* ActiveStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
130       if (!ActiveStudy) return;
131
132       _PTR(Study) aStudy(ActiveStudy->studyDS());
133       _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder();
134
135       GEOM::GEOM_Gen_var Geom = GeometryGUI::GetGeomGen();
136       if (CORBA::is_nil(Geom)) {
137         GeometryGUI::InitGeomGen();
138         Geom = GeometryGUI::GetGeomGen();
139       }
140       if (CORBA::is_nil(Geom))
141         return;
142
143       string aFatherIOR;
144       _PTR(SComponent) father = aStudy->FindComponent("GEOM");
145       if (!father)
146         return;
147       if (!father->ComponentIOR(aFatherIOR)) {
148         aStudyBuilder->LoadWith(father, SalomeApp_Application::orb()->object_to_string(Geom));
149         father->ComponentIOR(aFatherIOR);
150       }
151
152       _PTR(SObject) obj = aStudy->FindObjectID(myEntry);
153       if (!obj)
154         return;
155
156       // Create new actor
157       _PTR(GenericAttribute) anAttr;
158       if (!obj->FindAttribute(anAttr, "AttributeIOR"))
159         return;
160       _PTR(AttributeIOR) anIOR(anAttr);
161       string anIORValue = anIOR->Value();
162
163       GEOM::GEOM_Object_var aShape = Geom->GetIORFromString(anIORValue.c_str());
164       TopoDS_Shape Shape = ShapeReader.GetShape(Geom,aShape);
165       if (!Shape.IsNull()) {
166         if (obj->FindAttribute(anAttr, "AttributeName")) {
167           _PTR(AttributeName) aName (anAttr);
168           string aNameValue = aName->Value();
169           // open transaction
170           /*SUIT_Operation* op = new SalomeApp_ImportOperation (app);
171           op->start();
172
173           _PTR(SObject) newObj1 = aStudyBuilder->NewObject(father);
174           aStudyBuilder->Addreference(newObj1, obj);
175           // commit transaction
176           op->commit();*/
177           Handle(GEOM_InteractiveObject) anIO =
178             new GEOM_InteractiveObject (const_cast<char*>(anIORValue.c_str()),
179                                         const_cast<char*>(aFatherIOR.c_str()),
180                                         "GEOM",
181                                         const_cast<char*>( obj->GetID().c_str()));
182
183           if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) {
184             SVTK_View* aView = aViewWindow->getView();
185             int aMode = aView->GetDisplayMode();
186
187             vtkActorCollection* theActors =
188               GEOM_AssemblyBuilder::BuildActors(Shape,0,aMode,true);
189             theActors->InitTraversal();
190             while (vtkActor* anActor = theActors->GetNextActor()) {
191               GEOM_Actor* GActor = GEOM_Actor::SafeDownCast(anActor);
192               GActor->setName(const_cast<char*>(aNameValue.c_str()));
193               GActor->setIO(anIO);
194               aView->Display(GActor);
195             }
196             aView->Repaint();
197           } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app)) {
198             Handle(AIS_InteractiveContext) ic = occViewer->getAISContext();
199             Handle(GEOM_AISShape) aSh =
200               new GEOM_AISShape (Shape,const_cast<char*>(aNameValue.c_str()));
201             aSh->setName(const_cast<char*>(aNameValue.c_str()));
202             aSh->setIO(anIO);
203             ic->Display(aSh);
204             ic->AddOrRemoveCurrentObject(aSh,true);
205           }
206           // update object browser
207           SalomeApp_Application* app = NULL; //dynamic_cast<SalomeApp_Application*>(app);
208           if (app) {
209             CAM_Module* module = app->module("Geometry");
210             SalomeApp_Module* appMod = dynamic_cast<SalomeApp_Module*>(module);
211             if (appMod)
212               appMod->updateObjBrowser(true);
213           }
214         }
215       }
216     }
217   };
218
219   // MESSAGE("createAndDisplayGO");
220   ProcessVoidEvent(new TEvent (Entry));
221
222   class TEventUpdateBrowser: public SALOME_Event
223     {
224       public:
225         TEventUpdateBrowser() {}
226         virtual void Execute() {
227           SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
228           if (app) {
229             CAM_Module* module = app->module("Geometry");
230             SalomeApp_Module* appMod = dynamic_cast<SalomeApp_Module*>(module);
231             if (appMod) appMod->updateObjBrowser(true);
232           }
233         }
234     };
235
236   ProcessVoidEvent(new TEventUpdateBrowser ());
237 }
238
239
240 int  GEOM_Swig::getIndexTopology(const char* SubIOR, const char* IOR)
241 {
242   GEOM::GEOM_Gen_var Geom   = GeometryGUI::GetGeomGen();
243   if ( CORBA::is_nil( Geom ) )
244     return -1;
245
246   GEOM::GEOM_Object_var aMainShape = Geom->GetIORFromString(IOR);
247   TopoDS_Shape shape = ShapeReader.GetShape(Geom, aMainShape);
248
249   GEOM::GEOM_Object_var aSubShape = Geom->GetIORFromString(SubIOR);
250   TopoDS_Shape subshape = ShapeReader.GetShape(Geom, aSubShape);
251
252   int index = 1;
253   if(subshape.ShapeType() == TopAbs_COMPOUND) {
254     TopoDS_Iterator it;
255     TopTools_ListOfShape CL;
256     CL.Append(shape);
257     TopTools_ListIteratorOfListOfShape itC;
258     for(itC.Initialize(CL); itC.More(); itC.Next()) {
259       for(it.Initialize(itC.Value()); it.More(); it.Next()) {
260         if (it.Value().ShapeType() == TopAbs_COMPOUND) {
261           if (it.Value().IsSame(subshape))
262             return index;
263           else
264             index++;
265           CL.Append(it.Value());
266         }
267       }
268     }
269   }
270   else {
271     TopExp_Explorer Exp(shape, subshape.ShapeType());
272     TopTools_MapOfShape M;
273     while(Exp.More()) {
274       if(M.Add(Exp.Current())) {
275         if(Exp.Current().IsSame(subshape))
276           return index;
277         index++;
278       }
279       Exp.Next();
280     }
281   }
282
283   return -1;
284 }
285
286 const char* GEOM_Swig::getShapeTypeString(const char* IOR)
287 {
288   GEOM::GEOM_Gen_var Geom   = GeometryGUI::GetGeomGen();
289   if ( CORBA::is_nil( Geom ) )
290     return 0;
291
292   GEOM::GEOM_Object_var aShape = Geom->GetIORFromString(IOR);
293   TopoDS_Shape shape    = ShapeReader.GetShape(Geom, aShape);
294
295   if( shape.IsNull() ) {
296     return "Null Shape" ;
297   }
298
299   switch (shape.ShapeType() )
300   {
301   case TopAbs_COMPOUND:
302     { return "Compound" ;}
303   case  TopAbs_COMPSOLID:
304     { return "Compound Solid" ;}
305   case TopAbs_SOLID:
306     { return "Solid" ;}
307   case TopAbs_SHELL:
308     { return "Shell" ;}
309   case TopAbs_FACE:
310     {
311       BRepAdaptor_Surface surf(TopoDS::Face(shape));
312       if ( surf.GetType() == GeomAbs_Plane ) {
313         return "Plane" ;
314       } else if ( surf.GetType() == GeomAbs_Cylinder ) {
315         return "Cylindrical Face" ;
316       } else if ( surf.GetType() == GeomAbs_Sphere ) {
317         return "Spherical Face" ;
318       } else if ( surf.GetType() == GeomAbs_Torus ) {
319         return "Toroidal Face" ;
320       } else if ( surf.GetType() == GeomAbs_Cone ) {
321         return "Conical Face" ;
322       } else {
323         return "GEOM::FACE" ;
324       }
325     }
326   case TopAbs_WIRE:
327     { return "Wire" ;}
328   case TopAbs_EDGE:
329     {
330       BRepAdaptor_Curve curv(TopoDS::Edge(shape));
331       if ( curv.GetType() == GeomAbs_Line ) {
332         if ( (Abs(curv.FirstParameter()) >= 1E6 ) ||
333              (Abs(curv.LastParameter()) >= 1E6 )) {
334           return "Line" ;
335         } else
336           return "Edge" ;
337       } else if ( curv.GetType() == GeomAbs_Circle ) {
338         if ( curv.IsClosed() )
339           return "Circle" ;
340         else
341           return "Arc" ;
342       } else {
343         return "Edge" ;
344       }
345     }
346   case TopAbs_VERTEX:
347     { return "Vertex" ;}
348   case TopAbs_SHAPE:
349     { return "Shape" ;}
350   }
351   return 0;
352 }
353
354
355 const char* GEOM_Swig::getShapeTypeIcon(const char* IOR)
356 {
357   GEOM::GEOM_Gen_var Geom   = GeometryGUI::GetGeomGen();
358   if ( CORBA::is_nil( Geom ) )
359     return "None";
360
361   GEOM::GEOM_Object_var aShape = Geom->GetIORFromString(IOR);
362   TopoDS_Shape shape = ShapeReader.GetShape(Geom, aShape);
363
364   if( shape.IsNull() ) {
365     return "None" ;
366   }
367
368   switch (shape.ShapeType() )
369     {
370     case TopAbs_COMPOUND:
371       { return "ICON_OBJBROWSER_COMPOUND" ;}
372     case  TopAbs_COMPSOLID:
373       { return "ICON_OBJBROWSER_COMPSOLID" ;}
374     case TopAbs_SOLID:
375       { return "ICON_OBJBROWSER_SOLID" ;}
376     case TopAbs_SHELL:
377       { return "ICON_OBJBROWSER_SHELL" ;}
378     case TopAbs_FACE:
379       { return "ICON_OBJBROWSER_FACE" ;}
380     case TopAbs_WIRE:
381       { return "ICON_OBJBROWSER_WIRE" ;}
382     case TopAbs_EDGE:
383       { return "ICON_OBJBROWSER_EDGE" ;}
384     case TopAbs_VERTEX:
385       { return "ICON_OBJBROWSER_VERTEX" ;}
386     }
387
388   return "None";
389 }
390
391 void GEOM_Swig::setDisplayMode(const char* theEntry, int theMode)
392 {
393   SUIT_Application* app = SUIT_Session::session()->activeApplication();
394   if ( !app ) return;
395
396   Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(theEntry, "GEOM", "");
397
398   class TEvent: public SALOME_Event{
399     SUIT_Application* myApp;
400     Handle(SALOME_InteractiveObject) myIO;
401     int myParam;
402   public:
403     TEvent(SUIT_Application* theApp, const Handle(SALOME_InteractiveObject)& theIO, int theParam):
404       myApp(theApp), myIO(theIO), myParam(theParam)
405     {}
406     virtual void Execute(){
407       if(SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(myApp)){
408         SVTK_View* aView = aViewWindow->getView();
409         aView->SetDisplayMode(myIO,myParam);
410         aView->Repaint();
411       }
412       else if(OCCViewer_Viewer* occViewer = GetOCCViewer(myApp)) {
413         SOCC_Viewer* soccViewer = dynamic_cast<SOCC_Viewer*>( occViewer );
414         if (soccViewer)
415           soccViewer->switchRepresentation(myIO,myParam);
416       }
417     }
418   };
419
420   ProcessVoidEvent(new TEvent(app,anIO,theMode));
421 }
422
423 void GEOM_Swig::setColor(const char* theEntry, int red, int green, int blue)
424 {
425   SUIT_Application* app = SUIT_Session::session()->activeApplication();
426   if ( !app ) return;
427
428   Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(theEntry, "GEOM", "");
429
430   QColor aColor(red,green,blue);
431
432   class TEvent: public SALOME_Event{
433     SUIT_Application* myApp;
434     Handle(SALOME_InteractiveObject) myIO;
435     QColor myParam;
436   public:
437     TEvent(SUIT_Application* theApp, const Handle(SALOME_InteractiveObject)& theIO, const QColor& theParam):
438       myApp(theApp), myIO(theIO), myParam(theParam)
439     {}
440     virtual void Execute(){
441       if(SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(myApp)){
442         SVTK_View* aView = aViewWindow->getView();
443         aView->SetColor(myIO,myParam);
444         aView->Repaint();
445       }else if(OCCViewer_Viewer* occViewer = GetOCCViewer(myApp)){
446         Handle(AIS_InteractiveContext) ic = occViewer->getAISContext();
447         AIS_ListOfInteractive List;
448         ic->DisplayedObjects(List);
449         AIS_ListIteratorOfListOfInteractive ite(List);
450         for ( ; ite.More(); ite.Next() ) {
451           Handle(SALOME_InteractiveObject) anObj =
452             Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() );
453           if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( myIO ) ) {
454             Quantity_Color CSFColor = Quantity_Color ( myParam.red()   / 255.,
455                                                        myParam.green() / 255.,
456                                                        myParam.blue()  / 255.,
457                                                        Quantity_TOC_RGB );
458             ite.Value()->SetColor( CSFColor );
459             if ( ite.Value()->IsKind( STANDARD_TYPE(GEOM_AISShape) ) )
460               Handle(GEOM_AISShape)::DownCast( ite.Value() )->SetShadingColor( CSFColor );
461             ite.Value()->Redisplay( Standard_True );
462             occViewer->update();
463             break;
464           }
465         }
466       }
467     }
468   };
469   ProcessVoidEvent(new TEvent(app,anIO,aColor));
470 }
471
472 void GEOM_Swig::setTransparency(const char* theEntry, float transp)
473 {
474   SUIT_Application* app = SUIT_Session::session()->activeApplication();
475   if ( !app ) return;
476
477   Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(theEntry, "GEOM", "");
478
479   class TEvent: public SALOME_Event{
480     SUIT_Application* myApp;
481     Handle(SALOME_InteractiveObject) myIO;
482     float myParam;
483   public:
484     TEvent(SUIT_Application* theApp, const Handle(SALOME_InteractiveObject)& theIO, float theParam):
485       myApp(theApp), myIO(theIO), myParam(theParam)
486     {}
487     virtual void Execute(){
488       if(SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(myApp)){
489         SVTK_View* aView = aViewWindow->getView();
490         aView->SetTransparency(myIO,myParam);
491         aView->Repaint();
492       }else if(OCCViewer_Viewer* occViewer = GetOCCViewer(myApp)) {
493         SOCC_Viewer* soccViewer = dynamic_cast<SOCC_Viewer*>( occViewer );
494         if (soccViewer)
495           soccViewer->setTransparency(myIO,myParam);
496       }
497     }
498   };
499
500   ProcessVoidEvent(new TEvent(app,anIO,transp));
501 }
502
503
504 bool GEOM_Swig::initGeomGen()
505 {
506   return GeometryGUI::InitGeomGen();
507 }