From cf23216ed711e4c24105040f2d9e6947de5df061 Mon Sep 17 00:00:00 2001 From: ouv Date: Thu, 25 Mar 2010 13:48:01 +0000 Subject: [PATCH] Issue 0020613: EDF 1106 : Modify Node Marker in SMESH and VISU --- .../gui/VISU/images/custom_point_marker.png | Bin 0 -> 5617 bytes .../gui/VISU/images/point_marker_dlg1.png | Bin 0 -> 9563 bytes .../gui/VISU/images/point_marker_dlg2.png | Bin 0 -> 9511 bytes .../gui/VISU/images/std_point_marker.png | Bin 0 -> 6645 bytes doc/salome/gui/VISU/input/3d_management.doc | 2 + doc/salome/gui/VISU/input/point_marker.doc | 56 ++++ .../gui/VISU/input/tui_point_marker.doc | 48 ++++ .../VISU/input/viewing_3d_presentations.doc | 2 + idl/VISU_Gen.idl | 75 +++++ resources/SalomeApp.xml | 2 + src/ENGINE/VISU_Engine_i.cc | 5 + src/ENGINE/VISU_Engine_i.hh | 3 + src/OBJECT/VISU_DataSetActor.cxx | 5 +- src/OBJECT/VISU_DataSetActor.h | 3 +- src/OBJECT/VISU_MeshAct.cxx | 12 + src/OBJECT/VISU_MeshAct.h | 7 + src/OBJECT/VISU_ScalarMapAct.cxx | 190 +------------ src/OBJECT/VISU_ScalarMapAct.h | 15 +- src/VISUGUI/VISU_msg_en.ts | 12 + src/VISUGUI/VisuGUI.cxx | 94 +++++++ src/VISUGUI/VisuGUI.h | 1 + src/VISUGUI/VisuGUI_ActionsDef.h | 1 + src/VISU_I/VISU_DumpPython.cc | 81 ++++++ src/VISU_I/VISU_Gen_i.cc | 266 +++++++++++++++++- src/VISU_I/VISU_Gen_i.hh | 12 + src/VISU_I/VISU_PointMap3d_i.cc | 23 ++ src/VISU_I/VISU_PointMap3d_i.hh | 7 + src/VISU_I/VISU_Prs3d_i.cc | 108 +++++++ src/VISU_I/VISU_Prs3d_i.hh | 33 +++ src/VISU_SWIG/Makefile.am | 2 +- src/VISU_SWIG/VISU_Example_08.py | 89 ++++++ 31 files changed, 960 insertions(+), 194 deletions(-) create mode 100755 doc/salome/gui/VISU/images/custom_point_marker.png create mode 100755 doc/salome/gui/VISU/images/point_marker_dlg1.png create mode 100755 doc/salome/gui/VISU/images/point_marker_dlg2.png create mode 100755 doc/salome/gui/VISU/images/std_point_marker.png create mode 100644 doc/salome/gui/VISU/input/point_marker.doc create mode 100644 doc/salome/gui/VISU/input/tui_point_marker.doc create mode 100644 src/VISU_SWIG/VISU_Example_08.py diff --git a/doc/salome/gui/VISU/images/custom_point_marker.png b/doc/salome/gui/VISU/images/custom_point_marker.png new file mode 100755 index 0000000000000000000000000000000000000000..29b2dd90f9133a8917aef40d93974e7ddedb5a44 GIT binary patch literal 5617 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/VISU/images/point_marker_dlg1.png b/doc/salome/gui/VISU/images/point_marker_dlg1.png new file mode 100755 index 0000000000000000000000000000000000000000..9bcecefca1dbfd5057a9d132d11e9c547dca60b9 GIT binary patch literal 9563 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 z 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
  • \subpage evolution_page - tracing of temporal evolution of a variable at a given point.
  • +
  • \subpage point_marker_page - allows to change the representation +of points, using standard or custom markers.
  • \subpage translate_presentation_page - displacement of presentations in the viewer.
  • \subpage recording_page - allows to dump user actions in an AVI diff --git a/doc/salome/gui/VISU/input/point_marker.doc b/doc/salome/gui/VISU/input/point_marker.doc new file mode 100644 index 00000000..efd0bcd9 --- /dev/null +++ b/doc/salome/gui/VISU/input/point_marker.doc @@ -0,0 +1,56 @@ +/*! + +\page point_marker_page Point Marker + +\n You can change the representation of points in +the 3D viewer either by selecting one of the predefined +shapes or by loading a custom texture from an external file. + +- Standard point markers + +The Post-Pro module provides a set of predefined point marker shapes +which can be used to display points in 3D viewer. +Each standard point marker has two attributes: type (defines shape +form) and scale factor (defines shape size). + +\image html point_marker_dlg1.png + +
    + +\image html std_point_marker.png "Presentation with standard point markers" + +- Custom point markers + +It is also possible to load a point marker shape from an external file. +This file should provide a description of the point texture as a set +of lines; each line is represented as sequence of "0" and "1" symbols, +where "1" symbol means an opaque pixel and "0" symbol means a +transparent pixel. The width of the texture correspond to the length +of the longest line in the file, expanded to the nearest byte-aligned +value. The height of the texture is equal to the number of non-empty +lines in the file. Note that missing symbols are replaced by "0". + +Here is a texture file sample: + +
    +00111100
    +00111100
    +11111111
    +11111111
    +11111111
    +11111111
    +00111100
    +00111100
    +
    + +\image html point_marker_dlg2.png + +
    + +\image html custom_point_marker.png "Presentation with custom point markers" + + +Our TUI Scripts provide you with \subpage tui_point_marker_page script. + +*/ + diff --git a/doc/salome/gui/VISU/input/tui_point_marker.doc b/doc/salome/gui/VISU/input/tui_point_marker.doc new file mode 100644 index 00000000..1199dc9a --- /dev/null +++ b/doc/salome/gui/VISU/input/tui_point_marker.doc @@ -0,0 +1,48 @@ +/*! + +\page tui_point_marker_page Example of using Point Markers + +\code +import os +import time +import VISU +from visu_gui import * + +data_dir = os.getenv("DATA_DIR") +sleep_delay = 2 + +myViewManager = myVisu.GetViewManager(); + +myView = myViewManager.Create3DView() +myView.SetTitle("The viewer for Point Marker Example") +print "myViewManager.Create3DView()" + +medFile = "fra.med" +medFile = data_dir + '/MedFiles/' + medFile +myResult = myVisu.ImportFile(medFile) + +aMeshName ="LE VOLUME" +anEntity = VISU.NODE +aFieldName = "VITESSE"; +aTimeStampId = 1 + +aScalarMap = myVisu.ScalarMapOnField(myResult,aMeshName,anEntity,aFieldName,aTimeStampId) +myView.Display(aScalarMap); +myView.FitAll(); + +print "Set representation type to Point" +myView.SetPresentationType(aScalarMap, VISU.POINT) + +print "Set standard marker" +aScalarMap.SetMarkerStd(VISU.MT_PLUS, VISU.MS_25) +myView.Update() +time.sleep(sleep_delay) + +print "Set custom marker" +custom_texture = myVisu.LoadTexture(os.path.join(data_dir, "Textures", "texture1.dat")) +aScalarMap.SetMarkerTexture(custom_texture) +myView.Update() + +\endcode + +*/ diff --git a/doc/salome/gui/VISU/input/viewing_3d_presentations.doc b/doc/salome/gui/VISU/input/viewing_3d_presentations.doc index fb116a68..0ea0cecc 100644 --- a/doc/salome/gui/VISU/input/viewing_3d_presentations.doc +++ b/doc/salome/gui/VISU/input/viewing_3d_presentations.doc @@ -102,6 +102,8 @@ are visualized: as straight lines or as arcs of circle. shrink_factor.png - Edge Color - allows to set the color of lines representing the edges of the presentation displayed in SurfaceFrame mode. + - \ref point_marker_page "Point Marker" - allows to change the + representation of points. - \ref translate_presentation_page "Translate Presentation" - allows to translate the presentation along coordinate axes. diff --git a/idl/VISU_Gen.idl b/idl/VISU_Gen.idl index dded558f..c5e40f34 100644 --- a/idl/VISU_Gen.idl +++ b/idl/VISU_Gen.idl @@ -78,6 +78,43 @@ module VISU { NONE /*!< Indicates undefined entity value */ }; + /*! + * Marker type (used for point rendering) + */ + enum MarkerType { + MT_NONE, + MT_POINT, + MT_PLUS, + MT_STAR, + MT_O, + MT_X, + MT_O_POINT, + MT_O_PLUS, + MT_O_STAR, + MT_O_X, + MT_USER + }; + + /*! + * Marker scale (used for point rendering) + */ + enum MarkerScale { + MS_NONE, + MS_10, + MS_15, + MS_20, + MS_25, + MS_30, + MS_35, + MS_40, + MS_45, + MS_50, + MS_55, + MS_60, + MS_65, + MS_70 + }; + /*! * This enumeration contains a set of elements defining the type of the %VISU object. * This enumeration is used for navigation between a set of %VISU interfaces. @@ -307,6 +344,38 @@ module VISU { */ void GetOffset(out float theDx, out float theDy, out float theDz); + /*! + * Set standard point marker for the object + * \param theType standard marker type + * \param theScale standard marker scale + */ + void SetMarkerStd(in MarkerType theType, in MarkerScale theScale); + + /*! + * Set custom point marker for the object. The texture can be added + * by LoadTexture() function + * \param theTextureId texture ID + */ + void SetMarkerTexture(in long theTextureId); + + /*! + * Get type of the point marker assigned to the object + * \return current marker type (MT_NONE if no marker is set) + */ + MarkerType GetMarkerType(); + + /*! + * Get scale of the point marker assigned to the object + * \return current marker scale (MS_NONE if no marker is set) + */ + MarkerScale GetMarkerScale(); + + /*! + * Get texture idenifier of the point marker assigned to the object + * \return marker texture ID (0 if no marker set) + */ + long GetMarkerTexture(); + /*! * Gets memory size actually used by the presentation (Mb). */ @@ -2492,6 +2561,12 @@ module VISU { in string theMeshName, in double_array theTStamps ); + /*! + * Load texture from file + * \param theTextureFile texture file name + * \return unique texture identifier + */ + long LoadTexture(in string theTextureFile); }; /*! \brief %View interface diff --git a/resources/SalomeApp.xml b/resources/SalomeApp.xml index e25cb85c..2e79ca19 100644 --- a/resources/SalomeApp.xml +++ b/resources/SalomeApp.xml @@ -63,6 +63,8 @@ + + diff --git a/src/ENGINE/VISU_Engine_i.cc b/src/ENGINE/VISU_Engine_i.cc index 117e5473..291258e4 100644 --- a/src/ENGINE/VISU_Engine_i.cc +++ b/src/ENGINE/VISU_Engine_i.cc @@ -546,4 +546,9 @@ namespace VISU{ return myVisuGen->VTK2MED(theVTKFiles, theMEDFile, theMeshName, theTStamps); } + /* Load texture from file */ + CORBA::Long VISU_Gen_i::LoadTexture(const char* theTextureFile) + { + return myVisuGen->LoadTexture(theTextureFile); + } }; diff --git a/src/ENGINE/VISU_Engine_i.hh b/src/ENGINE/VISU_Engine_i.hh index 97cff3cd..ecf428c2 100644 --- a/src/ENGINE/VISU_Engine_i.hh +++ b/src/ENGINE/VISU_Engine_i.hh @@ -276,6 +276,9 @@ namespace VISU const char* theMEDFile, const char* theMeshName, const VISU::double_array& theTStamps ); + + /* Load texture from file */ + virtual CORBA::Long LoadTexture(const char* theTextureFile); }; }; diff --git a/src/OBJECT/VISU_DataSetActor.cxx b/src/OBJECT/VISU_DataSetActor.cxx index 128982ab..05fda9ba 100644 --- a/src/OBJECT/VISU_DataSetActor.cxx +++ b/src/OBJECT/VISU_DataSetActor.cxx @@ -28,7 +28,8 @@ #include "VISU_UnstructuredGridPL.hxx" #include "VISU_PipeLineUtils.hxx" -#include +#include + #include #include #include @@ -52,7 +53,7 @@ vtkStandardNewMacro(VISU_DataSetActor); //---------------------------------------------------------------------------- VISU_DataSetActor ::VISU_DataSetActor(): - myMapper(vtkDataSetMapper::New()), + myMapper(VTKViewer_DataSetMapper::New()), myExtractor(SALOME_ExtractGeometry::New()), myPolyDataExtractor(SALOME_ExtractPolyDataGeometry::New()), myFunction(vtkImplicitBoolean::New()) diff --git a/src/OBJECT/VISU_DataSetActor.h b/src/OBJECT/VISU_DataSetActor.h index b3aa197a..9261b6f9 100644 --- a/src/OBJECT/VISU_DataSetActor.h +++ b/src/OBJECT/VISU_DataSetActor.h @@ -31,6 +31,7 @@ #include "VISU_Actor.h" class vtkDataSetMapper; +class VTKViewer_DataSetMapper; class SALOME_ExtractGeometry; class SALOME_ExtractPolyDataGeometry; class vtkImplicitBoolean; @@ -77,7 +78,7 @@ class VISU_OBJECT_EXPORT VISU_DataSetActor : public VISU_Actor SetMapperInput(vtkDataSet* theDataSet); //---------------------------------------------------------------------------- - vtkSmartPointer myMapper; + vtkSmartPointer myMapper; vtkSmartPointer myExtractor; vtkSmartPointer myPolyDataExtractor; vtkSmartPointer myFunction; diff --git a/src/OBJECT/VISU_MeshAct.cxx b/src/OBJECT/VISU_MeshAct.cxx index 13e81879..41799765 100644 --- a/src/OBJECT/VISU_MeshAct.cxx +++ b/src/OBJECT/VISU_MeshAct.cxx @@ -457,3 +457,15 @@ void VISU_MeshAct::SetQuadratic2DRepresentation( EQuadratic2DRepresentation theM break; } } + +void VISU_MeshAct::SetMarkerStd( VTK::MarkerType theMarkerType, VTK::MarkerScale theMarkerScale ) +{ + Superclass::SetMarkerStd( theMarkerType, theMarkerScale ); + myNodeActor->SetMarkerStd( theMarkerType, theMarkerScale ); +} + +void VISU_MeshAct::SetMarkerTexture( int theMarkerId, VTK::MarkerTexture theMarkerTexture ) +{ + Superclass::SetMarkerTexture( theMarkerId, theMarkerTexture ); + myNodeActor->SetMarkerTexture( theMarkerId, theMarkerTexture ); +} diff --git a/src/OBJECT/VISU_MeshAct.h b/src/OBJECT/VISU_MeshAct.h index 1c041bde..9e24df92 100644 --- a/src/OBJECT/VISU_MeshAct.h +++ b/src/OBJECT/VISU_MeshAct.h @@ -141,6 +141,13 @@ class VISU_OBJECT_EXPORT VISU_MeshAct : public VISU_DataSetActor virtual void SetQuadratic2DRepresentation( EQuadratic2DRepresentation theMode ); + virtual + void + SetMarkerStd( VTK::MarkerType, VTK::MarkerScale ); + + virtual + void + SetMarkerTexture( int, VTK::MarkerTexture ); protected: VISU_MeshAct(); diff --git a/src/OBJECT/VISU_ScalarMapAct.cxx b/src/OBJECT/VISU_ScalarMapAct.cxx index 7daf7259..54996e98 100644 --- a/src/OBJECT/VISU_ScalarMapAct.cxx +++ b/src/OBJECT/VISU_ScalarMapAct.cxx @@ -55,163 +55,6 @@ #include -//============================================================================ -class VISU_PointsDeviceActor: public VISU_GaussDeviceActorBase -{ - public: - vtkTypeMacro(VISU_PointsDeviceActor, VISU_GaussDeviceActorBase); - - static - VISU_PointsDeviceActor* - New(); - - - //---------------------------------------------------------------------------- - virtual - void - SetInput(vtkDataSet* theDataSet) - { - myGeomFilter->SetInput( theDataSet ); - } - - - //---------------------------------------------------------------------------- - void - SetInteractor(vtkRenderWindowInteractor* theInteractor) - { - if(theInteractor == myInteractor) - return; - - if(myInteractor) - myInteractor->RemoveObserver(myEventCallbackCommand); - - if(theInteractor) - theInteractor->AddObserver(vtkCommand::CharEvent, - myEventCallbackCommand, - 0.0); - - myInteractor = theInteractor; - } - - - //---------------------------------------------------------------------------- - void - DoMapperShallowCopy( vtkMapper* theMapper, - bool theIsCopyInput ) - { - Superclass::DoMapperShallowCopy( theMapper, theIsCopyInput ); - - vtkDataSet* aDataSet = theMapper->GetInput(); - vtkFloatingPointType aScaleFactor = VISU_DeformedShapePL::GetScaleFactor( aDataSet ); - - GetPointSpriteMapper()->SetAverageCellSize( aScaleFactor ); - } - - - //---------------------------------------------------------------------------- - void - DeepCopy( VISU_PointsDeviceActor *theActor ) - { - VISU::CopyPointSpriteDataMapper( GetPointSpriteMapper(), theActor->GetPointSpriteMapper(), false ); - } - - protected: - //---------------------------------------------------------------------------- - VISU_PointsDeviceActor(): - myGeomFilter( VTKViewer_GeometryFilter::New() ), - myEventCallbackCommand( vtkCallbackCommand::New() ), - myInteractor( NULL ) - { - myGeomFilter->SetInside(true); - - VISU_OpenGLPointSpriteMapper* aMapper = VISU_OpenGLPointSpriteMapper::New(); - aMapper->SetInput( myGeomFilter->GetOutput() ); - - std::string aRootDir( getenv( "VISU_ROOT_DIR") ); - std::string aMainTexture = aRootDir + "/share/salome/resources/visu/sprite_texture.bmp"; - std::string anAlphaTexture = aRootDir + "/share/salome/resources/visu/sprite_alpha.bmp"; - VISU::TTextureValue aTextureValue = VISU::GetTexture( aMainTexture, anAlphaTexture ); - aMapper->SetImageData( aTextureValue.GetPointer() ); - - aMapper->SetUseLookupTableScalarRange(true); - aMapper->SetColorModeToMapScalars(); - aMapper->SetScalarVisibility(true); - - SetPointSpriteMapper( aMapper ); - - aMapper->Delete(); - - myEventCallbackCommand->SetClientData( this ); - myEventCallbackCommand->SetCallback( VISU_PointsDeviceActor::ProcessEvents ); - } - - - //---------------------------------------------------------------------------- - ~VISU_PointsDeviceActor() - { - SetInteractor( NULL ); - myGeomFilter->Delete(); - myEventCallbackCommand->Delete(); - } - - - //---------------------------------------------------------------------------- - static - void - ProcessEvents(vtkObject* theObject, - unsigned long theEvent, - void* theClientData, - void* theCallData) - { - if ( VISU_PointsDeviceActor* self = reinterpret_cast( theClientData ) ) - self->OnInteractorEvent( theEvent ); - } - - - //---------------------------------------------------------------------------- - void - OnInteractorEvent(unsigned long theEvent) - { - switch ( theEvent ) { - case vtkCommand::CharEvent: { - switch( myInteractor->GetKeyCode() ) { - case 'M' : - case 'm' : { - if ( !GetVisibility() ) - return; - - static vtkFloatingPointType anIncrement = 2; - vtkFloatingPointType aMagnification = GetPointSpriteMapper()->GetPointSpriteMagnification(); - vtkFloatingPointType coefficient = myInteractor->GetShiftKey() ? anIncrement : 1 / anIncrement; - - GetPointSpriteMapper()->SetPointSpriteMagnification( aMagnification * coefficient ); - - myInteractor->CreateTimer(VTKI_TIMER_UPDATE); - break; - } - default: - return; - } - break; - } - default: - return; - } - } - - - //---------------------------------------------------------------------------- - vtkCallbackCommand* myEventCallbackCommand; - vtkRenderWindowInteractor* myInteractor; - VTKViewer_GeometryFilter* myGeomFilter; - - private: - VISU_PointsDeviceActor(const VISU_PointsDeviceActor&); // Not implemented - void operator=(const VISU_PointsDeviceActor&); // Not implemented -}; - -vtkStandardNewMacro(VISU_PointsDeviceActor); - //---------------------------------------------------------------------------- vtkStandardNewMacro(VISU_ScalarMapAct); static vtkFloatingPointType EPS = 1.0 / VTK_LARGE_FLOAT; @@ -241,7 +84,8 @@ VISU_ScalarMapAct myEdgeActor->SetUserMatrix(aMatrix); myEdgeActor->GetProperty()->SetColor(255.,255.,255.); - myPointsActor = VISU_PointsDeviceActor::New(); + myPointsActor = SVTK_DeviceActor::New(); + myPointsActor->SetRepresentation(SVTK::Representation::Points); myPointsActor->SetProperty(aProperty); myPointsActor->SetUserMatrix(aMatrix); @@ -280,8 +124,7 @@ VISU_ScalarMapAct myEdgeActor->GetMapper()->ScalarVisibilityOff(); - myPointsActor->DoMapperShallowCopy( thePipeLine->GetMapper(), false ); - + VISU::CopyMapper( myPointsActor->GetMapper(), thePipeLine->GetMapper(), false ); VISU::CopyMapper( mySurfaceActor->GetMapper(), thePipeLine->GetMapper(), false ); } @@ -465,7 +308,6 @@ VISU_ScalarMapAct if(VISU_ScalarMapAct* anActor = dynamic_cast(theActor)){ Superclass::DeepCopy(theActor); SetBarVisibility(anActor->GetBarVisibility()); - myPointsActor->DeepCopy( anActor->myPointsActor ); SetShading(anActor->IsShading()); } } @@ -478,8 +320,6 @@ VISU_ScalarMapAct { Superclass::AddToRender(theRenderer); - myPointsActor->SetInteractor( myInteractor ); - if(myScalarBar) theRenderer->AddActor2D(myScalarBar); } @@ -666,18 +506,6 @@ VISU_ScalarMapAct return 1; } -//---------------------------------------------------------------------------- -unsigned long int -VISU_ScalarMapAct -::GetMemorySize() -{ - unsigned long int aSize = Superclass::GetMemorySize(); - - aSize += myPointsActor->GetMemorySize(); - - return aSize; -} - //---------------------------------------------------------------------------- VISU_Actor::EQuadratic2DRepresentation @@ -708,3 +536,15 @@ void VISU_ScalarMapAct::SetQuadratic2DRepresentation( VISU_Actor::EQuadratic2DRe break; } } + +void VISU_ScalarMapAct::SetMarkerStd( VTK::MarkerType theMarkerType, VTK::MarkerScale theMarkerScale ) +{ + Superclass::SetMarkerStd( theMarkerType, theMarkerScale ); + myPointsActor->SetMarkerStd( theMarkerType, theMarkerScale ); +} + +void VISU_ScalarMapAct::SetMarkerTexture( int theMarkerId, VTK::MarkerTexture theMarkerTexture ) +{ + Superclass::SetMarkerTexture( theMarkerId, theMarkerTexture ); + myPointsActor->SetMarkerTexture( theMarkerId, theMarkerTexture ); +} diff --git a/src/OBJECT/VISU_ScalarMapAct.h b/src/OBJECT/VISU_ScalarMapAct.h index f16e6ada..9ff48ab2 100644 --- a/src/OBJECT/VISU_ScalarMapAct.h +++ b/src/OBJECT/VISU_ScalarMapAct.h @@ -32,8 +32,6 @@ #include "VISU_DataSetActor.h" class VISU_ScalarBarActor; -class VISU_PointsDeviceActor; - //---------------------------------------------------------------------------- class VISU_OBJECT_EXPORT VISU_ScalarMapAct : public VISU_DataSetActor @@ -171,11 +169,14 @@ class VISU_OBJECT_EXPORT VISU_ScalarMapAct : public VISU_DataSetActor bool IsShading(); - //! Gets memory size used by the instance (bytes). virtual - unsigned long int - GetMemorySize(); - + void + SetMarkerStd( VTK::MarkerType, VTK::MarkerScale ); + + virtual + void + SetMarkerTexture( int, VTK::MarkerTexture ); + protected: VISU_ScalarMapAct(); @@ -186,7 +187,7 @@ class VISU_OBJECT_EXPORT VISU_ScalarMapAct : public VISU_DataSetActor bool myBarVisibility; VISU_ScalarBarActor* myScalarBar; - VISU_PointsDeviceActor* myPointsActor; + SVTK_DeviceActor* myPointsActor; SVTK_DeviceActor* mySurfaceActor; SVTK_DeviceActor* myEdgeActor; }; diff --git a/src/VISUGUI/VISU_msg_en.ts b/src/VISUGUI/VISU_msg_en.ts index 22d1baf4..f863f8b5 100644 --- a/src/VISUGUI/VISU_msg_en.ts +++ b/src/VISUGUI/VISU_msg_en.ts @@ -265,6 +265,10 @@ number of time stamps or number of components is not the same! VISU_LOGARITHMIC_SCALING Logarithmic + + VISU_MARKER_SCALE + Scale of marker + VISU_MAX Max: @@ -409,6 +413,10 @@ number of time stamps or number of components is not the same! VISU_TITLE Title + + VISU_TYPE_OF_MARKER + Type of marker + QUADRATIC_REPRESENT_MODE Representation of the 2D quadratic elements @@ -1241,6 +1249,10 @@ Please, refer to the documentation. MEN_POINT_SELECTION Point Selection + + MEN_POINT_MARKER + Point Marker + MEN_POINTS Points diff --git a/src/VISUGUI/VisuGUI.cxx b/src/VISUGUI/VisuGUI.cxx index 97ba5489..330f6317 100644 --- a/src/VISUGUI/VisuGUI.cxx +++ b/src/VISUGUI/VisuGUI.cxx @@ -64,6 +64,7 @@ //#include "SVTK_MainWindow.h" #include "VTKViewer_Algorithm.h" +#include "VTKViewer_MarkerDlg.h" #include "SPlot2d_ViewModel.h" #include "VisuGUI_SetupPlot2dDlg.h" @@ -1428,6 +1429,67 @@ VisuGUI delete CursorDlg; } +//---------------------------------------------------------------------------- +void +VisuGUI +::OnChangePointMarker() +{ + SALOME_ListIO aListIO; + GetSelectionMgr( this )->selectedObjects( aListIO ); + if( aListIO.Extent() < 1 ) + return; + + VISU::StudyId2MarkerMap& aMarkerMap = GetVisuGen( this )->GetMarkerMap(); + _PTR(Study) aCStudy = GetCStudy( GetAppStudy( this ) ); + int aStudyId = aCStudy->StudyId(); + + bool update = false; + for( SALOME_ListIteratorOfListIO It( aListIO ); It.More(); It.Next() ) + { + Handle(SALOME_InteractiveObject)& anIO = It.Value(); + std::vector aPrsList = GetPrs3dList( this, anIO ); + for( int i = 0, n = aPrsList.size(); i < n; i++ ) + { + if( VISU::Prs3d_i* aPrs = aPrsList[i] ) + { + VTKViewer_MarkerDlg* aDlg = new VTKViewer_MarkerDlg( GetDesktop( this ) ); + + aDlg->setCustomMarkerMap( aMarkerMap[ aStudyId ] ); + + VISU::MarkerType aMarkerTypeCurrent = aPrs->GetMarkerType(); + VISU::MarkerScale aMarkerScaleCurrent = aPrs->GetMarkerScale(); + int aMarkerTextureCurrent = aPrs->GetMarkerTexture(); + if( aMarkerTypeCurrent != VISU::MT_USER ) + aDlg->setStandardMarker( (VTK::MarkerType)aMarkerTypeCurrent, (VTK::MarkerScale)aMarkerScaleCurrent ); + else + aDlg->setCustomMarker( aMarkerTextureCurrent ); + + if( aDlg->exec() ) + { + aMarkerMap[ aStudyId ] = aDlg->getCustomMarkerMap(); + + VISU::MarkerType aMarkerTypeNew = (VISU::MarkerType)aDlg->getMarkerType(); + VISU::MarkerScale aMarkerScaleNew = (VISU::MarkerScale)aDlg->getStandardMarkerScale(); + int aMarkerTextureNew = aDlg->getCustomMarkerID(); + if( aMarkerTypeNew != VISU::MT_USER ) + aPrs->SetMarkerStd( aMarkerTypeNew, aMarkerScaleNew ); + else + aPrs->SetMarkerTexture( aMarkerTextureNew ); + + aPrs->UpdateActors(); + update = true; + } + + delete aDlg; + } + } + } + + if( update ) + if( SVTK_ViewWindow* vw = GetActiveViewWindow( this ) ) + vw->Repaint(); +} + //---------------------------------------------------------------------------- void VisuGUI @@ -2724,6 +2786,10 @@ VisuGUI tr("MEN_LINE_WIDTH"), "", 0, aParent, false, this, SLOT(OnChangeLines())); + createAction( VISU_POINT_MARKER, tr("MEN_POINT_MARKER"), QIcon(), + tr("MEN_POINT_MARKER"), "", 0, aParent, false, + this, SLOT(OnChangePointMarker())); + createAction( VISU_SHRINK_FACTOR, tr("MEN_SHRINK_FACTOR"), QIcon(), tr("MEN_SHRINK_FACTOR"), "", 0, aParent, false, this, SLOT(OnChangeShrinkFactor())); @@ -3077,6 +3143,7 @@ VisuGUI mgr->insert( action( VISU_COLOR ) , parentId, -1, -1 ); // color mgr->insert( action( VISU_OPACITY ) , parentId, -1, -1 ); // opacity mgr->insert( action( VISU_LINE_WIDTH ), parentId, -1, -1 ); // line width + mgr->insert( action( VISU_POINT_MARKER ), parentId, -1, -1 ); // point marker mgr->insert( action( VISU_SHRINK_FACTOR ), parentId, -1, -1 ); // shrink factor mgr->insert( separator(), -1, -1, -1 ); @@ -3258,6 +3325,7 @@ VisuGUI "or (type='VISU::TDEFORMEDSHAPE' and hasActor=1))" ); mgr->setRule( action( VISU_OPACITY ), aRule + " and hasActor=1" ); mgr->setRule( action( VISU_LINE_WIDTH ), aRule + aLineType + " and hasActor=1" ); + mgr->setRule( action( VISU_POINT_MARKER ), aRule + aLineType + " and hasActor=1 and representation='VISU::POINT'" ); mgr->setRule( action( VISU_SHRINK_FACTOR ), aRule + aShrinkType + " and isShrunk=1" ); // rename command @@ -4125,6 +4193,32 @@ void VisuGUI::createPreferences() addPreference( tr( "VISU_EDGE_COLOR" ), representGr, LightApp_Preferences::Color, "VISU", "edge_color" ); addPreference( "", representGr, LightApp_Preferences::Space ); + SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); + + int typeOfMarker = addPreference( tr( "VISU_TYPE_OF_MARKER" ), representGr, LightApp_Preferences::Selector, "VISU", "type_of_marker" ); + + QList aMarkerTypeIndicesList; + QList aMarkerTypeIconsList; + for ( int i = VTK::MT_POINT; i <= VTK::MT_O_X; i++ ) { + QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i ); + QPixmap pixmap = aResourceMgr->loadPixmap( "VTKViewer", tr( qPrintable( icoFile ) ) ); + aMarkerTypeIndicesList << i; + aMarkerTypeIconsList << pixmap; + } + setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList ); + setPreferenceProperty( typeOfMarker, "icons", aMarkerTypeIconsList ); + + int markerScale = addPreference( tr( "VISU_MARKER_SCALE" ), representGr, LightApp_Preferences::Selector, "VISU", "marker_scale" ); + + QList aMarkerScaleIndicesList; + QStringList aMarkerScaleValuesList; + for ( int i = VISU::MS_10; i <= VISU::MS_70; i++ ) { + aMarkerScaleIndicesList << i; + aMarkerScaleValuesList << QString::number( (i-(int)VISU::MS_10)*0.5 + 1.0 ); + } + setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList ); + setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList ); + addPreference( tr( "VISU_USE_SHADING" ), representGr, LightApp_Preferences::Bool, "VISU", "represent_shading" ); sp = addPreference( "", representGr, LightApp_Preferences::Space ); setPreferenceProperty( sp, "hstretch", 0 ); diff --git a/src/VISUGUI/VisuGUI.h b/src/VISUGUI/VisuGUI.h index 90205718..05f19dd8 100644 --- a/src/VISUGUI/VisuGUI.h +++ b/src/VISUGUI/VisuGUI.h @@ -153,6 +153,7 @@ protected slots: void OnChangeWireframeColor(); void OnChangeOpacity(); void OnChangeLines(); + void OnChangePointMarker(); void OnChangeShrinkFactor(); void OnShowTable(); diff --git a/src/VISUGUI/VisuGUI_ActionsDef.h b/src/VISUGUI/VisuGUI_ActionsDef.h index 3b0be7fc..f0717599 100644 --- a/src/VISUGUI/VisuGUI_ActionsDef.h +++ b/src/VISUGUI/VisuGUI_ActionsDef.h @@ -92,6 +92,7 @@ #define VISU_EDGE_COLOR 4059 #define VISU_OPACITY 4060 #define VISU_LINE_WIDTH 4061 +#define VISU_POINT_MARKER 40611 #define VISU_SHRINK_FACTOR 40629 #define VISU_EDIT_SCALARMAP 40620 diff --git a/src/VISU_I/VISU_DumpPython.cc b/src/VISU_I/VISU_DumpPython.cc index b8356d85..6ef7dee1 100644 --- a/src/VISU_I/VISU_DumpPython.cc +++ b/src/VISU_I/VISU_DumpPython.cc @@ -212,6 +212,48 @@ namespace VISU theServant->GetOffset(x,y,z); theStr<GetMarkerType(); + if( aMarkerType != VISU::MT_NONE ) { + if( aMarkerType != VISU::MT_USER ) { + VISU::MarkerScale aMarkerScale = theServant->GetMarkerScale(); + std::string aParam1, aParam2; + switch( aMarkerType ) { + case MT_POINT: aParam1 = "MT_POINT"; break; + case MT_PLUS: aParam1 = "MT_PLUS"; break; + case MT_STAR: aParam1 = "MT_STAR"; break; + case MT_O: aParam1 = "MT_O"; break; + case MT_X: aParam1 = "MT_X"; break; + case MT_O_POINT: aParam1 = "MT_O_POINT"; break; + case MT_O_PLUS: aParam1 = "MT_O_PLUS"; break; + case MT_O_STAR: aParam1 = "MT_O_STAR"; break; + case MT_O_X: aParam1 = "MT_O_X"; break; + default: aParam1 = "MT_NONE"; break; + } + switch( aMarkerScale ) { + case MS_10: aParam2 = "MS_10"; break; + case MS_15: aParam2 = "MS_15"; break; + case MS_20: aParam2 = "MS_20"; break; + case MS_25: aParam2 = "MS_25"; break; + case MS_30: aParam2 = "MS_30"; break; + case MS_35: aParam2 = "MS_35"; break; + case MS_40: aParam2 = "MS_40"; break; + case MS_45: aParam2 = "MS_45"; break; + case MS_50: aParam2 = "MS_50"; break; + case MS_55: aParam2 = "MS_55"; break; + case MS_60: aParam2 = "MS_60"; break; + case MS_65: aParam2 = "MS_65"; break; + case MS_70: aParam2 = "MS_70"; break; + default: aParam2 = "MT_NONE"; break; + } + theStr<GetMarkerTexture(); + if( aMarkerTexture >= 0 ) + theStr<StudyId()); + if(anIter == theMarkerMap.end()) + return; + + theStr<second; + VTK::MarkerMap::const_iterator aMarkerIter = aMarkerMap.begin(); + for(; aMarkerIter != aMarkerMap.end(); aMarkerIter++) { + int aMarkerId = aMarkerIter->first; + std::string aMarkerTexture = aMarkerIter->second.first; + theStr<URL(); + aPrefix = SALOMEDS_Tool::GetNameFromPath(anURL.in()); + } + + theMarkerMapFileName = aPrefix + "_textures"; + theMarkerMapFile = VISU_TMP_DIR + theMarkerMapFileName; + + if( theIsASCII && !HDFascii::ConvertFromASCIIToHDF( const_cast( theMarkerMapFile.c_str() ), true ) ) + return false; + + HDFfile* aFile; + HDFdataset* aDataset; + HDFgroup* aTopGroup; + HDFgroup* aGroup; + HDFgroup* aSubGroup; + HDFgroup* aSubSubGroup; + int aSize; + + aFile = new HDFfile( (char*)theMarkerMapFile.c_str() ); + try { + aFile->OpenOnDisk( HDF_RDONLY ); + } + catch ( HDFexception ) { + INFOS( "Load(): " << theMarkerMapFile << " not found!" ); + return false; + } + + VTK::MarkerMap& aMarkerMap = theStudyId2MarkerMap[ theStudy->StudyId() ]; + + for( int i = 0, n = aFile->nInternalObjects(); i < n; i++ ) { + char markerGrpName[ HDF_NAME_MAX_LEN+1 ]; + aFile->InternalObjectIndentify( i, markerGrpName ); + + int aMarkerId = 0; + std::string aMarkerFile; + VTK::MarkerTexture aMarkerTexture; + + if( string( markerGrpName ).substr( 0, 6 ) == string( "Marker" ) ) { + aTopGroup = new HDFgroup( markerGrpName, aFile ); + aTopGroup->OpenOnDisk(); + + aMarkerId = atoi( string( markerGrpName ).substr( 6 ).c_str() ); + if( aMarkerId < 1 ) + continue; + + if( aTopGroup->ExistInternalObject( "File" ) ) { + aDataset = new HDFdataset( "File", aTopGroup ); + aDataset->OpenOnDisk(); + aSize = aDataset->GetSize(); + char* aFileName = new char[ aSize ]; + aDataset->ReadFromDisk( aFileName ); + aMarkerFile = aFileName; + delete [] aFileName; + aDataset->CloseOnDisk(); + } + + if( aTopGroup->ExistInternalObject( "Texture" ) ) { + aDataset = new HDFdataset( "Texture", aTopGroup ); + aDataset->OpenOnDisk(); + aSize = aDataset->GetSize(); + int* aTextureData = new int[ aSize ]; + aDataset->ReadFromDisk( aTextureData ); + for( int j = 0; j < aSize; j++ ) + aMarkerTexture.push_back( aTextureData[j] ); + delete [] aTextureData; + aDataset->CloseOnDisk(); + } + + aTopGroup->CloseOnDisk(); + } + + if( aMarkerId > 0 ) + aMarkerMap[ aMarkerId ] = VTK::MarkerData( aMarkerFile, aMarkerTexture ); + } + + aFile->CloseOnDisk(); + delete aFile; + + return true; + } + + //---------------------------------------------------------------------------- + bool + SaveMarkerMap(SALOMEDS::Study_ptr theStudy, + const char* theURL, + bool theIsMultiFile, + bool theIsASCII, + const StudyId2MarkerMap& theStudyId2MarkerMap, + std::string& theMarkerMapFileName, + std::string& theMarkerMapFile) + { + VISU::StudyId2MarkerMap::const_iterator aMainIter = theStudyId2MarkerMap.find( theStudy->StudyId() ); + if( aMainIter == theStudyId2MarkerMap.end() ) + return false; + + const VTK::MarkerMap& aMarkerMap = aMainIter->second; + if( aMarkerMap.empty() ) + return false; + + std::string aPrefix; + if( theIsMultiFile ) { + CORBA::String_var anURL = theStudy->URL(); + aPrefix = SALOMEDS_Tool::GetNameFromPath(anURL.in()); + } + + theMarkerMapFileName = aPrefix + "_textures"; + theMarkerMapFile = string( theURL ) + theMarkerMapFileName; + + HDFfile* aFile; + HDFdataset* aDataset; + HDFgroup* aTopGroup; + HDFgroup* aGroup; + HDFgroup* aSubGroup; + HDFgroup* aSubSubGroup; + hdf_size aSize[ 1 ]; + + aFile = new HDFfile( (char*)theMarkerMapFile.c_str() ); + aFile->CreateOnDisk(); + + VTK::MarkerMap::const_iterator aMarkerIter = aMarkerMap.begin(); + for( ; aMarkerIter != aMarkerMap.end(); aMarkerIter++ ) { + int aMarkerId = aMarkerIter->first; + const VTK::MarkerData& aMarkerData = aMarkerIter->second; + std::string aMarkerFile = aMarkerData.first; + VTK::MarkerTexture aMarkerTexture = aMarkerData.second; + + char markerGrpName[30]; + sprintf( markerGrpName, "Marker %d", aMarkerId ); + aTopGroup = new HDFgroup( markerGrpName, aFile ); + + aTopGroup->CreateOnDisk(); + + aSize[ 0 ] = aMarkerFile.length() + 1; + aDataset = new HDFdataset( "File", aTopGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( ( char* )( aMarkerFile.c_str() ) ); + aDataset->CloseOnDisk(); + + int* aTextureData = new int[ aMarkerTexture.size() ]; + VTK::MarkerTexture::const_iterator anIter = aMarkerTexture.begin(); + for( int i = 0; anIter != aMarkerTexture.end(); anIter++, i++ ) + aTextureData[i] = *anIter; + + aSize[0] = aMarkerTexture.size(); + aDataset = new HDFdataset( "Texture", aTopGroup, HDF_INT32, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( aTextureData ); + aDataset->CloseOnDisk(); + delete [] aTextureData; + + aTopGroup->CloseOnDisk(); + } + + aFile->CloseOnDisk(); + delete aFile; + + if( theIsASCII && !HDFascii::ConvertFromHDFToASCII( const_cast( theMarkerMapFile.c_str() ), true ) ) + return false; + + return true; + } + + //---------------------------------------------------------------------------- VISU_Gen_i ::VISU_Gen_i(CORBA::ORB_ptr theORB, PortableServer::POA_ptr thePOA, @@ -323,13 +500,13 @@ namespace VISU //---------------------------------------------------------------------------- CORBA::Boolean - VISU_Gen_i - ::Load(SALOMEDS::SComponent_ptr theComponent, - const SALOMEDS::TMPFile & theStream, - const char* theURL, - CORBA::Boolean theIsMultiFile) + LoadWithMarkerMap(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile & theStream, + const char* theURL, + CORBA::Boolean theIsMultiFile, + CORBA::Boolean theIsASCII, + StudyId2MarkerMap& theStudyId2MarkerMap) { - Mutex mt(myMutex); SALOMEDS::Study_var aStudy = theComponent->GetStudy(); SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(theComponent); @@ -340,15 +517,41 @@ namespace VISU CorrectSObjectType(aSObject, aStudyBuilder); } - VISU_TMP_DIR = theIsMultiFile ? theURL : SALOMEDS_Tool::GetTmpDir(); SALOMEDS::ListOfFileNames_var aSeq = SALOMEDS_Tool::PutStreamToFiles(theStream, VISU_TMP_DIR, theIsMultiFile); myIsMultiFile = theIsMultiFile; + + // load textures of custom point markers + Result_i::TFileNames aTMPFileNames; + std::string aMarkerMapFileName, aMarkerMapFile; + if( LoadMarkerMap( aStudy, theURL, theIsMultiFile, theIsASCII, + theStudyId2MarkerMap, aMarkerMapFileName, aMarkerMapFile ) ) { + aTMPFileNames.push_back( aMarkerMapFileName ); + } + + if(!theIsMultiFile && !aTMPFileNames.empty()) { + SALOMEDS::ListOfFileNames_var aListOfTMPFileNames = GetListOfFileNames(aTMPFileNames); + SALOMEDS_Tool::RemoveTemporaryFiles(VISU_TMP_DIR, aListOfTMPFileNames, true ); + } + return true; } + //---------------------------------------------------------------------------- + CORBA::Boolean + VISU_Gen_i + ::Load(SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile & theStream, + const char* theURL, + CORBA::Boolean theIsMultiFile) + { + Mutex mt(myMutex); + return LoadWithMarkerMap(theComponent, theStream, theURL, theIsMultiFile, false, myMarkerMap); + } + + //---------------------------------------------------------------------------- CORBA::Boolean VISU_Gen_i @@ -357,7 +560,8 @@ namespace VISU const char* theURL, bool theIsMultiFile) { - return Load(theComponent, theStream, theURL, theIsMultiFile); + Mutex mt(myMutex); + return LoadWithMarkerMap(theComponent, theStream, theURL, theIsMultiFile, true, myMarkerMap); } @@ -410,6 +614,16 @@ namespace VISU } if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - aFileNames.size() - "<StudyId(); + + VTK::MarkerTexture aMarkerTexture; + if( !VTK::LoadTextureData( theTextureFile, VTK::MS_NONE, aMarkerTexture ) ) + return 0; + + VTK::MarkerMap& aMarkerMap = myMarkerMap[ aStudyId ]; + int aMarkerId = VTK::GetUniqueId( aMarkerMap ); + + VTK::MarkerData& aMarkerData = aMarkerMap[ aMarkerId ]; + aMarkerData.first = theTextureFile; + aMarkerData.second = aMarkerTexture; + + return aMarkerId; + } } diff --git a/src/VISU_I/VISU_Gen_i.hh b/src/VISU_I/VISU_Gen_i.hh index 951688c9..216f0601 100644 --- a/src/VISU_I/VISU_Gen_i.hh +++ b/src/VISU_I/VISU_Gen_i.hh @@ -34,10 +34,16 @@ #include "VISU_ColoredPrs3d_i.hh" #include "VISU_ClippingPlaneMgr.hxx" +#include + +#include #include namespace VISU { + //---------------------------------------------------------------------------- + typedef std::map StudyId2MarkerMap; + //---------------------------------------------------------------------------- class VISU_Gen_i : public virtual POA_VISU::VISU_Gen, public virtual ::Engines_Component_i, @@ -46,6 +52,8 @@ namespace VISU SALOMEDS::Study_var myStudyDocument; VISU_ClippingPlaneMgr myClippingPlaneMgr; + StudyId2MarkerMap myMarkerMap; + VISU_Gen_i(const VISU::VISU_Gen_i &); public: VISU_Gen_i(CORBA::ORB_ptr theORB, @@ -413,6 +421,10 @@ namespace VISU const char* theMeshName, const VISU::double_array& theTStamps); + /* Load texture from file */ + virtual CORBA::Long LoadTexture(const char* theTextureFile); + + StudyId2MarkerMap& GetMarkerMap() { return myMarkerMap; } }; } diff --git a/src/VISU_I/VISU_PointMap3d_i.cc b/src/VISU_I/VISU_PointMap3d_i.cc index f0533c30..0bda5dbb 100644 --- a/src/VISU_I/VISU_PointMap3d_i.cc +++ b/src/VISU_I/VISU_PointMap3d_i.cc @@ -727,6 +727,29 @@ void VISU::PointMap3d_i::GetOffset(CORBA::Float& theDx, CORBA::Float& theDy, COR theDz = myOffset[2]; } +void VISU::PointMap3d_i::SetMarkerStd(VISU::MarkerType, VISU::MarkerScale) +{ +} + +void VISU::PointMap3d_i::SetMarkerTexture(CORBA::Long) +{ +} + +VISU::MarkerType VISU::PointMap3d_i::GetMarkerType() +{ + return VISU::MT_NONE; +} + +VISU::MarkerScale VISU::PointMap3d_i::GetMarkerScale() +{ + return VISU::MS_NONE; +} + +CORBA::Long VISU::PointMap3d_i::GetMarkerTexture() +{ + return 0; +} + CORBA::Float VISU::PointMap3d_i::GetMemorySize() { CORBA::Float aSize = GetSpecificPL()->GetMemorySize(); diff --git a/src/VISU_I/VISU_PointMap3d_i.hh b/src/VISU_I/VISU_PointMap3d_i.hh index 547191d8..252c00e7 100644 --- a/src/VISU_I/VISU_PointMap3d_i.hh +++ b/src/VISU_I/VISU_PointMap3d_i.hh @@ -77,6 +77,13 @@ namespace VISU //! Gets offset parameters for the 3D presentation virtual void GetOffset(CORBA::Float& theDx, CORBA::Float& theDy, CORBA::Float& theDz); + //! Do nothing, just for compilability + virtual void SetMarkerStd(VISU::MarkerType, VISU::MarkerScale); + virtual void SetMarkerTexture(CORBA::Long); + virtual VISU::MarkerType GetMarkerType(); + virtual VISU::MarkerScale GetMarkerScale(); + virtual CORBA::Long GetMarkerTexture(); + //! Gets memory size actually used by the presentation (Mb). virtual CORBA::Float GetMemorySize(); diff --git a/src/VISU_I/VISU_Prs3d_i.cc b/src/VISU_I/VISU_Prs3d_i.cc index 17468de9..ac0058d5 100644 --- a/src/VISU_I/VISU_Prs3d_i.cc +++ b/src/VISU_I/VISU_Prs3d_i.cc @@ -26,6 +26,7 @@ // #include "VISU_Prs3d_i.hh" #include "VISU_Prs3dUtils.hh" +#include "VISU_Gen_i.hh" #include "VISU_PipeLine.hxx" #include "VISU_Result_i.hh" @@ -35,6 +36,8 @@ #include "SUIT_ResourceMgr.h" #include "SUIT_MessageBox.h" +#include + #include #include #include @@ -59,6 +62,11 @@ VISU::Prs3d_i::Prs3d_i() : if(MYDEBUG) MESSAGE("Prs3d_i::Prs3d_i - this = "<Delete(); + + SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); + myMarkerType = (VISU::MarkerType)aResourceMgr->integerValue("VISU", "type_of_marker", 1); // dot + myMarkerScale = (VISU::MarkerScale)aResourceMgr->integerValue("VISU", "marker_scale", 9); // 5 pixels + myMarkerId = 0; } @@ -73,6 +81,10 @@ VISU::Prs3d_i GetPipeLine()->SameAs(anOrigin->GetPipeLine()); anOrigin->GetOffset(myOffset); + myMarkerType = anOrigin->GetMarkerType(); + myMarkerScale = anOrigin->GetMarkerScale(); + myMarkerId = anOrigin->GetMarkerTexture(); + SetForcedHidden(anOrigin->IsForcedHidden()); } } @@ -312,6 +324,9 @@ VISU::Prs3d_i myOffset[0] = VISU::Storable::FindValue(theMap,"myOffset[0]").toFloat(); myOffset[1] = VISU::Storable::FindValue(theMap,"myOffset[1]").toFloat(); myOffset[2] = VISU::Storable::FindValue(theMap,"myOffset[2]").toFloat(); + myMarkerType = VISU::MarkerType(VISU::Storable::FindValue(theMap,"myMarkerType").toInt()); + myMarkerScale = VISU::MarkerScale(VISU::Storable::FindValue(theMap,"myMarkerScale").toInt()); + myMarkerId = VISU::Storable::FindValue(theMap,"myMarkerId").toInt(); myParamsTime.Modified(); return this; } @@ -327,6 +342,9 @@ VISU::Prs3d_i Storable::DataToStream( theStr, "myOffset[0]", myOffset[0] ); Storable::DataToStream( theStr, "myOffset[1]", myOffset[1] ); Storable::DataToStream( theStr, "myOffset[2]", myOffset[2] ); + Storable::DataToStream( theStr, "myMarkerType", int(myMarkerType) ); + Storable::DataToStream( theStr, "myMarkerScale", int(myMarkerScale) ); + Storable::DataToStream( theStr, "myMarkerId", myMarkerId ); } @@ -498,6 +516,15 @@ VISU::Prs3d_i theActor->SetPrs3d(this); theActor->SetShrinkFactor(aResourceMgr->integerValue("VISU", "shrink_factor", 80)/100.); theActor->SetPosition(myOffset[0],myOffset[1],myOffset[2]); + + if( myMarkerType != VISU::MT_USER ) + theActor->SetMarkerStd( (VTK::MarkerType)myMarkerType, (VTK::MarkerScale)myMarkerScale ); + else if( myMarkerId > 0 ) { + VTK::MarkerTexture aMarkerTexture; + if( LoadMarkerTexture( myMarkerId, aMarkerTexture ) ) + theActor->SetMarkerTexture( myMarkerId, aMarkerTexture ); + } + theActor->SetPipeLine(GetActorPipeLine()); if(theActor->GetPipeLine() != GetPipeLine()){ // To decrease actor'ss pipeline reference counter @@ -546,6 +573,15 @@ VISU::Prs3d_i if(VISU_Actor* anActor = dynamic_cast(theActor)){ if(MYDEBUG) MESSAGE("Prs3d_i::UpdateActor - this = "<