Salome HOME
bos #19960: [CEA 19958] Show/Hide SHAPERSTUDY objects occ/19960_v2
authorjfa <jfa@opencascade.com>
Tue, 24 Nov 2020 12:22:56 +0000 (15:22 +0300)
committervsr <vsr@opencascade.com>
Fri, 5 Feb 2021 16:14:23 +0000 (19:14 +0300)
src/GEOMClient/GEOM_Client.cxx
src/GEOMClient/GEOM_Client.hxx
src/GEOMGUI/GEOM_Displayer.cxx
src/GEOMGUI/GeometryGUI.cxx
src/GEOMToolsGUI/GEOMToolsGUI_MarkerDlg.cxx

index 73558480d9a1deabdac3b317b808870885841004..897a475414249833e3c76f586c53ea8d1546a54b 100644 (file)
@@ -167,9 +167,10 @@ Standard_Boolean GEOM_Client::Find (const TopoDS_Shape& S, TCollection_AsciiStri
 // function : Bind()
 // purpose  :
 //=======================================================================
-void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S )
+void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S, int Tick )
 {
   myShapesMap[IOR] = S;
+  myTicksMap[IOR] = Tick;
 }
 
 //=======================================================================
@@ -192,31 +193,31 @@ void GEOM_Client::ClearClientBuffer()
   myShapesMap.clear();
 }
 
-//=======================================================================
-// function : BufferLength()
-// purpose  :
-//=======================================================================
-unsigned int GEOM_Client::BufferLength()
-{
-  return myShapesMap.size();
-}
-
 //=======================================================================
 // function : GetShape()
 // purpose  :
 //=======================================================================
 TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape )
 {
-  TopoDS_Shape S;
   CORBA::String_var     anIOR = geom->GetStringFromIOR(aShape);
   TCollection_AsciiString IOR = anIOR.in();
+  int aShapeTick = aShape->GetTick();
+
+  std::map< TCollection_AsciiString , int >::iterator i2t = myTicksMap.find( IOR );
+  if ( i2t != myTicksMap.end() ) {
+    // The shape was modified, clean the stored one
+    if (i2t->second != aShapeTick)
+      RemoveShapeFromBuffer(IOR);
+  }
+
+  TopoDS_Shape S;
   if ( Find( IOR, S ))
     return S;
 
   /******* in case of a MAIN GEOM::SHAPE ********/
   if ( aShape->IsMainShape() ) {
     S = Load(geom, aShape);
-    Bind(IOR, S);
+    Bind(IOR, S, aShapeTick);
     return S;
   }
 
@@ -254,6 +255,6 @@ TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_p
 
     S = aCompound;
   }
-  Bind(IOR, S);
+  Bind(IOR, S, aShapeTick);
   return S;
 }
index 7feebc689e98aa55b8f3612e1c7d620039d77d76..f18c85d1224d7f75b19950957718a9a00fcb2f91 100644 (file)
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(GEOM_Gen)
 
-#ifdef HAVE_FINITE
-#undef HAVE_FINITE // E.A. fix a warning about redefinition of HAVE_FINITE in re-inclusion of Standard_values.h
-#endif
-#ifndef _TColStd_SequenceOfAsciiString_HeaderFile
-#include <TColStd_SequenceOfAsciiString.hxx>
-#endif
-#ifndef _TopTools_SequenceOfShape_HeaderFile
-#include <TopTools_SequenceOfShape.hxx>
-#endif
-#ifndef _Standard_Integer_HeaderFile
-#include <Standard_Integer.hxx>
-#endif
-
-class TCollection_AsciiString;
-class TopoDS_Shape;
+#include <Standard_Boolean.hxx>
+#include <TCollection_AsciiString.hxx>
+#include <TopoDS_Shape.hxx>
 
-#ifndef _Standard_HeaderFile
-#include <Standard.hxx>
-#endif
-#ifndef _Standard_Macro_HeaderFile
-#include <Standard_Macro.hxx>
-#endif
+#include <map>
+#include <vector>
 
 #ifdef WIN32
   #if defined GEOMCLIENT_EXPORTS || defined GEOMClient_EXPORTS
@@ -62,11 +46,6 @@ class TopoDS_Shape;
    #define GEOMCLIENT_EXPORT
 #endif
 
-#include <TCollection_AsciiString.hxx>
-#include <TopoDS_Shape.hxx>
-#include <map>
-#include <vector>
-
 /*
  * if define SINGLE_CLIENT is not commented, the method get_client always returns the same GEOM_Client object (singleton object)
  * and the SHAPE_READER macro can be used to define an object that is always this singleton object
@@ -81,42 +60,17 @@ class TopoDS_Shape;
 class GEOMCLIENT_EXPORT GEOM_Client  {
 
  public:
-
-  inline void* operator new(size_t,void* anAddress)
-  {
-    return anAddress;
-  }
-  inline void* operator new(size_t size)
-  {
-    return Standard::Allocate(size);
-  }
-  inline void  operator delete(void *anAddress)
-  {
-    if (anAddress) Standard::Free((Standard_Address&)anAddress);
-  }
   // Methods PUBLIC
   //
-  //Standard_EXPORT
   GEOM_Client();
-  //Standard_EXPORT
   GEOM_Client(Engines::Container_ptr client);
-  //Standard_EXPORT
   GEOM_Client(const GEOM_Client& client);
-  //Standard_EXPORT
-  Standard_Boolean Find( const TCollection_AsciiString& IOR, TopoDS_Shape& S ) ;
-  //Standard_EXPORT
-  Standard_Boolean Find( const TopoDS_Shape& S, TCollection_AsciiString& IOR ) ;
-  //Standard_EXPORT
-  void Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S ) ;
-  //Standard_EXPORT
+
   TopoDS_Shape GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape );
-  //Standard_EXPORT
+  Standard_Boolean Find( const TopoDS_Shape& S, TCollection_AsciiString& IOR ) ;
   void RemoveShapeFromBuffer( const TCollection_AsciiString& IOR ) ;
-  //Standard_EXPORT
   void ClearClientBuffer() ;
-  //Standard_EXPORT
-  unsigned int BufferLength() ;
-  TopoDS_Shape Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape);
+
 #ifdef SINGLE_CLIENT
   static GEOM_Client& get_client();
 #else
@@ -124,10 +78,17 @@ class GEOMCLIENT_EXPORT GEOM_Client  {
 #endif
 
  private:
+  // Methods PRIVATE
+  //
+  Standard_Boolean Find( const TCollection_AsciiString& IOR, TopoDS_Shape& S ) ;
+  void Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape& S, int Tick ) ;
+  TopoDS_Shape Load( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape);
+
   // Fields PRIVATE
   //
   std::map< TCollection_AsciiString , std::vector<TopoDS_Shape> > _mySubShapes;
   std::map< TCollection_AsciiString , TopoDS_Shape > myShapesMap;
+  std::map< TCollection_AsciiString , int > myTicksMap;
   long  pid_client;
 };
 
index 808e735aa3d74ee10f4102d47d71a42277631af9..1ed416c580978a5b13542698316eec42d611efd0 100644 (file)
@@ -2697,38 +2697,40 @@ SALOMEDS::Color GEOM_Displayer::getColor(GEOM::GEOM_Object_var theGeomObject, bo
       aSColor = theGeomObject->GetColor();
       hasColor = aSColor.R >= 0 && aSColor.G >= 0 && aSColor.B >= 0;
       if ( !hasColor ) {
+        if (!theGeomObject->IsMainShape()) {
 #ifdef GENERAL_AUTOCOLOR // auto-color for all sub-shapes
-        bool general_autocolor = true;
+          bool general_autocolor = true;
 #else                    // auto-color for groups only
-        bool general_autocolor = false;
+          bool general_autocolor = false;
 #endif                   // GENERAL_AUTOCOLOR
-        if ( general_autocolor || theGeomObject->GetType() == GEOM_GROUP ) {
-          GEOM::GEOM_Object_var aMainObject = theGeomObject->GetMainShape();
-          if ( !CORBA::is_nil( aMainObject ) && aMainObject->GetAutoColor() ) {
+          if ( general_autocolor || theGeomObject->GetType() == GEOM_GROUP ) {
+            GEOM::GEOM_Object_var aMainObject = theGeomObject->GetMainShape();
+            if ( !CORBA::is_nil( aMainObject ) && aMainObject->GetAutoColor() ) {
 #ifdef SIMPLE_AUTOCOLOR  // simplified algorithm for auto-colors
-            aSColor = getPredefinedUniqueColor();
-            hasColor = true;
+              aSColor = getPredefinedUniqueColor();
+              hasColor = true;
 #else                    // old algorithm  for auto-colors
-            QList<SALOMEDS::Color> aReservedColors;
-            CORBA::String_var IOR = app->orb()->object_to_string( aMainObject );
-            _PTR(SObject) aMainSObject( aStudy->FindObjectIOR( IOR.in() ) );
-            if ( aMainSObject ) {
-              _PTR(ChildIterator) it( aStudy->NewChildIterator( aMainSObject ) );
-              for ( ; it->More(); it->Next() ) {
-                _PTR(SObject) aChildSObject( it->Value() );
-                GEOM::GEOM_Object_var aChildObject =
-                  GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aChildSObject));
-                if ( CORBA::is_nil( aChildObject ) )
-                  continue;
-
-                SALOMEDS::Color aReservedColor = aChildObject->GetColor();
-                if ( aReservedColor.R >= 0 && aReservedColor.G >= 0 && aReservedColor.B >= 0 )
-                  aReservedColors.append( aReservedColor );
+              QList<SALOMEDS::Color> aReservedColors;
+              CORBA::String_var IOR = app->orb()->object_to_string( aMainObject );
+              _PTR(SObject) aMainSObject( aStudy->FindObjectIOR( IOR.in() ) );
+              if ( aMainSObject ) {
+                _PTR(ChildIterator) it( aStudy->NewChildIterator( aMainSObject ) );
+                for ( ; it->More(); it->Next() ) {
+                  _PTR(SObject) aChildSObject( it->Value() );
+                  GEOM::GEOM_Object_var aChildObject =
+                    GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(aChildSObject));
+                  if ( CORBA::is_nil( aChildObject ) )
+                    continue;
+
+                  SALOMEDS::Color aReservedColor = aChildObject->GetColor();
+                  if ( aReservedColor.R >= 0 && aReservedColor.G >= 0 && aReservedColor.B >= 0 )
+                    aReservedColors.append( aReservedColor );
+                }
               }
-            }
-            aSColor = getUniqueColor( aReservedColors );
-            hasColor = true;
+              aSColor = getUniqueColor( aReservedColors );
+              hasColor = true;
 #endif                   // SIMPLE_AUTOCOLOR
+            }
           }
         }
       }
index f2d36230ae88e578cb6c2240ffca8777d039665d..bc39a219f804c172070f7c653df9aeab2c547b98 100644 (file)
@@ -1563,6 +1563,8 @@ void GeometryGUI::initialize( CAM_Application* app )
   QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
   QString clientOCCorOB_AndSomeVisible = clientOCCorOB + " and selcount>0 and isVisible";
 
+  QString notGEOMShape = "(not ($component={'GEOM'}) and ($displayer={'Geometry'}))";
+
   QString autoColorPrefix =
     "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer') and type='Shape' and selcount=1";
 
@@ -1584,7 +1586,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   mgr->insert( separator(), -1, -1 );     // -----------
 
   //QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true and topLevel=false";
-  QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and isFolder=false and (selcount>0) and isOCC=true";
+  QString bringRule = clientOCCorOB + " and ($displayer={'Geometry'}) and isFolder=false and (selcount>0) and isOCC=true";
   mgr->insert( action(GEOMOp::OpBringToFront ), -1, -1 ); // bring to front
   mgr->setRule(action(GEOMOp::OpBringToFront), bringRule + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
   mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule );
@@ -1593,56 +1595,58 @@ void GeometryGUI::initialize( CAM_Application* app )
   mgr->insert( separator(), -1, -1 );     // -----------
   dispmodeId = mgr->insert(  tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
   mgr->insert( action(  GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe
-  mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  //mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK + " and displaymode='Wireframe'", QtxPopupMgr::ToggleRule );
   mgr->insert( action(  GEOMOp::OpShading ), dispmodeId, -1 ); // shading
-  mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  //  mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule );
   mgr->insert( action(  GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges
-  mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule );
   mgr->insert( action(  GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe
   mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule );
   mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule );
   mgr->insert( separator(), dispmodeId, -1 );
   mgr->insert( action(  GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors
-  mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible  + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
   mgr->insert( action(  GEOMOp::OpVertices ), dispmodeId, -1 ); // vertices
-  mgr->setRule( action( GEOMOp::OpVertices ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpVertices ), clientOCCorVTK_AndSomeVisible  + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
   mgr->setRule( action( GEOMOp::OpVertices ), clientOCCorVTK + " and isVerticesMode", QtxPopupMgr::ToggleRule );
   mgr->insert( action(  GEOMOp::OpShowName ), dispmodeId, -1 ); // show name
-  mgr->setRule( action( GEOMOp::OpShowName ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpShowName ), clientOCCorVTK_AndSomeVisible  + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
   mgr->setRule( action( GEOMOp::OpShowName ), clientOCCorVTK + " and isNameMode", QtxPopupMgr::ToggleRule );
   mgr->insert( separator(), -1, -1 );     // -----------
 
   mgr->insert( action(  GEOMOp::OpColor ), -1, -1 ); // color
-  mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($displayer={'Geometry'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
   mgr->insert( action(  GEOMOp::OpTransparency ), -1, -1 ); // transparency
-  mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
   mgr->insert( action(  GEOMOp::OpIsos ), -1, -1 ); // isos
-  mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
   mgr->insert( action(  GEOMOp::OpDeflection ), -1, -1 ); // deflection
-  mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
   mgr->insert( action(  GEOMOp::OpPointMarker ), -1, -1 ); // point marker
-  mgr->setRule( action( GEOMOp::OpPointMarker ), clientOCCorOB + " and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0 and isOCC=true", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpPointMarker ), clientOCCorOB + " and ($type in {'Shape' 'Group' 'Field' 'FieldStep'} or " + notGEOMShape + ") and selcount>0 and isOCC=true", QtxPopupMgr::VisibleRule );
 
   // material properties
   mgr->insert( action(  GEOMOp::OpMaterialProperties ), -1, -1 );
-  mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'}) and matMenu=false", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($displayer={'Geometry'}) and matMenu=false", QtxPopupMgr::VisibleRule );
   mgr->insert( action(  GEOMOp::OpMaterialMenu ), -1, -1 );
-  mgr->setRule( action( GEOMOp::OpMaterialMenu ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'}) and matMenu=true", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpMaterialMenu ), clientOCCorVTK_AndSomeVisible + " and ($displayer={'Geometry'}) and matMenu=true", QtxPopupMgr::VisibleRule );
 
  // texture
   mgr->insert( action(  GEOMOp::OpSetTexture ), -1, -1 );
-  mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
 
   int lineW = mgr->insert(  tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu
   mgr->insert( action(  GEOMOp::OpEdgeWidth ), lineW, -1 ); // edge width
-  mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
 
   mgr->insert( action(  GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
-  mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
+  mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible + " and ($displayer={'Geometry'})", QtxPopupMgr::VisibleRule );
 
   mgr->insert( separator(), -1, -1 );     // -----------
   mgr->insert( action(  GEOMOp::OpAutoColor ), -1, -1 ); // auto color
@@ -1657,9 +1661,14 @@ void GeometryGUI::initialize( CAM_Application* app )
   mgr->setRule( action( GEOMOp::OpDeleteAnnotation ),  clientOCC + " and annotationsCount>0", QtxPopupMgr::VisibleRule );
   mgr->insert( separator(), -1, -1 );     // -----------
 
-  QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
-          onlyComponent = "((type='Component') and selcount=1)",
-          rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
+  //QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
+  //        onlyComponent = "((type='Component') and selcount=1)",
+  //        rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
+  //        types = "'Shape' 'Group' 'FieldStep'";
+
+  QString canDisplay = "($displayer={'Geometry'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
+          onlyComponent = "((type='Component') and ($component={'GEOM'}) and selcount=1)",
+          rule = canDisplay + "and ((($type in {%1} or " + notGEOMShape + ") and( %2 )) or " + onlyComponent + ")",
           types = "'Shape' 'Group' 'FieldStep'";
 
   mgr->insert( action(  GEOMOp::OpShow ), -1, -1 ); // display
index 10c67dd92f2a5fd62a688a2cde85446b0a8fe436..d15fcee7350cdf7294d08bb4be396bad730df14d 100644 (file)
@@ -220,19 +220,21 @@ void GEOMToolsGUI_MarkerDlg::accept()
             _PTR(SObject) aSObject( study->FindObjectID( it.Value()->getEntry() ) );
             GEOM::GEOM_Object_var anObject =
               GEOM::GEOM_Object::_narrow( GeometryGUI::ClientSObjectToObject( aSObject ) );
-            if ( !anObject->_is_nil() && GeometryGUI::IsInGeomComponent( aSObject )) {
-              if ( myWGStack->currentIndex() == 0 ) {
+            if ( myWGStack->currentIndex() == 0 ) {
+              if ( !anObject->_is_nil() && GeometryGUI::IsInGeomComponent( aSObject )) {
                 anObject->SetMarkerStd( getMarkerType(), getStandardMarkerScale() );
-                QString aMarker = "%1%2%3";
-                aMarker = aMarker.arg(getMarkerType());
-                aMarker = aMarker.arg(GEOM::subSectionSeparator());
-                aMarker = aMarker.arg(getStandardMarkerScale());
-                getStudy()->setObjectProperty(mgrId ,it.Value()->getEntry(),GEOM::propertyName( GEOM::PointMarker ), aMarker);
               }
-              else if ( getCustomMarkerID() > 0 ) {
+              QString aMarker = "%1%2%3";
+              aMarker = aMarker.arg(getMarkerType());
+              aMarker = aMarker.arg(GEOM::subSectionSeparator());
+              aMarker = aMarker.arg(getStandardMarkerScale());
+              getStudy()->setObjectProperty(mgrId ,it.Value()->getEntry(),GEOM::propertyName( GEOM::PointMarker ), aMarker);
+            }
+            else if ( getCustomMarkerID() > 0 ) {
+              if ( !anObject->_is_nil() && GeometryGUI::IsInGeomComponent( aSObject )) {
                 anObject->SetMarkerTexture( getCustomMarkerID() );
-                getStudy()->setObjectProperty(mgrId ,it.Value()->getEntry(),GEOM::propertyName( GEOM::PointMarker ), QString::number(getCustomMarkerID()));
               }
+              getStudy()->setObjectProperty(mgrId ,it.Value()->getEntry(),GEOM::propertyName( GEOM::PointMarker ), QString::number(getCustomMarkerID()));
             }
           }
           GEOM_Displayer displayer;
@@ -298,6 +300,7 @@ void GEOMToolsGUI_MarkerDlg::init()
             GEOM::GEOM_Object::_narrow( GeometryGUI::ClientSObjectToObject( aSObject ) );
           if ( !anObject->_is_nil() && GeometryGUI::IsInGeomComponent( aSObject )) {
             GEOM::marker_type mtype = anObject->GetMarkerType();
+
             if ( aType == -1 )
               aType = mtype;
             else if ( aType != mtype ) {
@@ -319,6 +322,47 @@ void GEOMToolsGUI_MarkerDlg::init()
                 break;
             }
           }
+          else {
+            // try study object properties
+            QStringList aMarkerProp;
+            SUIT_ViewWindow* window = getStudy()->application()->desktop()->activeWindow();
+            if (window && window->getViewManager()) {
+              int mgrId = window->getViewManager()->getGlobalId();
+              PropMap aPropMap = getStudy()->getObjectProperties(mgrId, it.Value()->getEntry());
+              aMarkerProp = aPropMap.value(GEOM::propertyName(GEOM::PointMarker)).toString().split( GEOM::subSectionSeparator());
+            }
+            if ( aMarkerProp.size() == 2 ) {
+              // standard marker string contains "TypeOfMarker:ScaleOfMarker"
+              GEOM::marker_type mtype = (GEOM::marker_type)aMarkerProp[0].toInt();
+              GEOM::marker_size msize = (GEOM::marker_size)aMarkerProp[1].toInt();
+
+              if ( aType == -1 )
+                aType = mtype;
+              else if ( aType != mtype ) {
+                aType = (GEOM::marker_type)-1;
+                break;
+              }
+              if ( aSize == -1 )
+                aSize = msize;
+              else if ( aSize != msize )
+                break;
+            }
+            else if ( aMarkerProp.size() == 1 ) {
+              // custom marker string contains "IdOfTexture"
+              int mtexture = aMarkerProp[0].toInt();
+
+              if ( aType == -1 )
+                aType = GEOM::MT_USER;
+              else if ( aType !=  GEOM::MT_USER) {
+                aType = (GEOM::marker_type)-1;
+                break;
+              }
+              if ( aTexture == 0 )
+                aTexture = mtexture;
+              else if ( aTexture != mtexture )
+                break;
+            }
+          }
         }
       }
     }