From: vsr Date: Tue, 4 Sep 2012 05:09:12 +0000 (+0000) Subject: 0021827: [CEA 650] TUI setColor on an object displayed in wireframe is ignored X-Git-Tag: V6_6_0a1~38 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=506a331dc5c43d7add77017401da049880b03cfa;p=modules%2Fgeom.git 0021827: [CEA 650] TUI setColor on an object displayed in wireframe is ignored --- diff --git a/src/GEOMGUI/GeometryGUI_Swig.cxx b/src/GEOMGUI/GeometryGUI_Swig.cxx deleted file mode 100644 index 2c4529085..000000000 --- a/src/GEOMGUI/GeometryGUI_Swig.cxx +++ /dev/null @@ -1,756 +0,0 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -// GEOM GEOMGUI : GUI for Geometry component -// File : GeometryGUI_Swig.cxx -// Author : Nicolas REJNERI, Paul RASCLE -// -#include "GeometryGUI_Swig.hxx" - -#include "GeometryGUI.h" - -#include "SUIT_Desktop.h" -#include "SUIT_Session.h" -#include "SalomeApp_Application.h" -#include "SalomeApp_Study.h" - -#include "OB_Browser.h" - -#include "OCCViewer_ViewWindow.h" -#include "OCCViewer_ViewManager.h" -#include "SOCC_ViewModel.h" -#include - -#include "SVTK_ViewModel.h" -#include "SVTK_ViewWindow.h" -#include "SVTK_View.h" -#include "SVTK_Renderer.h" -#include - -#include "GEOM_Actor.h" -#include "GEOM_Client.hxx" -#include "GEOM_AISShape.hxx" -#include "GEOM_InteractiveObject.hxx" -#include "GEOM_Displayer.h" -#include "GEOM_Constants.h" - -#include "SALOME_Event.h" - -// OCCT Includes -#include -#include -#include -#include -#include -#include -#include - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(GEOM_Gen) - -#include - -static SHAPE_READER(ShapeReader); - -inline OCCViewer_Viewer* GetOCCViewer(SUIT_Application* theApp){ - SUIT_ViewWindow* window = theApp->desktop()->activeWindow(); - if(window && window->getViewManager()->getType() == OCCViewer_Viewer::Type()){ - OCCViewer_ViewWindow* vw = dynamic_cast( window ); - if ( vw ) { - OCCViewer_ViewManager* vm = dynamic_cast( vw->getViewManager() ); - if ( vm ) - return vm->getOCCViewer(); - } - } - - return 0; -} - -inline SVTK_ViewWindow* GetSVTKViewWindow(SUIT_Application* theApp){ - SUIT_ViewWindow* window = theApp->desktop()->activeWindow(); - if(window && window->getViewManager()->getType() == SVTK_Viewer::Type()) - return dynamic_cast( window ); - - return 0; -} - -GEOM_Swig::GEOM_Swig() -{ - // MESSAGE("Constructeur"); -} - -GEOM_Swig::~GEOM_Swig() -{ - // MESSAGE("Destructeur"); -} - -void GEOM_Swig::createAndDisplayGO (const char* Entry, bool isUpdated) -{ - class TEvent: public SALOME_Event - { - std::string myEntry; - bool myUpdateViewer; - public: - TEvent(const char* theEntry, bool toUpdateViewer): - myEntry(theEntry), - myUpdateViewer(toUpdateViewer) - {} - virtual void Execute() - { - SUIT_Application* app = SUIT_Session::session()->activeApplication(); - if (!app) return; - - SalomeApp_Study* ActiveStudy = dynamic_cast(app->activeStudy()); - if (!ActiveStudy) return; - - _PTR(Study) aStudy(ActiveStudy->studyDS()); - _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder(); - - GEOM::GEOM_Gen_var Geom = GeometryGUI::GetGeomGen(); - if (CORBA::is_nil(Geom)) { - GeometryGUI::InitGeomGen(); - Geom = GeometryGUI::GetGeomGen(); - } - if (CORBA::is_nil(Geom)) - return; - - std::string aFatherIOR; - _PTR(SComponent) father = aStudy->FindComponent("GEOM"); - if (!father) - return; - if (!father->ComponentIOR(aFatherIOR)) { - CORBA::String_var objStr = SalomeApp_Application::orb()->object_to_string(Geom); - aStudyBuilder->LoadWith(father, objStr.in()); - father->ComponentIOR(aFatherIOR); - } - - _PTR(SObject) obj = aStudy->FindObjectID(myEntry); - if (!obj) - return; - - // Create new actor - _PTR(GenericAttribute) anAttr; - if (!obj->FindAttribute(anAttr, "AttributeIOR")) - return; - _PTR(AttributeIOR) anIOR(anAttr); - std::string anIORValue = anIOR->Value(); - - GEOM::GEOM_Object_var aShape = Geom->GetIORFromString(anIORValue.c_str()); - TopoDS_Shape Shape = ShapeReader.GetShape(Geom,aShape); - if (!Shape.IsNull()) { - if (obj->FindAttribute(anAttr, "AttributeName")) { - _PTR(AttributeName) aName (anAttr); - std::string aNameValue = aName->Value(); - // open transaction - /*SUIT_Operation* op = new SalomeApp_ImportOperation (app); - op->start(); - - _PTR(SObject) newObj1 = aStudyBuilder->NewObject(father); - aStudyBuilder->Addreference(newObj1, obj); - // commit transaction - op->commit();*/ - Handle(GEOM_InteractiveObject) anIO = - new GEOM_InteractiveObject (const_cast(anIORValue.c_str()), - const_cast(aFatherIOR.c_str()), - "GEOM", - const_cast( obj->GetID().c_str())); - - GEOM_Displayer(ActiveStudy).Display(anIO, myUpdateViewer); - /*if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) { - SVTK_View* aView = aViewWindow->getView(); - int aMode = aView->GetDisplayMode(); - - vtkActorCollection* theActors = - GEOM_AssemblyBuilder::BuildActors(Shape,0,aMode,true); - theActors->InitTraversal(); - while (vtkActor* anActor = theActors->GetNextActor()) { - GEOM_Actor* GActor = GEOM_Actor::SafeDownCast(anActor); - GActor->setName(const_cast(aNameValue.c_str())); - GActor->setIO(anIO); - aView->Display(GActor); - } - aView->Repaint(); - } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app)) { - Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); - Handle(GEOM_AISShape) aSh = - new GEOM_AISShape (Shape,const_cast(aNameValue.c_str())); - aSh->setName(const_cast(aNameValue.c_str())); - aSh->setIO(anIO); - ic->Display(aSh); - ic->AddOrRemoveCurrentObject(aSh,true); - }*/ - // update object browser - SalomeApp_Application* app = NULL; //dynamic_cast(app); - if (app) { - CAM_Module* module = app->module("Geometry"); - SalomeApp_Module* appMod = dynamic_cast(module); - if (appMod) - appMod->updateObjBrowser(true); - } - } - } - } - }; - - // MESSAGE("createAndDisplayGO"); - ProcessVoidEvent(new TEvent (Entry, isUpdated)); - - class TEventUpdateBrowser: public SALOME_Event - { - public: - TEventUpdateBrowser() {} - virtual void Execute() { - SalomeApp_Application* app = - dynamic_cast(SUIT_Session::session()->activeApplication()); - if (app) { - CAM_Module* module = app->module("Geometry"); - SalomeApp_Module* appMod = dynamic_cast(module); - if (appMod) appMod->updateObjBrowser(true); - } - } - }; - - if (isUpdated) - ProcessVoidEvent(new TEventUpdateBrowser ()); -} - -void GEOM_Swig::createAndDisplayFitAllGO (const char* Entry) -{ - class TEventFitAll: public SALOME_Event - { - public: - TEventFitAll() {} - virtual void Execute() { - SUIT_Application* app = SUIT_Session::session()->activeApplication(); - if (!app) return; - - if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) - { - SVTK_View* aView = aViewWindow->getView(); - aView->GetRenderer()->OnFitAll(); - } - else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app)) - { - Handle(V3d_Viewer) aViewer3d = occViewer->getViewer3d(); - aViewer3d->InitActiveViews(); - - if (aViewer3d->MoreActiveViews()) - aViewer3d->ActiveView()->FitAll(); - } - } - }; - - createAndDisplayGO(Entry); - ProcessVoidEvent(new TEventFitAll()); -} - -void GEOM_Swig::UpdateViewer() -{ - class TEventUpdateViewer: public SALOME_Event - { - public: - TEventUpdateViewer() {} - virtual void Execute() { - SUIT_Application* app = SUIT_Session::session()->activeApplication(); - if (!app) return; - SalomeApp_Study* ActiveStudy = dynamic_cast(app->activeStudy()); - if (!ActiveStudy) return; - - GEOM_Displayer(ActiveStudy).UpdateViewer(); - } - }; - - ProcessVoidEvent(new TEventUpdateViewer()); -} - -int GEOM_Swig::getIndexTopology(const char* SubIOR, const char* IOR) -{ - GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen(); - if (CORBA::is_nil(aGeomGen)) - return -1; - - GEOM::GEOM_Object_var aMainShape = aGeomGen->GetIORFromString(IOR); - GEOM::GEOM_Object_var aSubShape = aGeomGen->GetIORFromString(SubIOR); - if (CORBA::is_nil(aMainShape) || CORBA::is_nil(aSubShape)) - return -1; - - GEOM::GEOM_IShapesOperations_var anIShapesOperations = - aGeomGen->GetIShapesOperations(aMainShape->GetStudyID()); - if (CORBA::is_nil(anIShapesOperations)) - return -1; - - return anIShapesOperations->GetTopologyIndex(aMainShape, aSubShape); -} - -const char* GEOM_Swig::getShapeTypeString(const char* IOR) -{ - TCollection_AsciiString aTypeName ("Shape of unknown type"); - - GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen(); - if (!CORBA::is_nil(aGeomGen)) - { - GEOM::GEOM_Object_var aShape = aGeomGen->GetIORFromString(IOR); - if (!CORBA::is_nil(aShape)) - { - GEOM::GEOM_IShapesOperations_var anIShapesOperations = - aGeomGen->GetIShapesOperations(aShape->GetStudyID()); - if (!CORBA::is_nil(anIShapesOperations)) - { - aTypeName = anIShapesOperations->GetShapeTypeString(aShape); - } - } - } - - return CORBA::string_dup(aTypeName.ToCString()); -} - - -const char* GEOM_Swig::getShapeTypeIcon(const char* IOR) -{ - GEOM::GEOM_Gen_var Geom = GeometryGUI::GetGeomGen(); - if ( CORBA::is_nil( Geom ) ) - return "None"; - - GEOM::GEOM_Object_var aShape = Geom->GetIORFromString(IOR); - TopoDS_Shape shape = ShapeReader.GetShape(Geom, aShape); - - if( shape.IsNull() ) { - return "None" ; - } - - switch (shape.ShapeType() ) - { - case TopAbs_COMPOUND: - { return "ICON_OBJBROWSER_COMPOUND" ;} - case TopAbs_COMPSOLID: - { return "ICON_OBJBROWSER_COMPSOLID" ;} - case TopAbs_SOLID: - { return "ICON_OBJBROWSER_SOLID" ;} - case TopAbs_SHELL: - { return "ICON_OBJBROWSER_SHELL" ;} - case TopAbs_FACE: - { return "ICON_OBJBROWSER_FACE" ;} - case TopAbs_WIRE: - { return "ICON_OBJBROWSER_WIRE" ;} - case TopAbs_EDGE: - { return "ICON_OBJBROWSER_EDGE" ;} - case TopAbs_VERTEX: - { return "ICON_OBJBROWSER_VERTEX" ;} - } - - return "None"; -} - -void GEOM_Swig::setDisplayMode(const char* theEntry, int theMode, bool isUpdated) -{ - class TEvent: public SALOME_Event { - std::string myEntry; - int myMode; - bool myUpdateViewer; - public: - TEvent(const char* theEntryArg, int theModeArg, bool theUpdated): - myEntry(theEntryArg), myMode(theModeArg), myUpdateViewer(theUpdated) - {} - virtual void Execute() { - SUIT_Application* anApp = SUIT_Session::session()->activeApplication(); - if (!anApp) return; - - Handle(SALOME_InteractiveObject) anIO = - new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); - - if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) { - SVTK_View* aView = aViewWindow->getView(); - aView->SetDisplayMode(anIO, myMode); - if (myUpdateViewer) - aView->Repaint(); - } - else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { - SOCC_Viewer* soccViewer = dynamic_cast(occViewer); - if (soccViewer) - soccViewer->switchRepresentation(anIO, myMode, myUpdateViewer); - } - } - }; - - ProcessVoidEvent(new TEvent (theEntry, theMode, isUpdated)); -} - -void GEOM_Swig::setVectorsMode(const char* theEntry, bool isOn, bool isUpdated) -{ - class TEvent: public SALOME_Event { - std::string myEntry; - bool myOn; - bool myUpdateViewer; - public: - TEvent(const char* theEntryArg, bool theOn, bool theUpdated): - myEntry(theEntryArg), myOn(theOn), myUpdateViewer(theUpdated) - {} - virtual void Execute() { - SUIT_Application* anApp = SUIT_Session::session()->activeApplication(); - if (!anApp) return; - - Handle(SALOME_InteractiveObject) anIO = - new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); - - if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) { - SVTK_View* aView = aViewWindow->getView(); - SVTK_Viewer* stvkViewer = dynamic_cast(aViewWindow->getViewManager()->getViewModel()); - SVTK_Prs* vtkPrs = dynamic_cast( stvkViewer->CreatePrs( myEntry.c_str() ) ); - vtkActorCollection* anActors = vtkPrs->GetObjects(); - anActors->InitTraversal(); - while (vtkActor* anAct = anActors->GetNextActor()) { - GEOM_Actor* aGeomActor = GEOM_Actor::SafeDownCast(anAct); - aGeomActor->SetVectorMode(!aGeomActor->GetVectorMode()); - } - if (myUpdateViewer) - aView->Repaint(); - } - else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { - Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); - SOCC_Viewer* soccViewer = dynamic_cast(occViewer); - if (soccViewer) { - SOCC_Prs* occPrs = dynamic_cast( soccViewer->CreatePrs( myEntry.c_str() ) ); - if ( occPrs && !occPrs->IsNull() ) { - AIS_ListOfInteractive shapes; occPrs->GetObjects( shapes ); - AIS_ListIteratorOfListOfInteractive interIter( shapes ); - for ( ; interIter.More(); interIter.Next() ) { - Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast( interIter.Value() ); - aSh->SetDisplayVectors(myOn); - ic->RecomputePrsOnly(interIter.Value()); - } - } - } - } - } - }; - - ProcessVoidEvent(new TEvent (theEntry, isOn, isUpdated)); -} - -void GEOM_Swig::setColor(const char* theEntry, int red, int green, int blue, bool isUpdated) -{ - class TEvent: public SALOME_Event { - std::string myEntry; - int myRed; - int myGreen; - int myBlue; - bool myUpdateViewer; - public: - TEvent(const char* theEntryArg, int theR, int theG, int theB, bool theUpdated): - myEntry(theEntryArg), myRed(theR), myGreen(theG), myBlue(theB), myUpdateViewer(theUpdated) - {} - virtual void Execute() { - SUIT_Application* anApp = SUIT_Session::session()->activeApplication(); - if (!anApp) return; - - Handle(SALOME_InteractiveObject) anIO = - new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); - - if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)){ - SVTK_View* aView = aViewWindow->getView(); - QColor aColor (myRed, myGreen, myBlue); - aView->SetColor(anIO, aColor); - if (myUpdateViewer) - aView->Repaint(); - } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { - Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); - SOCC_Viewer* soccViewer = dynamic_cast(occViewer); - if (soccViewer) - { - SALOME_Prs* prs= soccViewer->CreatePrs( myEntry.c_str() ); - const SOCC_Prs* anOCCPrs = dynamic_cast( prs ); - if ( !anOCCPrs || anOCCPrs->IsNull() ) - return; - - // get objects to be displayed - AIS_ListOfInteractive anAISObjects; - anOCCPrs->GetObjects( anAISObjects ); - AIS_ListIteratorOfListOfInteractive ite( anAISObjects ); - Quantity_Color CSFColor = Quantity_Color(myRed/255., myGreen/255., myBlue/255., Quantity_TOC_RGB); - for ( ; ite.More(); ite.Next() ) - { - if(!ic->IsDisplayed(ite.Value()))continue; //only displayed ais - ite.Value()->SetColor(CSFColor); - if (ite.Value()->IsKind(STANDARD_TYPE(GEOM_AISShape))) Handle(GEOM_AISShape)::DownCast(ite.Value())->SetShadingColor(CSFColor); - ite.Value()->Redisplay(Standard_True); // as in OnColor - } - if (myUpdateViewer) occViewer->update(); - } - } - } - }; - ProcessVoidEvent(new TEvent(theEntry, red, green, blue, isUpdated)); -} - -void GEOM_Swig::setIsos(const char* Entry, int nbU, int nbV, bool isUpdated ) -{ - class TEvent: public SALOME_Event { - std::string myEntry; - int myNbU, myNbV; - bool myUpdateViewer; - public: - TEvent(const char* theEntry, int theNbU, int theNbV, bool theUpdated): - myEntry(theEntry), myNbU(theNbU), myNbV(theNbV), myUpdateViewer(theUpdated) - {} - virtual void Execute() { - SUIT_Application* app = SUIT_Session::session()->activeApplication(); - if (!app) return; - SalomeApp_Study* study = dynamic_cast(app->activeStudy()); - if (!study) return; - - Handle(SALOME_InteractiveObject) anIO = - new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); - - if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) { - SVTK_Viewer* aView = dynamic_cast(aViewWindow->getViewManager()->getViewModel()); - SVTK_Prs* vtkPrs = dynamic_cast( aView->CreatePrs( myEntry.c_str() ) ); - if ( vtkPrs ) { - vtkActorCollection* anActors = vtkPrs->GetObjects(); - anActors->InitTraversal(); - GEOM_Actor* anActor = GEOM_Actor::SafeDownCast( anActors->GetNextActor() ); - if ( anActor ) { - int aIsos[2]={myNbU,myNbV}; - anActor->SetNbIsos(aIsos); - anActor->StoreIsoNumbers(); - QString anIsos = QString("%1%2%3").arg(myNbU).arg(DIGIT_SEPARATOR).arg(myNbV); - int aMgrId = aView->getViewManager()->getGlobalId(); - study->setObjectProperty(aMgrId, myEntry.c_str(), ISOS_PROP, anIsos); - } - } - - if (myUpdateViewer) - aView->Repaint(); - } - else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app)) { - Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); - SOCC_Viewer* soccViewer = dynamic_cast(occViewer); - if (soccViewer) { - int aMgrId = soccViewer->getViewManager()->getGlobalId(); - SOCC_Prs* occPrs = dynamic_cast( soccViewer->CreatePrs( myEntry.c_str() ) ); - if ( occPrs && !occPrs->IsNull() ) { - AIS_ListOfInteractive shapes; occPrs->GetObjects( shapes ); - AIS_ListIteratorOfListOfInteractive interIter( shapes ); - for ( ; interIter.More(); interIter.Next() ) { - Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast( interIter.Value() ); - if ( !aSh.IsNull() ) { - Handle(AIS_Drawer) drawer = aSh->Attributes(); - QVariant v = study->getObjectProperty( aMgrId, myEntry.c_str(), EDGE_WIDTH_PROP, QVariant() ); - int width = v.isValid() ? v.toInt() : 1; - drawer->SetUIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, width, myNbU) ); - drawer->SetVIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, width, myNbV) ); - aSh->storeIsoNumbers(); - ic->SetLocalAttributes(aSh, drawer); - ic->Redisplay(aSh); - QString anIsos = QString("%1%2%3").arg(myNbU).arg(DIGIT_SEPARATOR).arg(myNbV); - study->setObjectProperty(aMgrId, myEntry.c_str(), ISOS_PROP, anIsos); - } - } - } - } - } - } - }; - - ProcessVoidEvent(new TEvent (Entry, nbU, nbV, isUpdated)); -} - -void GEOM_Swig::setTransparency(const char* theEntry, float transp, bool isUpdated) -{ - class TEvent: public SALOME_Event { - std::string myEntry; - float myParam; - bool myUpdateViewer; - public: - TEvent(const char* theEntryArg, float theParam, bool theUpdated): - myEntry(theEntryArg), myParam(theParam), myUpdateViewer(theUpdated) - {} - virtual void Execute() { - SUIT_Application* anApp = SUIT_Session::session()->activeApplication(); - if (!anApp) return; - - Handle(SALOME_InteractiveObject) anIO = - new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); - - if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) { - SVTK_View* aView = aViewWindow->getView(); - aView->SetTransparency(anIO, myParam); - if (myUpdateViewer) - aView->Repaint(); - } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { - SOCC_Viewer* soccViewer = dynamic_cast(occViewer); - if (soccViewer) - soccViewer->setTransparency(anIO, myParam, myUpdateViewer); - } - } - }; - - ProcessVoidEvent(new TEvent (theEntry, transp, isUpdated)); -} - - -class TInitGeomGenEvent: public SALOME_Event { -public: - typedef bool TResult; - TResult myResult; - TInitGeomGenEvent() : myResult(false) {} - virtual void Execute() { - myResult = GeometryGUI::InitGeomGen(); - } -}; -bool GEOM_Swig::initGeomGen() -{ - return ProcessEvent(new TInitGeomGenEvent()); -} - - - -void GEOM_Swig::eraseGO (const char* Entry, bool allWindows) -{ - class TEvent: public SALOME_Event - { - std::string myEntry; - bool myFromAllWindows; - public: - TEvent(const char* theEntry, bool fromAllWindows): - myEntry(theEntry), myFromAllWindows(fromAllWindows) - {} - virtual void Execute() - { - SUIT_Application* app = SUIT_Session::session()->activeApplication(); - if (!app) return; - SalomeApp_Study* ActiveStudy = dynamic_cast(app->activeStudy()); - if (!ActiveStudy) return; - - Handle (SALOME_InteractiveObject) aIO = new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); - - GEOM_Displayer(ActiveStudy).Erase(aIO, true); - /* if (myFromAllWindows) { - QPtrList aWindows = app->desktop()->windows(); - SUIT_ViewWindow* aWin = 0; - for (aWin = aWindows.first(); aWin; aWin = aWindows.next()) { - EraseObject(aWin, aIO); - } - } else { - SUIT_ViewWindow* aWin = app->desktop()->activeWindow(); - if (aWin) - EraseObject(aWin, aIO); - }*/ - } - - /* private: - void EraseObject(SUIT_ViewWindow* theWin, Handle (SALOME_InteractiveObject) theIO) - { - if (theWin->getViewManager()->getType() == OCCViewer_Viewer::Type()){ - OCCViewer_ViewWindow* vw = dynamic_cast( theWin ); - if ( vw ) { - OCCViewer_ViewManager* vm = dynamic_cast( vw->getViewManager() ); - if ( vm ) { - SOCC_Viewer* aViewer = dynamic_cast(vm->getOCCViewer()); - if (aViewer) { - SALOME_Prs* aPrs = aViewer->CreatePrs(myEntry.c_str()); - if (aPrs) { - SALOME_OCCPrs* aOccPrs = dynamic_cast(aPrs); - if (aOccPrs) { - aViewer->Erase(aOccPrs); - aViewer->Repaint(); - } - } - } - } - } - } else if (theWin->getViewManager()->getType() == SVTK_Viewer::Type()){ - SVTK_ViewWindow* aViewWindow = dynamic_cast( theWin ); - if (aViewWindow) { - aViewWindow->Erase(theIO); - } - } - }*/ - - }; - ProcessVoidEvent(new TEvent(Entry, allWindows)); -} - - - -void GEOM_Swig::setDeflection(const char* theEntry, float theDeflect) -{ - class TEvent: public SALOME_Event { - std::string myEntry; - float myParam; - public: - TEvent(const char* theEntryArg, float theParam): - myEntry(theEntryArg), myParam(theParam) - {} - virtual void Execute() { - SUIT_Application* anApp = SUIT_Session::session()->activeApplication(); - if (!anApp) return; - - Handle(SALOME_InteractiveObject) anIO = - new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); - - if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) { - vtkActorCollection* aActors = aViewWindow->getRenderer()->GetActors(); - aActors->InitTraversal(); - while (vtkActor* aAct = aActors->GetNextActor()) { - if (GEOM_Actor* aGeomActor = dynamic_cast(aAct)) { - if (aGeomActor->hasIO()) { - Handle(SALOME_InteractiveObject) aNextIO = aGeomActor->getIO(); - if (aNextIO->isSame(anIO)) { - aGeomActor->setDeflection(myParam); - aViewWindow->Repaint(); - return; - } - } - } - } - // aView->SetTransparency(anIO, myParam); - //aView->Repaint(); - } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { - Handle(AIS_InteractiveContext) aContext = occViewer->getAISContext(); - AIS_ListOfInteractive aAISList; - aContext->DisplayedObjects(aAISList); - AIS_ListIteratorOfListOfInteractive it(aAISList); - for (; it.More(); it.Next()) { - Handle(SALOME_InteractiveObject) aObj = - Handle(SALOME_InteractiveObject)::DownCast(it.Value()->GetOwner()); - if ((!aObj.IsNull()) && aObj->hasEntry() && aObj->isSame(anIO)) { - Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(it.Value()); - if (!aShape.IsNull()) { - TopoDS_Shape aSh = aShape->Shape(); - if (!aSh.IsNull()) - BRepTools::Clean(aSh); - - aShape->SetOwnDeviationCoefficient( myParam ); - aShape->SetOwnHLRDeviationAngle( 1.57 ); - aContext->Redisplay(aShape); - return; - } - } - } - } - } - }; - - ProcessVoidEvent(new TEvent (theEntry, theDeflect)); -} - diff --git a/src/GEOMGUI/GeometryGUI_Swig.hxx b/src/GEOMGUI/GeometryGUI_Swig.hxx deleted file mode 100644 index 3ddb4b6da..000000000 --- a/src/GEOMGUI/GeometryGUI_Swig.hxx +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -// GEOM GEOMGUI : GUI for Geometry component -// File : GeometryGUI_Swig.hxx -// Author : Nicolas REJNERI, Paul RASCLE -// -#ifndef GEOMETRYGUI_SWIG_HXX -#define GEOMETRYGUI_SWIG_HXX - -#include "GEOM_GEOMGUI.hxx" - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(GEOM_Gen) -#include CORBA_SERVER_HEADER(SALOMEDS) -#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) - -class GEOMGUI_EXPORT GEOM_Swig -{ -public: - GEOM_Swig(); - ~GEOM_Swig(); - - void createAndDisplayGO(const char* Entry, bool isUpdated = true); - void eraseGO(const char* Entry, bool allWindows); - void createAndDisplayFitAllGO(const char* Entry); - void UpdateViewer(); - void setDisplayMode(const char* Entry, int mode, bool isUpdated = true); - void setVectorsMode(const char* Entry, bool isSet, bool isUpdated = true); - void setColor(const char* Entry, int red, int green, int blue, bool isUpdated = true); - void setTransparency(const char* Entry, float transp, bool isUpdated = true); - void setIsos(const char* Entry, int nbU, int nbV, bool isUpdated =true); - void setDeflection(const char* Entry, float deflect); - - int getIndexTopology(const char *SubEntry, const char *Entry); - const char* getShapeTypeString(const char *Entry); - const char* getShapeTypeIcon(const char *Ior); - - bool initGeomGen(); -}; - -#endif // GEOMETRYGUI_SWIG_HXX diff --git a/src/GEOMGUI/GeometryGUI_Swig.i b/src/GEOMGUI/GeometryGUI_Swig.i deleted file mode 100644 index e9a4339ba..000000000 --- a/src/GEOMGUI/GeometryGUI_Swig.i +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// - -// GEOM GEOMGUI : GUI for Geometry component -// File : GeometryGUI_Swig.i -// Author : Nicolas REJNERI, Paul RASCLE -// -%{ -#include "GeometryGUI_Swig.hxx" -%} - -/* - managing C++ exception in the Python API -*/ -%exception -{ - class PyAllowThreadsGuard { - public: - // Py_BEGIN_ALLOW_THREADS - PyAllowThreadsGuard() { _save = PyEval_SaveThread(); } - // Py_END_ALLOW_THREADS - ~PyAllowThreadsGuard() { PyEval_RestoreThread(_save); } - private: - PyThreadState *_save; - }; - - PyAllowThreadsGuard guard; - - $action -} - -class GEOM_Swig -{ - public: - GEOM_Swig(); - ~GEOM_Swig(); - - void createAndDisplayGO(const char* Entry, bool isUpdated =true); - void eraseGO(const char* Entry, bool allWindows); - void createAndDisplayFitAllGO(const char* Entry); - void UpdateViewer(); - int getIndexTopology(const char *SubEntry, const char *Entry); - const char* getShapeTypeString(const char *Entry); - - void setDisplayMode(const char* Entry, int mode, bool isUpdated =true); - void setVectorsMode(const char* Entry, bool isSet, bool isUpdated =true); - void setColor(const char* Entry, int red, int green, int blue, bool isUpdated =true); - void setTransparency(const char* Entry, float transp, bool isUpdated =true); - void setIsos(const char* Entry, int nbU, int nbV, bool isUpdated =true); - void setDeflection(const char* Entry, float deflect); - const char* getShapeTypeIcon(const char *Ior); - - bool initGeomGen(); -}; diff --git a/src/GEOMGUI/Makefile.am b/src/GEOMGUI/Makefile.am index 2ac3a347b..71f187ae0 100644 --- a/src/GEOMGUI/Makefile.am +++ b/src/GEOMGUI/Makefile.am @@ -35,8 +35,6 @@ salomeinclude_HEADERS = \ GEOM_Displayer.h \ GEOMGUI_OCCSelector.h \ GEOMGUI_Selection.h \ - GeometryGUI_Swig.hxx \ - GeometryGUI_Swig.i \ GEOM_GEOMGUI.hxx dist_libGEOM_la_SOURCES = \ @@ -44,8 +42,7 @@ dist_libGEOM_la_SOURCES = \ GEOMGUI.cxx \ GEOM_Displayer.cxx \ GEOMGUI_OCCSelector.cxx \ - GEOMGUI_Selection.cxx \ - GeometryGUI_Swig.cxx + GEOMGUI_Selection.cxx MOC_FILES = \ GeometryGUI_moc.cxx diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.h b/src/GEOMToolsGUI/GEOMToolsGUI.h index 4241124f6..d980f5ee1 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.h +++ b/src/GEOMToolsGUI/GEOMToolsGUI.h @@ -30,12 +30,16 @@ #include "GEOM_ToolsGUI.hxx" #include - #include class GEOM_Displayer; class SALOME_View; class SALOME_ListIO; +class SalomeApp_Study; +class SVTK_View; +class QColor; +class Handle_SALOME_InteractiveObject; +class Handle_AIS_InteractiveContext; #include @@ -54,6 +58,8 @@ public: enum ActionType { SHOWDLG, INCR, DECR }; + static void SetColor( const QString&, const QColor&, bool ); + private: // Import and export topology methods bool Import(); @@ -89,6 +95,18 @@ private: _PTR(Study), QList, GEOM_Displayer* ); + + static void setVtkColor( SalomeApp_Study* study, + int mgrId, + SVTK_View* view, + const Handle_SALOME_InteractiveObject& IO, + const QColor& color ); + + static void setOccColor( SalomeApp_Study* study, + int mgrId, + const Handle_AIS_InteractiveContext& ic, + const Handle_SALOME_InteractiveObject& IO, + const QColor& color ); }; #endif // GEOMTOOLSGUI_H diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx index 64983d176..925585ca6 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx @@ -267,151 +267,240 @@ void GEOMToolsGUI::OnDisableAutoColor() return; aMainObject->SetAutoColor( false ); +} + +void GEOMToolsGUI::SetColor( const QString& entry, const QColor& color, bool /*updateViewer*/ ) +{ + if ( entry.isEmpty() || !color.isValid() ) return; + + // get active application + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) return; + + // get current study + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + if ( !appStudy ) return; + + // get active view + SUIT_ViewWindow* window = app->desktop()->activeWindow(); + bool isOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ); + bool isVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ); + + // get view id + int mgrId = window->getViewManager()->getGlobalId(); + + Handle(SALOME_InteractiveObject) IO = + new SALOME_InteractiveObject( entry.toLatin1().data(), "GEOM", ""); + + if ( isVTK ) { + SVTK_ViewWindow* vtkVW = dynamic_cast( window ); + if ( !vtkVW ) return; + SVTK_View* aView = vtkVW->getView(); + + GEOMToolsGUI::setVtkColor( appStudy, mgrId, aView, IO, color ); + } + else if ( isOCC ) { + OCCViewer_Viewer* vm = dynamic_cast ( window->getViewManager()->getViewModel() ); + Handle (AIS_InteractiveContext) ic = vm->getAISContext(); + GEOMToolsGUI::setOccColor( appStudy, mgrId, ic, IO, color ); + } + // mark study as modified + GeometryGUI::Modified(); + + // update actions + app->updateActions(); //SRN: To update a Save button in the toolbar } void GEOMToolsGUI::OnColor() { - SALOME_ListIO selected; + // get active application SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) return; + + // get current study SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); - if ( app && appStudy ) { - LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); - if ( aSelMgr ) { - aSelMgr->selectedObjects( selected ); - if ( !selected.IsEmpty() ) { - SUIT_ViewWindow* window = app->desktop()->activeWindow(); - bool isOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ); - bool isVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ); - int mgrId = window->getViewManager()->getGlobalId(); - if ( isVTK ) { - SVTK_ViewWindow* vtkVW = dynamic_cast( window ); - if ( !vtkVW ) - return; - SVTK_View* aView = vtkVW->getView(); - QColor initcolor = aView->GetColor( selected.First() ); - QColor c = QColorDialog::getColor( initcolor, app->desktop() ); - if ( c.isValid() ) { - SUIT_OverrideCursor(); - for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { - QString matProp; - matProp = appStudy->getObjectProperty(mgrId,It.Value()->getEntry(), MATERIAL_PROP, matProp).toString(); - Material_Model material; - material.fromProperties( matProp ); - if ( !material.isPhysical() ) { - aView->SetColor( It.Value(), c ); - appStudy->setObjectProperty(mgrId,It.Value()->getEntry(),COLOR_PROP, c); - } - // store color to GEOM_Object - _PTR(Study) aStudy = appStudy->studyDS(); - _PTR(SObject) aSObject( aStudy->FindObjectID( It.Value()->getEntry() ) ); - GEOM::GEOM_Object_var anObject = - GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObject)); - SALOMEDS::Color aSColor; - aSColor.R = (double)c.red() / 255.0; - aSColor.G = (double)c.green() / 255.0; - aSColor.B = (double)c.blue() / 255.0; - anObject->SetColor( aSColor ); - anObject->SetAutoColor( false ); - } - GeometryGUI::Modified(); - } - } // if ( isVTK ) - else if ( isOCC ) { - Handle(AIS_InteractiveObject) io = GEOMBase::GetAIS( selected.First() ); - if ( !io.IsNull() ) { - Quantity_Color aColor; - io->Color( aColor ); - QColor ic = QColor((int )( aColor.Red() * 255.0 ), - (int)( aColor.Green() * 255.0 ), - (int)( aColor.Blue() * 255.0 )); - - QVariant v = appStudy->getObjectProperty(mgrId,selected.First()->getEntry(), COLOR_PROP, ic); - - QColor initcolor = v.value(); - QColor c = QColorDialog::getColor( initcolor, app->desktop() ); - if ( c.isValid() ) { - SUIT_OverrideCursor(); - aColor = Quantity_Color( c.red() / 255., c.green() / 255., c.blue() / 255., Quantity_TOC_RGB ); - OCCViewer_Viewer* vm = dynamic_cast ( window->getViewManager()->getViewModel() ); - Handle (AIS_InteractiveContext) ic = vm->getAISContext(); - for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { - QString matProp; - matProp = appStudy->getObjectProperty(mgrId,It.Value()->getEntry(), MATERIAL_PROP, matProp).toString(); - Material_Model material; - material.fromProperties( matProp ); - io = GEOMBase::GetAIS( It.Value(), true ); - if ( !io.IsNull() && !material.isPhysical() ) { // change color only for shapes with not physical type of material - - if ( io->IsKind( STANDARD_TYPE(AIS_Shape) ) ) { - TopoDS_Shape theShape = Handle(AIS_Shape)::DownCast( io )->Shape(); - bool onlyVertex = (theShape.ShapeType() == TopAbs_VERTEX || GEOM_Displayer::isCompoundOfVertices( theShape )); - if (onlyVertex) { - // Set color for a point - - Handle(AIS_Drawer) aCurDrawer = io->Attributes(); - Handle(Prs3d_PointAspect) aCurPointAspect = aCurDrawer->PointAspect(); - Quantity_Color aCurColor; - Standard_Real aCurScale; - Aspect_TypeOfMarker aCurTypeOfMarker; - aCurPointAspect->Aspect()->Values( aCurColor, aCurTypeOfMarker, aCurScale ); - if ( aCurTypeOfMarker != Aspect_TOM_USERDEFINED ) { - aCurDrawer->SetPointAspect(new Prs3d_PointAspect(aCurTypeOfMarker, aColor, aCurScale)); - } - else { - Standard_Integer aWidth, aHeight; - aCurPointAspect->GetTextureSize( aWidth, aHeight ); + if ( !appStudy ) return; -#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1 - Handle(TColStd_HArray1OfByte) aTexture = aCurPointAspect->GetTexture(); -#else - Handle(Graphic3d_HArray1OfBytes) aTexture = aCurPointAspect->GetTexture(); -#endif + // get selection manager + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + if ( !aSelMgr ) return; - aCurDrawer->SetPointAspect(new Prs3d_PointAspect(aColor, 1, aWidth, aHeight, aTexture)); - } - ic->SetLocalAttributes(io, aCurDrawer, Standard_False); - } - } - - io->SetColor( aColor ); - if ( io->IsKind( STANDARD_TYPE(GEOM_AISShape) ) ) { - Handle(GEOM_AISShape) aGAISShape = Handle(GEOM_AISShape)::DownCast( io ); - aGAISShape->SetShadingColor( aColor ); - aGAISShape->storeBoundaryColors(); - } - - appStudy->setObjectProperty(mgrId,It.Value()->getEntry(), COLOR_PROP, c); - - io->Redisplay( Standard_True ); - - // store color to GEOM_Object - _PTR(Study) aStudy = appStudy->studyDS(); - _PTR(SObject) aSObject( aStudy->FindObjectID( It.Value()->getEntry() ) ); - GEOM::GEOM_Object_var anObject = - GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObject)); - - - SALOMEDS::Color aSColor; - aSColor.R = (double)c.red() / 255.0; - aSColor.G = (double)c.green() / 255.0; - aSColor.B = (double)c.blue() / 255.0; - anObject->SetColor( aSColor ); - anObject->SetAutoColor( false ); - } - } // for - ic->UpdateCurrentViewer(); - GeometryGUI::Modified(); - } // if c.isValid() - } // first IO is not null - } // if ( isOCC ) - } // if ( selection not empty ) + // get selection + SALOME_ListIO selected; + aSelMgr->selectedObjects( selected ); + if ( selected.IsEmpty() ) return; + + // get active view + SUIT_ViewWindow* window = app->desktop()->activeWindow(); + bool isOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ); + bool isVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ); + + // get view id + int mgrId = window->getViewManager()->getGlobalId(); + + if ( isVTK ) { + SVTK_ViewWindow* vtkVW = dynamic_cast( window ); + if ( !vtkVW ) return; + + // get initial color (use first object from selection) + SVTK_View* aView = vtkVW->getView(); + QColor color = aView->GetColor( selected.First() ); + QVariant v = appStudy->getObjectProperty( mgrId, selected.First()->getEntry(), COLOR_PROP, color ); + + // show Choose Color dialog box + color = QColorDialog::getColor( v.value(), app->desktop() ); + if ( !color.isValid() ) return; + + // iterate through list of objects and assign new color + SUIT_OverrideCursor(); + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + GEOMToolsGUI::setVtkColor( appStudy, mgrId, aView, It.Value(), color ); + } + } + else if ( isOCC ) { + // find AIS interactive object (for first item in selection) + Handle(AIS_InteractiveObject) io = GEOMBase::GetAIS( selected.First() ); + if ( io.IsNull() ) return; + + // get initial color (use first object from selection) + Quantity_Color aColor; + io->Color( aColor ); + QColor color = QColor((int)( aColor.Red() * 255.0 ), + (int)( aColor.Green() * 255.0 ), + (int)( aColor.Blue() * 255.0 )); + QVariant v = appStudy->getObjectProperty( mgrId, selected.First()->getEntry(), COLOR_PROP, color ); + + // show Choose Color dialog box + color = QColorDialog::getColor( v.value(), app->desktop() ); + if ( !color.isValid() ) return; + + // iterate through list of objects and assign new color + SUIT_OverrideCursor(); + OCCViewer_Viewer* vm = dynamic_cast ( window->getViewManager()->getViewModel() ); + Handle (AIS_InteractiveContext) ic = vm->getAISContext(); + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + GEOMToolsGUI::setOccColor( appStudy, mgrId, ic, It.Value(), color ); } } + // mark study as modified + GeometryGUI::Modified(); + + // update actions app->updateActions(); //SRN: To update a Save button in the toolbar } + +void GEOMToolsGUI::setVtkColor( SalomeApp_Study* study, // study + int mgrId, // view window id + SVTK_View* view, // VTK view + const Handle(SALOME_InteractiveObject)& IO, // interactive object + const QColor& color ) // color +{ + // get material property + QString matProp; + matProp = study->getObjectProperty( mgrId, IO->getEntry(), MATERIAL_PROP, matProp ).toString(); + Material_Model material; + material.fromProperties( matProp ); + + // change color only for shapes with not physical type of material + if ( !material.isPhysical() ) { + view->SetColor( IO, color ); + study->setObjectProperty( mgrId, IO->getEntry(), COLOR_PROP, color ); + } + + // store color to GEOM_Object + _PTR(Study) aStudy = study->studyDS(); + _PTR(SObject) aSObject( aStudy->FindObjectID( IO->getEntry() ) ); + if ( !aSObject ) return; + + GEOM::GEOM_Object_var anObject = + GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObject)); + + if ( CORBA::is_nil( anObject ) ) return; + + SALOMEDS::Color aSColor; + aSColor.R = (double)color.red() / 255.0; + aSColor.G = (double)color.green() / 255.0; + aSColor.B = (double)color.blue() / 255.0; + anObject->SetColor( aSColor ); + anObject->SetAutoColor( false ); +} + +void GEOMToolsGUI::setOccColor( SalomeApp_Study* study, // study + int mgrId, // view window id + const Handle(AIS_InteractiveContext)& ic, // OCC interactive context + const Handle(SALOME_InteractiveObject)& IO, // interactive object + const QColor& color ) // color +{ + // get AIS object + Handle(AIS_InteractiveObject) io = GEOMBase::GetAIS( IO, true ); + if ( io.IsNull() ) return; + + // get material property + QString matProp; + matProp = study->getObjectProperty( mgrId, IO->getEntry(), MATERIAL_PROP, matProp ).toString(); + Material_Model material; + material.fromProperties( matProp ); + + Quantity_Color aColor = Quantity_Color( color.red() / 255., color.green() / 255., color.blue() / 255., Quantity_TOC_RGB ); + + // change color only for shapes with not physical type of material + if ( !material.isPhysical() ) { + if ( io->IsKind( STANDARD_TYPE(AIS_Shape) ) ) { + TopoDS_Shape theShape = Handle(AIS_Shape)::DownCast( io )->Shape(); + bool onlyVertex = (theShape.ShapeType() == TopAbs_VERTEX || GEOM_Displayer::isCompoundOfVertices( theShape )); + if ( onlyVertex ) { + // set color for a point + Handle(AIS_Drawer) aCurDrawer = io->Attributes(); + Handle(Prs3d_PointAspect) aCurPointAspect = aCurDrawer->PointAspect(); + Quantity_Color aCurColor; + Standard_Real aCurScale; + Aspect_TypeOfMarker aCurTypeOfMarker; + aCurPointAspect->Aspect()->Values( aCurColor, aCurTypeOfMarker, aCurScale ); + if ( aCurTypeOfMarker != Aspect_TOM_USERDEFINED ) { + aCurDrawer->SetPointAspect( new Prs3d_PointAspect( aCurTypeOfMarker, aColor, aCurScale ) ); + } + else { + Standard_Integer aWidth, aHeight; + aCurPointAspect->GetTextureSize( aWidth, aHeight ); +#if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1 + Handle(TColStd_HArray1OfByte) aTexture = aCurPointAspect->GetTexture(); +#else + Handle(Graphic3d_HArray1OfBytes) aTexture = aCurPointAspect->GetTexture(); +#endif + aCurDrawer->SetPointAspect( new Prs3d_PointAspect( aColor, 1, aWidth, aHeight, aTexture ) ); + } + ic->SetLocalAttributes( io, aCurDrawer, Standard_False ); + } + } + + io->SetColor( aColor ); + if ( io->IsKind( STANDARD_TYPE(GEOM_AISShape) ) ) { + Handle(GEOM_AISShape) aGAISShape = Handle(GEOM_AISShape)::DownCast( io ); + aGAISShape->SetShadingColor( aColor ); + aGAISShape->storeBoundaryColors(); + } + + io->Redisplay( Standard_True ); + + study->setObjectProperty( mgrId, IO->getEntry(), COLOR_PROP, color ); + } + + // store color to GEOM_Object + _PTR(Study) aStudy = study->studyDS(); + _PTR(SObject) aSObject( aStudy->FindObjectID( IO->getEntry() ) ); + GEOM::GEOM_Object_var anObject = + GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aSObject)); + SALOMEDS::Color aSColor; + aSColor.R = (double)color.red() / 255.0; + aSColor.G = (double)color.green() / 255.0; + aSColor.B = (double)color.blue() / 255.0; + anObject->SetColor( aSColor ); + anObject->SetAutoColor( false ); +} + void GEOMToolsGUI::OnTexture() { SALOME_ListIO selected; diff --git a/src/GEOM_SWIG_WITHIHM/Makefile.am b/src/GEOM_SWIG_WITHIHM/Makefile.am index e468bfb0d..132fff96d 100644 --- a/src/GEOM_SWIG_WITHIHM/Makefile.am +++ b/src/GEOM_SWIG_WITHIHM/Makefile.am @@ -17,14 +17,6 @@ # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -# GEOM GEOM_SWIG : binding of C++ omplementaion with Python -# File : Makefile.in -# Author : Nicolas REJNERI, Paul RASCLE -# Modified by : Alexander BORODIN (OCN) - autotools usage -# Module : GEOM -# $Header$ -# Libraries targets -# include $(top_srcdir)/adm_local/unix/make_common_starter.am # =============================================================== @@ -40,28 +32,24 @@ include $(top_srcdir)/adm_local/unix/make_common_starter.am # Step 2: build the dynamic library from cpp built source files and # dependant libraries. # -# swig_wrap.cpp -- gcc --> swig_wrap.o |-- link --> _libSALOME_Swig.la +# swig_wrap.cpp -- gcc --> swig_wrap.o |-- link --> _libGEOM_Swig.la # + | # dependant libs | # -# The file libGEOM_Swig.py will be installed to the -# /bin/salome directory. -# The library _libGEOM_Swig.so will be installed to the +# The files libGEOM_Swig.py and _libGEOM_Swig.so will be installed to the # /lib/python/site-package/salome directory. # SWIG_FLAGS = @SWIG_FLAGS@ -I$(srcdir) -I$(srcdir)/../GEOMGUI SWIG_SOURCES = libGEOM_Swig.i +salomeinclude_HEADERS = $(SWIG_SOURCES) libGEOM_Swig.h + salomepython_PYTHON = libGEOM_Swig.py salomepyexec_LTLIBRARIES = _libGEOM_Swig.la -libGEOM_Swig.py: swig_wrap.cpp -BUILT_SOURCES = swig_wrap.cpp -_libGEOM_Swig_la_SOURCES = $(SWIG_SOURCES) -nodist__libGEOM_Swig_la_SOURCES = $(BUILT_SOURCES) - -salomeinclude_HEADERS = $(SWIG_SOURCES) +_libGEOM_Swig_la_SOURCES = $(SWIG_SOURCES) libGEOM_Swig.h libGEOM_Swig.cxx +nodist__libGEOM_Swig_la_SOURCES = swig_wrap.cpp _libGEOM_Swig_la_CPPFLAGS = \ $(QT_INCLUDES) \ @@ -73,16 +61,22 @@ _libGEOM_Swig_la_CPPFLAGS = \ $(GUI_CXXFLAGS) \ $(CORBA_CXXFLAGS) \ $(CORBA_INCLUDES) \ + -I$(srcdir)/../GEOMClient \ + -I$(srcdir)/../OBJECT \ -I$(srcdir)/../GEOMGUI \ + -I$(srcdir)/../GEOMToolsGUI \ -I$(top_builddir)/idl _libGEOM_Swig_la_LDFLAGS = -module _libGEOM_Swig_la_LIBADD = \ ../GEOMGUI/libGEOM.la \ + ../GEOMToolsGUI/libGEOMToolsGUI.la \ $(PYTHON_LIBS) swig_wrap.cpp : $(SWIG_SOURCES) $(SWIG) $(SWIG_FLAGS) -o $@ $< +libGEOM_Swig.py: swig_wrap.cpp + CLEANFILES = swig_wrap.cpp libGEOM_Swig.py diff --git a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx new file mode 100644 index 000000000..f423db40e --- /dev/null +++ b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx @@ -0,0 +1,759 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// GEOM GEOMGUI : GUI for Geometry component +// File : libGEOM_Swig.cxx +// Author : Nicolas REJNERI, Paul RASCLE +// +#include "libGEOM_Swig.h" + +#include "GeometryGUI.h" +#include "GEOMToolsGUI.h" + +#include "SUIT_Desktop.h" +#include "SUIT_Session.h" +#include "SalomeApp_Application.h" +#include "SalomeApp_Study.h" + +#include "OB_Browser.h" + +#include "OCCViewer_ViewWindow.h" +#include "OCCViewer_ViewManager.h" +#include "SOCC_ViewModel.h" +#include + +#include "SVTK_ViewModel.h" +#include "SVTK_ViewWindow.h" +#include "SVTK_View.h" +#include "SVTK_Renderer.h" +#include + +#include "GEOM_Actor.h" +#include "GEOM_Client.hxx" +#include "GEOM_AISShape.hxx" +#include "GEOM_InteractiveObject.hxx" +#include "GEOM_Displayer.h" +#include "GEOM_Constants.h" + +#include "SALOME_Event.h" + +// OCCT Includes +#include +#include +#include +#include +#include +#include +#include + +// IDL Headers +#include +#include CORBA_SERVER_HEADER(GEOM_Gen) + +#include + +static SHAPE_READER(ShapeReader); + +inline OCCViewer_Viewer* GetOCCViewer(SUIT_Application* theApp){ + SUIT_ViewWindow* window = theApp->desktop()->activeWindow(); + if(window && window->getViewManager()->getType() == OCCViewer_Viewer::Type()){ + OCCViewer_ViewWindow* vw = dynamic_cast( window ); + if ( vw ) { + OCCViewer_ViewManager* vm = dynamic_cast( vw->getViewManager() ); + if ( vm ) + return vm->getOCCViewer(); + } + } + + return 0; +} + +inline SVTK_ViewWindow* GetSVTKViewWindow(SUIT_Application* theApp){ + SUIT_ViewWindow* window = theApp->desktop()->activeWindow(); + if(window && window->getViewManager()->getType() == SVTK_Viewer::Type()) + return dynamic_cast( window ); + + return 0; +} + +GEOM_Swig::GEOM_Swig() +{ + // MESSAGE("Constructeur"); +} + +GEOM_Swig::~GEOM_Swig() +{ + // MESSAGE("Destructeur"); +} + +void GEOM_Swig::createAndDisplayGO (const char* Entry, bool isUpdated) +{ + class TEvent: public SALOME_Event + { + std::string myEntry; + bool myUpdateViewer; + public: + TEvent(const char* theEntry, bool toUpdateViewer): + myEntry(theEntry), + myUpdateViewer(toUpdateViewer) + {} + virtual void Execute() + { + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if (!app) return; + + SalomeApp_Study* ActiveStudy = dynamic_cast(app->activeStudy()); + if (!ActiveStudy) return; + + _PTR(Study) aStudy(ActiveStudy->studyDS()); + _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder(); + + GEOM::GEOM_Gen_var Geom = GeometryGUI::GetGeomGen(); + if (CORBA::is_nil(Geom)) { + GeometryGUI::InitGeomGen(); + Geom = GeometryGUI::GetGeomGen(); + } + if (CORBA::is_nil(Geom)) + return; + + std::string aFatherIOR; + _PTR(SComponent) father = aStudy->FindComponent("GEOM"); + if (!father) + return; + if (!father->ComponentIOR(aFatherIOR)) { + CORBA::String_var objStr = SalomeApp_Application::orb()->object_to_string(Geom); + aStudyBuilder->LoadWith(father, objStr.in()); + father->ComponentIOR(aFatherIOR); + } + + _PTR(SObject) obj = aStudy->FindObjectID(myEntry); + if (!obj) + return; + + // Create new actor + _PTR(GenericAttribute) anAttr; + if (!obj->FindAttribute(anAttr, "AttributeIOR")) + return; + _PTR(AttributeIOR) anIOR(anAttr); + std::string anIORValue = anIOR->Value(); + + GEOM::GEOM_Object_var aShape = Geom->GetIORFromString(anIORValue.c_str()); + TopoDS_Shape Shape = ShapeReader.GetShape(Geom,aShape); + if (!Shape.IsNull()) { + if (obj->FindAttribute(anAttr, "AttributeName")) { + _PTR(AttributeName) aName (anAttr); + std::string aNameValue = aName->Value(); + // open transaction + /*SUIT_Operation* op = new SalomeApp_ImportOperation (app); + op->start(); + + _PTR(SObject) newObj1 = aStudyBuilder->NewObject(father); + aStudyBuilder->Addreference(newObj1, obj); + // commit transaction + op->commit();*/ + Handle(GEOM_InteractiveObject) anIO = + new GEOM_InteractiveObject (const_cast(anIORValue.c_str()), + const_cast(aFatherIOR.c_str()), + "GEOM", + const_cast( obj->GetID().c_str())); + + GEOM_Displayer(ActiveStudy).Display(anIO, myUpdateViewer); + /*if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) { + SVTK_View* aView = aViewWindow->getView(); + int aMode = aView->GetDisplayMode(); + + vtkActorCollection* theActors = + GEOM_AssemblyBuilder::BuildActors(Shape,0,aMode,true); + theActors->InitTraversal(); + while (vtkActor* anActor = theActors->GetNextActor()) { + GEOM_Actor* GActor = GEOM_Actor::SafeDownCast(anActor); + GActor->setName(const_cast(aNameValue.c_str())); + GActor->setIO(anIO); + aView->Display(GActor); + } + aView->Repaint(); + } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app)) { + Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); + Handle(GEOM_AISShape) aSh = + new GEOM_AISShape (Shape,const_cast(aNameValue.c_str())); + aSh->setName(const_cast(aNameValue.c_str())); + aSh->setIO(anIO); + ic->Display(aSh); + ic->AddOrRemoveCurrentObject(aSh,true); + }*/ + // update object browser + SalomeApp_Application* app = NULL; //dynamic_cast(app); + if (app) { + CAM_Module* module = app->module("Geometry"); + SalomeApp_Module* appMod = dynamic_cast(module); + if (appMod) + appMod->updateObjBrowser(true); + } + } + } + } + }; + + // MESSAGE("createAndDisplayGO"); + ProcessVoidEvent(new TEvent (Entry, isUpdated)); + + class TEventUpdateBrowser: public SALOME_Event + { + public: + TEventUpdateBrowser() {} + virtual void Execute() { + SalomeApp_Application* app = + dynamic_cast(SUIT_Session::session()->activeApplication()); + if (app) { + CAM_Module* module = app->module("Geometry"); + SalomeApp_Module* appMod = dynamic_cast(module); + if (appMod) appMod->updateObjBrowser(true); + } + } + }; + + if (isUpdated) + ProcessVoidEvent(new TEventUpdateBrowser ()); +} + +void GEOM_Swig::createAndDisplayFitAllGO (const char* Entry) +{ + class TEventFitAll: public SALOME_Event + { + public: + TEventFitAll() {} + virtual void Execute() { + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if (!app) return; + + if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) + { + SVTK_View* aView = aViewWindow->getView(); + aView->GetRenderer()->OnFitAll(); + } + else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app)) + { + Handle(V3d_Viewer) aViewer3d = occViewer->getViewer3d(); + aViewer3d->InitActiveViews(); + + if (aViewer3d->MoreActiveViews()) + aViewer3d->ActiveView()->FitAll(); + } + } + }; + + createAndDisplayGO(Entry); + ProcessVoidEvent(new TEventFitAll()); +} + +void GEOM_Swig::UpdateViewer() +{ + class TEventUpdateViewer: public SALOME_Event + { + public: + TEventUpdateViewer() {} + virtual void Execute() { + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if (!app) return; + SalomeApp_Study* ActiveStudy = dynamic_cast(app->activeStudy()); + if (!ActiveStudy) return; + + GEOM_Displayer(ActiveStudy).UpdateViewer(); + } + }; + + ProcessVoidEvent(new TEventUpdateViewer()); +} + +int GEOM_Swig::getIndexTopology(const char* SubIOR, const char* IOR) +{ + GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen(); + if (CORBA::is_nil(aGeomGen)) + return -1; + + GEOM::GEOM_Object_var aMainShape = aGeomGen->GetIORFromString(IOR); + GEOM::GEOM_Object_var aSubShape = aGeomGen->GetIORFromString(SubIOR); + if (CORBA::is_nil(aMainShape) || CORBA::is_nil(aSubShape)) + return -1; + + GEOM::GEOM_IShapesOperations_var anIShapesOperations = + aGeomGen->GetIShapesOperations(aMainShape->GetStudyID()); + if (CORBA::is_nil(anIShapesOperations)) + return -1; + + return anIShapesOperations->GetTopologyIndex(aMainShape, aSubShape); +} + +const char* GEOM_Swig::getShapeTypeString(const char* IOR) +{ + TCollection_AsciiString aTypeName ("Shape of unknown type"); + + GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen(); + if (!CORBA::is_nil(aGeomGen)) + { + GEOM::GEOM_Object_var aShape = aGeomGen->GetIORFromString(IOR); + if (!CORBA::is_nil(aShape)) + { + GEOM::GEOM_IShapesOperations_var anIShapesOperations = + aGeomGen->GetIShapesOperations(aShape->GetStudyID()); + if (!CORBA::is_nil(anIShapesOperations)) + { + aTypeName = anIShapesOperations->GetShapeTypeString(aShape); + } + } + } + + return CORBA::string_dup(aTypeName.ToCString()); +} + + +const char* GEOM_Swig::getShapeTypeIcon(const char* IOR) +{ + GEOM::GEOM_Gen_var Geom = GeometryGUI::GetGeomGen(); + if ( CORBA::is_nil( Geom ) ) + return "None"; + + GEOM::GEOM_Object_var aShape = Geom->GetIORFromString(IOR); + TopoDS_Shape shape = ShapeReader.GetShape(Geom, aShape); + + if( shape.IsNull() ) { + return "None" ; + } + + switch (shape.ShapeType() ) + { + case TopAbs_COMPOUND: + { return "ICON_OBJBROWSER_COMPOUND" ;} + case TopAbs_COMPSOLID: + { return "ICON_OBJBROWSER_COMPSOLID" ;} + case TopAbs_SOLID: + { return "ICON_OBJBROWSER_SOLID" ;} + case TopAbs_SHELL: + { return "ICON_OBJBROWSER_SHELL" ;} + case TopAbs_FACE: + { return "ICON_OBJBROWSER_FACE" ;} + case TopAbs_WIRE: + { return "ICON_OBJBROWSER_WIRE" ;} + case TopAbs_EDGE: + { return "ICON_OBJBROWSER_EDGE" ;} + case TopAbs_VERTEX: + { return "ICON_OBJBROWSER_VERTEX" ;} + } + + return "None"; +} + +void GEOM_Swig::setDisplayMode(const char* theEntry, int theMode, bool isUpdated) +{ + class TEvent: public SALOME_Event { + std::string myEntry; + int myMode; + bool myUpdateViewer; + public: + TEvent(const char* theEntryArg, int theModeArg, bool theUpdated): + myEntry(theEntryArg), myMode(theModeArg), myUpdateViewer(theUpdated) + {} + virtual void Execute() { + SUIT_Application* anApp = SUIT_Session::session()->activeApplication(); + if (!anApp) return; + + Handle(SALOME_InteractiveObject) anIO = + new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); + + if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) { + SVTK_View* aView = aViewWindow->getView(); + aView->SetDisplayMode(anIO, myMode); + if (myUpdateViewer) + aView->Repaint(); + } + else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { + SOCC_Viewer* soccViewer = dynamic_cast(occViewer); + if (soccViewer) + soccViewer->switchRepresentation(anIO, myMode, myUpdateViewer); + } + } + }; + + ProcessVoidEvent(new TEvent (theEntry, theMode, isUpdated)); +} + +void GEOM_Swig::setVectorsMode(const char* theEntry, bool isOn, bool isUpdated) +{ + class TEvent: public SALOME_Event { + std::string myEntry; + bool myOn; + bool myUpdateViewer; + public: + TEvent(const char* theEntryArg, bool theOn, bool theUpdated): + myEntry(theEntryArg), myOn(theOn), myUpdateViewer(theUpdated) + {} + virtual void Execute() { + SUIT_Application* anApp = SUIT_Session::session()->activeApplication(); + if (!anApp) return; + + Handle(SALOME_InteractiveObject) anIO = + new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); + + if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) { + SVTK_View* aView = aViewWindow->getView(); + SVTK_Viewer* stvkViewer = dynamic_cast(aViewWindow->getViewManager()->getViewModel()); + SVTK_Prs* vtkPrs = dynamic_cast( stvkViewer->CreatePrs( myEntry.c_str() ) ); + vtkActorCollection* anActors = vtkPrs->GetObjects(); + anActors->InitTraversal(); + while (vtkActor* anAct = anActors->GetNextActor()) { + GEOM_Actor* aGeomActor = GEOM_Actor::SafeDownCast(anAct); + aGeomActor->SetVectorMode(!aGeomActor->GetVectorMode()); + } + if (myUpdateViewer) + aView->Repaint(); + } + else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { + Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); + SOCC_Viewer* soccViewer = dynamic_cast(occViewer); + if (soccViewer) { + SOCC_Prs* occPrs = dynamic_cast( soccViewer->CreatePrs( myEntry.c_str() ) ); + if ( occPrs && !occPrs->IsNull() ) { + AIS_ListOfInteractive shapes; occPrs->GetObjects( shapes ); + AIS_ListIteratorOfListOfInteractive interIter( shapes ); + for ( ; interIter.More(); interIter.Next() ) { + Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast( interIter.Value() ); + aSh->SetDisplayVectors(myOn); + ic->RecomputePrsOnly(interIter.Value()); + } + } + } + } + } + }; + + ProcessVoidEvent(new TEvent (theEntry, isOn, isUpdated)); +} + +void GEOM_Swig::setColor(const char* theEntry, int red, int green, int blue, bool isUpdated) +{ + class TEvent: public SALOME_Event { + QString myEntry; + int myRed; + int myGreen; + int myBlue; + bool myUpdateViewer; + public: + TEvent(const char* theEntryArg, int theR, int theG, int theB, bool theUpdated): + myEntry(theEntryArg), myRed(theR), myGreen(theG), myBlue(theB), myUpdateViewer(theUpdated) + {} + virtual void Execute() { + SUIT_Application* anApp = SUIT_Session::session()->activeApplication(); + if (!anApp) return; + + GEOMToolsGUI::SetColor( myEntry, QColor( myRed, myGreen, myBlue), myUpdateViewer ); + /* + Handle(SALOME_InteractiveObject) anIO = + new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); + + if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)){ + SVTK_View* aView = aViewWindow->getView(); + QColor aColor (myRed, myGreen, myBlue); + aView->SetColor(anIO, aColor); + if (myUpdateViewer) + aView->Repaint(); + } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { + Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); + SOCC_Viewer* soccViewer = dynamic_cast(occViewer); + if (soccViewer) + { + SALOME_Prs* prs= soccViewer->CreatePrs( myEntry.c_str() ); + const SOCC_Prs* anOCCPrs = dynamic_cast( prs ); + if ( !anOCCPrs || anOCCPrs->IsNull() ) + return; + + // get objects to be displayed + AIS_ListOfInteractive anAISObjects; + anOCCPrs->GetObjects( anAISObjects ); + AIS_ListIteratorOfListOfInteractive ite( anAISObjects ); + Quantity_Color CSFColor = Quantity_Color(myRed/255., myGreen/255., myBlue/255., Quantity_TOC_RGB); + for ( ; ite.More(); ite.Next() ) + { + if(!ic->IsDisplayed(ite.Value()))continue; //only displayed ais + ite.Value()->SetColor(CSFColor); + if (ite.Value()->IsKind(STANDARD_TYPE(GEOM_AISShape))) Handle(GEOM_AISShape)::DownCast(ite.Value())->SetShadingColor(CSFColor); + ite.Value()->Redisplay(Standard_True); // as in OnColor + } + if (myUpdateViewer) occViewer->update(); + } + }*/ + } + }; + ProcessVoidEvent(new TEvent(theEntry, red, green, blue, isUpdated)); +} + +void GEOM_Swig::setIsos(const char* Entry, int nbU, int nbV, bool isUpdated ) +{ + class TEvent: public SALOME_Event { + std::string myEntry; + int myNbU, myNbV; + bool myUpdateViewer; + public: + TEvent(const char* theEntry, int theNbU, int theNbV, bool theUpdated): + myEntry(theEntry), myNbU(theNbU), myNbV(theNbV), myUpdateViewer(theUpdated) + {} + virtual void Execute() { + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if (!app) return; + SalomeApp_Study* study = dynamic_cast(app->activeStudy()); + if (!study) return; + + Handle(SALOME_InteractiveObject) anIO = + new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); + + if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(app)) { + SVTK_Viewer* aView = dynamic_cast(aViewWindow->getViewManager()->getViewModel()); + SVTK_Prs* vtkPrs = dynamic_cast( aView->CreatePrs( myEntry.c_str() ) ); + if ( vtkPrs ) { + vtkActorCollection* anActors = vtkPrs->GetObjects(); + anActors->InitTraversal(); + GEOM_Actor* anActor = GEOM_Actor::SafeDownCast( anActors->GetNextActor() ); + if ( anActor ) { + int aIsos[2]={myNbU,myNbV}; + anActor->SetNbIsos(aIsos); + anActor->StoreIsoNumbers(); + QString anIsos = QString("%1%2%3").arg(myNbU).arg(DIGIT_SEPARATOR).arg(myNbV); + int aMgrId = aView->getViewManager()->getGlobalId(); + study->setObjectProperty(aMgrId, myEntry.c_str(), ISOS_PROP, anIsos); + } + } + + if (myUpdateViewer) + aView->Repaint(); + } + else if (OCCViewer_Viewer* occViewer = GetOCCViewer(app)) { + Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); + SOCC_Viewer* soccViewer = dynamic_cast(occViewer); + if (soccViewer) { + int aMgrId = soccViewer->getViewManager()->getGlobalId(); + SOCC_Prs* occPrs = dynamic_cast( soccViewer->CreatePrs( myEntry.c_str() ) ); + if ( occPrs && !occPrs->IsNull() ) { + AIS_ListOfInteractive shapes; occPrs->GetObjects( shapes ); + AIS_ListIteratorOfListOfInteractive interIter( shapes ); + for ( ; interIter.More(); interIter.Next() ) { + Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast( interIter.Value() ); + if ( !aSh.IsNull() ) { + Handle(AIS_Drawer) drawer = aSh->Attributes(); + QVariant v = study->getObjectProperty( aMgrId, myEntry.c_str(), EDGE_WIDTH_PROP, QVariant() ); + int width = v.isValid() ? v.toInt() : 1; + drawer->SetUIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, width, myNbU) ); + drawer->SetVIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, width, myNbV) ); + aSh->storeIsoNumbers(); + ic->SetLocalAttributes(aSh, drawer); + ic->Redisplay(aSh); + QString anIsos = QString("%1%2%3").arg(myNbU).arg(DIGIT_SEPARATOR).arg(myNbV); + study->setObjectProperty(aMgrId, myEntry.c_str(), ISOS_PROP, anIsos); + } + } + } + } + } + } + }; + + ProcessVoidEvent(new TEvent (Entry, nbU, nbV, isUpdated)); +} + +void GEOM_Swig::setTransparency(const char* theEntry, float transp, bool isUpdated) +{ + class TEvent: public SALOME_Event { + std::string myEntry; + float myParam; + bool myUpdateViewer; + public: + TEvent(const char* theEntryArg, float theParam, bool theUpdated): + myEntry(theEntryArg), myParam(theParam), myUpdateViewer(theUpdated) + {} + virtual void Execute() { + SUIT_Application* anApp = SUIT_Session::session()->activeApplication(); + if (!anApp) return; + + Handle(SALOME_InteractiveObject) anIO = + new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); + + if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) { + SVTK_View* aView = aViewWindow->getView(); + aView->SetTransparency(anIO, myParam); + if (myUpdateViewer) + aView->Repaint(); + } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { + SOCC_Viewer* soccViewer = dynamic_cast(occViewer); + if (soccViewer) + soccViewer->setTransparency(anIO, myParam, myUpdateViewer); + } + } + }; + + ProcessVoidEvent(new TEvent (theEntry, transp, isUpdated)); +} + + +class TInitGeomGenEvent: public SALOME_Event { +public: + typedef bool TResult; + TResult myResult; + TInitGeomGenEvent() : myResult(false) {} + virtual void Execute() { + myResult = GeometryGUI::InitGeomGen(); + } +}; +bool GEOM_Swig::initGeomGen() +{ + return ProcessEvent(new TInitGeomGenEvent()); +} + + + +void GEOM_Swig::eraseGO (const char* Entry, bool allWindows) +{ + class TEvent: public SALOME_Event + { + std::string myEntry; + bool myFromAllWindows; + public: + TEvent(const char* theEntry, bool fromAllWindows): + myEntry(theEntry), myFromAllWindows(fromAllWindows) + {} + virtual void Execute() + { + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if (!app) return; + SalomeApp_Study* ActiveStudy = dynamic_cast(app->activeStudy()); + if (!ActiveStudy) return; + + Handle (SALOME_InteractiveObject) aIO = new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); + + GEOM_Displayer(ActiveStudy).Erase(aIO, true); + /* if (myFromAllWindows) { + QPtrList aWindows = app->desktop()->windows(); + SUIT_ViewWindow* aWin = 0; + for (aWin = aWindows.first(); aWin; aWin = aWindows.next()) { + EraseObject(aWin, aIO); + } + } else { + SUIT_ViewWindow* aWin = app->desktop()->activeWindow(); + if (aWin) + EraseObject(aWin, aIO); + }*/ + } + + /* private: + void EraseObject(SUIT_ViewWindow* theWin, Handle (SALOME_InteractiveObject) theIO) + { + if (theWin->getViewManager()->getType() == OCCViewer_Viewer::Type()){ + OCCViewer_ViewWindow* vw = dynamic_cast( theWin ); + if ( vw ) { + OCCViewer_ViewManager* vm = dynamic_cast( vw->getViewManager() ); + if ( vm ) { + SOCC_Viewer* aViewer = dynamic_cast(vm->getOCCViewer()); + if (aViewer) { + SALOME_Prs* aPrs = aViewer->CreatePrs(myEntry.c_str()); + if (aPrs) { + SALOME_OCCPrs* aOccPrs = dynamic_cast(aPrs); + if (aOccPrs) { + aViewer->Erase(aOccPrs); + aViewer->Repaint(); + } + } + } + } + } + } else if (theWin->getViewManager()->getType() == SVTK_Viewer::Type()){ + SVTK_ViewWindow* aViewWindow = dynamic_cast( theWin ); + if (aViewWindow) { + aViewWindow->Erase(theIO); + } + } + }*/ + + }; + ProcessVoidEvent(new TEvent(Entry, allWindows)); +} + + + +void GEOM_Swig::setDeflection(const char* theEntry, float theDeflect) +{ + class TEvent: public SALOME_Event { + std::string myEntry; + float myParam; + public: + TEvent(const char* theEntryArg, float theParam): + myEntry(theEntryArg), myParam(theParam) + {} + virtual void Execute() { + SUIT_Application* anApp = SUIT_Session::session()->activeApplication(); + if (!anApp) return; + + Handle(SALOME_InteractiveObject) anIO = + new SALOME_InteractiveObject(myEntry.c_str(), "GEOM", ""); + + if (SVTK_ViewWindow* aViewWindow = GetSVTKViewWindow(anApp)) { + vtkActorCollection* aActors = aViewWindow->getRenderer()->GetActors(); + aActors->InitTraversal(); + while (vtkActor* aAct = aActors->GetNextActor()) { + if (GEOM_Actor* aGeomActor = dynamic_cast(aAct)) { + if (aGeomActor->hasIO()) { + Handle(SALOME_InteractiveObject) aNextIO = aGeomActor->getIO(); + if (aNextIO->isSame(anIO)) { + aGeomActor->setDeflection(myParam); + aViewWindow->Repaint(); + return; + } + } + } + } + // aView->SetTransparency(anIO, myParam); + //aView->Repaint(); + } else if (OCCViewer_Viewer* occViewer = GetOCCViewer(anApp)) { + Handle(AIS_InteractiveContext) aContext = occViewer->getAISContext(); + AIS_ListOfInteractive aAISList; + aContext->DisplayedObjects(aAISList); + AIS_ListIteratorOfListOfInteractive it(aAISList); + for (; it.More(); it.Next()) { + Handle(SALOME_InteractiveObject) aObj = + Handle(SALOME_InteractiveObject)::DownCast(it.Value()->GetOwner()); + if ((!aObj.IsNull()) && aObj->hasEntry() && aObj->isSame(anIO)) { + Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(it.Value()); + if (!aShape.IsNull()) { + TopoDS_Shape aSh = aShape->Shape(); + if (!aSh.IsNull()) + BRepTools::Clean(aSh); + + aShape->SetOwnDeviationCoefficient( myParam ); + aShape->SetOwnHLRDeviationAngle( 1.57 ); + aContext->Redisplay(aShape); + return; + } + } + } + } + } + }; + + ProcessVoidEvent(new TEvent (theEntry, theDeflect)); +} + diff --git a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.h b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.h new file mode 100644 index 000000000..5f85b568b --- /dev/null +++ b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.h @@ -0,0 +1,63 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// GEOM GEOMGUI : GUI for Geometry component +// File : libGEOM_Swig.h +// Author : Nicolas REJNERI, Paul RASCLE +// + +#ifndef GEOMETRYGUI_SWIG_HXX +#define GEOMETRYGUI_SWIG_HXX + +#include "GEOM_GEOMGUI.hxx" + +// IDL Headers +#include +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class GEOMGUI_EXPORT GEOM_Swig +{ +public: + GEOM_Swig(); + ~GEOM_Swig(); + + void createAndDisplayGO(const char* Entry, bool isUpdated = true); + void eraseGO(const char* Entry, bool allWindows); + void createAndDisplayFitAllGO(const char* Entry); + void UpdateViewer(); + void setDisplayMode(const char* Entry, int mode, bool isUpdated = true); + void setVectorsMode(const char* Entry, bool isSet, bool isUpdated = true); + void setColor(const char* Entry, int red, int green, int blue, bool isUpdated = true); + void setTransparency(const char* Entry, float transp, bool isUpdated = true); + void setIsos(const char* Entry, int nbU, int nbV, bool isUpdated =true); + void setDeflection(const char* Entry, float deflect); + + int getIndexTopology(const char *SubEntry, const char *Entry); + const char* getShapeTypeString(const char *Entry); + const char* getShapeTypeIcon(const char *Ior); + + bool initGeomGen(); +}; + +#endif // GEOMETRYGUI_SWIG_HXX diff --git a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i index fc1b8fea4..6bf220c2d 100644 --- a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i +++ b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i @@ -26,5 +26,51 @@ // %module libGEOM_Swig -%include "GeometryGUI_Swig.i" +%{ +#include "libGEOM_Swig.h" +%} + +/* + managing C++ exception in the Python API +*/ +%exception +{ + class PyAllowThreadsGuard { + public: + // Py_BEGIN_ALLOW_THREADS + PyAllowThreadsGuard() { _save = PyEval_SaveThread(); } + // Py_END_ALLOW_THREADS + ~PyAllowThreadsGuard() { PyEval_RestoreThread(_save); } + private: + PyThreadState *_save; + }; + + PyAllowThreadsGuard guard; + + $action +} + +class GEOM_Swig +{ + public: + GEOM_Swig(); + ~GEOM_Swig(); + + void createAndDisplayGO(const char* Entry, bool isUpdated =true); + void eraseGO(const char* Entry, bool allWindows); + void createAndDisplayFitAllGO(const char* Entry); + void UpdateViewer(); + int getIndexTopology(const char *SubEntry, const char *Entry); + const char* getShapeTypeString(const char *Entry); + + void setDisplayMode(const char* Entry, int mode, bool isUpdated =true); + void setVectorsMode(const char* Entry, bool isSet, bool isUpdated =true); + void setColor(const char* Entry, int red, int green, int blue, bool isUpdated =true); + void setTransparency(const char* Entry, float transp, bool isUpdated =true); + void setIsos(const char* Entry, int nbU, int nbV, bool isUpdated =true); + void setDeflection(const char* Entry, float deflect); + const char* getShapeTypeIcon(const char *Ior); + + bool initGeomGen(); +};