Salome HOME
Merge branch 'Dev_0.6.1' of newgeom:newgeom.git into Dev_0.6.1
authorsbh <sergey.belash@opencascade.com>
Mon, 22 Dec 2014 13:58:48 +0000 (16:58 +0300)
committersbh <sergey.belash@opencascade.com>
Mon, 22 Dec 2014 13:58:48 +0000 (16:58 +0300)
24 files changed:
CMakeCommon/FindCAS.cmake
src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp
src/FeaturesPlugin/FeaturesPlugin_Boolean.cpp
src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp
src/FeaturesPlugin/FeaturesPlugin_Placement.cpp
src/Model/Model_ResultBody.cpp
src/Model/Model_ResultBody.h
src/ModelAPI/ModelAPI_ResultBody.h
src/ModuleBase/ModuleBase_IViewer.h
src/ModuleBase/ModuleBase_IWorkshop.h
src/NewGeom/NewGeom_SalomeViewer.cpp
src/NewGeom/NewGeom_SalomeViewer.h
src/PartSet/CMakeLists.txt
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Module.h
src/PartSet/PartSet_SketcherMgr.cpp [new file with mode: 0644]
src/PartSet/PartSet_SketcherMgr.h [new file with mode: 0644]
src/PartSet/PartSet_WidgetSketchLabel.cpp
src/PartSet/PartSet_WidgetSketchLabel.h
src/XGUI/XGUI_Displayer.cpp
src/XGUI/XGUI_Displayer.h
src/XGUI/XGUI_ModuleConnector.cpp
src/XGUI/XGUI_ViewerProxy.cpp
src/XGUI/XGUI_ViewerProxy.h

index 1d066b168ff38cfe7a915975b5a9428d09a79553..b610c2915d5f027ec9b77f77fec29cd393daf9bf 100644 (file)
@@ -94,7 +94,6 @@ FIND_LIBRARY(CAS_FWOSPlugin FWOSPlugin )
 MESSAGE(STATUS "FWOS " ${CAS_FWOSPlugin})
 
 FIND_LIBRARY(CAS_PTKernel PTKernel )
-FIND_LIBRARY(CAS_TKAdvTools TKAdvTools )
 FIND_LIBRARY(CAS_TKBin TKBin )
 FIND_LIBRARY(CAS_TKBinL TKBinL )
 FIND_LIBRARY(CAS_TKBinTObj TKBinTObj )
@@ -179,7 +178,6 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(CAS
       REQUIRED_VARS CAS_INCLUDE_DIRS  
         CAS_FWOSPlugin
         CAS_PTKernel
-        CAS_TKAdvTools
         CAS_TKBin
         CAS_TKBinL
         CAS_TKBinTObj
index 11abbb3904ae5cd475c3100ca87601e61dfb1297..bd789b083debb7c22e154426d29a32e82b4c705b 100644 (file)
@@ -129,10 +129,14 @@ void ExchangePlugin_ImportFeature::loadNamingDS(
 {  
   //load result
   theResultBody->store(theGeomShape);
+  std::string aPrefix =  data()->name() + "/";
   int aTag(1);
-  theResultBody->loadFirstLevel(theGeomShape, aTag);
-  theResultBody->loadDisconnectedEdges(theGeomShape, aTag);
-  theResultBody->loadDisconnectedVertexes(theGeomShape, aTag); 
+  std::string aNameMS = aPrefix + "Shape";
+  theResultBody->loadFirstLevel(theGeomShape, aNameMS, aTag);
+  std::string aNameDE = aPrefix + "DiscEdges";
+  theResultBody->loadDisconnectedEdges(theGeomShape, aNameDE, aTag);
+  std::string aNameDV = aPrefix + "DiscVertexes";
+  theResultBody->loadDisconnectedVertexes(theGeomShape, aNameDV, aTag); 
 }
 
 LibHandle ExchangePlugin_ImportFeature::loadImportPlugin(const std::string& theFormatName)
index e71b379baaa0dacddc7be125e259d92a9c410cb4..580a3163d9e6727205dde5995458d45483c39727 100644 (file)
@@ -103,10 +103,10 @@ void FeaturesPlugin_Boolean::LoadNamingDS(GeomAlgoAPI_Boolean* theFeature,
 
   GeomAPI_DataMapOfShapeShape* aSubShapes = new GeomAPI_DataMapOfShapeShape();
   theFeature->mapOfShapes(*aSubShapes);
-
+  std::string aPrefix =  data()->name() + "/";
   // Put in DF modified faces
-  theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theObject, FACE, _MODIFY_TAG, *aSubShapes);
-  theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theTool,   FACE, _MODIFY_TAG, *aSubShapes);
+  theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theObject, FACE, _MODIFY_TAG, aPrefix, *aSubShapes);
+  theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theTool,   FACE, _MODIFY_TAG, aPrefix, *aSubShapes);
 
   //Put in DF deleted faces
   theResultBody->loadDeletedShapes(theFeature->makeShape(), theObject, FACE, _DELETED_TAG);
index f8235f691a43aa1b48b3d69db3af4ac6716fa293..b3fd919ee3b4d53512c7dd039aff5c37a91d887b 100644 (file)
@@ -103,17 +103,17 @@ void FeaturesPlugin_Extrusion::LoadNamingDS(GeomAlgoAPI_Extrusion& theFeature,
 
   GeomAPI_DataMapOfShapeShape* aSubShapes = new GeomAPI_DataMapOfShapeShape();
   theFeature.mapOfShapes(*aSubShapes);
-
+  std::string aPrefix =  data()->name() + "/";
     //Insert lateral face : Face from Edge
-  theResultBody->loadAndOrientGeneratedShapes(theFeature.makeShape(), theBasis, EDGE,_LATERAL_TAG, *aSubShapes);
+  theResultBody->loadAndOrientGeneratedShapes(theFeature.makeShape(), theBasis, EDGE,_LATERAL_TAG, aPrefix, *aSubShapes);
 
   //Insert bottom face
   std::shared_ptr<GeomAPI_Shape> aBottomFace = theFeature.firstShape();  
   if (!aBottomFace->isNull()) {
        if (aSubShapes->isBound(aBottomFace)) {  
                aBottomFace = aSubShapes->find(aBottomFace);            
-    }    
-    theResultBody->generated(aBottomFace, _FIRST_TAG);
+    }     
+    theResultBody->generated(aBottomFace, aPrefix, _FIRST_TAG);
   }
 
 
@@ -124,7 +124,7 @@ void FeaturesPlugin_Extrusion::LoadNamingDS(GeomAlgoAPI_Extrusion& theFeature,
     if (aSubShapes->isBound(aTopFace)) {        
       aTopFace = aSubShapes->find(aTopFace);   
     }
-    theResultBody->generated(aTopFace, _LAST_TAG);
+    theResultBody->generated(aTopFace, aPrefix, _LAST_TAG);
   }
 
   
index d9fe0ca5f35f7f7423a20973845475ecaf1fcde0..c8ff8278b71c32922295abc3f14bd26737770bfe 100644 (file)
@@ -126,8 +126,8 @@ void FeaturesPlugin_Placement::LoadNamingDS(
 
   GeomAPI_DataMapOfShapeShape* aSubShapes = new GeomAPI_DataMapOfShapeShape();
   theFeature.mapOfShapes(*aSubShapes);
-
+   std::string aPrefix =  data()->name() + "/";
     // put modifed faces in DF
-  theResultBody->loadAndOrientModifiedShapes(theFeature.makeShape(), theSlaveObject, _FACE, _MODIFIEDF_TAG, *aSubShapes); 
+  theResultBody->loadAndOrientModifiedShapes(theFeature.makeShape(), theSlaveObject, _FACE, _MODIFIEDF_TAG, aPrefix, *aSubShapes); 
 
 }
index 49cfa0fe543f5b4e085d6d8ae53cb2657f405c75..0bfd48103112c47ee6bbac54c9d4c32068b2e29f 100644 (file)
@@ -8,6 +8,7 @@
 #include <Model_Data.h>
 #include <TNaming_Builder.hxx>
 #include <TNaming_NamedShape.hxx>
+#include <TDataStd_Name.hxx>
 #include <TopoDS.hxx>
 #include <TopoDS_Shape.hxx>
 #include <TopoDS_Face.hxx>
@@ -50,7 +51,7 @@ void Model_ResultBody::store(const std::shared_ptr<GeomAPI_Shape>& theShape)
     if (aShape.IsNull())
       return;  // null shape inside
 
-    aBuilder.Generated(aShape);
+    aBuilder.Generated(aShape);        
   }
 }
 
@@ -144,28 +145,39 @@ TNaming_Builder* Model_ResultBody::builder(const int theTag)
   return myBuilders[theTag];
 }
 
+void Model_ResultBody::buildName(const int theTag, const std::string& theName)
+{
+  std::string aName = data()->name() + "/" + theName;
+  TDataStd_Name::Set(builder(theTag)->NamedShape()->Label(),aName.c_str());
+}
 void Model_ResultBody::generated(
-  const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag)
+  const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag)
 {
   TopoDS_Shape aShape = theNewShape->impl<TopoDS_Shape>();
   builder(theTag)->Generated(aShape);
+  if(!theName.empty()) 
+    buildName(theTag, theName);
 }
 
 void Model_ResultBody::generated(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
-  const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag)
+  const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag)
 {
   TopoDS_Shape anOldShape = theOldShape->impl<TopoDS_Shape>();
   TopoDS_Shape aNewShape = theNewShape->impl<TopoDS_Shape>();
   builder(theTag)->Generated(anOldShape, aNewShape);
+  if(!theName.empty()) 
+    buildName(theTag, theName);
 }
 
 
 void Model_ResultBody::modified(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
-  const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag)
+  const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag)
 {
   TopoDS_Shape anOldShape = theOldShape->impl<TopoDS_Shape>();
   TopoDS_Shape aNewShape = theNewShape->impl<TopoDS_Shape>();
   builder(theTag)->Modify(anOldShape, aNewShape);
+  if(!theName.empty()) 
+    buildName(theTag, theName);
 }
 
 void Model_ResultBody::deleted(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
@@ -199,10 +211,12 @@ void Model_ResultBody::loadAndOrientModifiedShapes (
   std::shared_ptr<GeomAPI_Shape>  theShapeIn,
   const int  theKindOfShape,
   const int  theTag,
+  const std::string& theName,
   GeomAPI_DataMapOfShapeShape& theSubShapes)
 {
   TopoDS_Shape aShapeIn = theShapeIn->impl<TopoDS_Shape>();
   TopTools_MapOfShape aView;
+  bool isBuilt = theName.empty();
   TopExp_Explorer aShapeExplorer (aShapeIn, (TopAbs_ShapeEnum)theKindOfShape);
   for (; aShapeExplorer.More(); aShapeExplorer.Next ()) {
     const TopoDS_Shape& aRoot = aShapeExplorer.Current ();
@@ -218,8 +232,11 @@ void Model_ResultBody::loadAndOrientModifiedShapes (
         std::shared_ptr<GeomAPI_Shape> aMapShape(theSubShapes.find(*anIt));
         aNewShape.Orientation(aMapShape->impl<TopoDS_Shape>().Orientation());
       }
-      if (!aRoot.IsSame (aNewShape)) 
+      if (!aRoot.IsSame (aNewShape)) {
         builder(theTag)->Modify(aRoot,aNewShape);
+               if(!isBuilt) 
+                 buildName(theTag, theName);           
+         }
     }
   }
 }
@@ -229,10 +246,12 @@ void Model_ResultBody::loadAndOrientGeneratedShapes (
   std::shared_ptr<GeomAPI_Shape>  theShapeIn,
   const int  theKindOfShape,
   const int  theTag,
+  const std::string& theName,
   GeomAPI_DataMapOfShapeShape& theSubShapes)
 {
   TopoDS_Shape aShapeIn = theShapeIn->impl<TopoDS_Shape>();
   TopTools_MapOfShape aView;
+  bool isBuilt = theName.empty();
   TopExp_Explorer aShapeExplorer (aShapeIn, (TopAbs_ShapeEnum)theKindOfShape);
   for (; aShapeExplorer.More(); aShapeExplorer.Next ()) {
     const TopoDS_Shape& aRoot = aShapeExplorer.Current ();
@@ -248,8 +267,11 @@ void Model_ResultBody::loadAndOrientGeneratedShapes (
         std::shared_ptr<GeomAPI_Shape> aMapShape(theSubShapes.find(*anIt));
         aNewShape.Orientation(aMapShape->impl<TopoDS_Shape>().Orientation());
       }
-      if (!aRoot.IsSame (aNewShape)) 
+      if (!aRoot.IsSame (aNewShape)) {
         builder(theTag)->Generated(aRoot,aNewShape);
+               if(!isBuilt) 
+                 buildName(theTag, theName);   
+         }
     }
   }
 }
@@ -289,14 +311,18 @@ void loadGeneratedDangleShapes(
 
 //=======================================================================
 void Model_ResultBody::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape, 
-                                         int&  theTag)
+                                         const std::string& theName, int&  theTag)
 {
   if(theShape->isNull()) return;
   TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();    
+  std::string aName;
   if (aShape.ShapeType() == TopAbs_SOLID) {                
     TopExp_Explorer expl(aShape, TopAbs_FACE);
     for (; expl.More(); expl.Next())      
-         builder(++theTag)->Generated(expl.Current());     
+         builder(++theTag)->Generated(expl.Current()); 
+         TCollection_AsciiString aStr(theTag);
+         aName = theName + aStr.ToCString();
+         buildName(theTag, aName);
   }
   else if (aShape.ShapeType() == TopAbs_SHELL || aShape.ShapeType() == TopAbs_FACE) {
     // load faces and all the free edges
@@ -304,8 +330,12 @@ void Model_ResultBody::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape,
     TopExp::MapShapes(aShape, TopAbs_FACE, Faces);
     if (Faces.Extent() > 1 || (aShape.ShapeType() == TopAbs_SHELL && Faces.Extent() == 1)) {
       TopExp_Explorer expl(aShape, TopAbs_FACE);
-      for (; expl.More(); expl.Next()) 
+      for (; expl.More(); expl.Next()) {
                  builder(++theTag)->Generated(expl.Current());          
+                 TCollection_AsciiString aStr(theTag);
+             aName = theName + aStr.ToCString();
+             buildName(theTag, aName);
+         }
        }
     TopTools_IndexedDataMapOfShapeListOfShape anEdgeAndNeighbourFaces;
     TopExp::MapShapesAndAncestors(aShape, TopAbs_EDGE, TopAbs_FACE, anEdgeAndNeighbourFaces);
@@ -313,13 +343,19 @@ void Model_ResultBody::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape,
        {
       const TopTools_ListOfShape& aLL = anEdgeAndNeighbourFaces.FindFromIndex(i);
       if (aLL.Extent() < 2) {
-           builder(++theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i));    
+           builder(++theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i));
+               TCollection_AsciiString aStr(theTag);
+           aName = theName + aStr.ToCString();
+           buildName(theTag, aName);
       } else {
          TopTools_ListIteratorOfListOfShape anIter(aLL);
          const TopoDS_Face& aFace = TopoDS::Face(anIter.Value());
          anIter.Next();
          if(aFace.IsEqual(anIter.Value())) {
                builder(++theTag)->Generated(anEdgeAndNeighbourFaces.FindKey(i));
+               TCollection_AsciiString aStr(theTag);
+           aName = theName + aStr.ToCString();
+           buildName(theTag, aName);
          }
          }
        }
@@ -331,11 +367,17 @@ void Model_ResultBody::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape,
       TopExp_Explorer expl(aShape, TopAbs_VERTEX);
       for (; expl.More(); expl.Next()) {
            builder(++theTag)->Generated(expl.Current());
+               TCollection_AsciiString aStr(theTag);
+           aName = theName + aStr.ToCString();
+           buildName(theTag, aName);
          }
        } else {
       TopExp_Explorer expl(aShape, TopAbs_EDGE); 
       for (; expl.More(); expl.Next()) {       
                builder(++theTag)->Generated(expl.Current());
+               TCollection_AsciiString aStr(theTag);
+           aName = theName + aStr.ToCString();
+           buildName(theTag, aName);
          }   
       // and load generated vertices.
       TopTools_DataMapOfShapeShape generated;
@@ -349,41 +391,49 @@ void Model_ResultBody::loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape,
     TopExp_Explorer expl(aShape, TopAbs_VERTEX);
     for (; expl.More(); expl.Next()) {      
                builder(++theTag)->Generated(expl.Current());
+               TCollection_AsciiString aStr(theTag);
+           aName = theName + aStr.ToCString();
+           buildName(theTag, aName);
        }
   }
 }
 //=======================================================================
 void Model_ResultBody::loadFirstLevel(
-                    std::shared_ptr<GeomAPI_Shape> theShape, int&  theTag)
+                    std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag)
 {
- if(theShape->isNull()) return;
- TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();    
+  if(theShape->isNull()) return;
+  TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>(); 
+  std::string aName;
   if (aShape.ShapeType() == TopAbs_COMPOUND || aShape.ShapeType() == TopAbs_COMPSOLID) {
     TopoDS_Iterator itr(aShape);
     for (; itr.More(); itr.Next()) {
-         builder(++theTag)->Generated(itr.Value());     
+         builder(++theTag)->Generated(itr.Value());
+         TCollection_AsciiString aStr(theTag);
+         aName = theName + aStr.ToCString();
+         buildName(theTag, aName);
+         if(!theName.empty()) buildName(theTag, aName);
       if (itr.Value().ShapeType() == TopAbs_COMPOUND || 
                  itr.Value().ShapeType() == TopAbs_COMPSOLID) 
          {
                std::shared_ptr<GeomAPI_Shape> itrShape(new GeomAPI_Shape());
         itrShape->setImpl(new TopoDS_Shape(itr.Value()));
-           loadFirstLevel(itrShape, theTag);
+           loadFirstLevel(itrShape, theName, theTag);
       } else {
                std::shared_ptr<GeomAPI_Shape> itrShape(new GeomAPI_Shape());
-        itrShape->setImpl(new TopoDS_Shape(itr.Value()));
-               loadNextLevels(itrShape, theTag);
+        itrShape->setImpl(new TopoDS_Shape(itr.Value()));              
+               loadNextLevels(itrShape, theName, theTag);
          }
     }
   } else {
     std::shared_ptr<GeomAPI_Shape> itrShape(new GeomAPI_Shape());
     itrShape->setImpl(new TopoDS_Shape(aShape));
-       loadNextLevels(itrShape, theTag); 
+       loadNextLevels(itrShape, theName, theTag); 
   }
 }
 
 //=======================================================================
 void Model_ResultBody::loadDisconnectedEdges(
-                    std::shared_ptr<GeomAPI_Shape> theShape, int&  theTag)
+                    std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag)
 {
   if(theShape->isNull()) return;
   TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();  
@@ -411,6 +461,7 @@ void Model_ResultBody::loadDisconnectedEdges(
   
   TopTools_MapOfShape anEdgesToDelete;
   TopExp_Explorer anEx(aShape,TopAbs_EDGE); 
+  std::string aName;
   for(;anEx.More();anEx.Next()) {
     Standard_Boolean aC0 = Standard_False;
     TopoDS_Shape anEdge1 = anEx.Current();
@@ -431,8 +482,11 @@ void Model_ResultBody::loadDisconnectedEdges(
                if (aLIter1.Value().IsSame(aLIter2.Value())) aMatches++;
                if (aMatches == aList1.Extent()) {
                  aC0=Standard_True;
-                         builder(++theTag)->Generated(anEdge2);              
+                         builder(++theTag)->Generated(anEdge2);
                  anEdgesToDelete.Add(anEdge2);
+                         TCollection_AsciiString aStr(theTag);
+                         aName = theName + aStr.ToCString();
+                 buildName(theTag, aName);
                        }
                }
          }      
@@ -441,12 +495,16 @@ void Model_ResultBody::loadDisconnectedEdges(
            edgeNaborFaces.UnBind(itDelete.Key());      
       edgeNaborFaces.UnBind(anEdge1);
        }
-    if (aC0) 
-         builder(++theTag)->Generated(anEdge1);                  
+    if (aC0) {
+         builder(++theTag)->Generated(anEdge1);
+         TCollection_AsciiString aStr(theTag);
+         aName = theName + aStr.ToCString();
+         buildName(theTag, aName);      
+       }
   }
 }
 
-void Model_ResultBody::loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, int&  theTag)
+void Model_ResultBody::loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag)
 {
   if(theShape->isNull()) return;
   TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();  
@@ -472,11 +530,15 @@ void Model_ResultBody::loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> t
       }
     }
   }
-
+  std::string aName;
   TopTools_DataMapIteratorOfDataMapOfShapeListOfShape itr(vertexNaborFaces);
   for (; itr.More(); itr.Next()) {
     const TopTools_ListOfShape& naborFaces = itr.Value();
-    if (naborFaces.Extent() < 3) 
-               builder(++theTag)->Generated(itr.Key());         
+    if (naborFaces.Extent() < 3) {
+               builder(++theTag)->Generated(itr.Key());
+               TCollection_AsciiString aStr(theTag);
+           aName = theName + aStr.ToCString();
+           buildName(theTag, aName);    
+       }
   }
 }
\ No newline at end of file
index 31f9744cf7273f4304183d381cd17d658a8eceb7..8da264eec6f52ea54597172c561a3715ec7ad9c3 100644 (file)
@@ -46,19 +46,19 @@ public:
   /// Records the subshape newShape which was generated during a topological construction.
   /// As an example, consider the case of a face generated in construction of a box.
   MODEL_EXPORT virtual void generated(const std::shared_ptr<GeomAPI_Shape>& theNewShape, 
-    const int theTag = 1);
+    const std::string& theName, const int theTag = 1);
 
   /// Records the shape newShape which was generated from the shape oldShape during a topological 
   /// construction. As an example, consider the case of a face generated from an edge in 
   /// construction of a prism.
   MODEL_EXPORT virtual void generated(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
-    const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag = 1);
+    const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag = 1);
 
 
   /// Records the shape newShape which is a modification of the shape oldShape.
   /// As an example, consider the case of a face split or merged in a Boolean operation.
   MODEL_EXPORT virtual void modified(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
-    const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag = 1);
+    const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag = 1);
 
   /// Records the shape oldShape which was deleted from the current label.
   /// As an example, consider the case of a face removed by a Boolean operation.
@@ -76,6 +76,7 @@ public:
                                                std::shared_ptr<GeomAPI_Shape>  theShapeIn,
                                                const int  theKindOfShape,
                                                const int  theTag,
+                                                                                          const std::string& theName,
                                                GeomAPI_DataMapOfShapeShape& theSubShapes);
    /// load and orient generated shapes
   MODEL_EXPORT virtual void loadAndOrientGeneratedShapes (
@@ -83,16 +84,17 @@ public:
                                                std::shared_ptr<GeomAPI_Shape>  theShapeIn,
                                                const int  theKindOfShape,
                                                const int  theTag,
+                                                                                          const std::string& theName,
                                                GeomAPI_DataMapOfShapeShape& theSubShapes);
   
   /// Loads shapes of the first level (to be used during shape import)
-  MODEL_EXPORT virtual void loadFirstLevel(std::shared_ptr<GeomAPI_Shape> theShape, int&  theTag);
+  MODEL_EXPORT virtual void loadFirstLevel(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag);
   
   /// Loads disconnected edges
-  MODEL_EXPORT virtual void loadDisconnectedEdges(std::shared_ptr<GeomAPI_Shape> theShape, int&  theTag);
+  MODEL_EXPORT virtual void loadDisconnectedEdges(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag);
 
   /// Loads disconnected vetexes
-  MODEL_EXPORT virtual void loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, int&  theTag);
+  MODEL_EXPORT virtual void loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag);
 
   /// Removes the stored builders
   MODEL_EXPORT virtual ~Model_ResultBody();
@@ -109,7 +111,10 @@ protected:
 
 private:
   /// Loads shapes of the next level (to be used during shape import)
-  void loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape, int&  theTag);
+  void loadNextLevels(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag);
+
+  /// builds name for the shape kept at the specified tag 
+  void buildName(const int theTag, const std::string& theName);
 
   friend class Model_Document;
 };
index 9a2053abcdce276371be600ada2a74511ea48a56..61f90120c5ed07fedc37fa2f6a9e948d777b71cb 100644 (file)
@@ -52,18 +52,18 @@ public:
   /// Records the subshape newShape which was generated during a topological construction.
   /// As an example, consider the case of a face generated in construction of a box.
   virtual void generated(
-    const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag = 1) = 0;
+    const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag = 1) = 0;
 
   /// Records the shape newShape which was generated from the shape oldShape during a topological 
   /// construction. As an example, consider the case of a face generated from an edge in 
   /// construction of a prism.
   virtual void generated(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
-    const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag = 1) = 0;
+    const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag = 1) = 0;
 
   /// Records the shape newShape which is a modification of the shape oldShape.
   /// As an example, consider the case of a face split or merged in a Boolean operation.
   virtual void modified(const std::shared_ptr<GeomAPI_Shape>& theOldShape,
-    const std::shared_ptr<GeomAPI_Shape>& theNewShape, const int theTag = 1) = 0;
+    const std::shared_ptr<GeomAPI_Shape>& theNewShape, const std::string& theName, const int theTag = 1) = 0;
 
   /// Records the shape oldShape which was deleted from the current label.
   /// As an example, consider the case of a face removed by a Boolean operation.
@@ -81,6 +81,7 @@ public:
                                                std::shared_ptr<GeomAPI_Shape>  theShapeIn,
                                                const int  theKindOfShape,
                                                const int  theTag,
+                                                                                          const std::string& theName,
                                                GeomAPI_DataMapOfShapeShape& theSubShapes) = 0;
   /// load and orient generated shapes
   virtual void loadAndOrientGeneratedShapes (
@@ -88,16 +89,17 @@ public:
                                                std::shared_ptr<GeomAPI_Shape>  theShapeIn,
                                                const int  theKindOfShape,
                                                const int  theTag,
+                                                                                          const std::string& theName,
                                                GeomAPI_DataMapOfShapeShape& theSubShapes) = 0;
 
   /// load shapes of the first level (to be used during shape import)
-  virtual void loadFirstLevel(std::shared_ptr<GeomAPI_Shape> theShape, int&  theTag) = 0;
+  virtual void loadFirstLevel(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag) = 0;
   
   /// load disconnected edges
-  virtual void loadDisconnectedEdges(std::shared_ptr<GeomAPI_Shape> theShape, int&  theTag) = 0;
+  virtual void loadDisconnectedEdges(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName, int&  theTag) = 0;
 
   /// load disconnected vetexes
-  virtual void loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, int&  theTag) = 0;
+  virtual void loadDisconnectedVertexes(std::shared_ptr<GeomAPI_Shape> theShape, const std::string& theName,int&  theTag) = 0;
 
 protected:
 };
index d3028d42d4f0a5c60e6aa32dcf46d87d88692b05..33205b817d06bb8b814e88b4c0256b0d0ff8a2bb 100644 (file)
@@ -65,6 +65,9 @@ Q_OBJECT
   /// Remove all selection filters from the viewer
   virtual void clearSelectionFilters() = 0;
 
+  /// Update current viewer
+  virtual void update() = 0;
+
 signals:
   void lastViewClosed();
   void tryCloseView(ModuleBase_IViewWindow* theWnd);
index 84af1145fa2e82359ccd8fd2ded285cd29432ccc..3679e30d2df1fbc5833f33b258db503739905dcc 100644 (file)
@@ -38,7 +38,7 @@ Q_OBJECT
   virtual ModuleBase_ISelection* selection() const = 0;
 
   /// Activate sub-shapes selection (opens local context)
-  /// Types has to be dined according to TopAbs_ShapeEnum
+  /// Types has to be defined according to TopAbs_ShapeEnum
   virtual void activateSubShapesSelection(const QIntList& theTypes) = 0;
 
   /// Deactivate sub-shapes selection (closes local context)
index a1a640e5e6d0958f1f1547f0d4ab40e4933a1e32..8fe9bd862ce0662f02e3b90a5385616ca6f2b78d 100644 (file)
@@ -265,3 +265,12 @@ void NewGeom_SalomeViewer::clearSelectionFilters()
     aContext->RemoveFilters();
   }
 }
+
+//***************************************
+void NewGeom_SalomeViewer::update()
+{
+  Handle(AIS_InteractiveContext) aContext = AISContext();
+  if (!aContext.IsNull()) {
+    aContext->UpdateCurrentViewer();
+  }
+}
index f3b6243f8887dcf0b76d2c7ef08e74937551823e..7ac8ea6a39fff9b42db2b4dc8aeb8efb080fa3f6 100644 (file)
@@ -89,6 +89,10 @@ Q_OBJECT
     return mySelector;
   }
 
+  /// Update current viewer
+  virtual void update();
+
+
  private slots:
   void onMousePress(SUIT_ViewWindow*, QMouseEvent*);
   void onMouseRelease(SUIT_ViewWindow*, QMouseEvent*);
index fc2f4b0b82d2502af48722a81be8346f5f73ce25..9f0f38e8b15e17aa01767a6e92ea611150464b49 100644 (file)
@@ -16,6 +16,7 @@ SET(PROJECT_HEADERS
        PartSet_WidgetPoint2dDistance.h
        PartSet_WidgetShapeSelector.h
        PartSet_Filters.h
+       PartSet_SketcherMgr.h
 )
 
 SET(PROJECT_SOURCES
@@ -28,6 +29,7 @@ SET(PROJECT_SOURCES
        PartSet_WidgetPoint2dDistance.cpp
        PartSet_WidgetShapeSelector.cpp
        PartSet_Filters.cpp
+       PartSet_SketcherMgr.cpp
 )
 
 SET(PROJECT_RESOURCES 
index 4d84d816834264352a3cb0d1f20b934df7133ec6..94c577a55272a5a9b85722926c92af717655dfad 100644 (file)
@@ -7,6 +7,7 @@
 #include <PartSet_WidgetPoint2d.h>
 #include <PartSet_WidgetPoint2dDistance.h>
 #include <PartSet_WidgetShapeSelector.h>
+#include <PartSet_SketcherMgr.h>
 
 #include <ModuleBase_Operation.h>
 #include <ModuleBase_IViewer.h>
 #include <XGUI_ModuleConnector.h>
 #include <XGUI_Tools.h>
 
-#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Feature.h>
 #include <SketchPlugin_Sketch.h>
-#include <SketchPlugin_Point.h>
-#include <SketchPlugin_Arc.h>
-#include <SketchPlugin_Circle.h>
+#include <SketchPlugin_Line.h>
+//#include <SketchPlugin_Arc.h>
+//#include <SketchPlugin_Circle.h>
 #include <SketchPlugin_ConstraintLength.h>
 #include <SketchPlugin_ConstraintDistance.h>
 #include <SketchPlugin_ConstraintParallel.h>
 #include <SketchPlugin_ConstraintPerpendicular.h>
 #include <SketchPlugin_ConstraintRadius.h>
-#include <SketchPlugin_ConstraintRigid.h>
+//#include <SketchPlugin_ConstraintRigid.h>
 
 #include <Events_Loop.h>
 
 #include <QDebug>
 #endif
 
-
-/// Returns list of unique objects by sum of objects from List1 and List2
-QList<ObjectPtr> getSumList(const QList<ModuleBase_ViewerPrs>& theList1,
-                                       const QList<ModuleBase_ViewerPrs>& theList2)
-{
-  QList<ObjectPtr> aRes;
-  foreach (ModuleBase_ViewerPrs aPrs, theList1) {
-    if (!aRes.contains(aPrs.object()))
-      aRes.append(aPrs.object());
-  }
-  foreach (ModuleBase_ViewerPrs aPrs, theList2) {
-    if (!aRes.contains(aPrs.object()))
-      aRes.append(aPrs.object());
-  }
-  return aRes;
-}
-
 /*!Create and return new instance of XGUI_Module*/
 extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop)
 {
@@ -93,21 +77,10 @@ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop*
 
 PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop)
   : ModuleBase_IModule(theWshop), 
-  myIsDragging(false), myRestartingMode(RM_None), myDragDone(false)
+  myRestartingMode(RM_None)
 {
   //myWorkshop = dynamic_cast<XGUI_Workshop*>(theWshop);
-  ModuleBase_IViewer* aViewer = aViewer = theWshop->viewer();
-  connect(aViewer, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)),
-          this, SLOT(onMousePressed(ModuleBase_IViewWindow*, QMouseEvent*)));
-
-  connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)),
-          this, SLOT(onMouseReleased(ModuleBase_IViewWindow*, QMouseEvent*)));
-
-  connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)),
-          this, SLOT(onMouseMoved(ModuleBase_IViewWindow*, QMouseEvent*)));
-
-  connect(aViewer, SIGNAL(mouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)),
-          this, SLOT(onMouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)));
+  mySketchMgr = new PartSet_SketcherMgr(this);
 
   XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(theWshop);
   XGUI_Workshop* aWorkshop = aConnector->workshop();
@@ -117,6 +90,7 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop)
   connect(anOpMgr, SIGNAL(operationActivatedByPreselection()),
           this, SLOT(onOperationActivatedByPreselection()));
 
+  ModuleBase_IViewer* aViewer = theWshop->viewer();
   connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)),
           this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*)));
 }
@@ -125,8 +99,6 @@ PartSet_Module::~PartSet_Module()
 {
   if (!myDocumentShapeFilter.IsNull())
     myDocumentShapeFilter.Nullify();
-  if (!myPlaneFilter.IsNull())
-    myPlaneFilter.Nullify();
 }
 
 void PartSet_Module::registerValidators()
@@ -185,37 +157,7 @@ void PartSet_Module::operationAborted(ModuleBase_Operation* theOperation)
 void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation)
 {
   if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) {
-    // Display all sketcher sub-Objects
-    myCurrentSketch = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(theOperation->feature());
-    XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(workshop());
-    XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
-
-    for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
-      FeaturePtr aFeature = myCurrentSketch->subFeature(i);
-      std::list<ResultPtr> aResults = aFeature->results();
-      std::list<ResultPtr>::const_iterator aIt;
-      for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
-        aDisplayer->display((*aIt), false);
-      }
-      aDisplayer->display(aFeature);
-    }
-    // Hide sketcher result
-    std::list<ResultPtr> aResults = myCurrentSketch->results();
-    std::list<ResultPtr>::const_iterator aIt;
-    for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
-      aDisplayer->erase((*aIt), false);
-    }
-    aDisplayer->erase(myCurrentSketch);
-
-
-    if (myPlaneFilter.IsNull()) 
-      myPlaneFilter = new ModuleBase_ShapeInPlaneFilter();
-    myWorkshop->viewer()->addSelectionFilter(myPlaneFilter);
-    if (theOperation->isEditOperation()) {
-      // If it is editing of sketch then it means that plane is already defined
-      std::shared_ptr<GeomAPI_Pln> aPln = PartSet_Tools::sketchPlane(myCurrentSketch);
-      myPlaneFilter->setPlane(aPln->impl<gp_Pln>());
-    }
+    mySketchMgr->startSketch(theOperation);
   }
   if (myDocumentShapeFilter.IsNull())
     myDocumentShapeFilter = new PartSet_GlobalFilter(myWorkshop);
@@ -225,43 +167,11 @@ void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation)
 void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation)
 {
   if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) {
-    DataPtr aData = myCurrentSketch->data();
-    if ((!aData) || (!aData->isValid())) {
-      // The sketch was aborted
-      myCurrentSketch = CompositeFeaturePtr();
-      return; 
-    }
-    // Hide all sketcher sub-Objects
-    XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(workshop());
-    XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
-    for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
-      FeaturePtr aFeature = myCurrentSketch->subFeature(i);
-      std::list<ResultPtr> aResults = aFeature->results();
-      std::list<ResultPtr>::const_iterator aIt;
-      for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
-        aDisplayer->erase((*aIt), false);
-      }
-      aDisplayer->erase(aFeature, false);
-    }
-    // Display sketcher result
-    std::list<ResultPtr> aResults = myCurrentSketch->results();
-    std::list<ResultPtr>::const_iterator aIt;
-    for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
-      aDisplayer->display((*aIt), false);
-    }
-    aDisplayer->display(myCurrentSketch);
-    
-    myCurrentSketch = CompositeFeaturePtr();
-    myWorkshop->viewer()->removeSelectionFilter(myPlaneFilter);
+    mySketchMgr->stopSketch(theOperation);
   }
   myWorkshop->viewer()->removeSelectionFilter(myDocumentShapeFilter);
 }
 
-void PartSet_Module::onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>& thePln)
-{
-  myPlaneFilter->setPlane(thePln->impl<gp_Pln>());
-}
-
 
 void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation)
 {
@@ -285,7 +195,7 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation)
           std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(SketchPlugin_Line::END_ID()));
         if (aPoint) {
           aPnt2dWgt->setPoint(aPoint->x(), aPoint->y());
-          PartSet_Tools::setConstraints(myCurrentSketch, theOperation->feature(), 
+          PartSet_Tools::setConstraints(mySketchMgr->activeSketch(), theOperation->feature(), 
             aWgt->attributeID(), aPoint->x(), aPoint->y());
           theOperation->propertyPanel()->activateNextWidget(aPnt2dWgt);
         }
@@ -295,7 +205,7 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation)
     // Start editing constraint
     if (theOperation->isEditOperation()) {
       std::string aId = theOperation->id().toStdString();
-      if (sketchOperationIdList().contains(QString(aId.c_str()))) {
+      if (PartSet_SketcherMgr::sketchOperationIdList().contains(QString(aId.c_str()))) {
         if ((aId == SketchPlugin_ConstraintRadius::ID()) ||
             (aId == SketchPlugin_ConstraintLength::ID()) || 
             (aId == SketchPlugin_ConstraintDistance::ID())) {
@@ -320,8 +230,8 @@ void PartSet_Module::onSelectionChanged()
   ModuleBase_Operation* aOperation = myWorkshop->currentOperation();
   bool isSketcherOp = false;
   // An edit operation is enable only if the current opeation is the sketch operation
-  if (aOperation && myCurrentSketch) {
-    if (PartSet_Tools::sketchPlane(myCurrentSketch))
+  if (aOperation && mySketchMgr->activeSketch()) {
+    if (PartSet_Tools::sketchPlane(mySketchMgr->activeSketch()))
       isSketcherOp = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID());
   }
   if (!isSketcherOp)
@@ -345,214 +255,7 @@ void PartSet_Module::onSelectionChanged()
   }
 }
 
-void PartSet_Module::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) 
-{
-  if (!(theEvent->buttons() & Qt::LeftButton))
-    return;
-
-  ModuleBase_Operation* aOperation = myWorkshop->currentOperation();
-  // Use only for sketch operations
-  if (aOperation && myCurrentSketch) {
-    if (!PartSet_Tools::sketchPlane(myCurrentSketch))
-      return;
-
-    bool isSketcher = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID());
-    bool isSketchOpe = sketchOperationIdList().contains(aOperation->id());
-
-    // Avoid non-sketch operations
-    if ((!isSketchOpe) && (!isSketcher))
-      return;
-
-    bool isEditing = aOperation->isEditOperation();
-
-    // Ignore creation sketch operation
-    if ((!isSketcher) && (!isEditing))
-      return;
-
-    if (theEvent->modifiers()) {
-      // If user performs multiselection
-      if (isSketchOpe && (!isSketcher))
-        if (!aOperation->commit())
-          aOperation->abort();
-      return;
-    }
-    // Remember highlighted objects for editing
-    ModuleBase_ISelection* aSelect = myWorkshop->selection();
-    QList<ModuleBase_ViewerPrs> aHighlighted = aSelect->getHighlighted();
-    QList<ModuleBase_ViewerPrs> aSelected = aSelect->getSelected();
-    myEditingFeatures.clear();
-    myEditingAttr.clear();
-    if ((aHighlighted.size() == 0) && (aSelected.size() == 0)) {
-      if (isSketchOpe && (!isSketcher))
-        // commit previous operation
-        if (!aOperation->commit())
-          aOperation->abort();
-      return;
-    }
-
-    QObjectPtrList aSelObjects = getSumList(aHighlighted, aSelected);
-    if ((aHighlighted.size() == 1) && (aSelected.size() == 0)) {
-      // Move by selected shape (vertex). Can be used only for single selection
-      foreach(ModuleBase_ViewerPrs aPrs, aHighlighted) {
-        FeaturePtr aFeature = ModelAPI_Feature::feature(aHighlighted.first().object());
-        if (aFeature) {
-          myEditingFeatures.append(aFeature);
-          TopoDS_Shape aShape = aPrs.shape();
-          if (!aShape.IsNull()) {
-            if (aShape.ShapeType() == TopAbs_VERTEX) {
-              AttributePtr aAttr = PartSet_Tools::findAttributeBy2dPoint(myEditingFeatures.first(), 
-                                                                         aShape, myCurrentSketch);
-              if (aAttr)
-                myEditingAttr.append(aAttr);
-            }
-          }
-        }
-      }
-    } else {
-      // Provide multi-selection. Can be used only for features
-      foreach (ObjectPtr aObj, aSelObjects) {
-        FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
-        if (aFeature && (!myEditingFeatures.contains(aFeature)))
-          myEditingFeatures.append(aFeature);
-      }
-
-    }
-    // If nothing highlighted - return
-    if (myEditingFeatures.size() == 0)
-      return;
-
-    if (isSketcher) {
-      myIsDragging = true;
-      get2dPoint(theWnd, theEvent, myCurX, myCurY);
-      myDragDone = false;
-      myWorkshop->viewer()->enableSelection(false);
-      launchEditing();
-
-    } else if (isSketchOpe && isEditing) {
-      // If selected another object
-      aOperation->abort();
-
-      myIsDragging = true;
-      get2dPoint(theWnd, theEvent, myCurX, myCurY);
-      myDragDone = false;
-      myWorkshop->viewer()->enableSelection(false);
-
-      // This is necessary in order to finalize previous operation
-      QApplication::processEvents();
-      launchEditing();
-    }
-  }
-}
-
-
-void PartSet_Module::get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, 
-                                double& theX, double& theY)
-{
-  Handle(V3d_View) aView = theWnd->v3dView();
-  gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView);
-  PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, theX, theY);
-}
-
-
-void PartSet_Module::launchEditing()
-{
-  if (myEditingFeatures.size() > 0) {
-    FeaturePtr aFeature = myEditingFeatures.first();
-    std::shared_ptr<SketchPlugin_Feature> aSPFeature = 
-              std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
-    if (aSPFeature) {
-      editFeature(aSPFeature);
-    }
-  }
-}
-
-void PartSet_Module::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
-{
-  myWorkshop->viewer()->enableSelection(true);
-  if (myIsDragging) {
-    myIsDragging = false;
-    if (myDragDone) {
-      myWorkshop->currentOperation()->commit();
-      myEditingFeatures.clear();
-      myEditingAttr.clear();
-    }
-  }
-}
-
-
-void PartSet_Module::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
-{
-  if (myIsDragging) {
-    ModuleBase_Operation* aOperation = myWorkshop->currentOperation();
-    if (aOperation->id().toStdString() == SketchPlugin_Sketch::ID())
-      return; // No edit operation activated
-
-    static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED);
-    Handle(V3d_View) aView = theWnd->v3dView();
-    gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView);
-    double aX, aY;
-    PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, aX, aY);
-    double dX =  aX - myCurX;
-    double dY =  aY - myCurY;
-
-    if ((aOperation->id().toStdString() == SketchPlugin_Line::ID()) &&
-        (myEditingAttr.size() == 1) && 
-        myEditingAttr.first()) {
-      // probably we have prehighlighted point
-      AttributePtr aAttr = myEditingAttr.first();
-      std::string aAttrId = aAttr->id();
-      ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
-      QList<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
-      // Find corresponded widget to provide dragging
-      foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
-        if (aWgt->attributeID() == aAttrId) {
-          PartSet_WidgetPoint2D* aWgt2d = dynamic_cast<PartSet_WidgetPoint2D*>(aWgt);
-          if (aWgt2d) {
-            aWgt2d->setPoint(aWgt2d->x() + dX, aWgt2d->y() + dY);
-            break;
-          }
-        }
-      }
-    } else {
-      foreach(FeaturePtr aFeature, myEditingFeatures) {
-        std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
-          std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
-        if (aSketchFeature) { 
-          aSketchFeature->move(dX, dY);
-          ModelAPI_EventCreator::get()->sendUpdated(aSketchFeature, anEvent);
-        }
-      }
       // after movement the solver will call the update event: optimization
-      Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_MOVED));
-    }
-    myDragDone = true;
-    myCurX = aX;
-    myCurY = aY;
-  }
-}
-
-void PartSet_Module::onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
-{
-  ModuleBase_Operation* aOperation = myWorkshop->currentOperation();
-  if (aOperation && aOperation->isEditOperation()) {
-    std::string aId = aOperation->id().toStdString();
-    if ((aId == SketchPlugin_ConstraintLength::ID()) ||
-      (aId == SketchPlugin_ConstraintDistance::ID()) ||
-      (aId == SketchPlugin_ConstraintRadius::ID())) 
-    {
-      // Activate dimension value editing on double click
-      ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
-      QList<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
-      // Find corresponded widget to activate value editing
-      foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
-        if (aWgt->attributeID() == "ConstraintValue") {
-          aWgt->focusTo();
-          return;
-        }
-      }
-    }
-  }
-}
 
 void PartSet_Module::onKeyRelease(ModuleBase_IViewWindow* theWnd, QKeyEvent* theEvent)
 {
@@ -600,22 +303,6 @@ void PartSet_Module::onNoMoreWidgets()
   }
 }
 
-QStringList PartSet_Module::sketchOperationIdList() const
-{
-  QStringList aIds;
-  aIds << SketchPlugin_Line::ID().c_str();
-  aIds << SketchPlugin_Point::ID().c_str();
-  aIds << SketchPlugin_Arc::ID().c_str();
-  aIds << SketchPlugin_Circle::ID().c_str();
-  aIds << SketchPlugin_ConstraintLength::ID().c_str();
-  aIds << SketchPlugin_ConstraintDistance::ID().c_str();
-  aIds << SketchPlugin_ConstraintRigid::ID().c_str();
-  aIds << SketchPlugin_ConstraintRadius::ID().c_str();
-  aIds << SketchPlugin_ConstraintPerpendicular::ID().c_str();
-  aIds << SketchPlugin_ConstraintParallel::ID().c_str();
-  return aIds;
-}
-
 void PartSet_Module::onVertexSelected(ObjectPtr theObject, const TopoDS_Shape& theShape)
 {
   ModuleBase_Operation* aOperation = myWorkshop->currentOperation();
@@ -639,14 +326,14 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget*
     PartSet_WidgetSketchLabel* aWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, theParentId);
     aWgt->setWorkshop(aWorkshop);
     connect(aWgt, SIGNAL(planeSelected(const std::shared_ptr<GeomAPI_Pln>&)), 
-      this, SLOT(onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>&)));
+      mySketchMgr, SLOT(onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>&)));
     theModelWidgets.append(aWgt);
     return aWgt->getControl();
 
   } else if (theType == "sketch-2dpoint_selector") {
     PartSet_WidgetPoint2D* aWgt = new PartSet_WidgetPoint2D(theParent, theWidgetApi, theParentId);
     aWgt->setWorkshop(aWorkshop);
-    aWgt->setSketch(myCurrentSketch);
+    aWgt->setSketch(mySketchMgr->activeSketch());
 
     connect(aWgt, SIGNAL(vertexSelected(ObjectPtr, const TopoDS_Shape&)), 
       this, SLOT(onVertexSelected(ObjectPtr, const TopoDS_Shape&)));
@@ -657,7 +344,7 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget*
   } if (theType == "point2ddistance") {
     PartSet_WidgetPoint2dDistance* aWgt = new PartSet_WidgetPoint2dDistance(theParent, theWidgetApi, theParentId);
     aWgt->setWorkshop(aWorkshop);
-    aWgt->setSketch(myCurrentSketch);
+    aWgt->setSketch(mySketchMgr->activeSketch());
 
     theModelWidgets.append(aWgt);
     return aWgt->getControl();
@@ -665,7 +352,7 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget*
   } if (theType == "sketch_shape_selector") {
     PartSet_WidgetShapeSelector* aWgt = 
       new PartSet_WidgetShapeSelector(theParent, workshop(), theWidgetApi, theParentId);
-    aWgt->setSketcher(myCurrentSketch);
+    aWgt->setSketcher(mySketchMgr->activeSketch());
 
     theModelWidgets.append(aWgt);
     return aWgt->getControl();
@@ -673,12 +360,12 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget*
   } if (theType == "sketch_constraint_shape_selector") {
     PartSet_WidgetConstraintShapeSelector* aWgt = 
       new PartSet_WidgetConstraintShapeSelector(theParent, workshop(), theWidgetApi, theParentId);
-    aWgt->setSketcher(myCurrentSketch);
+    aWgt->setSketcher(mySketchMgr->activeSketch());
 
     theModelWidgets.append(aWgt);
     return aWgt->getControl();
 
-  }else
+  } else
     return 0;
 }
 
index e04148a1db65620069090f9feeca5d8017c9c656..8fa932b39f21b9d24a6fd77d9e6d04a65b448ae0 100644 (file)
@@ -4,7 +4,8 @@
 #define PartSet_Module_H
 
 #include "PartSet.h"
-#include <PartSet_Filters.h>
+#include "PartSet_Filters.h"
+#include "PartSet_SketcherMgr.h"
 
 #include <ModuleBase_IModule.h>
 #include <ModuleBase_Definitions.h>
@@ -12,7 +13,7 @@
 #include <ModelAPI_Attribute.h>
 #include <ModelAPI_CompositeFeature.h>
 
-#include <StdSelect_FaceFilter.hxx>
+//#include <StdSelect_FaceFilter.hxx>
 #include <TopoDS_Shape.hxx>
 
 #include <QMap>
@@ -49,7 +50,6 @@ public:
   /// Call back forlast tuning of property panel before operation performance
   virtual void propertyPanelDefined(ModuleBase_Operation* theOperation);
 
-  QStringList sketchOperationIdList() const;
 
   /// Realizes some functionality by an operation start
   /// Displays all sketcher sub-Objects, hides sketcher result, appends selection filters
@@ -83,22 +83,22 @@ protected slots:
   /// SLOT, that is called by mouse press in the viewer.
   /// \param theWnd - the window where the event happens
   /// \param theEvent the mouse event
-  void onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
+  //void onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
 
   /// SLOT, that is called by mouse release in the viewer.
   /// \param theWnd - the window where the event happens
   /// \param theEvent the mouse event
-  void onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
+  //void onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
   
   /// SLOT, that is called by mouse move in the viewer.
   /// \param theWnd - the window where the event happens
   /// \param theEvent the mouse event
-  void onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
+  //void onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
 
   /// SLOT, that is called by mouse double click in the viewer.
   /// \param theWnd - the window where the event happens
   /// \param theEvent the mouse event
-  void onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
+  //void onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent);
 
   /// SLOT, that is called by key release in the viewer.
   /// The mouse moved point is sent to the current operation to be processed.
@@ -113,8 +113,6 @@ protected slots:
   /// It commits the operation of it is can be committed
   void onOperationActivatedByPreselection();
 
-  /// Launches the operation from current highlighting
-  void launchEditing();
 
  protected:
   /// Register validators for this module
@@ -126,13 +124,8 @@ protected slots:
  private slots:
    void onVertexSelected(ObjectPtr theObject, const TopoDS_Shape& theShape);
 
-   void onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>& thePln);
 
  private:
-   /// Converts mouse position to 2d coordinates. 
-   /// Member myCurrentSketch has to be correctly defined
-  void get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, 
-                  double& theX, double& theY);
 
   /// Breaks sequense of automatically resterted operations
   void breakOperationSequence();
@@ -141,20 +134,13 @@ protected slots:
    QString myLastOperationId;
    FeaturePtr myLastFeature;
 
-   bool myIsDragging;
-   bool myDragDone;
-
    // Automatical restarting mode flag
    RestartingMode myRestartingMode;
 
-   double myCurX, myCurY;
-   CompositeFeaturePtr myCurrentSketch;
-   QList<FeaturePtr> myEditingFeatures;
-   QList<AttributePtr> myEditingAttr;
-
-   Handle(ModuleBase_ShapeInPlaneFilter) myPlaneFilter;
   /// A filter which provides selection within a current document or whole PartSet
   Handle(PartSet_GlobalFilter) myDocumentShapeFilter;
+
+  PartSet_SketcherMgr* mySketchMgr;
 };
 
 #endif
diff --git a/src/PartSet/PartSet_SketcherMgr.cpp b/src/PartSet/PartSet_SketcherMgr.cpp
new file mode 100644 (file)
index 0000000..200297b
--- /dev/null
@@ -0,0 +1,414 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:        PartSet_SketcherMgr.cpp
+// Created:     19 Dec 2014
+// Author:      Vitaly SMETANNIKOV
+
+#include "PartSet_SketcherMgr.h"
+#include "PartSet_Module.h"
+#include "PartSet_WidgetPoint2D.h"
+#include "PartSet_Tools.h"
+
+#include <XGUI_ModuleConnector.h>
+#include <XGUI_Displayer.h>
+#include <XGUI_Workshop.h>
+
+#include <ModuleBase_IViewer.h>
+#include <ModuleBase_IWorkshop.h>
+#include <ModuleBase_IViewWindow.h>
+#include <ModuleBase_Operation.h>
+#include <ModuleBase_ISelection.h>
+#include <ModuleBase_IPropertyPanel.h>
+#include <ModuleBase_Operation.h>
+
+#include <Events_Loop.h>
+
+#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Sketch.h>
+#include <SketchPlugin_Point.h>
+#include <SketchPlugin_Arc.h>
+#include <SketchPlugin_Circle.h>
+#include <SketchPlugin_ConstraintLength.h>
+#include <SketchPlugin_ConstraintDistance.h>
+#include <SketchPlugin_ConstraintParallel.h>
+#include <SketchPlugin_ConstraintPerpendicular.h>
+#include <SketchPlugin_ConstraintRadius.h>
+#include <SketchPlugin_ConstraintRigid.h>
+
+#include <ModelAPI_Events.h>
+
+#include <QMouseEvent>
+#include <QApplication>
+
+
+
+
+/// Returns list of unique objects by sum of objects from List1 and List2
+QList<ObjectPtr> getSumList(const QList<ModuleBase_ViewerPrs>& theList1,
+                                       const QList<ModuleBase_ViewerPrs>& theList2)
+{
+  QList<ObjectPtr> aRes;
+  foreach (ModuleBase_ViewerPrs aPrs, theList1) {
+    if (!aRes.contains(aPrs.object()))
+      aRes.append(aPrs.object());
+  }
+  foreach (ModuleBase_ViewerPrs aPrs, theList2) {
+    if (!aRes.contains(aPrs.object()))
+      aRes.append(aPrs.object());
+  }
+  return aRes;
+}
+
+
+
+
+PartSet_SketcherMgr::PartSet_SketcherMgr(PartSet_Module* theModule)
+  : QObject(theModule), myModule(theModule), myIsDragging(false), myDragDone(false)
+{
+  ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
+  ModuleBase_IViewer* aViewer = aWorkshop->viewer();
+
+  connect(aViewer, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)),
+          this, SLOT(onMousePressed(ModuleBase_IViewWindow*, QMouseEvent*)));
+
+  connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)),
+          this, SLOT(onMouseReleased(ModuleBase_IViewWindow*, QMouseEvent*)));
+
+  connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)),
+          this, SLOT(onMouseMoved(ModuleBase_IViewWindow*, QMouseEvent*)));
+
+  connect(aViewer, SIGNAL(mouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)),
+          this, SLOT(onMouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)));
+}
+
+PartSet_SketcherMgr::~PartSet_SketcherMgr()
+{
+  if (!myPlaneFilter.IsNull())
+    myPlaneFilter.Nullify();
+}
+
+void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
+{
+  // 
+  if (!(theEvent->buttons() & Qt::LeftButton))
+    return;
+
+  ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
+  ModuleBase_Operation* aOperation = aWorkshop->currentOperation();
+  // Use only for sketch operations
+  if (aOperation && myCurrentSketch) {
+    if (!PartSet_Tools::sketchPlane(myCurrentSketch))
+      return;
+
+    bool isSketcher = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID());
+    bool isSketchOpe = sketchOperationIdList().contains(aOperation->id());
+
+    // Avoid non-sketch operations
+    if ((!isSketchOpe) && (!isSketcher))
+      return;
+
+    bool isEditing = aOperation->isEditOperation();
+
+    // Ignore creation sketch operation
+    if ((!isSketcher) && (!isEditing))
+      return;
+
+    if (theEvent->modifiers()) {
+      // If user performs multiselection
+      if (isSketchOpe /* && (!isSketcher)*/)
+        if (!aOperation->commit())
+          aOperation->abort();
+      return;
+    }
+    // Remember highlighted objects for editing
+    ModuleBase_ISelection* aSelect = aWorkshop->selection();
+    QList<ModuleBase_ViewerPrs> aHighlighted = aSelect->getHighlighted();
+    QList<ModuleBase_ViewerPrs> aSelected = aSelect->getSelected();
+    myEditingFeatures.clear();
+    myEditingAttr.clear();
+    if ((aHighlighted.size() == 0) && (aSelected.size() == 0)) {
+      if (isSketchOpe && (!isSketcher))
+        // commit previous operation
+        if (!aOperation->commit())
+          aOperation->abort();
+      return;
+    }
+
+    QObjectPtrList aSelObjects = getSumList(aHighlighted, aSelected);
+    //foreach (ModuleBase_ViewerPrs aPrs, aHighlighted) {
+    //  aSelObjects.append(aPrs.object());
+    //}
+
+    if ((aHighlighted.size() == 1) && (aSelected.size() == 0)) {
+      // Move by selected shape (vertex). Can be used only for single selection
+      foreach(ModuleBase_ViewerPrs aPrs, aHighlighted) {
+        FeaturePtr aFeature = ModelAPI_Feature::feature(aHighlighted.first().object());
+        if (aFeature) {
+          myEditingFeatures.append(aFeature);
+          TopoDS_Shape aShape = aPrs.shape();
+          if (!aShape.IsNull()) {
+            if (aShape.ShapeType() == TopAbs_VERTEX) {
+              AttributePtr aAttr = PartSet_Tools::findAttributeBy2dPoint(myEditingFeatures.first(), 
+                                                                         aShape, myCurrentSketch);
+              if (aAttr)
+                myEditingAttr.append(aAttr);
+            }
+          }
+        }
+      }
+    } else {
+      // Provide multi-selection. Can be used only for features
+      foreach (ObjectPtr aObj, aSelObjects) {
+        FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
+        if (aFeature && (!myEditingFeatures.contains(aFeature)))
+          myEditingFeatures.append(aFeature);
+      }
+
+    }
+    // If nothing highlighted - return
+    if (myEditingFeatures.size() == 0)
+      return;
+
+    if (isSketcher) {
+      myIsDragging = true;
+      get2dPoint(theWnd, theEvent, myCurX, myCurY);
+      myDragDone = false;
+      aWorkshop->viewer()->enableMultiselection(false);
+      launchEditing();
+
+    } else if (isSketchOpe && isEditing) {
+      // If selected another object
+      aOperation->abort();
+
+      myIsDragging = true;
+      get2dPoint(theWnd, theEvent, myCurX, myCurY);
+      myDragDone = false;
+      aWorkshop->viewer()->enableMultiselection(false);
+
+      // This is necessary in order to finalize previous operation
+      QApplication::processEvents();
+      launchEditing();
+    }
+  }
+}
+
+void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
+{
+  ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
+  ModuleBase_Operation* aOp = aWorkshop->currentOperation();
+  if (!aOp)
+    return;
+  if (!sketchOperationIdList().contains(aOp->id()))
+    return;
+
+  // Only for sketcher operations
+  ModuleBase_IViewer* aViewer = aWorkshop->viewer();
+  if (myIsDragging) {
+    myIsDragging = false;
+    if (myDragDone) {
+      aViewer->enableMultiselection(true);
+      aOp->commit();
+      myEditingFeatures.clear();
+      myEditingAttr.clear();
+      return;
+    }
+  }
+  if (!aViewer->isMultiSelectionEnabled()) {
+    aViewer->enableMultiselection(true);
+  }
+  aViewer->AISContext()->MoveTo(theEvent->x(), theEvent->y(), theWnd->v3dView());
+  if (theEvent->modifiers() & Qt::ShiftModifier)
+    aViewer->AISContext()->ShiftSelect();
+  else
+    aViewer->AISContext()->Select();
+}
+
+void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
+{
+  if (myIsDragging) {
+    ModuleBase_Operation* aOperation = myModule->workshop()->currentOperation();
+    if (aOperation->id().toStdString() == SketchPlugin_Sketch::ID())
+      return; // No edit operation activated
+
+    static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED);
+    Handle(V3d_View) aView = theWnd->v3dView();
+    gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView);
+    double aX, aY;
+    PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, aX, aY);
+    double dX =  aX - myCurX;
+    double dY =  aY - myCurY;
+
+    if ((aOperation->id().toStdString() == SketchPlugin_Line::ID()) &&
+        (myEditingAttr.size() == 1) && 
+        myEditingAttr.first()) {
+      // probably we have prehighlighted point
+      AttributePtr aAttr = myEditingAttr.first();
+      std::string aAttrId = aAttr->id();
+      ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
+      QList<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
+      // Find corresponded widget to provide dragging
+      foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
+        if (aWgt->attributeID() == aAttrId) {
+          PartSet_WidgetPoint2D* aWgt2d = dynamic_cast<PartSet_WidgetPoint2D*>(aWgt);
+          if (aWgt2d) {
+            aWgt2d->setPoint(aWgt2d->x() + dX, aWgt2d->y() + dY);
+            break;
+          }
+        }
+      }
+    } else {
+      foreach(FeaturePtr aFeature, myEditingFeatures) {
+        std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
+          std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
+        if (aSketchFeature) { 
+          aSketchFeature->move(dX, dY);
+          ModelAPI_EventCreator::get()->sendUpdated(aSketchFeature, anEvent);
+        }
+      }
+      Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_MOVED));
+      Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
+    }
+    myDragDone = true;
+    myCurX = aX;
+    myCurY = aY;
+  }
+}
+
+void PartSet_SketcherMgr::onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
+{
+  ModuleBase_Operation* aOperation = myModule->workshop()->currentOperation();
+  if (aOperation && aOperation->isEditOperation()) {
+    std::string aId = aOperation->id().toStdString();
+    if ((aId == SketchPlugin_ConstraintLength::ID()) ||
+      (aId == SketchPlugin_ConstraintDistance::ID()) ||
+      (aId == SketchPlugin_ConstraintRadius::ID())) 
+    {
+      // Activate dimension value editing on double click
+      ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
+      QList<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
+      // Find corresponded widget to activate value editing
+      foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
+        if (aWgt->attributeID() == "ConstraintValue") {
+          aWgt->focusTo();
+          return;
+        }
+      }
+    }
+  }
+}
+
+void PartSet_SketcherMgr::get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, 
+                                double& theX, double& theY)
+{
+  Handle(V3d_View) aView = theWnd->v3dView();
+  gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView);
+  PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, theX, theY);
+}
+
+void PartSet_SketcherMgr::launchEditing()
+{
+  if (myEditingFeatures.size() > 0) {
+    FeaturePtr aFeature = myEditingFeatures.first();
+    std::shared_ptr<SketchPlugin_Feature> aSPFeature = 
+              std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
+    if (aSPFeature) {
+      myModule->editFeature(aSPFeature);
+    }
+  }
+}
+
+
+QStringList PartSet_SketcherMgr::sketchOperationIdList()
+{
+  static QStringList aIds;
+  if (aIds.size() == 0) {
+    aIds << SketchPlugin_Line::ID().c_str();
+    aIds << SketchPlugin_Point::ID().c_str();
+    aIds << SketchPlugin_Arc::ID().c_str();
+    aIds << SketchPlugin_Circle::ID().c_str();
+    aIds << SketchPlugin_ConstraintLength::ID().c_str();
+    aIds << SketchPlugin_ConstraintDistance::ID().c_str();
+    aIds << SketchPlugin_ConstraintRigid::ID().c_str();
+    aIds << SketchPlugin_ConstraintRadius::ID().c_str();
+    aIds << SketchPlugin_ConstraintPerpendicular::ID().c_str();
+    aIds << SketchPlugin_ConstraintParallel::ID().c_str();
+  }
+  return aIds;
+}
+
+void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation)
+{
+  // Display all sketcher sub-Objects
+  myCurrentSketch = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(theOperation->feature());
+  XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myModule->workshop());
+  XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
+
+  // Hide sketcher result
+  std::list<ResultPtr> aResults = myCurrentSketch->results();
+  std::list<ResultPtr>::const_iterator aIt;
+  for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
+    aDisplayer->erase((*aIt), false);
+  }
+  aDisplayer->erase(myCurrentSketch, false);
+
+  // Display sketcher objects
+  for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
+    FeaturePtr aFeature = myCurrentSketch->subFeature(i);
+    std::list<ResultPtr> aResults = aFeature->results();
+    std::list<ResultPtr>::const_iterator aIt;
+    for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
+      aDisplayer->display((*aIt), false);
+    }
+    aDisplayer->display(aFeature, false);
+  }
+
+  if (myPlaneFilter.IsNull()) 
+    myPlaneFilter = new ModuleBase_ShapeInPlaneFilter();
+
+  myModule->workshop()->viewer()->addSelectionFilter(myPlaneFilter);
+  if (theOperation->isEditOperation()) {
+    // If it is editing of sketch then it means that plane is already defined
+    std::shared_ptr<GeomAPI_Pln> aPln = PartSet_Tools::sketchPlane(myCurrentSketch);
+    myPlaneFilter->setPlane(aPln->impl<gp_Pln>());
+  }
+  aDisplayer->updateViewer();
+}
+
+void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation)
+{
+  DataPtr aData = myCurrentSketch->data();
+  if ((!aData) || (!aData->isValid())) {
+    // The sketch was aborted
+    myCurrentSketch = CompositeFeaturePtr();
+    return; 
+  }
+  // Hide all sketcher sub-Objects
+  XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myModule->workshop());
+  XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
+  for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) {
+    FeaturePtr aFeature = myCurrentSketch->subFeature(i);
+    std::list<ResultPtr> aResults = aFeature->results();
+    std::list<ResultPtr>::const_iterator aIt;
+    for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
+      aDisplayer->erase((*aIt), false);
+    }
+    aDisplayer->erase(aFeature, false);
+  }
+  // Display sketcher result
+  std::list<ResultPtr> aResults = myCurrentSketch->results();
+  std::list<ResultPtr>::const_iterator aIt;
+  for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
+    aDisplayer->display((*aIt), false);
+  }
+  aDisplayer->display(myCurrentSketch);
+    
+  myCurrentSketch = CompositeFeaturePtr();
+  myModule->workshop()->viewer()->removeSelectionFilter(myPlaneFilter);
+  aDisplayer->updateViewer();
+}
+
+
+void PartSet_SketcherMgr::onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>& thePln)
+{
+  myPlaneFilter->setPlane(thePln->impl<gp_Pln>());
+}
diff --git a/src/PartSet/PartSet_SketcherMgr.h b/src/PartSet/PartSet_SketcherMgr.h
new file mode 100644 (file)
index 0000000..8131578
--- /dev/null
@@ -0,0 +1,86 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:        PartSet_SketcherMgr.h
+// Created:     19 Dec 2014
+// Author:      Vitaly SMETANNIKOV
+
+#ifndef PartSet_SketcherMgr_H
+#define PartSet_SketcherMgr_H
+
+#include "PartSet.h"
+
+#include <ModelAPI_Feature.h>
+#include <ModelAPI_Attribute.h>
+#include <ModelAPI_CompositeFeature.h>
+
+#include <ModuleBase_ViewerFilters.h>
+
+#include <GeomAPI_Pln.h>
+
+#include <QObject>
+#include <QList>
+
+class PartSet_Module;
+class ModuleBase_IViewWindow;
+class ModuleBase_Operation;
+class QMouseEvent;
+
+
+/**
+* A class for management of sketch operations
+*/
+class PARTSET_EXPORT PartSet_SketcherMgr : public QObject
+{
+  Q_OBJECT
+public:
+  PartSet_SketcherMgr(PartSet_Module* theModule);
+
+  virtual ~PartSet_SketcherMgr();
+
+  static QStringList sketchOperationIdList();
+
+  /// Launches the operation from current highlighting
+  void launchEditing();
+
+  // Returns current Sketch feature/ Returns NULL if there is no launched sketch operation
+  CompositeFeaturePtr activeSketch() const { return myCurrentSketch; }
+
+  /// Starts sketch operation
+  void startSketch(ModuleBase_Operation* theOperation);
+
+  /// Stops sketch operation
+  void stopSketch(ModuleBase_Operation* theOperation);
+
+public slots:
+  void onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>& thePln);
+
+
+private slots:
+  void onMousePressed(ModuleBase_IViewWindow*, QMouseEvent*);
+  void onMouseReleased(ModuleBase_IViewWindow*, QMouseEvent*);
+  void onMouseMoved(ModuleBase_IViewWindow*, QMouseEvent*);
+  void onMouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*);
+
+private:
+   /// Converts mouse position to 2d coordinates. 
+   /// Member myCurrentSketch has to be correctly defined
+  void get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, 
+                  double& theX, double& theY);
+
+
+private:
+  PartSet_Module* myModule;
+
+  bool myIsDragging;
+  bool myDragDone;
+  double myCurX, myCurY;
+
+  CompositeFeaturePtr myCurrentSketch;
+  QList<FeaturePtr> myEditingFeatures;
+  QList<AttributePtr> myEditingAttr;
+
+  Handle(ModuleBase_ShapeInPlaneFilter) myPlaneFilter;
+};
+
+
+#endif
\ No newline at end of file
index d5aa73b6bde91d841f5e823131761af5955e28b4..eeb38baaab46c3e49126cefcc72a37e82af383ec 100644 (file)
@@ -35,6 +35,7 @@
 #include <Config_PropManager.h>
 
 #include <QLabel>
+#include <QTimer>
 
 #define PLANE_SIZE          "200"     
 #define SKETCH_WIDTH        "4"
@@ -51,6 +52,10 @@ PartSet_WidgetSketchLabel::PartSet_WidgetSketchLabel(QWidget* theParent,
   myTooltip = QString::fromStdString(theData->getProperty("tooltip"));
   myLabel->setToolTip("");
   myLabel->setIndent(5);
+
+  mySelectionTimer = new QTimer(this);
+  connect(mySelectionTimer, SIGNAL(timeout()), SLOT(setSketchingMode()));
+  mySelectionTimer->setSingleShot(true);
 }
 
 PartSet_WidgetSketchLabel::~PartSet_WidgetSketchLabel()
@@ -105,7 +110,7 @@ void PartSet_WidgetSketchLabel::onPlaneSelected()
         // Clear selection mode and define sketching mode
         XGUI_Displayer* aDisp = myWorkshop->displayer();
         aDisp->removeSelectionFilter(myFaceFilter);
-        aDisp->closeLocalContexts();
+        //aDisp->closeLocalContexts();
         emit planeSelected(plane());
         setSketchingMode();
 
@@ -128,14 +133,16 @@ void PartSet_WidgetSketchLabel::activate()
 {
   std::shared_ptr<GeomAPI_Pln> aPlane = plane();
   if (aPlane) {
-    setSketchingMode();
+    //setSketchingMode();
+    // In order to avoid Opening/Closing of context too often
+    mySelectionTimer->start(20);
   } else {
     // We have to select a plane before any operation
     showPreviewPlanes();
 
     XGUI_Displayer* aDisp = myWorkshop->displayer();
-    aDisp->openLocalContext();
-    aDisp->activateObjects(QIntList());
+    //aDisp->openLocalContext();
+    //aDisp->activateObjects(QIntList());
     if (myFaceFilter.IsNull())
       myFaceFilter = new StdSelect_FaceFilter(StdSelect_Plane);
     aDisp->addSelectionFilter(myFaceFilter);
@@ -153,11 +160,12 @@ void PartSet_WidgetSketchLabel::activate()
 
 void PartSet_WidgetSketchLabel::deactivate()
 {
-
+  // Do not set selection mode if the widget was activated for a small moment 
+  mySelectionTimer->stop();
   XGUI_Displayer* aDisp = myWorkshop->displayer();
   aDisp->removeSelectionFilter(myFaceFilter);
   //aDisp->removeSelectionFilter(mySketchFilter);
-  aDisp->closeLocalContexts();
+  //aDisp->closeLocalContexts();
   erasePreviewPlanes();
 }
 
@@ -264,22 +272,15 @@ std::shared_ptr<GeomAPI_Dir> PartSet_WidgetSketchLabel::setSketchPlane(const Top
 
 void PartSet_WidgetSketchLabel::setSketchingMode()
 {
+  qDebug("### Set sketching mode");
+
   XGUI_Displayer* aDisp = myWorkshop->displayer();
-  QIntList aModes;
   // Clear standard selection modes if they are defined
-  aDisp->activateObjects(aModes);
-  aDisp->openLocalContext();
-
-  // Set filter
-  std::shared_ptr<GeomAPI_Pln> aPlane = plane();
-  double aA, aB, aC, aD;
-  aPlane->coefficients(aA, aB, aC, aD);
-  gp_Pln aPln(aA, aB, aC, aD);
-  // No selection of external objects
-  //mySketchFilter = new ModuleBase_ShapeInPlaneFilter(aPln);
-  //aDisp->addSelectionFilter(mySketchFilter);
+  //aDisp->activateObjects(aModes);
+  //aDisp->openLocalContext();
 
   // Get default selection modes
+  QIntList aModes;
   aModes.append(AIS_DSM_Text);
   aModes.append(AIS_DSM_Line);
   aModes.append(AIS_Shape::SelectionMode((TopAbs_ShapeEnum) TopAbs_VERTEX));
index 58816ee4c7cfde676b82b90e230835db9caf7410..0dbc1da33c9c93caf3c0a256d829b74332166baa 100644 (file)
@@ -20,9 +20,9 @@
 #include <TopoDS_Shape.hxx>
 
 class QLabel;
+class QTimer;
 class XGUI_OperationMgr;
 class XGUI_Workshop;
-//class PartSet_OperationSketch;
 
 class PARTSET_EXPORT PartSet_WidgetSketchLabel : public ModuleBase_ModelWidget
 {
@@ -68,6 +68,7 @@ signals:
 
  private slots:
   void onPlaneSelected();
+  void setSketchingMode();
 
  private:
   AISObjectPtr createPreviewPlane(std::shared_ptr<GeomAPI_Pnt> theOrigin, 
@@ -79,7 +80,6 @@ signals:
   void erasePreviewPlanes();
   void showPreviewPlanes();
 
-  void setSketchingMode();
 
   QLabel* myLabel;
   QString myText;
@@ -93,7 +93,8 @@ signals:
   bool myPreviewDisplayed;
 
   Handle(StdSelect_FaceFilter) myFaceFilter;
-  //Handle(ModuleBase_ShapeInPlaneFilter) mySketchFilter;
+
+  QTimer* mySelectionTimer;
 };
 
 #endif
index 17f52eb5f9d01d15f23be14a58cd1c1862a1cb74..b0a119a709c637905a7015c9b1738e98b2c213ad 100644 (file)
 #include <SelectMgr_ListOfFilter.hxx>
 #include <SelectMgr_ListIteratorOfListOfFilter.hxx>
 
+#include <TColStd_MapOfTransient.hxx>
+#include <TColStd_MapIteratorOfMapOfTransient.hxx>
+
 #include <set>
 
 const int MOUSE_SENSITIVITY_IN_PIXEL = 10;  ///< defines the local context mouse selection sensitivity
 
 XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop)
-  : myUseExternalObjects(false), myWorkshop(theWorkshop)
+  : myWorkshop(theWorkshop)
 {
 }
 
@@ -88,26 +91,31 @@ void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS,
   Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
   if (!anAISIO.IsNull()) {
     myResult2AISObjectMap[theObject] = theAIS;
+
+    closeLocalContexts(false);
     aContext->Display(anAISIO, false);
     aContext->SetDisplayMode(anAISIO, isShading? Shading : Wireframe, false);
-
+    // Customization of presentation
     FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
     if (aFeature.get() != NULL) {
       GeomCustomPrsPtr aCustPrs = std::dynamic_pointer_cast<GeomAPI_ICustomPrs>(aFeature);
       if (aCustPrs.get() != NULL)
         aCustPrs->customisePresentation(theAIS);
     }
-    if (aContext->HasOpenedContext()) {
-      if (myUseExternalObjects) {
-        if (myActiveSelectionModes.size() == 0)
-          aContext->Activate(anAISIO);
-        else {
-          foreach(int aMode, myActiveSelectionModes) {
-            aContext->Activate(anAISIO, aMode);
-          }
-        }
-      }
-    }
+    openLocalContext();
+    aContext->Load(anAISIO, -1, true);
+    activate(theObject);
+    //if (aContext->HasOpenedContext()) {
+      //if (myUseExternalObjects) {
+        //if (myActiveSelectionModes.size() == 0)
+        //  aContext->Activate(anAISIO);
+        //else {
+        //  foreach(int aMode, myActiveSelectionModes) {
+        //    aContext->Activate(anAISIO, aMode);
+        //  }
+        //}
+      //}
+    //}
   }
   if (isUpdateViewer)
     updateViewer();
@@ -175,8 +183,7 @@ void XGUI_Displayer::deactivate(ObjectPtr theObject)
 
 void XGUI_Displayer::activate(ObjectPtr theFeature)
 {
-  QIntList aModes;
-  activate(theFeature, aModes);
+  activate(theFeature, myActiveSelectionModes);
 }
 
 void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes)
@@ -188,9 +195,11 @@ void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes)
 
     AISObjectPtr anObj = myResult2AISObjectMap[theObject];
     Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
-    if (aContext->HasOpenedContext()) {
-      aContext->Load(anAIS, -1, true);
-    }
+    aContext->Deactivate(anAIS);
+    //if (aContext->HasOpenedContext()) {
+    //  aContext->Load(anAIS, -1, true);
+    //}
+    // In order to clear active modes list
     if (theModes.size() > 0) {
       foreach(int aMode, theModes) {
         aContext->Activate(anAIS, aMode);
@@ -200,6 +209,78 @@ void XGUI_Displayer::activate(ObjectPtr theObject, const QIntList& theModes)
   }
 }
 
+void XGUI_Displayer::activateObjects(const QIntList& theModes)
+{
+  // In order to avoid doblications of selection modes
+  myActiveSelectionModes.clear();
+  foreach (int aMode, theModes) {
+    if (!myActiveSelectionModes.contains(aMode))
+      myActiveSelectionModes.append(aMode);
+  }
+  Handle(AIS_InteractiveContext) aContext = AISContext();
+  // Open local context if there is no one
+  if (!aContext->HasOpenedContext()) 
+    return;
+
+  //aContext->UseDisplayedObjects();
+  //myUseExternalObjects = true;
+
+  AIS_ListOfInteractive aPrsList;
+  aContext->DisplayedObjects(aPrsList, true);
+  //Deactivate trihedron which can be activated in local selector
+
+  Handle(AIS_Trihedron) aTrihedron;
+  AIS_ListIteratorOfListOfInteractive aLIt(aPrsList);
+  Handle(AIS_InteractiveObject) anAISIO;
+  for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){
+    anAISIO = aLIt.Value();
+    aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO);
+    if (!aTrihedron.IsNull()) {
+      aContext->Deactivate(aTrihedron);
+    } else {
+      //aContext->Load(anAISIO, -1, true);
+      // In order to clear active modes list
+      aContext->Deactivate(anAISIO);
+      if (myActiveSelectionModes.size() == 0)
+        aContext->Activate(anAISIO);
+      else {
+        foreach(int aMode, myActiveSelectionModes) {
+          aContext->Activate(anAISIO, aMode);
+        }
+      }
+    }
+  }
+}
+
+
+void XGUI_Displayer::deactivateObjects()
+{
+  myActiveSelectionModes.clear();
+  Handle(AIS_InteractiveContext) aContext = AISContext();
+  // Open local context if there is no one
+  if (!aContext->HasOpenedContext()) 
+    return;
+
+  aContext->NotUseDisplayedObjects();
+  AIS_ListOfInteractive aPrsList;
+  aContext->DisplayedObjects(aPrsList);
+
+  AIS_ListIteratorOfListOfInteractive aLIt;
+  Handle(AIS_Trihedron) aTrihedron;
+  Handle(AIS_InteractiveObject) anAISIO;
+  for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){
+    anAISIO = aLIt.Value();
+    aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO);
+    if (!aTrihedron.IsNull()) {
+      aContext->Deactivate(aTrihedron);
+    } else {
+      //aContext->Load(anAISIO, -1, true);
+      aContext->Deactivate(anAISIO);
+      //aContext->Activate(anAISIO);
+    }
+  }
+}
+
 bool XGUI_Displayer::isActive(ObjectPtr theObject) const
 {
   Handle(AIS_InteractiveContext) aContext = AISContext();
@@ -311,32 +392,32 @@ void XGUI_Displayer::eraseAll(const bool isUpdateViewer)
      updateViewer();
  }
 
-void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer)
-{
-  Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (aContext.IsNull())
-    return;
-
-  QObjectPtrList aRemoved;
-  foreach (ObjectPtr aFeature, myResult2AISObjectMap.keys()) {
-    if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) {
-      AISObjectPtr anObj = myResult2AISObjectMap[aFeature];
-      if (!anObj)
-        continue;
-      Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
-      if (!anAIS.IsNull()) {
-        aContext->Remove(anAIS, false);
-        aRemoved.append(aFeature);
-      }
-    }
-  }
-  foreach(ObjectPtr aObj, aRemoved) {
-    myResult2AISObjectMap.remove(aObj);
-  }
-
-  if (isUpdateViewer)
-    updateViewer();
-}
+//void XGUI_Displayer::eraseDeletedResults(const bool isUpdateViewer)
+//{
+//  Handle(AIS_InteractiveContext) aContext = AISContext();
+//  if (aContext.IsNull())
+//    return;
+//
+//  QObjectPtrList aRemoved;
+//  foreach (ObjectPtr aFeature, myResult2AISObjectMap.keys()) {
+//    if (!aFeature || !aFeature->data() || !aFeature->data()->isValid()) {
+//      AISObjectPtr anObj = myResult2AISObjectMap[aFeature];
+//      if (!anObj)
+//        continue;
+//      Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
+//      if (!anAIS.IsNull()) {
+//        aContext->Remove(anAIS, false);
+//        aRemoved.append(aFeature);
+//      }
+//    }
+//  }
+//  foreach(ObjectPtr aObj, aRemoved) {
+//    myResult2AISObjectMap.remove(aObj);
+//  }
+//
+//  if (isUpdateViewer)
+//    updateViewer();
+//}
 
 void XGUI_Displayer::openLocalContext()
 {
@@ -360,9 +441,9 @@ void XGUI_Displayer::openLocalContext()
 
     aContext->ClearCurrents();
     aContext->OpenLocalContext();
-    aContext->NotUseDisplayedObjects();
+    //aContext->NotUseDisplayedObjects();
 
-    myUseExternalObjects = false;
+    //myUseExternalObjects = false;
     myActiveSelectionModes.clear();
 
     SelectMgr_ListIteratorOfListOfFilter aIt(aFilters);
@@ -413,7 +494,7 @@ void XGUI_Displayer::closeLocalContexts(const bool isUpdateViewer)
 
     if (isUpdateViewer)
       updateViewer();
-    myUseExternalObjects = false;
+    //myUseExternalObjects = false;
     myActiveSelectionModes.clear();
 
     // Restore selection
@@ -460,7 +541,11 @@ void XGUI_Displayer::updateViewer()
 
 Handle(AIS_InteractiveContext) XGUI_Displayer::AISContext() const
 {
-  return myWorkshop->viewer()->AISContext();
+  Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
+  if ((!aContext.IsNull()) && (!aContext->HasOpenedContext())) {
+    aContext->OpenLocalContext();
+  }
+  return aContext;
 }
 
 Handle(SelectMgr_AndFilter) XGUI_Displayer::GetFilter()
@@ -480,7 +565,7 @@ void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate)
   if (!anAISIO.IsNull()) {
     aContext->Display(anAISIO, isUpdate);
     if (aContext->HasOpenedContext()) {
-      if (myUseExternalObjects) {
+      //if (myUseExternalObjects) {
         if (myActiveSelectionModes.size() == 0)
           aContext->Activate(anAISIO);
         else {
@@ -488,7 +573,7 @@ void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, bool isUpdate)
             aContext->Activate(anAISIO, aMode);
           }
         }
-      }
+      //}
     }
   }
 }
@@ -502,65 +587,6 @@ void XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool isUpdate)
   }
 }
 
-void XGUI_Displayer::activateObjects(const QIntList& theModes)
-{
-  Handle(AIS_InteractiveContext) aContext = AISContext();
-  // Open local context if there is no one
-  if (!aContext->HasOpenedContext()) 
-    return;
-
-  aContext->UseDisplayedObjects();
-  myUseExternalObjects = true;
-  myActiveSelectionModes = theModes;
-
-  //Deactivate trihedron which can be activated in local selector
-  AIS_ListOfInteractive aPrsList;
-  aContext->DisplayedObjects(aPrsList, true);
-
-  Handle(AIS_Trihedron) aTrihedron;
-  AIS_ListIteratorOfListOfInteractive aLIt(aPrsList);
-  for(; aLIt.More(); aLIt.Next()){
-    aTrihedron = Handle(AIS_Trihedron)::DownCast(aLIt.Value());
-    if (!aTrihedron.IsNull()) {
-      aContext->Deactivate(aTrihedron);
-      break;
-    }
-  }
-
-  //Activate all displayed objects with the module modes
-  //AIS_ListOfInteractive aPrsList;
-  //aContext->DisplayedObjects(aPrsList, true);
-
-  //AIS_ListIteratorOfListOfInteractive aLIt(aPrsList);
-  Handle(AIS_InteractiveObject) anAISIO;
-  for(aLIt.Initialize(aPrsList); aLIt.More(); aLIt.Next()){
-    anAISIO = aLIt.Value();
-    aTrihedron = Handle(AIS_Trihedron)::DownCast(anAISIO);
-    if (!aTrihedron.IsNull())
-      continue;
-
-    aContext->Load(anAISIO, -1, true);
-    if (theModes.size() == 0)
-      aContext->Activate(anAISIO);
-    else {
-      foreach(int aMode, theModes) {
-        aContext->Activate(anAISIO, aMode);
-      }
-    }
-  }
-}
-
-
-void XGUI_Displayer::deactivateObjects()
-{
-  Handle(AIS_InteractiveContext) aContext = AISContext();
-  // Open local context if there is no one
-  if (!aContext->HasOpenedContext()) 
-    return;
-
-  aContext->NotUseDisplayedObjects();
-}
-
 
 void XGUI_Displayer::setDisplayMode(ObjectPtr theObject, DisplayMode theMode, bool toUpdate)
 {
index 7fbbd814d07e758e733545588f25d6b9d2407f9e..2cc3bd4efb4b82cc356ca00eb491770b7b1293ae 100644 (file)
@@ -88,10 +88,7 @@ class XGUI_EXPORT XGUI_Displayer
 
   /// Erase AIS interactive objects, which has an empty feature in the internal map
   /// \param isUpdateViewer the parameter whether the viewer should be update immediatelly
-  void eraseDeletedResults(const bool isUpdateViewer = true);
-
-  /// Opens local context. Does nothing if it is already opened.
-  void openLocalContext();
+  //void eraseDeletedResults(const bool isUpdateViewer = true);
 
   /// Deactivates selection of sub-shapes
   /// \param isUpdateViewer the parameter whether the viewer should be update immediatelly
@@ -182,6 +179,9 @@ class XGUI_EXPORT XGUI_Displayer
    */
   void redisplay(ObjectPtr theObject, bool isUpdateViewer = true);
 
+  /// Opens local context. Does nothing if it is already opened.
+  void openLocalContext();
+
  protected:
   XGUI_Workshop* myWorkshop;
 
@@ -191,7 +191,7 @@ class XGUI_EXPORT XGUI_Displayer
   ResultToAISMap myResult2AISObjectMap;
 
   // A flag of initialization of external objects selection
-  bool myUseExternalObjects;
+  //bool myUseExternalObjects;
   // Selection modes installed for external objects in local context
   QIntList myActiveSelectionModes;
 };
index d1b2d8d2b4cb8f227565fd6db591807f39d600d2..970cb045c6aad989e23ec9d9b9dbe54ace120437 100644 (file)
@@ -57,8 +57,8 @@ void XGUI_ModuleConnector::activateSubShapesSelection(const QIntList& theTypes)
 {
   XGUI_Displayer* aDisp = myWorkshop->displayer();
   // Close context if it was opened in order to clear stsndard selection modes
-  aDisp->closeLocalContexts(false);
-  aDisp->openLocalContext();
+  //aDisp->closeLocalContexts(false);
+  //aDisp->openLocalContext();
   // Convert shape types to selection types
   QIntList aModes;
   foreach(int aType, theTypes) {
@@ -74,7 +74,7 @@ void XGUI_ModuleConnector::deactivateSubShapesSelection()
   XGUI_Displayer* aDisp = myWorkshop->displayer();
   // The document limitation selection has to be only during operation
   //aDisp->removeSelectionFilter(myDocumentShapeFilter);
-  aDisp->closeLocalContexts(false);
+  //aDisp->closeLocalContexts(false);
 }
 
 AISObjectPtr XGUI_ModuleConnector::findPresentation(const ObjectPtr& theObject) const
index 25baff9a741524e6dd77d836cbaacad2714fdcf7..a4a55cca5f10ed96c784d60b5f06ca19b55dbb28 100644 (file)
@@ -257,3 +257,9 @@ void XGUI_ViewerProxy::clearSelectionFilters()
 {
   myWorkshop->displayer()->removeFilters();
 }
+
+//***************************************
+void XGUI_ViewerProxy::update()
+{
+  myWorkshop->displayer()->updateViewer();
+}
index 1f20b281b41cd01a5e55e0b02c8e595cf8e16dcc..7cd1f90d6e7b8e3bb9bb439d1962a33ef6b446de 100644 (file)
@@ -63,6 +63,9 @@ Q_OBJECT
   /// Remove all selection filters from the viewer
   virtual void clearSelectionFilters();
 
+  /// Update current viewer
+  virtual void update();
+
 private slots:
   void onTryCloseView(AppElements_ViewWindow*);
   void onDeleteView(AppElements_ViewWindow*);