]> SALOME platform Git repositories - modules/smesh.git/commitdiff
Salome HOME
0051564: TC6.6.0: Extrusion work incorrect
authoreap <eap@opencascade.com>
Thu, 8 Nov 2012 10:46:53 +0000 (10:46 +0000)
committereap <eap@opencascade.com>
Thu, 8 Nov 2012 10:46:53 +0000 (10:46 +0000)
+  MeshEditor_I::TPreviewMesh * getPreviewMesh( SMDSAbs_ElementType previewType = SMDSAbs_All );
+  ::SMESH_MeshEditor& getEditor();

src/SMESH_I/SMESH_MeshEditor_i.cxx
src/SMESH_I/SMESH_MeshEditor_i.hxx

index 2d3f5b88831641f040fa6a505dfba9ea990e6738..62c174fc78b58a75467adcbde63b28b299779514 100644 (file)
@@ -99,7 +99,7 @@ using namespace std;
 using SMESH::TPythonDump;
 using SMESH::TVar;
 
-namespace {
+namespace MeshEditor_I {
 
   //=============================================================================
   /*!
@@ -419,7 +419,9 @@ namespace {
     return partIOR;
   }
 
-}
+} // namespace MeshEditor_I
+
+using namespace MeshEditor_I;
 
 //=============================================================================
 /*!
@@ -431,7 +433,9 @@ SMESH_MeshEditor_i::SMESH_MeshEditor_i(SMESH_Mesh_i* theMesh, bool isPreview):
   myMesh_i( theMesh ),
   myMesh( &theMesh->GetImpl() ),
   myEditor( myMesh ),
-  myPreviewMode ( isPreview )
+  myIsPreviewMode ( isPreview ),
+  myPreviewMesh( 0 ),
+  myPreviewEditor( 0 )
 {
 }
 
@@ -444,6 +448,8 @@ SMESH_MeshEditor_i::SMESH_MeshEditor_i(SMESH_Mesh_i* theMesh, bool isPreview):
 SMESH_MeshEditor_i::~SMESH_MeshEditor_i()
 {
   deleteAuxIDSources();
+  delete myPreviewMesh;   myPreviewMesh = 0;
+  delete myPreviewEditor; myPreviewEditor = 0;
 }
 
 //================================================================================
@@ -454,27 +460,64 @@ SMESH_MeshEditor_i::~SMESH_MeshEditor_i()
 
 void SMESH_MeshEditor_i::initData(bool deleteSearchers)
 {
-  if ( myPreviewMode ) {
-    //myPreviewData = new SMESH::MeshPreviewStruct();
+  if ( myIsPreviewMode ) {
+    if ( myPreviewMesh ) myPreviewMesh->Clear();
   }
   else {
     if ( deleteSearchers )
       TSearchersDeleter::Delete();
   }
-  myEditor.GetError().reset();
-  myEditor.CrearLastCreated();
+  getEditor().GetError().reset();
+  getEditor().CrearLastCreated();
+}
+//================================================================================
+/*!
+ * \brief Return either myEditor or myPreviewEditor depending on myIsPreviewMode.
+ *        WARNING: in preview mode call getPreviewMesh() before getEditor()!
+ */
+//================================================================================
+
+::SMESH_MeshEditor& SMESH_MeshEditor_i::getEditor()
+{
+  if ( myIsPreviewMode && !myPreviewEditor ) {
+    if ( !myPreviewMesh ) getPreviewMesh();
+    myPreviewEditor = new ::SMESH_MeshEditor( myPreviewMesh );
+  }
+  return myIsPreviewMode ? *myPreviewEditor : myEditor;
 }
 
 //================================================================================
 /*!
- * \brief Now does nothing
+ * \brief Initialize and return myPreviewMesh
+ *  \param previewElements - type of elements to show in preview
+ *
+ *  WARNING: call it once par a method!
  */
 //================================================================================
 
-void SMESH_MeshEditor_i::storeResult(::SMESH_MeshEditor& )
+TPreviewMesh * SMESH_MeshEditor_i::getPreviewMesh(SMDSAbs_ElementType previewElements)
 {
+  if ( !myPreviewMesh || myPreviewMesh->myPreviewType != previewElements )
+  {
+    delete myPreviewEditor;
+    myPreviewEditor = 0;
+    delete myPreviewMesh;
+    myPreviewMesh = new TPreviewMesh( previewElements );
+  }
+  myPreviewMesh->Clear();
+  return myPreviewMesh;
 }
 
+//================================================================================
+/*!
+ * \brief Now does nothing
+ */
+//================================================================================
+
+// void SMESH_MeshEditor_i::storeResult(::SMESH_MeshEditor& )
+// {
+// }
+
 //================================================================================
 /*!
  * Return data of mesh edition preview
@@ -483,9 +526,9 @@ void SMESH_MeshEditor_i::storeResult(::SMESH_MeshEditor& )
 
 SMESH::MeshPreviewStruct* SMESH_MeshEditor_i::GetPreviewData()
 {
-  const bool hasBadElems = ( myEditor.GetError() && myEditor.GetError()->HasBadElems() );
+  const bool hasBadElems = ( getEditor().GetError() && getEditor().GetError()->HasBadElems() );
 
-  if ( myPreviewMode || hasBadElems ) { // --- MeshPreviewStruct filling ---
+  if ( myIsPreviewMode || hasBadElems ) { // --- MeshPreviewStruct filling ---
 
     list<int> aNodesConnectivity;
     typedef map<int, int> TNodesMap;
@@ -494,11 +537,11 @@ SMESH::MeshPreviewStruct* SMESH_MeshEditor_i::GetPreviewData()
     SMESHDS_Mesh* aMeshDS;
     std::auto_ptr< SMESH_MeshPartDS > aMeshPartDS;
     if ( hasBadElems ) {
-      aMeshPartDS.reset( new SMESH_MeshPartDS( myEditor.GetError()->myBadElements ));
+      aMeshPartDS.reset( new SMESH_MeshPartDS( getEditor().GetError()->myBadElements ));
       aMeshDS = aMeshPartDS.get();
     }
     else {
-      aMeshDS = myEditor.GetMeshDS();
+      aMeshDS = getEditor().GetMeshDS();
     }
     int nbEdges = aMeshDS->NbEdges();
     int nbFaces = aMeshDS->NbFaces();
@@ -509,7 +552,7 @@ SMESH::MeshPreviewStruct* SMESH_MeshEditor_i::GetPreviewData()
     
     SMDSAbs_ElementType previewType = SMDSAbs_All;
     if ( !hasBadElems )
-      if (TPreviewMesh * aPreviewMesh = dynamic_cast< TPreviewMesh* >( myEditor.GetMesh() )) {
+      if (TPreviewMesh * aPreviewMesh = dynamic_cast< TPreviewMesh* >( getEditor().GetMesh() )) {
         previewType = aPreviewMesh->myPreviewType;
         switch ( previewType ) {
         case SMDSAbs_Edge  : nbFaces = nbVolum = 0; break;
@@ -521,13 +564,10 @@ SMESH::MeshPreviewStruct* SMESH_MeshEditor_i::GetPreviewData()
 
     myPreviewData->elementTypes.length(nbEdges + nbFaces + nbVolum);
     int i = 0, j = 0;
-    SMDS_ElemIteratorPtr itMeshElems = aMeshDS->elementsIterator();
+    SMDS_ElemIteratorPtr itMeshElems = aMeshDS->elementsIterator(previewType);
 
     while ( itMeshElems->more() ) {
       const SMDS_MeshElement* aMeshElem = itMeshElems->next();
-      if ( previewType != SMDSAbs_All && aMeshElem->GetType() != previewType )
-        continue;
-
       SMDS_ElemIteratorPtr itElemNodes = aMeshElem->nodesIterator();
       while ( itElemNodes->more() ) {
         const SMDS_MeshNode* aMeshNode =
@@ -577,7 +617,7 @@ SMESH::MeshPreviewStruct* SMESH_MeshEditor_i::GetPreviewData()
 SMESH::long_array* SMESH_MeshEditor_i::GetLastCreatedNodes()
 {
   SMESH::long_array_var myLastCreatedNodes = new SMESH::long_array();
-  const SMESH_SequenceOfElemPtr& aSeq = myEditor.GetLastCreatedNodes();
+  const SMESH_SequenceOfElemPtr& aSeq = getEditor().GetLastCreatedNodes();
   myLastCreatedNodes->length( aSeq.Length() );
   for (int i = 1; i <= aSeq.Length(); i++)
     myLastCreatedNodes[i-1] = aSeq.Value(i)->GetID();
@@ -594,7 +634,7 @@ SMESH::long_array* SMESH_MeshEditor_i::GetLastCreatedNodes()
 SMESH::long_array* SMESH_MeshEditor_i::GetLastCreatedElems()
 {
   SMESH::long_array_var myLastCreatedElems = new SMESH::long_array();
-  const SMESH_SequenceOfElemPtr& aSeq = myEditor.GetLastCreatedElems();
+  const SMESH_SequenceOfElemPtr& aSeq = getEditor().GetLastCreatedElems();
   myLastCreatedElems->length( aSeq.Length() );
   for ( int i = 1; i <= aSeq.Length(); i++ )
     myLastCreatedElems[i-1] = aSeq.Value(i)->GetID();
@@ -610,7 +650,7 @@ SMESH::long_array* SMESH_MeshEditor_i::GetLastCreatedElems()
 SMESH::ComputeError* SMESH_MeshEditor_i::GetLastError()
 {
   SMESH::ComputeError*   errOut = new SMESH::ComputeError;
-  SMESH_ComputeErrorPtr& errIn  = myEditor.GetError();
+  SMESH_ComputeErrorPtr& errIn  = getEditor().GetError();
   if ( errIn && !errIn->IsOK() )
   {
     errOut->code       = -( errIn->myName < 0 ? errIn->myName + 1: errIn->myName ); // -1 -> 0
@@ -691,7 +731,7 @@ SMESH_MeshEditor_i::RemoveElements(const SMESH::long_array & IDsOfElements)
   TPythonDump() << "isDone = " << this << ".RemoveElements( " << IDsOfElements << " )";
 
   // Remove Elements
-  bool ret = myEditor.Remove( IdList, false );
+  bool ret = getEditor().Remove( IdList, false );
   myMesh->GetMeshDS()->Modified();
   if ( IDsOfElements.length() )
     myMesh->SetIsModified( true ); // issue 0020693
@@ -715,7 +755,7 @@ CORBA::Boolean SMESH_MeshEditor_i::RemoveNodes(const SMESH::long_array & IDsOfNo
   // Update Python script
   TPythonDump() << "isDone = " << this << ".RemoveNodes( " << IDsOfNodes << " )";
 
-  bool ret = myEditor.Remove( IdList, true );
+  bool ret = getEditor().Remove( IdList, true );
   myMesh->GetMeshDS()->Modified();
   if ( IDsOfNodes.length() )
     myMesh->SetIsModified( true ); // issue 0020693
@@ -739,7 +779,7 @@ CORBA::Long SMESH_MeshEditor_i::RemoveOrphanNodes()
   // Create filter to find all orphan nodes
   SMESH::Controls::Filter::TIdSequence seq;
   SMESH::Controls::PredicatePtr predicate( new SMESH::Controls::FreeNodes() );
-  SMESH::Controls::Filter::GetElementsId( GetMeshDS(), predicate, seq );
+  SMESH::Controls::Filter::GetElementsId( getMeshDS(), predicate, seq );
 
   // remove orphan nodes (if there are any)
   list< int > IdList;
@@ -747,7 +787,7 @@ CORBA::Long SMESH_MeshEditor_i::RemoveOrphanNodes()
     IdList.push_back( seq[i] );
 
   int nbNodesBefore = myMesh->NbNodes();
-  myEditor.Remove( IdList, true );
+  getEditor().Remove( IdList, true );
   myMesh->GetMeshDS()->Modified();
   if ( IdList.size() )
     myMesh->SetIsModified( true );
@@ -767,7 +807,7 @@ CORBA::Long SMESH_MeshEditor_i::AddNode(CORBA::Double x,
 {
   initData();
 
-  const SMDS_MeshNode* N = GetMeshDS()->AddNode(x, y, z);
+  const SMDS_MeshNode* N = getMeshDS()->AddNode(x, y, z);
 
   // Update Python script
   TPythonDump() << "nodeID = " << this << ".AddNode( "
@@ -788,8 +828,8 @@ CORBA::Long SMESH_MeshEditor_i::Add0DElement(CORBA::Long IDOfNode)
 {
   initData();
 
-  const SMDS_MeshNode* aNode = GetMeshDS()->FindNode(IDOfNode);
-  SMDS_MeshElement* elem = GetMeshDS()->Add0DElement(aNode);
+  const SMDS_MeshNode* aNode = getMeshDS()->FindNode(IDOfNode);
+  SMDS_MeshElement* elem = getMeshDS()->Add0DElement(aNode);
 
   // Update Python script
   TPythonDump() << "elem0d = " << this << ".Add0DElement( " << IDOfNode <<" )";
@@ -817,8 +857,8 @@ CORBA::Long SMESH_MeshEditor_i::AddBall(CORBA::Long IDOfNode, CORBA::Double diam
   if ( diameter < std::numeric_limits<double>::min() )
     THROW_SALOME_CORBA_EXCEPTION("Invalid diameter", SALOME::BAD_PARAM);
 
-  const SMDS_MeshNode* aNode = GetMeshDS()->FindNode(IDOfNode);
-  SMDS_MeshElement* elem = GetMeshDS()->AddBall(aNode, diameter);
+  const SMDS_MeshNode* aNode = getMeshDS()->FindNode(IDOfNode);
+  SMDS_MeshElement* elem = getMeshDS()->AddBall(aNode, diameter);
 
   // Update Python script
   TPythonDump() << "ballElem = "
@@ -850,7 +890,8 @@ CORBA::Long SMESH_MeshEditor_i::AddEdge(const SMESH::long_array & IDsOfNodes)
   {
     CORBA::Long index1 = IDsOfNodes[0];
     CORBA::Long index2 = IDsOfNodes[1];
-    elem = GetMeshDS()->AddEdge(GetMeshDS()->FindNode(index1), GetMeshDS()->FindNode(index2));
+    elem = getMeshDS()->AddEdge( getMeshDS()->FindNode(index1),
+                                 getMeshDS()->FindNode(index2));
 
     // Update Python script
     TPythonDump() << "edge = " << this << ".AddEdge([ "
@@ -860,9 +901,9 @@ CORBA::Long SMESH_MeshEditor_i::AddEdge(const SMESH::long_array & IDsOfNodes)
     CORBA::Long n1 = IDsOfNodes[0];
     CORBA::Long n2 = IDsOfNodes[1];
     CORBA::Long n12 = IDsOfNodes[2];
-    elem = GetMeshDS()->AddEdge(GetMeshDS()->FindNode(n1),
-                                GetMeshDS()->FindNode(n2),
-                                GetMeshDS()->FindNode(n12));
+    elem = getMeshDS()->AddEdge( getMeshDS()->FindNode(n1),
+                                 getMeshDS()->FindNode(n2),
+                                 getMeshDS()->FindNode(n12));
     // Update Python script
     TPythonDump() << "edgeID = " << this << ".AddEdge([ "
                   <<n1<<", "<<n2<<", "<<n12<<" ])";
@@ -893,29 +934,29 @@ CORBA::Long SMESH_MeshEditor_i::AddFace(const SMESH::long_array & IDsOfNodes)
 
   std::vector<const SMDS_MeshNode*> nodes (NbNodes);
   for (int i = 0; i < NbNodes; i++)
-    nodes[i] = GetMeshDS()->FindNode(IDsOfNodes[i]);
+    nodes[i] = getMeshDS()->FindNode(IDsOfNodes[i]);
 
   SMDS_MeshElement* elem = 0;
   if (NbNodes == 3) {
-    elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2]);
+    elem = getMeshDS()->AddFace(nodes[0], nodes[1], nodes[2]);
   }
   else if (NbNodes == 4) {
-    elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3]);
+    elem = getMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3]);
   }
   else if (NbNodes == 6) {
-    elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
+    elem = getMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
                                 nodes[4], nodes[5]);
   }
   else if (NbNodes == 8) {
-    elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
+    elem = getMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
                                 nodes[4], nodes[5], nodes[6], nodes[7]);
   }
   else if (NbNodes == 9) {
-    elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
+    elem = getMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3],
                                 nodes[4], nodes[5], nodes[6], nodes[7], nodes[8] );
   }
   else if (NbNodes > 2) {
-    elem = GetMeshDS()->AddPolygonalFace(nodes);
+    elem = getMeshDS()->AddPolygonalFace(nodes);
   }
 
   // Update Python script
@@ -940,9 +981,9 @@ CORBA::Long SMESH_MeshEditor_i::AddPolygonalFace (const SMESH::long_array & IDsO
   int NbNodes = IDsOfNodes.length();
   std::vector<const SMDS_MeshNode*> nodes (NbNodes);
   for (int i = 0; i < NbNodes; i++)
-    nodes[i] = GetMeshDS()->FindNode(IDsOfNodes[i]);
+    nodes[i] = getMeshDS()->FindNode(IDsOfNodes[i]);
 
-  const SMDS_MeshElement* elem = GetMeshDS()->AddPolygonalFace(nodes);
+  const SMDS_MeshElement* elem = getMeshDS()->AddPolygonalFace(nodes);
 
   // Update Python script
   TPythonDump() <<"faceID = "<<this<<".AddPolygonalFace( "<<IDsOfNodes<<" )";
@@ -965,32 +1006,32 @@ CORBA::Long SMESH_MeshEditor_i::AddVolume(const SMESH::long_array & IDsOfNodes)
   int NbNodes = IDsOfNodes.length();
   vector< const SMDS_MeshNode*> n(NbNodes);
   for(int i=0;i<NbNodes;i++)
-    n[i]=GetMeshDS()->FindNode(IDsOfNodes[i]);
+    n[i]= getMeshDS()->FindNode(IDsOfNodes[i]);
 
   SMDS_MeshElement* elem = 0;
   switch(NbNodes)
   {
-  case 4 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3]); break;
-  case 5 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4]); break;
-  case 6 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5]); break;
-  case 8 :elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7]); break;
-  case 10:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],
+  case 4 :elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3]); break;
+  case 5 :elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4]); break;
+  case 6 :elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5]); break;
+  case 8 :elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7]); break;
+  case 10:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],
                                         n[6],n[7],n[8],n[9]);
     break;
-  case 12:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],
+  case 12:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],
                                         n[6],n[7],n[8],n[9],n[10],n[11]);
     break;
-  case 13:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],
+  case 13:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],
                                         n[7],n[8],n[9],n[10],n[11],n[12]);
     break;
-  case 15:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],
+  case 15:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],
                                         n[9],n[10],n[11],n[12],n[13],n[14]);
     break;
-  case 20:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],
+  case 20:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],
                                         n[8],n[9],n[10],n[11],n[12],n[13],n[14],
                                         n[15],n[16],n[17],n[18],n[19]);
     break;
-  case 27:elem = GetMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],
+  case 27:elem = getMeshDS()->AddVolume(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],
                                         n[8],n[9],n[10],n[11],n[12],n[13],n[14],
                                         n[15],n[16],n[17],n[18],n[19],
                                         n[20],n[21],n[22],n[23],n[24],n[25],n[26]);
@@ -1021,7 +1062,7 @@ CORBA::Long SMESH_MeshEditor_i::AddPolyhedralVolume (const SMESH::long_array & I
   std::vector<const SMDS_MeshNode*> n (NbNodes);
   for (int i = 0; i < NbNodes; i++)
     {
-      const SMDS_MeshNode* aNode = GetMeshDS()->FindNode(IDsOfNodes[i]);
+      const SMDS_MeshNode* aNode = getMeshDS()->FindNode(IDsOfNodes[i]);
       if (!aNode) return 0;
       n[i] = aNode;
     }
@@ -1031,7 +1072,7 @@ CORBA::Long SMESH_MeshEditor_i::AddPolyhedralVolume (const SMESH::long_array & I
   for (int j = 0; j < NbFaces; j++)
     q[j] = Quantities[j];
 
-  const SMDS_MeshElement* elem = GetMeshDS()->AddPolyhedralVolume(n, q);
+  const SMDS_MeshElement* elem = getMeshDS()->AddPolyhedralVolume(n, q);
 
   // Update Python script
   TPythonDump() << "volID = " << this << ".AddPolyhedralVolume( "
@@ -1056,7 +1097,7 @@ CORBA::Long SMESH_MeshEditor_i::AddPolyhedralVolumeByFaces (const SMESH::long_ar
   std::vector<int> quantities (NbFaces);
 
   for (int i = 0; i < NbFaces; i++) {
-    const SMDS_MeshElement* aFace = GetMeshDS()->FindElement(IdsOfFaces[i]);
+    const SMDS_MeshElement* aFace = getMeshDS()->FindElement(IdsOfFaces[i]);
     quantities[i] = aFace->NbNodes();
 
     SMDS_ElemIteratorPtr It = aFace->nodesIterator();
@@ -1065,7 +1106,7 @@ CORBA::Long SMESH_MeshEditor_i::AddPolyhedralVolumeByFaces (const SMESH::long_ar
     }
   }
 
-  const SMDS_MeshElement* elem = GetMeshDS()->AddPolyhedralVolume(poly_nodes, quantities);
+  const SMDS_MeshElement* elem = getMeshDS()->AddPolyhedralVolume(poly_nodes, quantities);
 
   // Update Python script
   TPythonDump() << "volID = " << this << ".AddPolyhedralVolumeByFaces( "
@@ -1098,8 +1139,8 @@ SMESH_MeshEditor_i::Create0DElementsOnAllNodes(SMESH::SMESH_IDSource_ptr theObje
   TPythonDump pyDump;
 
   TIDSortedElemSet elements, elems0D;
-  if ( idSourceToSet( theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
-    myEditor.Create0DElementsOnAllNodes( elements, elems0D );
+  if ( idSourceToSet( theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
+    getEditor().Create0DElementsOnAllNodes( elements, elems0D );
 
   SMESH::long_array_var newElems = new SMESH::long_array;
   newElems->length( elems0D.size() );
@@ -1160,7 +1201,7 @@ void SMESH_MeshEditor_i::SetNodeOnVertex(CORBA::Long NodeID, CORBA::Long VertexI
 {
   Unexpect aCatch(SALOME_SalomeException);
 
-  SMESHDS_Mesh * mesh = GetMeshDS();
+  SMESHDS_Mesh * mesh = getMeshDS();
   SMDS_MeshNode* node = const_cast<SMDS_MeshNode*>( mesh->FindNode(NodeID) );
   if ( !node )
     THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM);
@@ -1193,7 +1234,7 @@ void SMESH_MeshEditor_i::SetNodeOnEdge(CORBA::Long NodeID, CORBA::Long EdgeID,
 {
   Unexpect aCatch(SALOME_SalomeException);
 
-  SMESHDS_Mesh * mesh = GetMeshDS();
+  SMESHDS_Mesh * mesh = getMeshDS();
   SMDS_MeshNode* node = const_cast<SMDS_MeshNode*>( mesh->FindNode(NodeID) );
   if ( !node )
     THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM);
@@ -1232,7 +1273,7 @@ void SMESH_MeshEditor_i::SetNodeOnFace(CORBA::Long NodeID, CORBA::Long FaceID,
 {
   Unexpect aCatch(SALOME_SalomeException);
 
-  SMESHDS_Mesh * mesh = GetMeshDS();
+  SMESHDS_Mesh * mesh = getMeshDS();
   SMDS_MeshNode* node = const_cast<SMDS_MeshNode*>( mesh->FindNode(NodeID) );
   if ( !node )
     THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM);
@@ -1279,7 +1320,7 @@ void SMESH_MeshEditor_i::SetNodeInVolume(CORBA::Long NodeID, CORBA::Long SolidID
 {
   Unexpect aCatch(SALOME_SalomeException);
 
-  SMESHDS_Mesh * mesh = GetMeshDS();
+  SMESHDS_Mesh * mesh = getMeshDS();
   SMDS_MeshNode* node = const_cast<SMDS_MeshNode*>( mesh->FindNode(NodeID) );
   if ( !node )
     THROW_SALOME_CORBA_EXCEPTION("Invalid NodeID", SALOME::BAD_PARAM);
@@ -1312,7 +1353,7 @@ void SMESH_MeshEditor_i::SetMeshElementOnShape(CORBA::Long ElementID,
 {
   Unexpect aCatch(SALOME_SalomeException);
 
-  SMESHDS_Mesh * mesh = GetMeshDS();
+  SMESHDS_Mesh * mesh = getMeshDS();
   SMDS_MeshElement* elem = const_cast<SMDS_MeshElement*>(mesh->FindElement(ElementID));
   if ( !elem )
     THROW_SALOME_CORBA_EXCEPTION("Invalid ElementID", SALOME::BAD_PARAM);
@@ -1343,8 +1384,8 @@ CORBA::Boolean SMESH_MeshEditor_i::InverseDiag(CORBA::Long NodeID1,
 {
   initData();
 
-  const SMDS_MeshNode * n1 = GetMeshDS()->FindNode( NodeID1 );
-  const SMDS_MeshNode * n2 = GetMeshDS()->FindNode( NodeID2 );
+  const SMDS_MeshNode * n1 = getMeshDS()->FindNode( NodeID1 );
+  const SMDS_MeshNode * n2 = getMeshDS()->FindNode( NodeID2 );
   if ( !n1 || !n2 )
     return false;
 
@@ -1353,7 +1394,7 @@ CORBA::Boolean SMESH_MeshEditor_i::InverseDiag(CORBA::Long NodeID1,
                 << NodeID1 << ", " << NodeID2 << " )";
 
 
-  int ret =  myEditor.InverseDiag ( n1, n2 );
+  int ret =  getEditor().InverseDiag ( n1, n2 );
   myMesh->GetMeshDS()->Modified();
   myMesh->SetIsModified( true );
   return ret;
@@ -1370,8 +1411,8 @@ CORBA::Boolean SMESH_MeshEditor_i::DeleteDiag(CORBA::Long NodeID1,
 {
   initData();
 
-  const SMDS_MeshNode * n1 = GetMeshDS()->FindNode( NodeID1 );
-  const SMDS_MeshNode * n2 = GetMeshDS()->FindNode( NodeID2 );
+  const SMDS_MeshNode * n1 = getMeshDS()->FindNode( NodeID1 );
+  const SMDS_MeshNode * n2 = getMeshDS()->FindNode( NodeID2 );
   if ( !n1 || !n2 )
     return false;
 
@@ -1380,13 +1421,12 @@ CORBA::Boolean SMESH_MeshEditor_i::DeleteDiag(CORBA::Long NodeID1,
                 << NodeID1 << ", " << NodeID2 <<  " )";
 
 
-  bool stat = myEditor.DeleteDiag ( n1, n2 );
+  bool stat = getEditor().DeleteDiag ( n1, n2 );
 
   myMesh->GetMeshDS()->Modified();
   if ( stat )
     myMesh->SetIsModified( true ); // issue 0020693
 
-  storeResult(myEditor);
 
   return stat;
 }
@@ -1404,9 +1444,9 @@ CORBA::Boolean SMESH_MeshEditor_i::Reorient(const SMESH::long_array & IDsOfEleme
   for (int i = 0; i < IDsOfElements.length(); i++)
   {
     CORBA::Long index = IDsOfElements[i];
-    const SMDS_MeshElement * elem = GetMeshDS()->FindElement(index);
+    const SMDS_MeshElement * elem = getMeshDS()->FindElement(index);
     if ( elem )
-      myEditor.Reorient( elem );
+      getEditor().Reorient( elem );
   }
   // Update Python script
   TPythonDump() << "isDone = " << this << ".Reorient( " << IDsOfElements << " )";
@@ -1462,14 +1502,14 @@ CORBA::Long SMESH_MeshEditor_i::Reorient2D(SMESH::SMESH_IDSource_ptr the2Dgroup,
   initData(/*deleteSearchers=*/false);
 
   TIDSortedElemSet elements;
-  if ( !idSourceToSet( the2Dgroup, GetMeshDS(), elements, SMDSAbs_Face, /*emptyIfIsMesh=*/1))
+  if ( !idSourceToSet( the2Dgroup, getMeshDS(), elements, SMDSAbs_Face, /*emptyIfIsMesh=*/1))
     THROW_SALOME_CORBA_EXCEPTION("No faces in given group", SALOME::BAD_PARAM);
 
 
   const SMDS_MeshElement* face = 0;
   if ( theFace > 0 )
   {
-    face = GetMeshDS()->FindElement( theFace );
+    face = getMeshDS()->FindElement( theFace );
     if ( !face )
       THROW_SALOME_CORBA_EXCEPTION("Inexistent face given", SALOME::BAD_PARAM);
     if ( face->GetType() != SMDSAbs_Face )
@@ -1511,8 +1551,7 @@ CORBA::Long SMESH_MeshEditor_i::Reorient2D(SMESH::SMESH_IDSource_ptr the2Dgroup,
   if ( dirVec.Magnitude() < std::numeric_limits< double >::min() )
     THROW_SALOME_CORBA_EXCEPTION("Zero size vector", SALOME::BAD_PARAM);
 
-  int nbReori = myEditor.Reorient2D( elements, dirVec, face );
-  storeResult(myEditor);
+  int nbReori = getEditor().Reorient2D( elements, dirVec, face );
 
   if ( nbReori ) {
     myMesh->SetIsModified( true );
@@ -1538,7 +1577,7 @@ CORBA::Boolean SMESH_MeshEditor_i::TriToQuad (const SMESH::long_array &   IDsOfE
 {
   initData();
 
-  SMESHDS_Mesh* aMesh = GetMeshDS();
+  SMESHDS_Mesh* aMesh = getMeshDS();
   TIDSortedElemSet faces;
   arrayToSet(IDsOfElements, aMesh, faces, SMDSAbs_Face);
 
@@ -1555,12 +1594,11 @@ CORBA::Boolean SMESH_MeshEditor_i::TriToQuad (const SMESH::long_array &   IDsOfE
                 << IDsOfElements << ", " << aNumericalFunctor << ", " << TVar( MaxAngle ) << " )";
 
 
-  bool stat = myEditor.TriToQuad( faces, aCrit, MaxAngle );
+  bool stat = getEditor().TriToQuad( faces, aCrit, MaxAngle );
   myMesh->GetMeshDS()->Modified();
   if ( stat )
     myMesh->SetIsModified( true ); // issue 0020693
 
-  storeResult(myEditor);
 
   return stat;
 }
@@ -1602,7 +1640,7 @@ CORBA::Boolean SMESH_MeshEditor_i::QuadToTri (const SMESH::long_array &   IDsOfE
 {
   initData();
 
-  SMESHDS_Mesh* aMesh = GetMeshDS();
+  SMESHDS_Mesh* aMesh = getMeshDS();
   TIDSortedElemSet faces;
   arrayToSet(IDsOfElements, aMesh, faces, SMDSAbs_Face);
 
@@ -1618,12 +1656,11 @@ CORBA::Boolean SMESH_MeshEditor_i::QuadToTri (const SMESH::long_array &   IDsOfE
   // Update Python script
   TPythonDump() << "isDone = " << this << ".QuadToTri( " << IDsOfElements << ", " << aNumericalFunctor << " )";
 
-  CORBA::Boolean stat = myEditor.QuadToTri( faces, aCrit );
+  CORBA::Boolean stat = getEditor().QuadToTri( faces, aCrit );
   myMesh->GetMeshDS()->Modified();
   if ( stat )
     myMesh->SetIsModified( true ); // issue 0020693
 
-  storeResult(myEditor);
 
   return stat;
 }
@@ -1664,7 +1701,7 @@ CORBA::Boolean SMESH_MeshEditor_i::SplitQuad (const SMESH::long_array & IDsOfEle
 {
   initData();
 
-  SMESHDS_Mesh* aMesh = GetMeshDS();
+  SMESHDS_Mesh* aMesh = getMeshDS();
   TIDSortedElemSet faces;
   arrayToSet(IDsOfElements, aMesh, faces, SMDSAbs_Face);
 
@@ -1672,13 +1709,12 @@ CORBA::Boolean SMESH_MeshEditor_i::SplitQuad (const SMESH::long_array & IDsOfEle
   TPythonDump() << "isDone = " << this << ".SplitQuad( "
                 << IDsOfElements << ", " << Diag13 << " )";
 
-  CORBA::Boolean stat = myEditor.QuadToTri( faces, Diag13 );
+  CORBA::Boolean stat = getEditor().QuadToTri( faces, Diag13 );
   myMesh->GetMeshDS()->Modified();
   if ( stat )
     myMesh->SetIsModified( true ); // issue 0020693
 
 
-  storeResult(myEditor);
 
   return stat;
 }
@@ -1717,7 +1753,7 @@ CORBA::Long SMESH_MeshEditor_i::BestSplit (CORBA::Long                 IDOfQuad,
 {
   initData();
 
-  const SMDS_MeshElement* quad = GetMeshDS()->FindElement(IDOfQuad);
+  const SMDS_MeshElement* quad = getMeshDS()->FindElement(IDOfQuad);
   if (quad && quad->GetType() == SMDSAbs_Face && quad->NbNodes() == 4)
   {
     SMESH::NumericalFunctor_i* aNumericalFunctor =
@@ -1728,7 +1764,7 @@ CORBA::Long SMESH_MeshEditor_i::BestSplit (CORBA::Long                 IDOfQuad,
     else
       aCrit.reset(new SMESH::Controls::AspectRatio());
 
-    return myEditor.BestSplit(quad, aCrit);
+    return getEditor().BestSplit(quad, aCrit);
   }
   return -1;
 }
@@ -1749,12 +1785,11 @@ void SMESH_MeshEditor_i::SplitVolumesIntoTetra (SMESH::SMESH_IDSource_ptr elems,
 
   SMESH::long_array_var anElementsId = elems->GetIDs();
   TIDSortedElemSet elemSet;
-  arrayToSet( anElementsId, GetMeshDS(), elemSet, SMDSAbs_Volume );
+  arrayToSet( anElementsId, getMeshDS(), elemSet, SMDSAbs_Volume );
 
-  myEditor.SplitVolumesIntoTetra( elemSet, int( methodFlags ));
+  getEditor().SplitVolumesIntoTetra( elemSet, int( methodFlags ));
   myMesh->GetMeshDS()->Modified();
 
-  storeResult(myEditor);
 
 //   if ( myLastCreatedElems.length() ) - it does not influence Compute()
 //     myMesh->SetIsModified( true ); // issue 0020693
@@ -1847,7 +1882,7 @@ SMESH_MeshEditor_i::smooth(const SMESH::long_array &              IDsOfElements,
 {
   initData();
 
-  SMESHDS_Mesh* aMesh = GetMeshDS();
+  SMESHDS_Mesh* aMesh = getMeshDS();
 
   TIDSortedElemSet elements;
   arrayToSet(IDsOfElements, aMesh, elements, SMDSAbs_Face);
@@ -1863,13 +1898,12 @@ SMESH_MeshEditor_i::smooth(const SMESH::long_array &              IDsOfElements,
   if ( Method != SMESH::SMESH_MeshEditor::LAPLACIAN_SMOOTH )
     method = ::SMESH_MeshEditor::CENTROIDAL;
 
-  myEditor.Smooth(elements, fixedNodes, method,
+  getEditor().Smooth(elements, fixedNodes, method,
                   MaxNbOfIterations, MaxAspectRatio, IsParametric );
 
   myMesh->GetMeshDS()->Modified();
   myMesh->SetIsModified( true ); // issue 0020693
 
-  storeResult(myEditor);
 
   // Update Python script
   TPythonDump() << "isDone = " << this << "."
@@ -1930,7 +1964,7 @@ void SMESH_MeshEditor_i::RenumberNodes()
   // Update Python script
   TPythonDump() << this << ".RenumberNodes()";
 
-  GetMeshDS()->Renumber( true );
+  getMeshDS()->Renumber( true );
 }
 
 
@@ -1945,7 +1979,7 @@ void SMESH_MeshEditor_i::RenumberElements()
   // Update Python script
   TPythonDump() << this << ".RenumberElements()";
 
-  GetMeshDS()->Renumber( false );
+  getMeshDS()->Renumber( false );
 }
 
 //=======================================================================
@@ -1979,32 +2013,24 @@ SMESH_MeshEditor_i::rotationSweep(const SMESH::long_array & theIDsOfElements,
   initData();
 
   TIDSortedElemSet inElements, copyElements;
-  arrayToSet(theIDsOfElements, GetMeshDS(), inElements, theElementType);
+  arrayToSet(theIDsOfElements, getMeshDS(), inElements, theElementType);
 
   TIDSortedElemSet* workElements = & inElements;
-  TPreviewMesh      tmpMesh( SMDSAbs_Face );
-  SMESH_Mesh*       mesh = 0;
   bool              makeWalls=true;
-  if ( myPreviewMode )
+  if ( myIsPreviewMode )
   {
     SMDSAbs_ElementType select = SMDSAbs_All, avoid = SMDSAbs_Volume;
-    tmpMesh.Copy( inElements, copyElements, select, avoid );
-    mesh = &tmpMesh;
+    getPreviewMesh( SMDSAbs_Face )->Copy( inElements, copyElements, select, avoid );
     workElements = & copyElements;
     //makeWalls = false;
   }
-  else
-  {
-    mesh = myMesh;
-  }
 
   gp_Ax1 Ax1 (gp_Pnt( theAxis.x,  theAxis.y,  theAxis.z ),
               gp_Vec( theAxis.vx, theAxis.vy, theAxis.vz ));
 
   ::SMESH_MeshEditor::PGroupIDs groupIds =
-      myEditor.RotationSweep (*workElements, Ax1, theAngleInRadians,
-                              theNbOfSteps, theTolerance, theMakeGroups, makeWalls);
-  storeResult(myEditor);
+      getEditor().RotationSweep (*workElements, Ax1, theAngleInRadians,
+                                 theNbOfSteps, theTolerance, theMakeGroups, makeWalls);
   myMesh->GetMeshDS()->Modified();
 
   //  myMesh->SetIsModified( true ); -- it does not influence Compute()
@@ -2023,7 +2049,7 @@ void SMESH_MeshEditor_i::RotationSweep(const SMESH::long_array & theIDsOfElement
                                        CORBA::Long               theNbOfSteps,
                                        CORBA::Double             theTolerance)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << this << ".RotationSweep( "
                   << theIDsOfElements          << ", "
                   << theAxis                   << ", "
@@ -2059,7 +2085,7 @@ SMESH_MeshEditor_i::RotationSweepMakeGroups(const SMESH::long_array& theIDsOfEle
                                                theNbOfSteps,
                                                theTolerance,
                                                true);
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".RotationSweepMakeGroups( "
                 << theIDsOfElements        << ", "
@@ -2082,7 +2108,7 @@ void SMESH_MeshEditor_i::RotationSweepObject(SMESH::SMESH_IDSource_ptr theObject
                                              CORBA::Long               theNbOfSteps,
                                              CORBA::Double             theTolerance)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << this << ".RotationSweepObject( "
                   << theObject << ", "
                   << theAxis << ", "
@@ -2110,7 +2136,7 @@ void SMESH_MeshEditor_i::RotationSweepObject1D(SMESH::SMESH_IDSource_ptr theObje
                                                CORBA::Long               theNbOfSteps,
                                                CORBA::Double             theTolerance)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << this << ".RotationSweepObject1D( "
                   << theObject                 << ", "
                   << theAxis                   << ", "
@@ -2139,7 +2165,7 @@ void SMESH_MeshEditor_i::RotationSweepObject2D(SMESH::SMESH_IDSource_ptr theObje
                                                CORBA::Long               theNbOfSteps,
                                                CORBA::Double             theTolerance)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << this << ".RotationSweepObject2D( "
                   << theObject                 << ", "
                   << theAxis                   << ", "
@@ -2178,7 +2204,7 @@ SMESH_MeshEditor_i::RotationSweepObjectMakeGroups(SMESH::SMESH_IDSource_ptr theO
                                                theNbOfSteps,
                                                theTolerance,
                                                true);
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".RotationSweepObjectMakeGroups( "
                 << theObject << ", "
@@ -2212,7 +2238,7 @@ SMESH_MeshEditor_i::RotationSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr th
                                                theTolerance,
                                                true,
                                                SMDSAbs_Edge);
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".RotationSweepObject1DMakeGroups( "
                 << theObject                 << ", "
@@ -2246,7 +2272,7 @@ SMESH_MeshEditor_i::RotationSweepObject2DMakeGroups(SMESH::SMESH_IDSource_ptr th
                                                theTolerance,
                                                true,
                                                SMDSAbs_Face);
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".RotationSweepObject2DMakeGroups( "
                 << theObject                 << ", "
@@ -2278,7 +2304,7 @@ SMESH_MeshEditor_i::extrusionSweep(const SMESH::long_array & theIDsOfElements,
     OCC_CATCH_SIGNALS;
 #endif
     TIDSortedElemSet elements, copyElements;
-    arrayToSet(theIDsOfElements, GetMeshDS(), elements, theElementType);
+    arrayToSet(theIDsOfElements, getMeshDS(), elements, theElementType);
 
     const SMESH::PointStruct * P = &theStepVector.PS;
     gp_Vec stepVec( P->x, P->y, P->z );
@@ -2286,29 +2312,22 @@ SMESH_MeshEditor_i::extrusionSweep(const SMESH::long_array & theIDsOfElements,
     TIDSortedElemSet* workElements = & elements;
 
     SMDSAbs_ElementType aType = SMDSAbs_Face;
-    //::SMESH_MeshEditor::ExtrusionFlags aFlag = ::SMESH_MeshEditor::ExtrusionFlags::EXTRUSION_FLAG_BOUNDARY;
     if (theElementType == SMDSAbs_Node)
     {
       aType = SMDSAbs_Edge;
-      //aFlag = ::SMESH_MeshEditor::ExtrusionFlags::EXTRUSION_FLAG_SEW;
     }
-    TPreviewMesh      tmpMesh( aType );
-    SMESH_Mesh* mesh = myMesh;
-
-    if ( myPreviewMode ) {
+    if ( myIsPreviewMode ) {
       SMDSAbs_ElementType select = SMDSAbs_All, avoid = SMDSAbs_Volume;
-      tmpMesh.Copy( elements, copyElements, select, avoid );
-      mesh = &tmpMesh;
+      getPreviewMesh( aType )->Copy( elements, copyElements, select, avoid );
       workElements = & copyElements;
       theMakeGroups = false;
     }
 
     TElemOfElemListMap aHystory;
     ::SMESH_MeshEditor::PGroupIDs groupIds = 
-        myEditor.ExtrusionSweep (*workElements, stepVec, theNbOfSteps, aHystory, theMakeGroups);
+        getEditor().ExtrusionSweep (*workElements, stepVec, theNbOfSteps, aHystory, theMakeGroups);
 
     myMesh->GetMeshDS()->Modified();
-    storeResult(myEditor);
 
     return theMakeGroups ? getGroups(groupIds.get()) : 0;
 
@@ -2329,7 +2348,7 @@ void SMESH_MeshEditor_i::ExtrusionSweep(const SMESH::long_array & theIDsOfElemen
                                         CORBA::Long               theNbOfSteps)
 {
   extrusionSweep (theIDsOfElements, theStepVector, theNbOfSteps, false );
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     TPythonDump() << this << ".ExtrusionSweep( "
                   << theIDsOfElements << ", " << theStepVector <<", " << TVar(theNbOfSteps) << " )";
   }
@@ -2345,7 +2364,7 @@ void SMESH_MeshEditor_i::ExtrusionSweep0D(const SMESH::long_array & theIDsOfElem
                                           CORBA::Long               theNbOfSteps)
 {
   extrusionSweep (theIDsOfElements, theStepVector, theNbOfSteps, false, SMDSAbs_Node );
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     TPythonDump() << this << ".ExtrusionSweep0D( "
                   << theIDsOfElements << ", " << theStepVector <<", " << TVar(theNbOfSteps)<< " )";
   }
@@ -2362,7 +2381,7 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject(SMESH::SMESH_IDSource_ptr theObjec
 {
   SMESH::long_array_var anElementsId = theObject->GetIDs();
   extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false );
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     TPythonDump() << this << ".ExtrusionSweepObject( "
                   << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )";
   }
@@ -2379,7 +2398,7 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject0D(SMESH::SMESH_IDSource_ptr theObj
 {
   SMESH::long_array_var anElementsId = theObject->GetIDs();
   extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false, SMDSAbs_Node );
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << this << ".ExtrusionSweepObject0D( "
                   << theObject << ", " << theStepVector << ", " << TVar( theNbOfSteps ) << " )";
   }
@@ -2396,7 +2415,7 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject1D(SMESH::SMESH_IDSource_ptr theObj
 {
   SMESH::long_array_var anElementsId = theObject->GetIDs();
   extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false, SMDSAbs_Edge );
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << this << ".ExtrusionSweepObject1D( "
                   << theObject << ", " << theStepVector << ", " << TVar( theNbOfSteps ) << " )";
   }
@@ -2413,7 +2432,7 @@ void SMESH_MeshEditor_i::ExtrusionSweepObject2D(SMESH::SMESH_IDSource_ptr theObj
 {
   SMESH::long_array_var anElementsId = theObject->GetIDs();
   extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false, SMDSAbs_Face );
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << this << ".ExtrusionSweepObject2D( "
                   << theObject << ", " << theStepVector << ", " << TVar( theNbOfSteps ) << " )";
   }
@@ -2433,7 +2452,7 @@ SMESH_MeshEditor_i::ExtrusionSweepMakeGroups(const SMESH::long_array& theIDsOfEl
 
   SMESH::ListOfGroups* aGroups = extrusionSweep(theIDsOfElements, theStepVector, theNbOfSteps, true);
 
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".ExtrusionSweepMakeGroups( " << theIDsOfElements
                 << ", " << theStepVector <<", " << TVar( theNbOfSteps ) << " )";
@@ -2455,7 +2474,7 @@ SMESH_MeshEditor_i::ExtrusionSweepMakeGroups0D(const SMESH::long_array& theIDsOf
 
   SMESH::ListOfGroups* aGroups = extrusionSweep(theIDsOfElements, theStepVector, theNbOfSteps, true,SMDSAbs_Node);
 
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".ExtrusionSweepMakeGroups0D( " << theIDsOfElements
                 << ", " << theStepVector <<", " << TVar( theNbOfSteps ) << " )";
@@ -2478,7 +2497,7 @@ SMESH_MeshEditor_i::ExtrusionSweepObjectMakeGroups(SMESH::SMESH_IDSource_ptr the
   SMESH::long_array_var anElementsId = theObject->GetIDs();
   SMESH::ListOfGroups * aGroups = extrusionSweep(anElementsId, theStepVector, theNbOfSteps, true);
 
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".ExtrusionSweepObjectMakeGroups( " << theObject
                 << ", " << theStepVector << ", " << theNbOfSteps << " )";
@@ -2501,7 +2520,7 @@ SMESH_MeshEditor_i::ExtrusionSweepObject0DMakeGroups(SMESH::SMESH_IDSource_ptr t
   SMESH::long_array_var anElementsId = theObject->GetIDs();
   SMESH::ListOfGroups * aGroups = extrusionSweep(anElementsId, theStepVector,
                                                  theNbOfSteps, true, SMDSAbs_Node);
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".ExtrusionSweepObject0DMakeGroups( " << theObject
                 << ", " << theStepVector << ", " << TVar( theNbOfSteps ) << " )";
@@ -2524,7 +2543,7 @@ SMESH_MeshEditor_i::ExtrusionSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr t
   SMESH::long_array_var anElementsId = theObject->GetIDs();
   SMESH::ListOfGroups * aGroups = extrusionSweep(anElementsId, theStepVector,
                                                  theNbOfSteps, true, SMDSAbs_Edge);
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".ExtrusionSweepObject1DMakeGroups( " << theObject
                 << ", " << theStepVector << ", " << TVar( theNbOfSteps ) << " )";
@@ -2547,7 +2566,7 @@ SMESH_MeshEditor_i::ExtrusionSweepObject2DMakeGroups(SMESH::SMESH_IDSource_ptr t
   SMESH::long_array_var anElementsId = theObject->GetIDs();
   SMESH::ListOfGroups * aGroups = extrusionSweep(anElementsId, theStepVector,
                                                  theNbOfSteps, true, SMDSAbs_Face);
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".ExtrusionSweepObject2DMakeGroups( " << theObject
                 << ", " << theStepVector << ", " << TVar( theNbOfSteps ) << " )";
@@ -2572,16 +2591,15 @@ SMESH_MeshEditor_i::advancedExtrusion(const SMESH::long_array & theIDsOfElements
   initData();
 
   TIDSortedElemSet elements;
-  arrayToSet(theIDsOfElements, GetMeshDS(), elements);
+  arrayToSet(theIDsOfElements, getMeshDS(), elements);
 
   const SMESH::PointStruct * P = &theStepVector.PS;
   gp_Vec stepVec( P->x, P->y, P->z );
 
   TElemOfElemListMap aHystory;
   ::SMESH_MeshEditor::PGroupIDs groupIds =
-      myEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory,
-                               theMakeGroups, theExtrFlags, theSewTolerance);
-  storeResult(myEditor);
+      getEditor().ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory,
+                                  theMakeGroups, theExtrFlags, theSewTolerance);
 
   return theMakeGroups ? getGroups(groupIds.get()) : 0;
 }
@@ -2597,7 +2615,7 @@ void SMESH_MeshEditor_i::AdvancedExtrusion(const SMESH::long_array & theIDsOfEle
                                            CORBA::Long               theExtrFlags,
                                            CORBA::Double             theSewTolerance)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << "stepVector = " << theStepVector;
     TPythonDump() << this << ".AdvancedExtrusion("
                   << theIDsOfElements
@@ -2625,7 +2643,7 @@ SMESH_MeshEditor_i::AdvancedExtrusionMakeGroups(const SMESH::long_array& theIDsO
                                                 CORBA::Long              theExtrFlags,
                                                 CORBA::Double            theSewTolerance)
 {
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     TPythonDump() << "stepVector = " << theStepVector;
   }
   TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
@@ -2637,7 +2655,7 @@ SMESH_MeshEditor_i::AdvancedExtrusionMakeGroups(const SMESH::long_array& theIDsO
                                                      theSewTolerance,
                                                      true);
 
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".AdvancedExtrusionMakeGroups("
                 << theIDsOfElements
@@ -2714,7 +2732,7 @@ SMESH_MeshEditor_i::extrusionAlongPath(const SMESH::long_array &   theIDsOfEleme
   }
 
   TIDSortedElemSet elements;
-  arrayToSet(theIDsOfElements, GetMeshDS(), elements, theElementType);
+  arrayToSet(theIDsOfElements, getMeshDS(), elements, theElementType);
 
   list<double> angles;
   for (int i = 0; i < theAngles.length(); i++) {
@@ -2726,11 +2744,10 @@ SMESH_MeshEditor_i::extrusionAlongPath(const SMESH::long_array &   theIDsOfEleme
   int nbOldGroups = myMesh->NbGroup();
 
   ::SMESH_MeshEditor::Extrusion_Error error =
-      myEditor.ExtrusionAlongTrack( elements, aSubMesh, nodeStart,
+      getEditor().ExtrusionAlongTrack( elements, aSubMesh, nodeStart,
                                     theHasAngles, angles, false,
                                     theHasRefPoint, refPnt, theMakeGroups );
   myMesh->GetMeshDS()->Modified();
-  storeResult(myEditor);
   theError = convExtrError( error );
 
   if ( theMakeGroups ) {
@@ -2778,17 +2795,14 @@ SMESH_MeshEditor_i::extrusionAlongPathX(const SMESH::long_array &  IDsOfElements
   }
 
   TIDSortedElemSet elements, copyElements;
-  arrayToSet(IDsOfElements, GetMeshDS(), elements, ElementType);
+  arrayToSet(IDsOfElements, getMeshDS(), elements, ElementType);
 
   TIDSortedElemSet* workElements = &elements;
-  TPreviewMesh      tmpMesh( SMDSAbs_Face );
-  SMESH_Mesh*       mesh = myMesh;
 
-  if ( myPreviewMode )
+  if ( myIsPreviewMode )
   {
     SMDSAbs_ElementType select = SMDSAbs_All, avoid = SMDSAbs_Volume;
-    tmpMesh.Copy( elements, copyElements, select, avoid );
-    mesh = &tmpMesh;
+    getPreviewMesh( SMDSAbs_Face )->Copy( elements, copyElements, select, avoid );
     workElements = & copyElements;
     MakeGroups = false;
   }
@@ -2804,9 +2818,9 @@ SMESH_MeshEditor_i::extrusionAlongPathX(const SMESH::long_array &  IDsOfElements
       Error = SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE;
       return EmptyGr;
     }
-    error = myEditor.ExtrusionAlongTrack( *workElements, &(aMeshImp->GetImpl()), aNodeStart,
-                                          HasAngles, angles, LinearVariation,
-                                          HasRefPoint, refPnt, MakeGroups );
+    error = getEditor().ExtrusionAlongTrack( *workElements, &(aMeshImp->GetImpl()), aNodeStart,
+                                             HasAngles, angles, LinearVariation,
+                                             HasRefPoint, refPnt, MakeGroups );
     myMesh->GetMeshDS()->Modified();
   }
   else if ( SMESH_subMesh_i* aSubMeshImp = SMESH::DownCast<SMESH_subMesh_i*>( Path ))
@@ -2822,9 +2836,9 @@ SMESH_MeshEditor_i::extrusionAlongPathX(const SMESH::long_array &  IDsOfElements
     }
     SMESH_subMesh* aSubMesh =
       aMeshImp->GetImpl().GetSubMeshContaining(aSubMeshImp->GetId());
-    error = myEditor.ExtrusionAlongTrack( *workElements, aSubMesh, aNodeStart,
-                                          HasAngles, angles, LinearVariation,
-                                          HasRefPoint, refPnt, MakeGroups );
+    error = getEditor().ExtrusionAlongTrack( *workElements, aSubMesh, aNodeStart,
+                                             HasAngles, angles, LinearVariation,
+                                             HasRefPoint, refPnt, MakeGroups );
     myMesh->GetMeshDS()->Modified();
   }
   else if ( SMESH::DownCast<SMESH_Group_i*>( Path ))
@@ -2839,7 +2853,6 @@ SMESH_MeshEditor_i::extrusionAlongPathX(const SMESH::long_array &  IDsOfElements
     return EmptyGr;
   }
 
-  storeResult(myEditor);
   Error = convExtrError( error );
 
   if ( MakeGroups ) {
@@ -2868,7 +2881,7 @@ SMESH_MeshEditor_i::ExtrusionAlongPath(const SMESH::long_array &   theIDsOfEleme
                                        const SMESH::PointStruct &  theRefPoint)
 {
   MESSAGE("ExtrusionAlongPath");
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << "error = " << this << ".ExtrusionAlongPath( "
                   << theIDsOfElements << ", "
                   << thePathMesh      << ", "
@@ -2910,7 +2923,7 @@ SMESH_MeshEditor_i::ExtrusionAlongPathObject(SMESH::SMESH_IDSource_ptr   theObje
                                              CORBA::Boolean              theHasRefPoint,
                                              const SMESH::PointStruct &  theRefPoint)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << "error = " << this << ".ExtrusionAlongPathObject( "
                   << theObject        << ", "
                   << thePathMesh      << ", "
@@ -2953,7 +2966,7 @@ SMESH_MeshEditor_i::ExtrusionAlongPathObject1D(SMESH::SMESH_IDSource_ptr   theOb
                                                CORBA::Boolean              theHasRefPoint,
                                                const SMESH::PointStruct &  theRefPoint)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << "error = " << this << ".ExtrusionAlongPathObject1D( "
                   << theObject        << ", "
                   << thePathMesh      << ", "
@@ -2997,7 +3010,7 @@ SMESH_MeshEditor_i::ExtrusionAlongPathObject2D(SMESH::SMESH_IDSource_ptr   theOb
                                                CORBA::Boolean              theHasRefPoint,
                                                const SMESH::PointStruct &  theRefPoint)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << "error = " << this << ".ExtrusionAlongPathObject2D( "
                   << theObject        << ", "
                   << thePathMesh      << ", "
@@ -3055,7 +3068,7 @@ SMESH_MeshEditor_i::ExtrusionAlongPathMakeGroups(const SMESH::long_array&   theI
                                                        theRefPoint,
                                                        true,
                                                        Error);
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     bool isDumpGroups = aGroups && aGroups->length() > 0;
     if (isDumpGroups)
       aPythonDump << "(" << aGroups << ", error)";
@@ -3107,7 +3120,7 @@ ExtrusionAlongPathObjectMakeGroups(SMESH::SMESH_IDSource_ptr  theObject,
                                                       true,
                                                       Error);
 
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     bool isDumpGroups = aGroups && aGroups->length() > 0;
     if (isDumpGroups)
       aPythonDump << "(" << aGroups << ", error)";
@@ -3160,7 +3173,7 @@ ExtrusionAlongPathObject1DMakeGroups(SMESH::SMESH_IDSource_ptr  theObject,
                                                       Error,
                                                       SMDSAbs_Edge);
 
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     bool isDumpGroups = aGroups && aGroups->length() > 0;
     if (isDumpGroups)
       aPythonDump << "(" << aGroups << ", error)";
@@ -3213,7 +3226,7 @@ ExtrusionAlongPathObject2DMakeGroups(SMESH::SMESH_IDSource_ptr  theObject,
                                                       Error,
                                                       SMDSAbs_Face);
 
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     bool isDumpGroups = aGroups && aGroups->length() > 0;
     if (isDumpGroups)
       aPythonDump << "(" << aGroups << ", error)";
@@ -3269,7 +3282,7 @@ ExtrusionAlongPathObjX(SMESH::SMESH_IDSource_ptr  Object,
                                                       (SMDSAbs_ElementType)ElemType,
                                                       Error);
 
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     bool isDumpGroups = aGroups && aGroups->length() > 0;
     if (isDumpGroups)
       aPythonDump << "(" << *aGroups << ", error)";
@@ -3326,7 +3339,7 @@ ExtrusionAlongPathX(const SMESH::long_array&   IDsOfElements,
                                                       (SMDSAbs_ElementType)ElemType,
                                                       Error);
 
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     bool isDumpGroups = aGroups && aGroups->length() > 0;
     if (isDumpGroups)
       aPythonDump << "(" << *aGroups << ", error)";
@@ -3458,31 +3471,26 @@ SMESH_MeshEditor_i::mirror(TIDSortedElemSet &                  theElements,
   }
 
   TIDSortedElemSet  copyElements;
-  TPreviewMesh      tmpMesh;
   TIDSortedElemSet* workElements = & theElements;
-  SMESH_Mesh*       mesh = myMesh;
 
-  if ( myPreviewMode )
+  if ( myIsPreviewMode )
   {
-    tmpMesh.Copy( theElements, copyElements);
+    TPreviewMesh * tmpMesh = getPreviewMesh();
+    tmpMesh->Copy( theElements, copyElements);
     if ( !theCopy && !theTargetMesh )
     {
       TIDSortedElemSet elemsAround, elemsAroundCopy;
-      getElementsAround( theElements, GetMeshDS(), elemsAround );
-      tmpMesh.Copy( elemsAround, elemsAroundCopy);
+      getElementsAround( theElements, getMeshDS(), elemsAround );
+      tmpMesh->Copy( elemsAround, elemsAroundCopy);
     }
-    mesh = &tmpMesh;
     workElements = & copyElements;
     theMakeGroups = false;
   }
 
   ::SMESH_MeshEditor::PGroupIDs groupIds =
-      myEditor.Transform (*workElements, aTrsf, theCopy, theMakeGroups, theTargetMesh);
+      getEditor().Transform (*workElements, aTrsf, theCopy, theMakeGroups, theTargetMesh);
 
-  if(theCopy || myPreviewMode)
-    storeResult(myEditor); // store preview data or new elements
-
-  if ( !myPreviewMode )
+  if ( theCopy && !myIsPreviewMode)
   {
     if ( theTargetMesh )
     {
@@ -3507,7 +3515,7 @@ void SMESH_MeshEditor_i::Mirror(const SMESH::long_array &           theIDsOfElem
                                 SMESH::SMESH_MeshEditor::MirrorType theMirrorType,
                                 CORBA::Boolean                      theCopy)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << this << ".Mirror( "
                   << theIDsOfElements              << ", "
                   << theAxis                       << ", "
@@ -3517,7 +3525,7 @@ void SMESH_MeshEditor_i::Mirror(const SMESH::long_array &           theIDsOfElem
   if ( theIDsOfElements.length() > 0 )
   {
     TIDSortedElemSet elements;
-    arrayToSet(theIDsOfElements, GetMeshDS(), elements);
+    arrayToSet(theIDsOfElements, getMeshDS(), elements);
     mirror(elements, theAxis, theMirrorType, theCopy, false);
   }
 }
@@ -3533,7 +3541,7 @@ void SMESH_MeshEditor_i::MirrorObject(SMESH::SMESH_IDSource_ptr           theObj
                                       SMESH::SMESH_MeshEditor::MirrorType theMirrorType,
                                       CORBA::Boolean                      theCopy)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << this << ".MirrorObject( "
                   << theObject                     << ", "
                   << theAxis                       << ", "
@@ -3542,9 +3550,9 @@ void SMESH_MeshEditor_i::MirrorObject(SMESH::SMESH_IDSource_ptr           theObj
   }
   TIDSortedElemSet elements;
 
-  bool emptyIfIsMesh = myPreviewMode ? false : true;
+  bool emptyIfIsMesh = myIsPreviewMode ? false : true;
 
-  if (idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
+  if (idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
     mirror(elements, theAxis, theMirrorType, theCopy, false);
 }
 
@@ -3564,10 +3572,10 @@ SMESH_MeshEditor_i::MirrorMakeGroups(const SMESH::long_array&            theIDsO
   if ( theIDsOfElements.length() > 0 )
   {
     TIDSortedElemSet elements;
-    arrayToSet(theIDsOfElements, GetMeshDS(), elements);
+    arrayToSet(theIDsOfElements, getMeshDS(), elements);
     aGroups = mirror(elements, theMirror, theMirrorType, true, true);
   }
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".MirrorMakeGroups( "
                 << theIDsOfElements              << ", "
@@ -3591,10 +3599,10 @@ SMESH_MeshEditor_i::MirrorObjectMakeGroups(SMESH::SMESH_IDSource_ptr           t
 
   SMESH::ListOfGroups * aGroups = 0;
   TIDSortedElemSet elements;
-  if ( idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
+  if ( idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
     aGroups = mirror(elements, theMirror, theMirrorType, true, true);
 
-  if (!myPreviewMode)
+  if (!myIsPreviewMode)
   {
     DumpGroupsList(aPythonDump,aGroups);
     aPythonDump << this << ".MirrorObjectMakeGroups( "
@@ -3629,13 +3637,13 @@ SMESH_MeshEditor_i::MirrorMakeMesh(const SMESH::long_array&            theIDsOfE
     if (mesh_i && theIDsOfElements.length() > 0 )
     {
       TIDSortedElemSet elements;
-      arrayToSet(theIDsOfElements, GetMeshDS(), elements);
+      arrayToSet(theIDsOfElements, getMeshDS(), elements);
       mirror(elements, theMirror, theMirrorType,
              false, theCopyGroups, & mesh_i->GetImpl());
       mesh_i->CreateGroupServants();
     }
 
-    if (!myPreviewMode) {
+    if (!myIsPreviewMode) {
       pydump << mesh << " = " << this << ".MirrorMakeMesh( "
              << theIDsOfElements              << ", "
              << theMirror                     << ", "
@@ -3646,7 +3654,7 @@ SMESH_MeshEditor_i::MirrorMakeMesh(const SMESH::long_array&            theIDsOfE
   }
 
   //dump "GetGroups"
-  if (!myPreviewMode && mesh_i)
+  if (!myIsPreviewMode && mesh_i)
     mesh_i->GetGroups();
 
   return mesh._retn();
@@ -3675,13 +3683,13 @@ SMESH_MeshEditor_i::MirrorObjectMakeMesh(SMESH::SMESH_IDSource_ptr           the
     mesh_i = SMESH::DownCast<SMESH_Mesh_i*>( mesh );
     TIDSortedElemSet elements;
     if ( mesh_i &&
-         idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
+         idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
     {
       mirror(elements, theMirror, theMirrorType,
              false, theCopyGroups, & mesh_i->GetImpl());
       mesh_i->CreateGroupServants();
     }
-    if (!myPreviewMode) {
+    if (!myIsPreviewMode) {
       pydump << mesh << " = " << this << ".MirrorObjectMakeMesh( "
              << theObject                     << ", "
              << theMirror                     << ", "
@@ -3692,7 +3700,7 @@ SMESH_MeshEditor_i::MirrorObjectMakeMesh(SMESH::SMESH_IDSource_ptr           the
   }
 
   //dump "GetGroups"
-  if (!myPreviewMode && mesh_i)
+  if (!myIsPreviewMode && mesh_i)
     mesh_i->GetGroups();
 
   return mesh._retn();
@@ -3721,30 +3729,25 @@ SMESH_MeshEditor_i::translate(TIDSortedElemSet        & theElements,
 
   TIDSortedElemSet  copyElements;
   TIDSortedElemSet* workElements = &theElements;
-  TPreviewMesh      tmpMesh;
-  SMESH_Mesh*       mesh = myMesh;
 
-  if ( myPreviewMode )
+  if ( myIsPreviewMode )
   {
-    tmpMesh.Copy( theElements, copyElements);
+    TPreviewMesh * tmpMesh = getPreviewMesh();
+    tmpMesh->Copy( theElements, copyElements);
     if ( !theCopy && !theTargetMesh )
     {
       TIDSortedElemSet elemsAround, elemsAroundCopy;
-      getElementsAround( theElements, GetMeshDS(), elemsAround );
-      tmpMesh.Copy( elemsAround, elemsAroundCopy);
+      getElementsAround( theElements, getMeshDS(), elemsAround );
+      tmpMesh->Copy( elemsAround, elemsAroundCopy);
     }
-    mesh = &tmpMesh;
     workElements = & copyElements;
     theMakeGroups = false;
   }
 
   ::SMESH_MeshEditor::PGroupIDs groupIds =
-      myEditor.Transform (*workElements, aTrsf, theCopy, theMakeGroups, theTargetMesh);
-
-  if(theCopy || myPreviewMode)
-    storeResult(myEditor);
+      getEditor().Transform (*workElements, aTrsf, theCopy, theMakeGroups, theTargetMesh);
 
-  if ( !myPreviewMode )
+  if ( theCopy && !myIsPreviewMode )
   {
     if ( theTargetMesh )
     {
@@ -3769,7 +3772,7 @@ void SMESH_MeshEditor_i::Translate(const SMESH::long_array & theIDsOfElements,
                                    const SMESH::DirStruct &  theVector,
                                    CORBA::Boolean            theCopy)
 {
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     TPythonDump() << this << ".Translate( "
                   << theIDsOfElements << ", "
                   << theVector        << ", "
@@ -3777,7 +3780,7 @@ void SMESH_MeshEditor_i::Translate(const SMESH::long_array & theIDsOfElements,
   }
   if (theIDsOfElements.length()) {
     TIDSortedElemSet elements;
-    arrayToSet(theIDsOfElements, GetMeshDS(), elements);
+    arrayToSet(theIDsOfElements, getMeshDS(), elements);
     translate(elements, theVector, theCopy, false);
   }
 }
@@ -3791,7 +3794,7 @@ void SMESH_MeshEditor_i::TranslateObject(SMESH::SMESH_IDSource_ptr theObject,
                                          const SMESH::DirStruct &  theVector,
                                          CORBA::Boolean            theCopy)
 {
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     TPythonDump() << this << ".TranslateObject( "
                   << theObject << ", "
                   << theVector << ", "
@@ -3799,9 +3802,9 @@ void SMESH_MeshEditor_i::TranslateObject(SMESH::SMESH_IDSource_ptr theObject,
   }
   TIDSortedElemSet elements;
 
-  bool emptyIfIsMesh = myPreviewMode ? false : true;
+  bool emptyIfIsMesh = myIsPreviewMode ? false : true;
   
-  if (idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
+  if (idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
     translate(elements, theVector, theCopy, false);
 }
 
@@ -3819,10 +3822,10 @@ SMESH_MeshEditor_i::TranslateMakeGroups(const SMESH::long_array& theIDsOfElement
   SMESH::ListOfGroups * aGroups = 0;
   if (theIDsOfElements.length()) {
     TIDSortedElemSet elements;
-    arrayToSet(theIDsOfElements, GetMeshDS(), elements);
+    arrayToSet(theIDsOfElements, getMeshDS(), elements);
     aGroups = translate(elements,theVector,true,true);
   }
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".TranslateMakeGroups( "
                 << theIDsOfElements << ", "
@@ -3844,10 +3847,10 @@ SMESH_MeshEditor_i::TranslateObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObjec
 
   SMESH::ListOfGroups * aGroups = 0;
   TIDSortedElemSet elements;
-  if (idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
+  if (idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
     aGroups = translate(elements, theVector, true, true);
 
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".TranslateObjectMakeGroups( "
                 << theObject << ", "
@@ -3881,12 +3884,12 @@ SMESH_MeshEditor_i::TranslateMakeMesh(const SMESH::long_array& theIDsOfElements,
     if ( mesh_i && theIDsOfElements.length() )
     {
       TIDSortedElemSet elements;
-      arrayToSet(theIDsOfElements, GetMeshDS(), elements);
+      arrayToSet(theIDsOfElements, getMeshDS(), elements);
       translate(elements, theVector, false, theCopyGroups, & mesh_i->GetImpl());
       mesh_i->CreateGroupServants();
     }
 
-    if ( !myPreviewMode ) {
+    if ( !myIsPreviewMode ) {
       pydump << mesh << " = " << this << ".TranslateMakeMesh( "
              << theIDsOfElements << ", "
              << theVector        << ", "
@@ -3896,7 +3899,7 @@ SMESH_MeshEditor_i::TranslateMakeMesh(const SMESH::long_array& theIDsOfElements,
   }
 
   //dump "GetGroups"
-  if (!myPreviewMode && mesh_i)
+  if (!myIsPreviewMode && mesh_i)
     mesh_i->GetGroups();
 
   return mesh._retn();
@@ -3924,12 +3927,12 @@ SMESH_MeshEditor_i::TranslateObjectMakeMesh(SMESH::SMESH_IDSource_ptr theObject,
 
     TIDSortedElemSet elements;
     if ( mesh_i &&
-      idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
+      idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
     {
       translate(elements, theVector,false, theCopyGroups, & mesh_i->GetImpl());
       mesh_i->CreateGroupServants();
     }
-    if ( !myPreviewMode ) {
+    if ( !myIsPreviewMode ) {
       pydump << mesh << " = " << this << ".TranslateObjectMakeMesh( "
              << theObject     << ", "
              << theVector     << ", "
@@ -3939,7 +3942,7 @@ SMESH_MeshEditor_i::TranslateObjectMakeMesh(SMESH::SMESH_IDSource_ptr theObject,
   }
 
   // dump "GetGroups"
-  if (!myPreviewMode && mesh_i)
+  if (!myIsPreviewMode && mesh_i)
     mesh_i->GetGroups();
 
   return mesh._retn();
@@ -3971,29 +3974,23 @@ SMESH_MeshEditor_i::rotate(TIDSortedElemSet &        theElements,
 
   TIDSortedElemSet  copyElements;
   TIDSortedElemSet* workElements = &theElements;
-  TPreviewMesh      tmpMesh;
-  SMESH_Mesh*       mesh = myMesh;
-
-  if ( myPreviewMode ) {
-    tmpMesh.Copy( theElements, copyElements );
+  if ( myIsPreviewMode ) {
+    TPreviewMesh * tmpMesh = getPreviewMesh();
+    tmpMesh->Copy( theElements, copyElements );
     if ( !theCopy && !theTargetMesh )
     {
       TIDSortedElemSet elemsAround, elemsAroundCopy;
-      getElementsAround( theElements, GetMeshDS(), elemsAround );
-      tmpMesh.Copy( elemsAround, elemsAroundCopy);
+      getElementsAround( theElements, getMeshDS(), elemsAround );
+      tmpMesh->Copy( elemsAround, elemsAroundCopy);
     }
-    mesh = &tmpMesh;
     workElements = &copyElements;
     theMakeGroups = false;
   }
 
   ::SMESH_MeshEditor::PGroupIDs groupIds =
-      myEditor.Transform (*workElements, aTrsf, theCopy, theMakeGroups, theTargetMesh);
-
-  if(theCopy || myPreviewMode)
-    storeResult(myEditor);
+      getEditor().Transform (*workElements, aTrsf, theCopy, theMakeGroups, theTargetMesh);
 
-  if ( !myPreviewMode )
+  if ( theCopy && !myIsPreviewMode)
   {
     if ( theTargetMesh )
     {
@@ -4019,7 +4016,7 @@ void SMESH_MeshEditor_i::Rotate(const SMESH::long_array & theIDsOfElements,
                                 CORBA::Double             theAngle,
                                 CORBA::Boolean            theCopy)
 {
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     TPythonDump() << this << ".Rotate( "
                   << theIDsOfElements << ", "
                   << theAxis          << ", "
@@ -4029,7 +4026,7 @@ void SMESH_MeshEditor_i::Rotate(const SMESH::long_array & theIDsOfElements,
   if (theIDsOfElements.length() > 0)
   {
     TIDSortedElemSet elements;
-    arrayToSet(theIDsOfElements, GetMeshDS(), elements);
+    arrayToSet(theIDsOfElements, getMeshDS(), elements);
     rotate(elements,theAxis,theAngle,theCopy,false);
   }
 }
@@ -4044,7 +4041,7 @@ void SMESH_MeshEditor_i::RotateObject(SMESH::SMESH_IDSource_ptr theObject,
                                       CORBA::Double             theAngle,
                                       CORBA::Boolean            theCopy)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << this << ".RotateObject( "
                   << theObject        << ", "
                   << theAxis          << ", "
@@ -4052,8 +4049,8 @@ void SMESH_MeshEditor_i::RotateObject(SMESH::SMESH_IDSource_ptr theObject,
                   << theCopy          << " )";
   }
   TIDSortedElemSet elements;
-  bool emptyIfIsMesh = myPreviewMode ? false : true;
-  if (idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
+  bool emptyIfIsMesh = myIsPreviewMode ? false : true;
+  if (idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
     rotate(elements,theAxis,theAngle,theCopy,false);
 }
 
@@ -4073,10 +4070,10 @@ SMESH_MeshEditor_i::RotateMakeGroups(const SMESH::long_array& theIDsOfElements,
   if (theIDsOfElements.length() > 0)
   {
     TIDSortedElemSet elements;
-    arrayToSet(theIDsOfElements, GetMeshDS(), elements);
+    arrayToSet(theIDsOfElements, getMeshDS(), elements);
     aGroups = rotate(elements,theAxis,theAngle,true,true);
   }
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".RotateMakeGroups( "
                 << theIDsOfElements << ", "
@@ -4100,10 +4097,10 @@ SMESH_MeshEditor_i::RotateObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject,
 
   SMESH::ListOfGroups * aGroups = 0;
   TIDSortedElemSet elements;
-  if (idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
+  if (idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
     aGroups = rotate(elements, theAxis, theAngle, true, true);
 
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".RotateObjectMakeGroups( "
                 << theObject        << ", "
@@ -4139,12 +4136,12 @@ SMESH_MeshEditor_i::RotateMakeMesh(const SMESH::long_array& theIDsOfElements,
     if ( mesh_i && theIDsOfElements.length() > 0 )
     {
       TIDSortedElemSet elements;
-      arrayToSet(theIDsOfElements, GetMeshDS(), elements);
+      arrayToSet(theIDsOfElements, getMeshDS(), elements);
       rotate(elements, theAxis, theAngleInRadians,
              false, theCopyGroups, & mesh_i->GetImpl());
       mesh_i->CreateGroupServants();
     }
-    if ( !myPreviewMode ) {
+    if ( !myIsPreviewMode ) {
       pydump << mesh << " = " << this << ".RotateMakeMesh( "
              << theIDsOfElements          << ", "
              << theAxis                   << ", "
@@ -4155,7 +4152,7 @@ SMESH_MeshEditor_i::RotateMakeMesh(const SMESH::long_array& theIDsOfElements,
   }
 
   // dump "GetGroups"
-  if (!myPreviewMode && mesh_i && theIDsOfElements.length() > 0 )
+  if (!myIsPreviewMode && mesh_i && theIDsOfElements.length() > 0 )
     mesh_i->GetGroups();
 
   return mesh._retn();
@@ -4185,13 +4182,13 @@ SMESH_MeshEditor_i::RotateObjectMakeMesh(SMESH::SMESH_IDSource_ptr theObject,
 
     TIDSortedElemSet elements;
     if (mesh_i &&
-        idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
+        idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
     {
       rotate(elements, theAxis, theAngleInRadians,
              false, theCopyGroups, & mesh_i->GetImpl());
       mesh_i->CreateGroupServants();
     }
-    if ( !myPreviewMode ) {
+    if ( !myIsPreviewMode ) {
       pydump << mesh << " = " << this << ".RotateObjectMakeMesh( "
              << theObject                 << ", "
              << theAxis                   << ", "
@@ -4202,7 +4199,7 @@ SMESH_MeshEditor_i::RotateObjectMakeMesh(SMESH::SMESH_IDSource_ptr theObject,
   }
 
   // dump "GetGroups"
-  if (!myPreviewMode && mesh_i)
+  if (!myIsPreviewMode && mesh_i)
     mesh_i->GetGroups();
 
   return mesh._retn();
@@ -4231,8 +4228,8 @@ SMESH_MeshEditor_i::scale(SMESH::SMESH_IDSource_ptr  theObject,
     theCopy = false;
 
   TIDSortedElemSet elements;
-  bool emptyIfIsMesh = myPreviewMode ? false : true;
-  if ( !idSourceToSet(theObject, GetMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
+  bool emptyIfIsMesh = myIsPreviewMode ? false : true;
+  if ( !idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
     return 0;
 
   double S[3] = {
@@ -4247,31 +4244,25 @@ SMESH_MeshEditor_i::scale(SMESH::SMESH_IDSource_ptr  theObject,
                    0,    0,    S[2], thePoint.z * (1-S[2]),   tol, tol);
 
   TIDSortedElemSet  copyElements;
-  TPreviewMesh      tmpMesh;
   TIDSortedElemSet* workElements = &elements;
-  SMESH_Mesh*       mesh = myMesh;
-  
-  if ( myPreviewMode )
+  if ( myIsPreviewMode )
   {
-    tmpMesh.Copy( elements, copyElements);
+    TPreviewMesh * tmpMesh = getPreviewMesh();
+    tmpMesh->Copy( elements, copyElements);
     if ( !theCopy && !theTargetMesh )
     {
       TIDSortedElemSet elemsAround, elemsAroundCopy;
-      getElementsAround( elements, GetMeshDS(), elemsAround );
-      tmpMesh.Copy( elemsAround, elemsAroundCopy);
+      getElementsAround( elements, getMeshDS(), elemsAround );
+      tmpMesh->Copy( elemsAround, elemsAroundCopy);
     }
-    mesh = &tmpMesh;
     workElements = & copyElements;
     theMakeGroups = false;
   }
 
   ::SMESH_MeshEditor::PGroupIDs groupIds =
-      myEditor.Transform (*workElements, aTrsf, theCopy, theMakeGroups, theTargetMesh);
-
-  if(theCopy || myPreviewMode )
-    storeResult(myEditor);
+      getEditor().Transform (*workElements, aTrsf, theCopy, theMakeGroups, theTargetMesh);
 
-  if ( !myPreviewMode )
+  if ( theCopy && !myIsPreviewMode )
   {
     if ( theTargetMesh )
     {
@@ -4297,7 +4288,7 @@ void SMESH_MeshEditor_i::Scale(SMESH::SMESH_IDSource_ptr  theObject,
                                const SMESH::double_array& theScaleFact,
                                CORBA::Boolean             theCopy)
 {
-  if ( !myPreviewMode ) {
+  if ( !myIsPreviewMode ) {
     TPythonDump() << this << ".Scale( "
                   << theObject            << ", "
                   << thePoint             << ", "
@@ -4321,7 +4312,7 @@ SMESH_MeshEditor_i::ScaleMakeGroups(SMESH::SMESH_IDSource_ptr  theObject,
   TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
 
   SMESH::ListOfGroups * aGroups = scale(theObject, thePoint, theScaleFact, true, true);
-  if (!myPreviewMode) {
+  if (!myIsPreviewMode) {
     DumpGroupsList(aPythonDump, aGroups);
     aPythonDump << this << ".Scale("
                 << theObject            << ","
@@ -4358,7 +4349,7 @@ SMESH_MeshEditor_i::ScaleMakeMesh(SMESH::SMESH_IDSource_ptr  theObject,
       scale(theObject, thePoint, theScaleFact,false, theCopyGroups, & mesh_i->GetImpl());
       mesh_i->CreateGroupServants();
     }
-    if ( !myPreviewMode )
+    if ( !myIsPreviewMode )
       pydump << mesh << " = " << this << ".ScaleMakeMesh( "
              << theObject            << ", "
              << thePoint             << ", "
@@ -4368,7 +4359,7 @@ SMESH_MeshEditor_i::ScaleMakeMesh(SMESH::SMESH_IDSource_ptr  theObject,
   }
 
   // dump "GetGroups"
-  if (!myPreviewMode && mesh_i)
+  if (!myIsPreviewMode && mesh_i)
     mesh_i->GetGroups();
 
   return mesh._retn();
@@ -4387,7 +4378,7 @@ void SMESH_MeshEditor_i::FindCoincidentNodes (CORBA::Double                  Tol
 
   ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes;
   TIDSortedNodeSet nodes; // no input nodes
-  myEditor.FindCoincidentNodes( nodes, Tolerance, aListOfListOfNodes );
+  getEditor().FindCoincidentNodes( nodes, Tolerance, aListOfListOfNodes );
 
   GroupsOfNodes = new SMESH::array_of_long_array;
   GroupsOfNodes->length( aListOfListOfNodes.size() );
@@ -4415,11 +4406,11 @@ void SMESH_MeshEditor_i::FindCoincidentNodesOnPart(SMESH::SMESH_IDSource_ptr
   initData();
 
   TIDSortedNodeSet nodes;
-  idSourceToNodeSet( theObject, GetMeshDS(), nodes );
+  idSourceToNodeSet( theObject, getMeshDS(), nodes );
 
   ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes;
   if(!nodes.empty())
-    myEditor.FindCoincidentNodes( nodes, Tolerance, aListOfListOfNodes );
+    getEditor().FindCoincidentNodes( nodes, Tolerance, aListOfListOfNodes );
 
   GroupsOfNodes = new SMESH::array_of_long_array;
   GroupsOfNodes->length( aListOfListOfNodes.size() );
@@ -4454,19 +4445,19 @@ FindCoincidentNodesOnPartBut(SMESH::SMESH_IDSource_ptr      theObject,
   initData();
 
   TIDSortedNodeSet nodes;
-  idSourceToNodeSet( theObject, GetMeshDS(), nodes );
+  idSourceToNodeSet( theObject, getMeshDS(), nodes );
 
   for ( int i = 0; i < theExceptSubMeshOrGroups.length(); ++i )
   {
     TIDSortedNodeSet exceptNodes;
-    idSourceToNodeSet( theExceptSubMeshOrGroups[i], GetMeshDS(), exceptNodes );
+    idSourceToNodeSet( theExceptSubMeshOrGroups[i], getMeshDS(), exceptNodes );
     TIDSortedNodeSet::iterator avoidNode = exceptNodes.begin();
     for ( ; avoidNode != exceptNodes.end(); ++avoidNode)
       nodes.erase( *avoidNode );
   }
   ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes;
   if(!nodes.empty())
-    myEditor.FindCoincidentNodes( nodes, theTolerance, aListOfListOfNodes );
+    getEditor().FindCoincidentNodes( nodes, theTolerance, aListOfListOfNodes );
 
   theGroupsOfNodes = new SMESH::array_of_long_array;
   theGroupsOfNodes->length( aListOfListOfNodes.size() );
@@ -4495,7 +4486,7 @@ void SMESH_MeshEditor_i::MergeNodes (const SMESH::array_of_long_array& GroupsOfN
 {
   initData();
 
-  SMESHDS_Mesh* aMesh = GetMeshDS();
+  SMESHDS_Mesh* aMesh = getMeshDS();
 
   TPythonDump aTPythonDump;
   aTPythonDump << this << ".MergeNodes([";
@@ -4518,7 +4509,7 @@ void SMESH_MeshEditor_i::MergeNodes (const SMESH::array_of_long_array& GroupsOfN
     if ( i > 0 ) aTPythonDump << ", ";
     aTPythonDump << aNodeGroup;
   }
-  myEditor.MergeNodes( aListOfListOfNodes );
+  getEditor().MergeNodes( aListOfListOfNodes );
 
   aTPythonDump <<  "])";
   myMesh->GetMeshDS()->Modified();
@@ -4538,10 +4529,10 @@ void SMESH_MeshEditor_i::FindEqualElements(SMESH::SMESH_IDSource_ptr      theObj
   if ( !(!group->_is_nil() && group->GetType() == SMESH::NODE) )
   {
     TIDSortedElemSet elems;
-    idSourceToSet( theObject, GetMeshDS(), elems, SMDSAbs_All, /*emptyIfIsMesh=*/true);
+    idSourceToSet( theObject, getMeshDS(), elems, SMDSAbs_All, /*emptyIfIsMesh=*/true);
 
     ::SMESH_MeshEditor::TListOfListOfElementsID aListOfListOfElementsID;
-    myEditor.FindEqualElements( elems, aListOfListOfElementsID );
+    getEditor().FindEqualElements( elems, aListOfListOfElementsID );
 
     GroupsOfElementsID = new SMESH::array_of_long_array;
     GroupsOfElementsID->length( aListOfListOfElementsID.size() );
@@ -4591,7 +4582,7 @@ void SMESH_MeshEditor_i::MergeElements(const SMESH::array_of_long_array& GroupsO
     aTPythonDump << anElemsIDGroup;
   }
 
-  myEditor.MergeElements(aListOfListOfElementsID);
+  getEditor().MergeElements(aListOfListOfElementsID);
   myMesh->GetMeshDS()->Modified();
   myMesh->SetIsModified( true );
 
@@ -4607,7 +4598,7 @@ void SMESH_MeshEditor_i::MergeEqualElements()
 {
   initData();
 
-  myEditor.MergeEqualElements();
+  getEditor().MergeEqualElements();
 
   myMesh->GetMeshDS()->Modified();
 
@@ -4627,17 +4618,17 @@ CORBA::Boolean SMESH_MeshEditor_i::MoveNode(CORBA::Long   NodeID,
 {
   initData(/*deleteSearchers=*/false);
 
-  const SMDS_MeshNode * node = GetMeshDS()->FindNode( NodeID );
+  const SMDS_MeshNode * node = getMeshDS()->FindNode( NodeID );
   if ( !node )
     return false;
 
   if ( theNodeSearcher )
     theSearchersDeleter.Set( myMesh ); // remove theNodeSearcher if mesh is other
 
-  if ( myPreviewMode ) // make preview data
+  if ( myIsPreviewMode ) // make preview data
   {
     // in a preview mesh, make edges linked to a node
-    TPreviewMesh tmpMesh;
+    TPreviewMesh& tmpMesh = *getPreviewMesh();
     TIDSortedElemSet linkedNodes;
     ::SMESH_MeshEditor::GetLinkedNodes( node, linkedNodes );
     TIDSortedElemSet::iterator nIt = linkedNodes.begin();
@@ -4651,14 +4642,13 @@ CORBA::Boolean SMESH_MeshEditor_i::MoveNode(CORBA::Long   NodeID,
     if ( nodeCpy1 )
       tmpMesh.GetMeshDS()->MoveNode(nodeCpy1, x, y, z);
     // fill preview data
-    storeResult( myEditor );
   }
   else if ( theNodeSearcher ) // move node and update theNodeSearcher data accordingly
     theNodeSearcher->MoveNode(node, gp_Pnt( x,y,z ));
   else
-    GetMeshDS()->MoveNode(node, x, y, z);
+    getMeshDS()->MoveNode(node, x, y, z);
 
-  if ( !myPreviewMode )
+  if ( !myIsPreviewMode )
   {
     // Update Python script
     TPythonDump() << "isDone = " << this << ".MoveNode( "
@@ -4713,7 +4703,7 @@ CORBA::Long SMESH_MeshEditor_i::MoveClosestNodeToPoint(CORBA::Double x,
   theSearchersDeleter.Set( myMesh ); // remove theNodeSearcher if mesh is other
 
   int nodeID = theNodeID;
-  const SMDS_MeshNode* node = GetMeshDS()->FindNode( nodeID );
+  const SMDS_MeshNode* node = getMeshDS()->FindNode( nodeID );
   if ( !node ) // preview moving node
   {
     if ( !theNodeSearcher ) {
@@ -4724,10 +4714,10 @@ CORBA::Long SMESH_MeshEditor_i::MoveClosestNodeToPoint(CORBA::Double x,
   }
   if ( node ) {
     nodeID = node->GetID();
-    if ( myPreviewMode ) // make preview data
+    if ( myIsPreviewMode ) // make preview data
     {
       // in a preview mesh, make edges linked to a node
-      TPreviewMesh tmpMesh;
+      TPreviewMesh tmpMesh = *getPreviewMesh();
       TIDSortedElemSet linkedNodes;
       ::SMESH_MeshEditor::GetLinkedNodes( node, linkedNodes );
       TIDSortedElemSet::iterator nIt = linkedNodes.begin();
@@ -4741,7 +4731,6 @@ CORBA::Long SMESH_MeshEditor_i::MoveClosestNodeToPoint(CORBA::Double x,
       if ( node )
         tmpMesh.GetMeshDS()->MoveNode(node, x, y, z);
       // fill preview data
-      storeResult( myEditor );
     }
     else if ( theNodeSearcher ) // move node and update theNodeSearcher data accordingly
     {
@@ -4749,11 +4738,11 @@ CORBA::Long SMESH_MeshEditor_i::MoveClosestNodeToPoint(CORBA::Double x,
     }
     else
     {
-      GetMeshDS()->MoveNode(node, x, y, z);
+      getMeshDS()->MoveNode(node, x, y, z);
     }
   }
 
-  if ( !myPreviewMode )
+  if ( !myIsPreviewMode )
   {
     TPythonDump() << "nodeID = " << this
                   << ".MoveClosestNodeToPoint( "<< x << ", " << y << ", " << z
@@ -4793,7 +4782,7 @@ SMESH::long_array* SMESH_MeshEditor_i::FindElementsByPoint(CORBA::Double      x,
   for ( int i = 0; i < foundElems.size(); ++i )
     res[i] = foundElems[i]->GetID();
 
-  if ( !myPreviewMode ) // call from tui
+  if ( !myIsPreviewMode ) // call from tui
     TPythonDump() << "res = " << this << ".FindElementsByPoint( "
                   << x << ", "
                   << y << ", "
@@ -4856,7 +4845,7 @@ SMESH_MeshEditor_i::FindAmongElementsByPoint(SMESH::SMESH_IDSource_ptr elementID
   for ( int i = 0; i < foundElems.size(); ++i )
     res[i] = foundElems[i]->GetID();
 
-  if ( !myPreviewMode ) // call from tui
+  if ( !myIsPreviewMode ) // call from tui
     TPythonDump() << "res = " << this << ".FindAmongElementsByPoint( "
                   << elementIDs << ", "
                   << x << ", "
@@ -4925,7 +4914,7 @@ SMESH_MeshEditor_i::SewFreeBorders(CORBA::Long FirstNodeID1,
 {
   initData();
 
-  SMESHDS_Mesh* aMesh = GetMeshDS();
+  SMESHDS_Mesh* aMesh = getMeshDS();
 
   const SMDS_MeshNode* aBorderFirstNode  = aMesh->FindNode( FirstNodeID1  );
   const SMDS_MeshNode* aBorderSecondNode = aMesh->FindNode( SecondNodeID1 );
@@ -4954,7 +4943,7 @@ SMESH_MeshEditor_i::SewFreeBorders(CORBA::Long FirstNodeID1,
                 << CreatePolyedrs<< " )";
 
   SMESH::SMESH_MeshEditor::Sew_Error error =
-    convError( myEditor.SewFreeBorder (aBorderFirstNode,
+    convError( getEditor().SewFreeBorder (aBorderFirstNode,
                                        aBorderSecondNode,
                                        aBorderLastNode,
                                        aSide2FirstNode,
@@ -4964,7 +4953,6 @@ SMESH_MeshEditor_i::SewFreeBorders(CORBA::Long FirstNodeID1,
                                        CreatePolygons,
                                        CreatePolyedrs) );
 
-  storeResult(myEditor);
 
   myMesh->GetMeshDS()->Modified();
   myMesh->SetIsModified( true );
@@ -4987,7 +4975,7 @@ SMESH_MeshEditor_i::SewConformFreeBorders(CORBA::Long FirstNodeID1,
 {
   initData();
 
-  SMESHDS_Mesh* aMesh = GetMeshDS();
+  SMESHDS_Mesh* aMesh = getMeshDS();
 
   const SMDS_MeshNode* aBorderFirstNode  = aMesh->FindNode( FirstNodeID1  );
   const SMDS_MeshNode* aBorderSecondNode = aMesh->FindNode( SecondNodeID1 );
@@ -5012,7 +5000,7 @@ SMESH_MeshEditor_i::SewConformFreeBorders(CORBA::Long FirstNodeID1,
                 << SecondNodeID2 << " )";
 
   SMESH::SMESH_MeshEditor::Sew_Error error =
-    convError( myEditor.SewFreeBorder (aBorderFirstNode,
+    convError( getEditor().SewFreeBorder (aBorderFirstNode,
                                        aBorderSecondNode,
                                        aBorderLastNode,
                                        aSide2FirstNode,
@@ -5021,7 +5009,6 @@ SMESH_MeshEditor_i::SewConformFreeBorders(CORBA::Long FirstNodeID1,
                                        true,
                                        false, false) );
 
-  storeResult(myEditor);
 
   myMesh->GetMeshDS()->Modified();
   myMesh->SetIsModified( true );
@@ -5046,7 +5033,7 @@ SMESH_MeshEditor_i::SewBorderToSide(CORBA::Long FirstNodeIDOnFreeBorder,
 {
   initData();
 
-  SMESHDS_Mesh* aMesh = GetMeshDS();
+  SMESHDS_Mesh* aMesh = getMeshDS();
 
   const SMDS_MeshNode* aBorderFirstNode  = aMesh->FindNode( FirstNodeIDOnFreeBorder  );
   const SMDS_MeshNode* aBorderSecondNode = aMesh->FindNode( SecondNodeIDOnFreeBorder );
@@ -5073,7 +5060,7 @@ SMESH_MeshEditor_i::SewBorderToSide(CORBA::Long FirstNodeIDOnFreeBorder,
                 << CreatePolyedrs           << ") ";
 
   SMESH::SMESH_MeshEditor::Sew_Error error =
-    convError( myEditor.SewFreeBorder (aBorderFirstNode,
+    convError( getEditor().SewFreeBorder (aBorderFirstNode,
                                        aBorderSecondNode,
                                        aBorderLastNode,
                                        aSide2FirstNode,
@@ -5083,7 +5070,6 @@ SMESH_MeshEditor_i::SewBorderToSide(CORBA::Long FirstNodeIDOnFreeBorder,
                                        CreatePolygons,
                                        CreatePolyedrs) );
 
-  storeResult(myEditor);
 
   myMesh->GetMeshDS()->Modified();
   myMesh->SetIsModified( true );
@@ -5107,7 +5093,7 @@ SMESH_MeshEditor_i::SewSideElements(const SMESH::long_array& IDsOfSide1Elements,
 {
   initData();
 
-  SMESHDS_Mesh* aMesh = GetMeshDS();
+  SMESHDS_Mesh* aMesh = getMeshDS();
 
   const SMDS_MeshNode* aFirstNode1ToMerge  = aMesh->FindNode( NodeID1OfSide1ToMerge );
   const SMDS_MeshNode* aFirstNode2ToMerge  = aMesh->FindNode( NodeID1OfSide2ToMerge );
@@ -5134,13 +5120,12 @@ SMESH_MeshEditor_i::SewSideElements(const SMESH::long_array& IDsOfSide1Elements,
                 << NodeID2OfSide2ToMerge << ")";
 
   SMESH::SMESH_MeshEditor::Sew_Error error =
-    convError( myEditor.SewSideElements (aSide1Elems, aSide2Elems,
+    convError( getEditor().SewSideElements (aSide1Elems, aSide2Elems,
                                          aFirstNode1ToMerge,
                                          aFirstNode2ToMerge,
                                          aSecondNode1ToMerge,
                                          aSecondNode2ToMerge));
 
-  storeResult(myEditor);
 
   myMesh->GetMeshDS()->Modified();
   myMesh->SetIsModified( true );
@@ -5162,7 +5147,7 @@ CORBA::Boolean SMESH_MeshEditor_i::ChangeElemNodes(CORBA::Long ide,
 {
   initData();
 
-  const SMDS_MeshElement* elem = GetMeshDS()->FindElement(ide);
+  const SMDS_MeshElement* elem = getMeshDS()->FindElement(ide);
   if(!elem) return false;
 
   int nbn = newIDs.length();
@@ -5170,7 +5155,7 @@ CORBA::Boolean SMESH_MeshEditor_i::ChangeElemNodes(CORBA::Long ide,
   vector<const SMDS_MeshNode*> aNodes(nbn);
   int nbn1=-1;
   for(; i<nbn; i++) {
-    const SMDS_MeshNode* aNode = GetMeshDS()->FindNode(newIDs[i]);
+    const SMDS_MeshNode* aNode = getMeshDS()->FindNode(newIDs[i]);
     if(aNode) {
       nbn1++;
       aNodes[nbn1] = aNode;
@@ -5180,7 +5165,7 @@ CORBA::Boolean SMESH_MeshEditor_i::ChangeElemNodes(CORBA::Long ide,
                 << ide << ", " << newIDs << " )";
 
   MESSAGE("ChangeElementNodes");
-  bool res = GetMeshDS()->ChangeElementNodes( elem, & aNodes[0], nbn1+1 );
+  bool res = getMeshDS()->ChangeElementNodes( elem, & aNodes[0], nbn1+1 );
 
   myMesh->GetMeshDS()->Modified();
   if ( res )
@@ -5196,7 +5181,7 @@ CORBA::Boolean SMESH_MeshEditor_i::ChangeElemNodes(CORBA::Long ide,
 
 void SMESH_MeshEditor_i::ConvertToQuadratic(CORBA::Boolean theForce3d)
 {
-  myEditor.ConvertToQuadratic(theForce3d);
+  getEditor().ConvertToQuadratic(theForce3d);
   TPythonDump() << this << ".ConvertToQuadratic( " << theForce3d << " )";
   myMesh->GetMeshDS()->Modified();
   myMesh->SetIsModified( true );
@@ -5209,7 +5194,7 @@ void SMESH_MeshEditor_i::ConvertToQuadratic(CORBA::Boolean theForce3d)
 
 CORBA::Boolean SMESH_MeshEditor_i::ConvertFromQuadratic()
 {
-  CORBA::Boolean isDone = myEditor.ConvertFromQuadratic();
+  CORBA::Boolean isDone = getEditor().ConvertFromQuadratic();
   TPythonDump() << this << ".ConvertFromQuadratic()";
   myMesh->GetMeshDS()->Modified();
   if ( isDone )
@@ -5229,7 +5214,7 @@ void SMESH_MeshEditor_i::ConvertToQuadraticObject(CORBA::Boolean            theF
   Unexpect aCatch(SALOME_SalomeException);
   TPythonDump pyDump;
   TIDSortedElemSet elems;
-  if ( idSourceToSet( theObject, GetMeshDS(), elems, SMDSAbs_All, /*emptyIfIsMesh=*/true ))
+  if ( idSourceToSet( theObject, getMeshDS(), elems, SMDSAbs_All, /*emptyIfIsMesh=*/true ))
   {
     if ( elems.empty() )
     {
@@ -5241,7 +5226,7 @@ void SMESH_MeshEditor_i::ConvertToQuadraticObject(CORBA::Boolean            theF
     }
     else
     {
-      myEditor.ConvertToQuadratic(theForce3d, elems);
+      getEditor().ConvertToQuadratic(theForce3d, elems);
     }
   }
   myMesh->GetMeshDS()->Modified();
@@ -5262,7 +5247,7 @@ void SMESH_MeshEditor_i::ConvertFromQuadraticObject(SMESH::SMESH_IDSource_ptr th
   Unexpect aCatch(SALOME_SalomeException);
   TPythonDump pyDump;
   TIDSortedElemSet elems;
-  if ( idSourceToSet( theObject, GetMeshDS(), elems, SMDSAbs_All, /*emptyIfIsMesh=*/true ))
+  if ( idSourceToSet( theObject, getMeshDS(), elems, SMDSAbs_All, /*emptyIfIsMesh=*/true ))
   {
     if ( elems.empty() )
     {
@@ -5274,7 +5259,7 @@ void SMESH_MeshEditor_i::ConvertFromQuadraticObject(SMESH::SMESH_IDSource_ptr th
     }
     else
     {
-      myEditor.ConvertFromQuadratic(elems);
+      getEditor().ConvertFromQuadratic(elems);
     }
   }
   myMesh->GetMeshDS()->Modified();
@@ -5371,10 +5356,9 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodes( const SMESH::long_array& theNode
   for ( i = 0, n = theModifiedElems.length(); i < n; i++ )
     aListOfElems.push_back( theModifiedElems[ i ] );
 
-  bool aResult = myEditor.DoubleNodes( aListOfNodes, aListOfElems );
+  bool aResult = getEditor().DoubleNodes( aListOfNodes, aListOfElems );
 
   myMesh->GetMeshDS()->Modified();
-  storeResult( myEditor) ;
   if ( aResult )
     myMesh->SetIsModified( true );
 
@@ -5538,9 +5522,8 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroups(const SMESH::ListOfGroups& t
     }
   }
 
-  bool aResult = myEditor.DoubleNodes( aNodes, anElems );
+  bool aResult = getEditor().DoubleNodes( aNodes, anElems );
 
-  storeResult( myEditor) ;
 
   myMesh->GetMeshDS()->Modified();
   if ( aResult )
@@ -5614,15 +5597,14 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElem( const SMESH::long_array& theE
   initData();
 
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
   TIDSortedElemSet anElems, aNodes, anAffected;
   arrayToSet(theElems, aMeshDS, anElems, SMDSAbs_All);
   arrayToSet(theNodesNot, aMeshDS, aNodes, SMDSAbs_Node);
   arrayToSet(theAffectedElems, aMeshDS, anAffected, SMDSAbs_All);
 
-  bool aResult = myEditor.DoubleNodes( anElems, aNodes, anAffected );
+  bool aResult = getEditor().DoubleNodes( anElems, aNodes, anAffected );
 
-  storeResult( myEditor) ;
 
   myMesh->GetMeshDS()->Modified();
   if ( aResult )
@@ -5656,15 +5638,14 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemInRegion ( const SMESH::long_ar
   initData();
 
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
   TIDSortedElemSet anElems, aNodes;
   arrayToSet(theElems, aMeshDS, anElems, SMDSAbs_All);
   arrayToSet(theNodesNot, aMeshDS, aNodes, SMDSAbs_Node);
 
   TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( theShape );
-  bool aResult = myEditor.DoubleNodesInRegion( anElems, aNodes, aShape );
+  bool aResult = getEditor().DoubleNodesInRegion( anElems, aNodes, aShape );
 
-  storeResult( myEditor) ;
 
   myMesh->GetMeshDS()->Modified();
   if ( aResult )
@@ -5698,15 +5679,14 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemGroup(SMESH::SMESH_GroupBase_pt
   initData();
 
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
   TIDSortedElemSet anElems, aNodes, anAffected;
   idSourceToSet( theElems, aMeshDS, anElems, SMDSAbs_All );
   idSourceToSet( theNodesNot, aMeshDS, aNodes, SMDSAbs_Node );
   idSourceToSet( theAffectedElems, aMeshDS, anAffected, SMDSAbs_All );
 
-  bool aResult = myEditor.DoubleNodes( anElems, aNodes, anAffected );
+  bool aResult = getEditor().DoubleNodes( anElems, aNodes, anAffected );
 
-  storeResult( myEditor) ;
 
   myMesh->GetMeshDS()->Modified();
   if ( aResult )
@@ -5766,16 +5746,15 @@ SMESH_MeshEditor_i::DoubleNodeElemGroup2New(SMESH::SMESH_GroupBase_ptr theElems,
   initData();
 
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
   TIDSortedElemSet anElems, aNodes, anAffected;
   idSourceToSet( theElems, aMeshDS, anElems, SMDSAbs_All );
   idSourceToSet( theNodesNot, aMeshDS, aNodes, SMDSAbs_Node );
   idSourceToSet( theAffectedElems, aMeshDS, anAffected, SMDSAbs_All );
 
 
-  bool aResult = myEditor.DoubleNodes( anElems, aNodes, anAffected );
+  bool aResult = getEditor().DoubleNodes( anElems, aNodes, anAffected );
 
-  storeResult( myEditor) ;
   myMesh->GetMeshDS()->Modified();
 
   TPythonDump pyDump;
@@ -5787,14 +5766,14 @@ SMESH_MeshEditor_i::DoubleNodeElemGroup2New(SMESH::SMESH_GroupBase_ptr theElems,
     // Create group with newly created elements
     CORBA::String_var elemGroupName = theElems->GetName();
     string aNewName = generateGroupName( string(elemGroupName.in()) + "_double");
-    if ( !myEditor.GetLastCreatedElems().IsEmpty() && theElemGroupNeeded )
+    if ( !getEditor().GetLastCreatedElems().IsEmpty() && theElemGroupNeeded )
     {
       SMESH::long_array_var anIds = GetLastCreatedElems();
       SMESH::ElementType aGroupType = myMesh_i->GetElementType(anIds[0], true);
       aNewElemGroup = myMesh_i->CreateGroup(aGroupType, aNewName.c_str());
       aNewElemGroup->Add(anIds);
     }
-    if ( !myEditor.GetLastCreatedNodes().IsEmpty() && theNodeGroupNeeded )
+    if ( !getEditor().GetLastCreatedNodes().IsEmpty() && theNodeGroupNeeded )
     {
       SMESH::long_array_var anIds = GetLastCreatedNodes();
       aNewNodeGroup = myMesh_i->CreateGroup(SMESH::NODE, aNewName.c_str());
@@ -5845,15 +5824,14 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemGroupInRegion(SMESH::SMESH_Grou
   initData();
 
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
   TIDSortedElemSet anElems, aNodes, anAffected;
   idSourceToSet( theElems, aMeshDS, anElems, SMDSAbs_All );
   idSourceToSet( theNodesNot, aMeshDS, aNodes, SMDSAbs_Node );
 
   TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( theShape );
-  bool aResult = myEditor.DoubleNodesInRegion( anElems, aNodes, aShape );
+  bool aResult = getEditor().DoubleNodesInRegion( anElems, aNodes, aShape );
 
-  storeResult( myEditor) ;
 
   myMesh->GetMeshDS()->Modified();
   if ( aResult )
@@ -5902,15 +5880,14 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemGroups(const SMESH::ListOfGroup
   initData();
 
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
   TIDSortedElemSet anElems, aNodes, anAffected;
   listOfGroupToSet(theElems, aMeshDS, anElems, false );
   listOfGroupToSet(theNodesNot, aMeshDS, aNodes, true );
   listOfGroupToSet(theAffectedElems, aMeshDS, anAffected, false );
 
-  bool aResult = myEditor.DoubleNodes( anElems, aNodes, anAffected );
+  bool aResult = getEditor().DoubleNodes( anElems, aNodes, anAffected );
 
-  storeResult( myEditor) ;
 
   myMesh->GetMeshDS()->Modified();
   if ( aResult )
@@ -5970,15 +5947,14 @@ SMESH_MeshEditor_i::DoubleNodeElemGroups2New(const SMESH::ListOfGroups& theElems
   initData();
 
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
   TIDSortedElemSet anElems, aNodes, anAffected;
   listOfGroupToSet(theElems, aMeshDS, anElems, false );
   listOfGroupToSet(theNodesNot, aMeshDS, aNodes, true );
   listOfGroupToSet(theAffectedElems, aMeshDS, anAffected, false );
 
-  bool aResult = myEditor.DoubleNodes( anElems, aNodes, anAffected );
+  bool aResult = getEditor().DoubleNodes( anElems, aNodes, anAffected );
 
-  storeResult( myEditor) ;
 
   myMesh->GetMeshDS()->Modified();
   TPythonDump pyDump;
@@ -5989,14 +5965,14 @@ SMESH_MeshEditor_i::DoubleNodeElemGroups2New(const SMESH::ListOfGroups& theElems
     // Create group with newly created elements
     CORBA::String_var elemGroupName = theElems[0]->GetName();
     string aNewName = generateGroupName( string(elemGroupName.in()) + "_double");
-    if ( !myEditor.GetLastCreatedElems().IsEmpty() && theElemGroupNeeded )
+    if ( !getEditor().GetLastCreatedElems().IsEmpty() && theElemGroupNeeded )
     {
       SMESH::long_array_var anIds = GetLastCreatedElems();
       SMESH::ElementType aGroupType = myMesh_i->GetElementType(anIds[0], true);
       aNewElemGroup = myMesh_i->CreateGroup(aGroupType, aNewName.c_str());
       aNewElemGroup->Add(anIds);
     }
-    if ( !myEditor.GetLastCreatedNodes().IsEmpty() && theNodeGroupNeeded )
+    if ( !getEditor().GetLastCreatedNodes().IsEmpty() && theNodeGroupNeeded )
     {
       SMESH::long_array_var anIds = GetLastCreatedNodes();
       aNewNodeGroup = myMesh_i->CreateGroup(SMESH::NODE, aNewName.c_str());
@@ -6045,15 +6021,14 @@ SMESH_MeshEditor_i::DoubleNodeElemGroupsInRegion(const SMESH::ListOfGroups& theE
   initData();
 
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
   TIDSortedElemSet anElems, aNodes;
   listOfGroupToSet(theElems, aMeshDS, anElems,false );
   listOfGroupToSet(theNodesNot, aMeshDS, aNodes, true );
 
   TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( theShape );
-  bool aResult = myEditor.DoubleNodesInRegion( anElems, aNodes, aShape );
+  bool aResult = getEditor().DoubleNodesInRegion( anElems, aNodes, aShape );
 
-  storeResult( myEditor) ;
 
   myMesh->GetMeshDS()->Modified();
   if ( aResult )
@@ -6096,7 +6071,7 @@ SMESH_MeshEditor_i::AffectedElemGroupsInRegion( const SMESH::ListOfGroups& theEl
 
   ::SMESH_MeshEditor aMeshEditor(myMesh);
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
   TIDSortedElemSet anElems, aNodes;
   listOfGroupToSet(theElems, aMeshDS, anElems, false);
   listOfGroupToSet(theNodesNot, aMeshDS, aNodes, true);
@@ -6105,7 +6080,6 @@ SMESH_MeshEditor_i::AffectedElemGroupsInRegion( const SMESH::ListOfGroups& theEl
   TIDSortedElemSet anAffected;
   bool aResult = aMeshEditor.AffectedElemGroupsInRegion(anElems, aNodes, aShape, anAffected);
 
-  storeResult(aMeshEditor);
 
   myMesh->GetMeshDS()->Modified();
   TPythonDump pyDump;
@@ -6195,8 +6169,7 @@ CORBA::Boolean SMESH_MeshEditor_i::Make2DMeshFrom3D()
 {
   initData();
 
-  bool aResult = myEditor.Make2DMeshFrom3D();
-  storeResult( myEditor) ;
+  bool aResult = getEditor().Make2DMeshFrom3D();
   myMesh->GetMeshDS()->Modified();
   TPythonDump() << "isDone = " << this << ".Make2DMeshFrom3D()";
   return aResult;
@@ -6223,7 +6196,7 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodesOnGroupBoundaries( const SMESH::Li
   initData();
 
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
 
   vector<TIDSortedElemSet> domains;
   domains.clear();
@@ -6243,10 +6216,9 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodesOnGroupBoundaries( const SMESH::Li
     }
   }
 
-  bool aResult = myEditor.DoubleNodesOnGroupBoundaries( domains, createJointElems );
+  bool aResult = getEditor().DoubleNodesOnGroupBoundaries( domains, createJointElems );
   // TODO publish the groups of flat elements in study
 
-  storeResult( myEditor) ;
   myMesh->GetMeshDS()->Modified();
 
   // Update Python script
@@ -6272,7 +6244,7 @@ CORBA::Boolean SMESH_MeshEditor_i::CreateFlatElementsOnFacesGroups( const SMESH:
   initData();
 
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
 
   vector<TIDSortedElemSet> faceGroups;
   faceGroups.clear();
@@ -6290,10 +6262,9 @@ CORBA::Boolean SMESH_MeshEditor_i::CreateFlatElementsOnFacesGroups( const SMESH:
     }
   }
 
-  bool aResult = myEditor.CreateFlatElementsOnFacesGroups( faceGroups );
+  bool aResult = getEditor().CreateFlatElementsOnFacesGroups( faceGroups );
   // TODO publish the groups of flat elements in study
 
-  storeResult( myEditor) ;
   myMesh->GetMeshDS()->Modified();
 
   // Update Python script
@@ -6379,7 +6350,7 @@ SMESH_MeshEditor_i::MakeBoundaryMesh(SMESH::SMESH_IDSource_ptr idSource,
   if ( dim > SMESH::BND_1DFROM2D )
     THROW_SALOME_CORBA_EXCEPTION("Invalid boundary dimension", SALOME::BAD_PARAM);
 
-  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  SMESHDS_Mesh* aMeshDS = getMeshDS();
 
   SMESH::SMESH_Mesh_var mesh_var;
   SMESH::SMESH_Group_var group_var;
@@ -6407,13 +6378,12 @@ SMESH_MeshEditor_i::MakeBoundaryMesh(SMESH::SMESH_IDSource_ptr idSource,
     }
 
     // do it
-    myEditor.MakeBoundaryMesh( elements,
+    getEditor().MakeBoundaryMesh( elements,
                                   ::SMESH_MeshEditor::Bnd_Dimension(dim),
                                   smesh_group,
                                   smesh_mesh,
                                   toCopyElements,
                                   toCopyExistingBondary);
-    storeResult( myEditor );
 
     if ( smesh_mesh )
       smesh_mesh->GetMeshDS()->Modified();
@@ -6551,7 +6521,7 @@ CORBA::Long SMESH_MeshEditor_i::MakeBoundaryElements(SMESH::Bnd_Dimension dim,
       {
         SMESH::Bnd_Dimension bdim = 
           ( elemType == SMDSAbs_Volume ) ? SMESH::BND_2DFROM3D : SMESH::BND_1DFROM2D;
-        nbAdded += myEditor.MakeBoundaryMesh( elements,
+        nbAdded += getEditor().MakeBoundaryMesh( elements,
                                                  ::SMESH_MeshEditor::Bnd_Dimension(bdim),
                                                  smesh_group,
                                                  tgtMesh,
@@ -6559,20 +6529,18 @@ CORBA::Long SMESH_MeshEditor_i::MakeBoundaryElements(SMESH::Bnd_Dimension dim,
                                                  /*toCopyExistingBondary=*/srcMesh != tgtMesh,
                                                  /*toAddExistingBondary=*/true,
                                                  /*aroundElements=*/true);
-        storeResult( myEditor );
       }
     }
   }
   else
   {
-    nbAdded += myEditor.MakeBoundaryMesh( elements,
+    nbAdded += getEditor().MakeBoundaryMesh( elements,
                                              ::SMESH_MeshEditor::Bnd_Dimension(dim),
                                              smesh_group,
                                              tgtMesh,
                                              /*toCopyElements=*/false,
                                              /*toCopyExistingBondary=*/srcMesh != tgtMesh,
                                              /*toAddExistingBondary=*/true);
-    storeResult( myEditor );
   }
   tgtMesh->GetMeshDS()->Modified();
 
index fb02d541f95708218e04f8e07bd73fbf8ebb206f..a6a0e3c44b89aca9703a90ec30a099f0a9857666 100644 (file)
 
 class SMESH_Mesh_i;
 
+namespace MeshEditor_I {
+  struct TPreviewMesh;
+}
+
 class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor
 {
 public:
@@ -835,13 +839,17 @@ public:
 
 private: //!< private methods
 
-  SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
+  ::SMESH_MeshEditor& getEditor();
+
+  SMESHDS_Mesh * getMeshDS() { return myMesh->GetMeshDS(); }
+
+  MeshEditor_I::TPreviewMesh * getPreviewMesh( SMDSAbs_ElementType previewType = SMDSAbs_All );
 
   /*!
    * \brief Update myLastCreated* or myPreviewData
    * \param anEditor - it contains edition results
    */
-  void storeResult(::SMESH_MeshEditor& anEditor);
+  //void storeResult(::SMESH_MeshEditor& anEditor);
   /*!
    * \brief Clear myLastCreated* or myPreviewData
    */
@@ -926,12 +934,14 @@ private: //!< private methods
 
 private: //!< fields
 
-  SMESH_Mesh_i*      myMesh_i;
-  SMESH_Mesh *       myMesh;
-  ::SMESH_MeshEditor myEditor;
+  SMESH_Mesh_i*                myMesh_i;
+  SMESH_Mesh *                 myMesh;
+  ::SMESH_MeshEditor           myEditor;
 
+  bool                         myIsPreviewMode;
+  MeshEditor_I::TPreviewMesh * myPreviewMesh;
+  ::SMESH_MeshEditor *         myPreviewEditor;
   SMESH::MeshPreviewStruct_var myPreviewData;
-  bool                         myPreviewMode;
 
   // temporary IDSources
   struct _IDSource;