]> SALOME platform Git repositories - modules/geom.git/blob - src/GEOMGUI/GeometryGUI_Swig.cxx
Salome HOME
Fix for bug PAL13107 ( EDF248 - GEOM - UpdateViewer on python functions ).
[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.salome-platform.org/ or email : webmaster.salome@opencascade.com
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 #include "SVTK_Renderer.h"
49
50 #include "GEOM_Actor.h"
51 #include "GEOM_Client.hxx"
52 #include "GEOM_AISShape.hxx"
53 #include "GEOM_AssemblyBuilder.h"
54 #include "GEOM_InteractiveObject.hxx"
55 #include "GEOM_Displayer.h"
56
57 #include "SALOME_Event.hxx"
58
59 #include "utilities.h"
60
61 #include "SALOMEDSClient.hxx"
62
63 // OCCT Includes
64 #include <TopAbs.hxx>
65 #include <TopoDS_Shape.hxx>
66 #include <AIS_ListOfInteractive.hxx>
67 #include <AIS_ListIteratorOfListOfInteractive.hxx>
68 #include <AIS_Drawer.hxx>
69
70 // IDL Headers
71 #include <SALOMEconfig.h>
72 #include CORBA_SERVER_HEADER(GEOM_Gen)
73
74 #include <vtkRenderer.h>
75
76 using namespace std;
77
78
79 static GEOM_Client ShapeReader;
80
81 inline OCCViewer_Viewer* GetOCCViewer(SUIT_Application* theApp){
82   SUIT_ViewWindow* window = theApp->desktop()->activeWindow();
83   if(window && window->getViewManager()->getType() == OCCViewer_Viewer::Type()){
84     OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
85     if ( vw ) {
86       OCCViewer_ViewManager* vm = dynamic_cast<OCCViewer_ViewManager*>( vw->getViewManager() );
87       if ( vm )
88         return vm->getOCCViewer();
89     }
90   }
91
92   return 0;
93 }
94
95 inline SVTK_ViewWindow* GetSVTKViewWindow(SUIT_Application* theApp){
96   SUIT_ViewWindow* window = theApp->desktop()->activeWindow();
97   if(window && window->getViewManager()->getType() == SVTK_Viewer::Type())
98     return dynamic_cast<SVTK_ViewWindow*>( window );
99
100   return 0;
101 }
102
103 GEOM_Swig::GEOM_Swig()
104 {
105   // MESSAGE("Constructeur");
106 }
107
108 GEOM_Swig::~GEOM_Swig()
109 {
110   // MESSAGE("Destructeur");
111 }
112
113 void GEOM_Swig::createAndDisplayGO (const char* Entry, bool isUpdated)
114 {
115   class TEvent: public SALOME_Event
116   {
117     std::string myEntry;
118     bool        myUpdateViewer;
119   public:
120     TEvent(const char* theEntry, bool toUpdateViewer):
121       myEntry(theEntry),
122       myUpdateViewer(toUpdateViewer)
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           GEOM_Displayer(ActiveStudy).Display(anIO, myUpdateViewer);
184           /*if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) {
185             SVTK_View* aView = aViewWindow->getView();
186             int aMode = aView->GetDisplayMode();
187
188             vtkActorCollection* theActors =
189               GEOM_AssemblyBuilder::BuildActors(Shape,0,aMode,true);
190             theActors->InitTraversal();
191             while (vtkActor* anActor = theActors->GetNextActor()) {
192               GEOM_Actor* GActor = GEOM_Actor::SafeDownCast(anActor);
193               GActor->setName(const_cast<char*>(aNameValue.c_str()));
194               GActor->setIO(anIO);
195               aView->Display(GActor);
196             }
197             aView->Repaint();
198           } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app)) {
199             Handle(AIS_InteractiveContext) ic = occViewer->getAISContext();
200             Handle(GEOM_AISShape) aSh =
201               new GEOM_AISShape (Shape,const_cast<char*>(aNameValue.c_str()));
202             aSh->setName(const_cast<char*>(aNameValue.c_str()));
203             aSh->setIO(anIO);
204             ic->Display(aSh);
205             ic->AddOrRemoveCurrentObject(aSh,true);
206             }*/
207           // update object browser
208           SalomeApp_Application* app = NULL; //dynamic_cast<SalomeApp_Application*>(app);
209           if (app) {
210             CAM_Module* module = app->module("Geometry");
211             SalomeApp_Module* appMod = dynamic_cast<SalomeApp_Module*>(module);
212             if (appMod)
213               appMod->updateObjBrowser(true);
214           }
215         }
216       }
217     }
218   };
219
220   // MESSAGE("createAndDisplayGO");
221   ProcessVoidEvent(new TEvent (Entry, isUpdated));
222
223   class TEventUpdateBrowser: public SALOME_Event
224     {
225       public:
226         TEventUpdateBrowser() {}
227         virtual void Execute() {
228           SalomeApp_Application* app =
229             dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
230           if (app) {
231             CAM_Module* module = app->module("Geometry");
232             SalomeApp_Module* appMod = dynamic_cast<SalomeApp_Module*>(module);
233             if (appMod) appMod->updateObjBrowser(true);
234           }
235         }
236     };
237
238   if (isUpdated)
239     ProcessVoidEvent(new TEventUpdateBrowser ());
240 }
241
242 void GEOM_Swig::createAndDisplayFitAllGO (const char* Entry)
243 {
244   class TEventFitAll: public SALOME_Event
245   {
246     public:
247       TEventFitAll() {}
248       virtual void Execute() {
249         SUIT_Application* app = SUIT_Session::session()->activeApplication();
250         if (!app) return;
251         
252         if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app))
253           {
254             SVTK_View* aView = aViewWindow->getView();
255             aView->GetRenderer()->OnFitAll();
256           }
257         else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app))
258           {  
259             Handle(V3d_Viewer) aViewer3d = occViewer->getViewer3d();
260             aViewer3d->InitActiveViews();
261             
262             if (aViewer3d->MoreActiveViews())
263               aViewer3d->ActiveView()->FitAll();
264           }
265       }
266   };
267
268   createAndDisplayGO(Entry);
269   ProcessVoidEvent(new TEventFitAll());
270 }
271
272 int GEOM_Swig::getIndexTopology(const char* SubIOR, const char* IOR)
273 {
274   GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen();
275   if (CORBA::is_nil(aGeomGen))
276     return -1;
277
278   GEOM::GEOM_Object_var aMainShape = aGeomGen->GetIORFromString(IOR);
279   GEOM::GEOM_Object_var aSubShape  = aGeomGen->GetIORFromString(SubIOR);
280   if (CORBA::is_nil(aMainShape) || CORBA::is_nil(aSubShape))
281     return -1;
282
283   GEOM::GEOM_IShapesOperations_var anIShapesOperations =
284     aGeomGen->GetIShapesOperations(aMainShape->GetStudyID());
285   if (CORBA::is_nil(anIShapesOperations))
286     return -1;
287
288   return anIShapesOperations->GetTopologyIndex(aMainShape, aSubShape);
289 }
290
291 const char* GEOM_Swig::getShapeTypeString(const char* IOR)
292 {
293   TCollection_AsciiString aTypeName ("Shape of unknown type");
294
295   GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen();
296   if (!CORBA::is_nil(aGeomGen))
297   {
298     GEOM::GEOM_Object_var aShape = aGeomGen->GetIORFromString(IOR);
299     if (!CORBA::is_nil(aShape))
300     {
301       GEOM::GEOM_IShapesOperations_var anIShapesOperations =
302         aGeomGen->GetIShapesOperations(aShape->GetStudyID());
303       if (!CORBA::is_nil(anIShapesOperations))
304       {
305         aTypeName = anIShapesOperations->GetShapeTypeString(aShape);
306       }
307     }
308   }
309
310   return CORBA::string_dup(aTypeName.ToCString());
311 }
312
313
314 const char* GEOM_Swig::getShapeTypeIcon(const char* IOR)
315 {
316   GEOM::GEOM_Gen_var Geom = GeometryGUI::GetGeomGen();
317   if ( CORBA::is_nil( Geom ) )
318     return "None";
319
320   GEOM::GEOM_Object_var aShape = Geom->GetIORFromString(IOR);
321   TopoDS_Shape shape = ShapeReader.GetShape(Geom, aShape);
322
323   if( shape.IsNull() ) {
324     return "None" ;
325   }
326
327   switch (shape.ShapeType() )
328     {
329     case TopAbs_COMPOUND:
330       { return "ICON_OBJBROWSER_COMPOUND" ;}
331     case  TopAbs_COMPSOLID:
332       { return "ICON_OBJBROWSER_COMPSOLID" ;}
333     case TopAbs_SOLID:
334       { return "ICON_OBJBROWSER_SOLID" ;}
335     case TopAbs_SHELL:
336       { return "ICON_OBJBROWSER_SHELL" ;}
337     case TopAbs_FACE:
338       { return "ICON_OBJBROWSER_FACE" ;}
339     case TopAbs_WIRE:
340       { return "ICON_OBJBROWSER_WIRE" ;}
341     case TopAbs_EDGE:
342       { return "ICON_OBJBROWSER_EDGE" ;}
343     case TopAbs_VERTEX:
344       { return "ICON_OBJBROWSER_VERTEX" ;}
345     }
346
347   return "None";
348 }
349
350 void GEOM_Swig::setDisplayMode(const char* theEntry, int theMode, bool isUpdated)
351 {
352   class TEvent: public SALOME_Event {
353     std::string myEntry;
354     int myMode;
355     bool myUpdateViewer;
356   public:
357     TEvent(const char* theEntryArg, int theModeArg, bool theUpdated):
358       myEntry(theEntryArg), myMode(theModeArg), myUpdateViewer(theUpdated)
359     {}
360     virtual void Execute() {
361       SUIT_Application* anApp = SUIT_Session::session()->activeApplication();
362       if (!anApp) return;
363
364       Handle(SALOME_InteractiveObject) anIO =
365         new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
366
367       if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) {
368         SVTK_View* aView = aViewWindow->getView();
369         aView->SetDisplayMode(anIO, myMode);
370         if (myUpdateViewer)
371           aView->Repaint();
372       }
373       else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) {
374         SOCC_Viewer* soccViewer = dynamic_cast<SOCC_Viewer*>(occViewer);
375         if (soccViewer)
376           soccViewer->switchRepresentation(anIO, myMode, myUpdateViewer);
377       }
378     }
379   };
380
381   ProcessVoidEvent(new TEvent (theEntry, theMode, isUpdated));
382 }
383
384 void GEOM_Swig::setColor(const char* theEntry, int red, int green, int blue, bool isUpdated)
385 {
386   class TEvent: public SALOME_Event {
387     std::string myEntry;
388     int myRed;
389     int myGreen;
390     int myBlue;
391     bool myUpdateViewer;
392   public:
393     TEvent(const char* theEntryArg, int theR, int theG, int theB, bool theUpdated):
394       myEntry(theEntryArg), myRed(theR), myGreen(theG), myBlue(theB), myUpdateViewer(theUpdated)
395     {}
396     virtual void Execute() {
397       SUIT_Application* anApp = SUIT_Session::session()->activeApplication();
398       if (!anApp) return;
399
400       Handle(SALOME_InteractiveObject) anIO =
401         new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
402
403       if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)){
404         SVTK_View* aView = aViewWindow->getView();
405         QColor aColor (myRed, myGreen, myBlue);
406         aView->SetColor(anIO, aColor);
407         if (myUpdateViewer)
408           aView->Repaint();
409       } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) {
410         Handle(AIS_InteractiveContext) ic = occViewer->getAISContext();
411         AIS_ListOfInteractive List;
412         ic->DisplayedObjects(List);
413         AIS_ListIteratorOfListOfInteractive ite (List);
414         for (; ite.More(); ite.Next()) {
415           Handle(SALOME_InteractiveObject) anObj =
416             Handle(SALOME_InteractiveObject)::DownCast(ite.Value()->GetOwner());
417           if (!anObj.IsNull() && anObj->hasEntry() && anObj->isSame(anIO)) {
418             Quantity_Color CSFColor =
419               Quantity_Color(myRed/255., myGreen/255., myBlue/255., Quantity_TOC_RGB);
420             ite.Value()->SetColor(CSFColor);
421             if (ite.Value()->IsKind(STANDARD_TYPE(GEOM_AISShape)))
422               Handle(GEOM_AISShape)::DownCast(ite.Value())->SetShadingColor(CSFColor);
423             ite.Value()->Redisplay(Standard_True);
424             if (myUpdateViewer)
425               occViewer->update();
426             break;
427           }
428         }
429       }
430     }
431   };
432   ProcessVoidEvent(new TEvent(theEntry, red, green, blue, isUpdated));
433 }
434
435 void GEOM_Swig::setTransparency(const char* theEntry, float transp, bool isUpdated)
436 {
437   class TEvent: public SALOME_Event {
438     std::string myEntry;
439     float myParam;
440     bool myUpdateViewer;
441   public:
442     TEvent(const char* theEntryArg, float theParam, bool theUpdated):
443       myEntry(theEntryArg), myParam(theParam), myUpdateViewer(theUpdated)
444     {}
445     virtual void Execute() {
446       SUIT_Application* anApp = SUIT_Session::session()->activeApplication();
447       if (!anApp) return;
448
449       Handle(SALOME_InteractiveObject) anIO =
450         new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
451
452       if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) {
453         SVTK_View* aView = aViewWindow->getView();
454         aView->SetTransparency(anIO, myParam);
455         if (myUpdateViewer)
456           aView->Repaint();
457       } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) {
458         SOCC_Viewer* soccViewer = dynamic_cast<SOCC_Viewer*>(occViewer);
459         if (soccViewer)
460           soccViewer->setTransparency(anIO, myParam, myUpdateViewer);
461       }
462     }
463   };
464
465   ProcessVoidEvent(new TEvent (theEntry, transp, isUpdated));
466 }
467
468
469 class TInitGeomGenEvent: public SALOME_Event {
470 public:
471   typedef bool TResult;
472   TResult myResult;
473   TInitGeomGenEvent() : myResult(false) {}
474   virtual void Execute() {
475     myResult = GeometryGUI::InitGeomGen();
476   }
477 };
478 bool GEOM_Swig::initGeomGen()
479 {
480   return ProcessEvent(new TInitGeomGenEvent());
481 }
482
483
484
485 void GEOM_Swig::eraseGO (const char* Entry, bool allWindows)
486 {
487   class TEvent: public SALOME_Event
488   {
489     std::string myEntry;
490     bool myFromAllWindows;
491   public:
492     TEvent(const char* theEntry, bool fromAllWindows):
493       myEntry(theEntry), myFromAllWindows(fromAllWindows)
494     {}
495     virtual void Execute()
496     {
497       SUIT_Application* app = SUIT_Session::session()->activeApplication();
498       if (!app) return;
499       SalomeApp_Study* ActiveStudy = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
500       if (!ActiveStudy) return;
501
502       Handle (SALOME_InteractiveObject) aIO = new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
503
504       GEOM_Displayer(ActiveStudy).Erase(aIO, true);
505       /*      if (myFromAllWindows) {
506         QPtrList<SUIT_ViewWindow> aWindows = app->desktop()->windows();
507         SUIT_ViewWindow* aWin = 0;
508         for (aWin = aWindows.first(); aWin; aWin = aWindows.next()) {
509           EraseObject(aWin, aIO);
510         }
511       } else {
512         SUIT_ViewWindow* aWin = app->desktop()->activeWindow();
513         if (aWin)
514           EraseObject(aWin, aIO);
515           }*/
516     }
517
518     /*  private:
519     void EraseObject(SUIT_ViewWindow* theWin, Handle (SALOME_InteractiveObject) theIO)
520     {
521       if (theWin->getViewManager()->getType() == OCCViewer_Viewer::Type()){
522         OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( theWin );
523         if ( vw ) {
524           OCCViewer_ViewManager* vm = dynamic_cast<OCCViewer_ViewManager*>( vw->getViewManager() );
525           if ( vm ) {
526             SOCC_Viewer* aViewer = dynamic_cast<SOCC_Viewer*>(vm->getOCCViewer());
527             if (aViewer) {
528               SALOME_Prs* aPrs = aViewer->CreatePrs(myEntry.c_str());
529               if (aPrs) {
530                 SALOME_OCCPrs* aOccPrs =  dynamic_cast<SALOME_OCCPrs*>(aPrs);
531                 if (aOccPrs) {
532                   aViewer->Erase(aOccPrs);
533                   aViewer->Repaint();
534                 }
535               }
536             }
537           }
538         }
539       } else if (theWin->getViewManager()->getType() == SVTK_Viewer::Type()){
540         SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>( theWin );
541         if (aViewWindow) {
542           aViewWindow->Erase(theIO);
543         }
544       }
545       }*/
546
547   };
548   ProcessVoidEvent(new TEvent(Entry, allWindows));
549 }
550
551
552
553 void GEOM_Swig::setDeflection(const char* theEntry, float theDeflect)
554 {
555   class TEvent: public SALOME_Event {
556     std::string myEntry;
557     float myParam;
558   public:
559     TEvent(const char* theEntryArg, float theParam):
560       myEntry(theEntryArg), myParam(theParam)
561     {}
562     virtual void Execute() {
563       SUIT_Application* anApp = SUIT_Session::session()->activeApplication();
564       if (!anApp) return;
565
566       Handle(SALOME_InteractiveObject) anIO =
567         new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", "");
568
569       if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) {
570         vtkActorCollection* aActors = aViewWindow->getRenderer()->GetActors();
571         aActors->InitTraversal();
572         while (vtkActor* aAct = aActors->GetNextActor()) {
573           if (GEOM_Actor* aGeomActor = dynamic_cast<GEOM_Actor*>(aAct)) {
574             if (aGeomActor->hasIO()) {
575               Handle(SALOME_InteractiveObject) aNextIO = aGeomActor->getIO();
576               if (aNextIO->isSame(anIO)) {
577                 aGeomActor->setDeflection(myParam);
578                 aViewWindow->Repaint();
579                 return;
580               }
581             }
582           }
583         }
584         //      aView->SetTransparency(anIO, myParam);
585         //aView->Repaint();
586       } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) {
587         Handle(AIS_InteractiveContext) aContext = occViewer->getAISContext();
588         AIS_ListOfInteractive aAISList;
589         aContext->DisplayedObjects(aAISList);
590         AIS_ListIteratorOfListOfInteractive it(aAISList);
591         for (; it.More(); it.Next()) {
592           Handle(SALOME_InteractiveObject) aObj = 
593             Handle(SALOME_InteractiveObject)::DownCast(it.Value()->GetOwner());
594           if ((!aObj.IsNull()) && aObj->hasEntry() && aObj->isSame(anIO)) {
595             Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(it.Value());
596             if (!aShape.IsNull()) {
597               Handle(AIS_Drawer) aDrawer = aShape->Attributes();
598               if (aDrawer.IsNull())
599                 aDrawer = new AIS_Drawer();
600               aDrawer->SetDeviationCoefficient(myParam);
601               aShape->SetAttributes(aDrawer);
602               aContext->Redisplay(aShape, true, true);
603               aContext->UpdateCurrentViewer();
604               return;
605             }
606           }
607         }
608       }
609     }
610   };
611
612   ProcessVoidEvent(new TEvent (theEntry, theDeflect));
613 }
614