From 0ac708f1b0afa63a8d7e7de379f13fa28689707b Mon Sep 17 00:00:00 2001 From: vsr Date: Tue, 29 Jan 2013 16:31:36 +0000 Subject: [PATCH] 0021830: [CEA 652] TUI createAndDisplayGO --- src/GEOM_SWIG_WITHIHM/Makefile.am | 2 + src/GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx | 898 +++++++++---------------- src/GEOM_SWIG_WITHIHM/libGEOM_Swig.h | 40 +- src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i | 28 +- 4 files changed, 374 insertions(+), 594 deletions(-) diff --git a/src/GEOM_SWIG_WITHIHM/Makefile.am b/src/GEOM_SWIG_WITHIHM/Makefile.am index 59166af81..710d23be6 100644 --- a/src/GEOM_SWIG_WITHIHM/Makefile.am +++ b/src/GEOM_SWIG_WITHIHM/Makefile.am @@ -66,12 +66,14 @@ _libGEOM_Swig_la_CPPFLAGS = \ -I$(srcdir)/../OBJECT \ -I$(srcdir)/../GEOMGUI \ -I$(srcdir)/../GEOMToolsGUI \ + -I$(srcdir)/../Material \ -I$(top_builddir)/idl _libGEOM_Swig_la_LDFLAGS = -module _libGEOM_Swig_la_LIBADD = \ ../GEOMGUI/libGEOM.la \ ../GEOMToolsGUI/libGEOMToolsGUI.la \ + ../Material/libMaterial.la \ $(PYTHON_LIBS) swig_wrap.cpp : $(SWIG_SOURCES) diff --git a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx index 29d82a3ff..80623324f 100644 --- a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx +++ b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.cxx @@ -19,313 +19,275 @@ // // 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 "Material_Model.h" -#include "SALOME_Event.h" +#include +#include +#include +#include +#include +#include +#include +#include -// OCCT Includes -#include -#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; -} - +/*! + \brief Constructor +*/ GEOM_Swig::GEOM_Swig() { - // MESSAGE("Constructeur"); + init(); } +/*! + \brief Destructor +*/ GEOM_Swig::~GEOM_Swig() { - // MESSAGE("Destructeur"); } -void GEOM_Swig::createAndDisplayGO (const char* Entry, bool theUpdateViewer) +/*! + \brief Internal initialization +*/ +void GEOM_Swig::init() { class TEvent: public SALOME_Event { - std::string myEntry; - bool myUpdateViewer; public: - TEvent(const char* theEntry, bool toUpdateViewer): - myEntry(theEntry), - myUpdateViewer(toUpdateViewer) + TEvent() {} virtual void Execute() { + // check active study SUIT_Application* app = SUIT_Session::session()->activeApplication(); if (!app) return; + + SalomeApp_Study* study = dynamic_cast( app->activeStudy() ); + if ( !study ) 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; + _PTR(Study) studyDS( study->studyDS() ); + _PTR(StudyBuilder) builder = studyDS->NewBuilder(); - std::string aFatherIOR; - _PTR(SComponent) father = aStudy->FindComponent("GEOM"); - if (!father) + // get/init GEOM engine + GEOM::GEOM_Gen_var engine = GeometryGUI::GetGeomGen(); + if ( CORBA::is_nil( engine ) ) 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) + // find GEOM component in the study + _PTR(SComponent) component = studyDS->FindComponent( "GEOM" ); + if ( !component ) 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); - } - } + // load GEOM data (if it is not done yet) + std::string ior; + if ( !component->ComponentIOR( ior ) ) { + CORBA::String_var engineIOR = SalomeApp_Application::orb()->object_to_string( engine ); + builder->LoadWith( component, engineIOR.in() ); } + + // update Object browser + if ( dynamic_cast( app ) ) + dynamic_cast( app )->updateObjectBrowser( true ); } }; - // MESSAGE("createAndDisplayGO"); - ProcessVoidEvent(new TEvent (Entry, theUpdateViewer)); + ProcessVoidEvent( new TEvent() ); +} - class TEventUpdateBrowser: public SALOME_Event +/*! + \brief Display the presenation in the currently active view + \param theEntry geometry object's entry + \param theUpdateViewer \c true to update active view's contents +*/ +void GEOM_Swig::createAndDisplayGO( const char* theEntry, bool theUpdateViewer ) +{ + class TEvent: public SALOME_Event + { + std::string myEntry; + bool myUpdateViewer; + public: + TEvent( const char* _entry, bool _update ): + myEntry( _entry ), myUpdateViewer( _update ) + {} + virtual void Execute() { - 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 (theUpdateViewer) - ProcessVoidEvent(new TEventUpdateBrowser ()); + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if ( !app ) return; + SalomeApp_Study* study = dynamic_cast( app->activeStudy() ); + if ( !study ) return; + + Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject( myEntry.c_str(), "GEOM", "" ); + + GEOM_Displayer( study ).Display( io, myUpdateViewer ); + } + }; + + ProcessVoidEvent( new TEvent( theEntry, theUpdateViewer ) ); } -void GEOM_Swig::createAndDisplayFitAllGO (const char* Entry) +/*! + \brief Same as createAndDisplayGO, but also fits the active view to the contents + \param theEntry geometry object's entry + \param theUpdateViewer \c true to update active view's contents +*/ +void GEOM_Swig::createAndDisplayFitAllGO( const char* theEntry ) { + // display object + createAndDisplayGO( theEntry ); + + // fit all the view 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(); - } + public: + TEventFitAll() {} + virtual void Execute() + { + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if ( app ) { + SUIT_ViewWindow* window = app->desktop()->activeWindow(); + if ( dynamic_cast( window ) ) + dynamic_cast( window )->onFitAll(); + else if ( dynamic_cast( window ) ) + dynamic_cast( window )->onViewFitAll(); } + } }; + + ProcessVoidEvent( new TEventFitAll() ); +} - createAndDisplayGO(Entry); - ProcessVoidEvent(new TEventFitAll()); +/*! + \brief Erase presentation in the currently active viewer + \param theEntry geometry object's entry + \param theUpdateViewer \c true to update active view's contents +*/ +void GEOM_Swig::eraseGO( const char* theEntry, bool theUpdateViewer ) +{ + class TEvent: public SALOME_Event + { + std::string myEntry; + bool myUpdateViewer; + public: + TEvent( const char* _entry, bool _update ): + myEntry( _entry ), myUpdateViewer( _update ) + {} + 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) io = new SALOME_InteractiveObject( myEntry.c_str(), "GEOM", "" ); + + GEOM_Displayer( study ).Erase( io, true, myUpdateViewer ); + } + }; + + ProcessVoidEvent( new TEvent( theEntry, theUpdateViewer ) ); } +/*! + \brief Update active viewer contents +*/ 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(); - } + public: + TEventUpdateViewer() + {} + virtual void Execute() + { + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if ( !app ) return; + + SalomeApp_Study* study = dynamic_cast( app->activeStudy() ); + if ( !study ) return; + + GEOM_Displayer( study ).UpdateViewer(); + } }; ProcessVoidEvent(new TEventUpdateViewer()); } -int GEOM_Swig::getIndexTopology(const char* SubIOR, const char* IOR) +/*! + \brief Get sub-shape index inside main shape + \param theSubIOR sub-shape geometry object's IOR + \param theMainIOR main shape geometry object's IOR + \return sub-shape index (-1 in case of error) +*/ +int GEOM_Swig::getIndexTopology( const char* theSubIOR, const char* theMainIOR ) { - GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen(); - if (CORBA::is_nil(aGeomGen)) - return -1; + int index = -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; + // get geom engine + GEOM::GEOM_Gen_var aGeomGen = GeometryGUI::GetGeomGen(); - GEOM::GEOM_IShapesOperations_var anIShapesOperations = - aGeomGen->GetIShapesOperations(aMainShape->GetStudyID()); - if (CORBA::is_nil(anIShapesOperations)) - return -1; + // get main shape's geom object by IOR + CORBA::Object_var anObject = SalomeApp_Application::orb()->string_to_object( theMainIOR ); + GEOM::GEOM_Object_var aMainShape = GEOM::GEOM_Object::_narrow( anObject.in() ); + // get sub-shape's geom object by IOR + anObject = SalomeApp_Application::orb()->string_to_object( theSubIOR ); + GEOM::GEOM_Object_var aSubShape = GEOM::GEOM_Object::_narrow( anObject.in() ); + + if ( !CORBA::is_nil( aGeomGen ) && !CORBA::is_nil( aMainShape ) && !CORBA::is_nil( aSubShape ) ) { + // get shapes operations interface + GEOM::GEOM_IShapesOperations_var anIShapesOperations = + aGeomGen->GetIShapesOperations( aMainShape->GetStudyID() ); + if ( !CORBA::is_nil( anIShapesOperations ) ) + index = anIShapesOperations->GetTopologyIndex( aMainShape, aSubShape ); + } - return anIShapesOperations->GetTopologyIndex(aMainShape, aSubShape); + return index; } -const char* GEOM_Swig::getShapeTypeString(const char* IOR) +/*! + \brief Get shape type name + \param theIOR geometry object's IOR + \return shape type name ("Shape of unknown type" in case of error) +*/ +const char* GEOM_Swig::getShapeTypeString( const char* theIOR ) { - TCollection_AsciiString aTypeName ("Shape of unknown type"); + QString aTypeName = "Shape of unknown type"; + // get geom engine 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); - } - } + + // get shape's geom object by IOR + CORBA::Object_var anObject = SalomeApp_Application::orb()->string_to_object( theIOR ); + GEOM::GEOM_Object_var aShape = GEOM::GEOM_Object::_narrow( anObject.in() ); + + if ( !CORBA::is_nil( aGeomGen ) && !CORBA::is_nil( aShape ) ) { + // get shapes operations interface + GEOM::GEOM_IShapesOperations_var anIShapesOperations = + aGeomGen->GetIShapesOperations( aShape->GetStudyID() ); + if ( !CORBA::is_nil( anIShapesOperations ) ) + aTypeName = anIShapesOperations->GetShapeTypeString( aShape ); } - return CORBA::string_dup(aTypeName.ToCString()); + return strdup( qPrintable( aTypeName ) ); } - +/*! + \brief Get shape's icon ID (specified by its type) + \param theIOR geometry object's IOR + \return icon ID ("None" in case of error) +*/ const char* GEOM_Swig::getShapeTypeIcon( const char* theIOR ) { static const char* icons[] = { @@ -358,365 +320,173 @@ const char* GEOM_Swig::getShapeTypeIcon( const char* theIOR ) return anIcon; } -void GEOM_Swig::setDisplayMode(const char* theEntry, int theMode, bool theUpdateViewer) +class TSetPropertyEvent: public SALOME_Event { - class TEvent: public SALOME_Event { - QString 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* app = SUIT_Session::session()->activeApplication(); - if ( !app ) return; - - SalomeApp_Study* study = dynamic_cast( app->activeStudy() ); - if ( !study ) return; - - GEOM_Displayer displayer( study ); - - SALOME_View* window = displayer.GetActiveView(); - if ( !window ) return; - - int mgrId = dynamic_cast( window )->getViewManager()->getGlobalId(); - study->setObjectProperty( mgrId, myEntry, GEOM::propertyName( GEOM::DisplayMode ), myMode ); + QString myEntry; + QString myProperty; + QVariant myValue; + bool myUpdateViewer; + +public: + TSetPropertyEvent( const QString& _entry, + const QString& _property, + const QVariant& _value, + bool _update = true ); + virtual void Execute(); +}; + +TSetPropertyEvent::TSetPropertyEvent( const QString& _entry, + const QString& _property, + const QVariant& _value, + bool _update ): + myEntry( _entry ), + myProperty( _property ), + myValue( _value ), + myUpdateViewer( _update ) +{ +} - Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject( myEntry.toLatin1().data(), "GEOM" ); - if ( window->isVisible( io ) ) { - SALOME_Prs* prs = displayer.buildPresentation( myEntry, window ); - displayer.Redisplay( io ); - delete prs; - } - } - }; +void TSetPropertyEvent::Execute() +{ + SUIT_Application* app = SUIT_Session::session()->activeApplication(); + if ( !app ) return; + + SalomeApp_Study* study = dynamic_cast( app->activeStudy() ); + if ( !study ) return; + + GEOM_Displayer displayer( study ); + + SALOME_View* window = displayer.GetActiveView(); + if ( !window ) return; + + int mgrId = dynamic_cast( window )->getViewManager()->getGlobalId(); - ProcessVoidEvent( new TEvent( theEntry, theMode, theUpdateViewer ) ); + study->setObjectProperty( mgrId, myEntry, myProperty, myValue ); + + Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject( myEntry.toLatin1().data(), "GEOM" ); + if ( window->isVisible( io ) ) displayer.Redisplay( io, myUpdateViewer ); } -void GEOM_Swig::setVectorsMode(const char* theEntry, bool isOn, bool theUpdateViewer) +/*! + \brief Set display mode to the presentation + \param theEntry geometry object's entry + \param theMode display mode: 0 - wireframe, 1 - shading, 2 - shading+edges, 3-textured + \param theUpdateViewer \c true to update active view's contents +*/ +void GEOM_Swig::setDisplayMode( const char* theEntry, int theMode, bool theUpdateViewer ) { - 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 TSetPropertyEvent( theEntry, GEOM::propertyName( GEOM::DisplayMode ), + theMode, theUpdateViewer ) ); +} - ProcessVoidEvent(new TEvent (theEntry, isOn, theUpdateViewer)); +/*! + \brief Show / hide edges direction vectors for the presentation + \param theEntry geometry object's entry + \param theOn \c true to show edges direction vectors or \c false otherwise + \param theUpdateViewer \c true to update active view's contents +*/ +void GEOM_Swig::setVectorsMode( const char* theEntry, bool theOn, bool theUpdateViewer ) +{ + ProcessVoidEvent( new TSetPropertyEvent( theEntry, GEOM::propertyName( GEOM::EdgesDirection ), + theOn, theUpdateViewer ) ); } -void GEOM_Swig::setColor(const char* theEntry, int red, int green, int blue, bool theUpdateViewer) +/*! + \brief Change color of the presentation + \param theEntry geometry object's entry + \param theRed red component of the component (0-255) + \param theGreen green component of the component (0-255) + \param theBlue blue component of the component (0-255) + \param theUpdateViewer \c true to update active view's contents +*/ +void GEOM_Swig::setColor( const char* theEntry, int theRed, int theGreen, int theBlue, bool theUpdateViewer ) { - 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 ); - } - }; - ProcessVoidEvent(new TEvent(theEntry, red, green, blue, theUpdateViewer)); + ProcessVoidEvent( new TSetPropertyEvent( theEntry, GEOM::propertyName( GEOM::Color ), + QColor( theRed, theGreen, theBlue ), theUpdateViewer ) ); } -void GEOM_Swig::setIsos(const char* Entry, int nbU, int nbV, bool theUpdateViewer ) +/*! + \brief Set number of iso-lines to the presentation + \param theEntry geometry object's entry + \param theNbU number of iso-lines along U axis (interger value >= 0) + \param theNbV number of iso-lines along V axis (interger value >= 0) + \param theUpdateViewer \c true to update active view's contents +*/ +void GEOM_Swig::setIsos( const char* theEntry, int theNbU, int theNbV, bool theUpdateViewer ) { - 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(GEOM::subSectionSeparator()).arg(myNbV); - int aMgrId = aView->getViewManager()->getGlobalId(); - study->setObjectProperty(aMgrId, myEntry.c_str(), GEOM::propertyName( GEOM::NbIsos ), 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(), GEOM::propertyName( GEOM::LineWidth ), 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(GEOM::subSectionSeparator()).arg(myNbV); - study->setObjectProperty(aMgrId, myEntry.c_str(), GEOM::propertyName( GEOM::NbIsos ), anIsos); - } - } - } - } - } - } - }; + ProcessVoidEvent( new TSetPropertyEvent( theEntry, GEOM::propertyName( GEOM::NbIsos ), + QString( "%1%2%3" ).arg( theNbU ).arg( GEOM::subSectionSeparator() ).arg( theNbV ), + theUpdateViewer ) ); +} - ProcessVoidEvent(new TEvent (Entry, nbU, nbV, theUpdateViewer)); +/*! + \brief Set transparency of the presentation + \param theEntry geometry object's entry + \param theTransparency transparency (floating point value between 0 and 1) + \param theUpdateViewer \c true to update active view's contents +*/ +void GEOM_Swig::setTransparency( const char* theEntry, float theTransparency, bool theUpdateViewer ) +{ + ProcessVoidEvent( new TSetPropertyEvent( theEntry, GEOM::propertyName( GEOM::Transparency ), + theTransparency, theUpdateViewer ) ); } -void GEOM_Swig::setTransparency(const char* theEntry, float transp, bool theUpdateViewer) +/*! + \brief Set deflection coefficient of the presentation + \param theEntry geometry object's entry + \param theDeflection deflection coefficient (floating point value) + \param theUpdateViewer \c true to update active view's contents +*/ +void GEOM_Swig::setDeflection( const char* theEntry, float theDeflection, bool theUpdateViewer ) { - 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 TSetPropertyEvent( theEntry, GEOM::propertyName( GEOM::Deflection ), + theDeflection, theUpdateViewer ) ); +} - ProcessVoidEvent(new TEvent (theEntry, transp, theUpdateViewer)); +/*! + \brief Set material to the presentation + \param theEntry geometry object's entry + \param theMaterial material name (string) + \param theUpdateViewer \c true to update active view's contents +*/ +void GEOM_Swig::setMaterial( const char* theEntry, const char* theMaterial, bool theUpdateViewer ) +{ + Material_Model material; + material.fromResources( theMaterial ); + ProcessVoidEvent( new TSetPropertyEvent( theEntry, GEOM::propertyName( GEOM::Material ), + material.toProperties(), theUpdateViewer ) ); } +/*! + \brief Set material property to the presentation + \param theEntry geometry object's entry + \param theMaterial material property string + \param theUpdateViewer \c true to update active view's contents +*/ +void GEOM_Swig::setMaterialProperty( const char* theEntry, const char* theMaterial, bool theUpdateViewer ) +{ + ProcessVoidEvent( new TSetPropertyEvent( theEntry, GEOM::propertyName( GEOM::Material ), + theMaterial, theUpdateViewer ) ); +} -class TInitGeomGenEvent: public SALOME_Event { +class TInitGeomGenEvent: public SALOME_Event +{ public: typedef bool TResult; TResult myResult; - TInitGeomGenEvent() : myResult(false) {} - virtual void Execute() { + 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) +/*! + \brief Initialize GEOM module's engine + \return \c true if initialization succeedes or \c false otherwise +*/ +bool GEOM_Swig::initGeomGen() { - 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)); + return ProcessEvent( new TInitGeomGenEvent() ); } - diff --git a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.h b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.h index bbb2470b7..8580c87c9 100644 --- a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.h +++ b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.h @@ -19,14 +19,11 @@ // // 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 +#ifndef LIBGEOM_SWIG_H +#define LIBGEOM_SWIG_H #include "GEOM_GEOMGUI.hxx" @@ -36,22 +33,29 @@ public: GEOM_Swig(); ~GEOM_Swig(); - void createAndDisplayGO(const char* Entry, bool theUpdateViewer = true); - void eraseGO(const char* Entry, bool allWindows); - void createAndDisplayFitAllGO(const char* Entry); + void createAndDisplayGO( const char* theEntry, bool theUpdateViewer = true ); + void createAndDisplayFitAllGO( const char* theEntry ); + void eraseGO( const char* theEntry, bool theUpdateViewer = true ); + void UpdateViewer(); - void setDisplayMode(const char* Entry, int mode, bool theUpdateViewer = true); - void setVectorsMode(const char* Entry, bool isSet, bool theUpdateViewer = true); - void setColor(const char* Entry, int red, int green, int blue, bool theUpdateViewer = true); - void setTransparency(const char* Entry, float transp, bool theUpdateViewer = true); - void setIsos(const char* Entry, int nbU, int nbV, bool theUpdateViewer =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); + void setDisplayMode( const char* theEntry, int theMode, bool theUpdateViewer = true ); + void setVectorsMode( const char* theEntry, bool theOn, bool theUpdateViewer = true ); + void setColor( const char* theEntry, int theRed, int theGreen, int theBlue, bool theUpdateViewer = true ); + void setTransparency( const char* theEntry, float theTransparency, bool theUpdateViewer = true ); + void setIsos( const char* theEntry, int theNbU, int theNbV, bool theUpdateViewer = true ); + void setDeflection( const char* theEntry, float theDeflection, bool theUpdateViewer = true ); + void setMaterial( const char* theEntry, const char* theMaterial, bool theUpdateViewer = true ); + void setMaterialProperty( const char* theEntry, const char* theMaterial, bool theUpdateViewer = true ); + + int getIndexTopology( const char* theSubIOR, const char* theMainIOR ); + const char* getShapeTypeString( const char* theIOR ); + const char* getShapeTypeIcon( const char* theIOR ); bool initGeomGen(); +private: + + void init(); }; -#endif // GEOMETRYGUI_SWIG_HXX +#endif // LIBGEOM_SWIG_H diff --git a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i index 0277c22c5..7504d783f 100644 --- a/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i +++ b/src/GEOM_SWIG_WITHIHM/libGEOM_Swig.i @@ -55,20 +55,24 @@ class GEOM_Swig 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 createAndDisplayGO( const char* theEntry, bool theUpdateViewer = true ); + void createAndDisplayFitAllGO( const char* theEntry ); + void eraseGO( const char* theEntry, bool theUpdateViewer = true ); + 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); + void setDisplayMode( const char* theEntry, int theMode, bool theUpdateViewer = true ); + void setVectorsMode( const char* theEntry, bool theOn, bool theUpdateViewer = true ); + void setColor( const char* theEntry, int theRed, int theGreen, int theBlue, bool theUpdateViewer = true ); + void setTransparency( const char* theEntry, float theTransparency, bool theUpdateViewer = true ); + void setIsos( const char* theEntry, int theNbU, int theNbV, bool theUpdateViewer = true ); + void setDeflection( const char* theEntry, float theDeflection, bool theUpdateViewer = true ); + void setMaterial( const char* theEntry, const char* theMaterial, bool theUpdateViewer = true ); + void setMaterialProperty( const char* theEntry, const char* theMaterial, bool theUpdateViewer = true ); + + int getIndexTopology( const char* theSubIOR, const char* theMainIOR ); + const char* getShapeTypeString( const char* theIOR ); + const char* getShapeTypeIcon( const char* theIOR ); bool initGeomGen(); }; -- 2.39.2