0028105: HLR rendering crash in MFC sample
[occt.git] / samples / mfc / standard / 04_Viewer3d / src / Viewer3dDoc.cpp
index 52698d2..e68c1a2 100755 (executable)
 
 IMPLEMENT_DYNCREATE(CViewer3dDoc, CDocument)
 
-BEGIN_MESSAGE_MAP(CViewer3dDoc, OCC_3dBaseDoc)
-       //{{AFX_MSG_MAP(CViewer3dDoc)
-       ON_COMMAND(ID_BOX, OnBox)
-       ON_COMMAND(ID_Cylinder, OnCylinder)
-       ON_COMMAND(ID_SPHERE, OnSphere)
-       ON_COMMAND(ID_ERASEALL, OnRemoveAll)
-       ON_COMMAND(ID_NBISOS, OnNbisos)
-       ON_COMMAND(ID_FACES, OnFaces)
-       ON_COMMAND(ID_EDGES, OnEdges)
-       ON_COMMAND(ID_VERTICES, OnVertices)
-       ON_COMMAND(ID_NEUTRAL, OnNeutral)
-       ON_COMMAND(ID_USERCYLINDER_CHANGEFACECOLOR, OnUsercylinderChangefacecolor)
-       ON_COMMAND(ID_FILLET3D, OnFillet3d)
-       ON_COMMAND(ID_CIRCLE, OnCircle)
-       ON_COMMAND(ID_LINE, OnLine)
-       ON_COMMAND(ID_OVERLAPPED_BOX, OnOverlappedBox)
-       ON_COMMAND(ID_OVERLAPPED_CYLINDER, OnOverlappedCylinder)
-       ON_COMMAND(ID_OVERLAPPED_SPHERE, OnOverlappedSphere)
-       ON_COMMAND(ID_POLYGON_OFFSETS, OnPolygonOffsets)
-       ON_UPDATE_COMMAND_UI(ID_POLYGON_OFFSETS, OnUpdatePolygonOffsets)
-       ON_UPDATE_COMMAND_UI(ID_Cylinder, OnUpdateCylinder)
-       ON_UPDATE_COMMAND_UI(ID_SPHERE, OnUpdateSphere)
-       ON_UPDATE_COMMAND_UI(ID_BOX, OnUpdateBox)
-       ON_UPDATE_COMMAND_UI(ID_OVERLAPPED_CYLINDER, OnUpdateOverlappedCylinder)
-       ON_UPDATE_COMMAND_UI(ID_OVERLAPPED_SPHERE, OnUpdateOverlappedSphere)
-       ON_UPDATE_COMMAND_UI(ID_OVERLAPPED_BOX, OnUpdateOverlappedBox)
-       ON_COMMAND(ID_OBJECT_REMOVE, OnObjectRemove)
-       ON_COMMAND(ID_OBJECT_ERASE, OnObjectErase)
-       ON_COMMAND(ID_OBJECT_DISPLAYALL, OnObjectDisplayall)
-       ON_COMMAND(ID_OBJECT_COLORED_MESH, OnObjectColoredMesh)
-       ON_UPDATE_COMMAND_UI(ID_OBJECT_COLORED_MESH, OnUpdateObjectColoredMesh)
-       ON_UPDATE_COMMAND_UI(ID_OBJECT_SHADING, OnUpdateObjectShading)
-       ON_UPDATE_COMMAND_UI(ID_OBJECT_WIREFRAME, OnUpdateObjectWireframe)
-       ON_COMMAND(ID_OPTIONS_TRIHEDRON_DYNAMIC_TRIHEDRON, OnOptionsTrihedronDynamicTrihedron)
-       ON_UPDATE_COMMAND_UI(ID_OPTIONS_TRIHEDRON_DYNAMIC_TRIHEDRON, OnUpdateOptionsTrihedronDynamicTrihedron)
-       ON_UPDATE_COMMAND_UI(ID_OPTIONS_TRIHEDRON_STATIC_TRIHEDRON, OnUpdateOptionsTrihedronStaticTrihedron)
-       ON_COMMAND(ID_OBJECT_MATERIAL, OnObjectMaterial)
-       ON_COMMAND(ID_TEXTURE_ON, OnTextureOn)
-       ON_COMMAND(ID_BUTTONNext, OnBUTTONNext)
-       ON_COMMAND(ID_BUTTONStart, OnBUTTONStart)
-       ON_COMMAND(ID_BUTTONRepeat, OnBUTTONRepeat)
-       ON_COMMAND(ID_BUTTONPrev, OnBUTTONPrev)
-       ON_COMMAND(ID_BUTTONEnd, OnBUTTONEnd)
-       ON_UPDATE_COMMAND_UI(ID_BUTTONNext, OnUpdateBUTTONNext)
-       ON_UPDATE_COMMAND_UI(ID_BUTTONPrev, OnUpdateBUTTONPrev)
-       ON_UPDATE_COMMAND_UI(ID_BUTTONStart, OnUpdateBUTTONStart)
-       ON_UPDATE_COMMAND_UI(ID_BUTTONRepeat, OnUpdateBUTTONRepeat)
-       ON_UPDATE_COMMAND_UI(ID_BUTTONEnd, OnUpdateBUTTONEnd)
-       ON_COMMAND(ID_FILE_NEW, OnFileNew)
-       ON_COMMAND(ID_DUMP_VIEW, OnDumpView)
-       //}}AFX_MSG_MAP
+BEGIN_MESSAGE_MAP(CViewer3dDoc, OCC_3dDoc)
+  //{{AFX_MSG_MAP(CViewer3dDoc)
+  ON_COMMAND(ID_BOX, OnBox)
+  ON_COMMAND(ID_Cylinder, OnCylinder)
+  ON_COMMAND(ID_SPHERE, OnSphere)
+  ON_COMMAND(ID_ERASEALL, OnRemoveAll)
+  ON_COMMAND(ID_NBISOS, OnNbisos)
+  ON_COMMAND(ID_FACES, OnFaces)
+  ON_COMMAND(ID_EDGES, OnEdges)
+  ON_COMMAND(ID_VERTICES, OnVertices)
+  ON_COMMAND(ID_NEUTRAL, OnNeutral)
+  ON_COMMAND(ID_USERCYLINDER_CHANGEFACECOLOR, OnUsercylinderChangefacecolor)
+  ON_COMMAND(ID_FILLET3D, OnFillet3d)
+  ON_COMMAND(ID_CIRCLE, OnCircle)
+  ON_COMMAND(ID_LINE, OnLine)
+  ON_COMMAND(ID_OVERLAPPED_BOX, OnOverlappedBox)
+  ON_COMMAND(ID_OVERLAPPED_CYLINDER, OnOverlappedCylinder)
+  ON_COMMAND(ID_OVERLAPPED_SPHERE, OnOverlappedSphere)
+  ON_COMMAND(ID_POLYGON_OFFSETS, OnPolygonOffsets)
+  ON_UPDATE_COMMAND_UI(ID_POLYGON_OFFSETS, OnUpdatePolygonOffsets)
+  ON_UPDATE_COMMAND_UI(ID_Cylinder, OnUpdateCylinder)
+  ON_UPDATE_COMMAND_UI(ID_SPHERE, OnUpdateSphere)
+  ON_UPDATE_COMMAND_UI(ID_BOX, OnUpdateBox)
+  ON_UPDATE_COMMAND_UI(ID_OVERLAPPED_CYLINDER, OnUpdateOverlappedCylinder)
+  ON_UPDATE_COMMAND_UI(ID_OVERLAPPED_SPHERE, OnUpdateOverlappedSphere)
+  ON_UPDATE_COMMAND_UI(ID_OVERLAPPED_BOX, OnUpdateOverlappedBox)
+  ON_COMMAND(ID_OBJECT_REMOVE, OnObjectRemove)
+  ON_COMMAND(ID_OBJECT_ERASE, OnObjectErase)
+  ON_COMMAND(ID_OBJECT_DISPLAYALL, OnObjectDisplayall)
+  ON_COMMAND(ID_OBJECT_COLORED_MESH, OnObjectColoredMesh)
+  ON_UPDATE_COMMAND_UI(ID_OBJECT_COLORED_MESH, OnUpdateObjectColoredMesh)
+  ON_UPDATE_COMMAND_UI(ID_OBJECT_SHADING, OnUpdateObjectShading)
+  ON_UPDATE_COMMAND_UI(ID_OBJECT_WIREFRAME, OnUpdateObjectWireframe)
+  ON_COMMAND(ID_OPTIONS_TRIHEDRON_DYNAMIC_TRIHEDRON, OnOptionsTrihedronDynamicTrihedron)
+  ON_UPDATE_COMMAND_UI(ID_OPTIONS_TRIHEDRON_DYNAMIC_TRIHEDRON, OnUpdateOptionsTrihedronDynamicTrihedron)
+  ON_UPDATE_COMMAND_UI(ID_OPTIONS_TRIHEDRON_STATIC_TRIHEDRON, OnUpdateOptionsTrihedronStaticTrihedron)
+  ON_COMMAND(ID_OBJECT_MATERIAL, OnObjectMaterial)
+  ON_COMMAND(ID_TEXTURE_ON, OnTextureOn)
+  ON_COMMAND(ID_BUTTONNext, OnBUTTONNext)
+  ON_COMMAND(ID_BUTTONStart, OnBUTTONStart)
+  ON_COMMAND(ID_BUTTONRepeat, OnBUTTONRepeat)
+  ON_COMMAND(ID_BUTTONPrev, OnBUTTONPrev)
+  ON_COMMAND(ID_BUTTONEnd, OnBUTTONEnd)
+  ON_UPDATE_COMMAND_UI(ID_BUTTONNext, OnUpdateBUTTONNext)
+  ON_UPDATE_COMMAND_UI(ID_BUTTONPrev, OnUpdateBUTTONPrev)
+  ON_UPDATE_COMMAND_UI(ID_BUTTONStart, OnUpdateBUTTONStart)
+  ON_UPDATE_COMMAND_UI(ID_BUTTONRepeat, OnUpdateBUTTONRepeat)
+  ON_UPDATE_COMMAND_UI(ID_BUTTONEnd, OnUpdateBUTTONEnd)
+  ON_COMMAND(ID_FILE_NEW, OnFileNew)
+  ON_COMMAND(ID_DUMP_VIEW, OnDumpView)
+  //}}AFX_MSG_MAP
 END_MESSAGE_MAP()
 
 /////////////////////////////////////////////////////////////////////////////
@@ -79,34 +79,34 @@ END_MESSAGE_MAP()
 CViewer3dDoc::CViewer3dDoc()
 :OCC_3dDoc()
 {
-       myCylinder.Nullify();
-       mySphere.Nullify();
-       myBox.Nullify();
-       myOverlappedCylinder.Nullify();
-       myOverlappedSphere.Nullify();
-       myOverlappedBox.Nullify();
-       myOffsetDlg = NULL;
-       myStaticTrihedronAxisIsDisplayed = FALSE;
-       myState = -1;
+  myCylinder.Nullify();
+  mySphere.Nullify();
+  myBox.Nullify();
+  myOverlappedCylinder.Nullify();
+  myOverlappedSphere.Nullify();
+  myOverlappedBox.Nullify();
+  myOffsetDlg = NULL;
+  myStaticTrihedronAxisIsDisplayed = FALSE;
+  myState = -1;
 
-       isTextureSampleStarted = FALSE;
+  isTextureSampleStarted = FALSE;
 
-       myPresentation = OCCDemo_Presentation::Current;
-       myPresentation->SetDocument(this);
+  myPresentation = OCCDemo_Presentation::Current;
+  myPresentation->SetDocument(this);
 
 
-       myAISContext->DefaultDrawer()->ShadingAspect()->SetColor(Quantity_NOC_CHARTREUSE1); 
-       myAISContext->DefaultDrawer()->ShadingAspect()->SetMaterial(Graphic3d_NOM_SILVER);
+  myAISContext->DefaultDrawer()->ShadingAspect()->SetColor(Quantity_NOC_CHARTREUSE1); 
+  myAISContext->DefaultDrawer()->ShadingAspect()->SetMaterial(Graphic3d_NOM_SILVER);
 
-       strcpy_s(myDataDir, "Data");
-       strcpy_s(myLastPath, ".");
+  strcpy_s(myDataDir, "Data");
+  strcpy_s(myLastPath, ".");
 
-       /*
-       Handle(AIS_Trihedron) myTrihedron;
-       Handle(Geom_Axis2Placement) myTrihedronAxis=new Geom_Axis2Placement(gp::XOY());
-       myTrihedron=new AIS_Trihedron(myTrihedronAxis);
-       myAISContext->Display(myTrihedron);
-       */
+  /*
+  Handle(AIS_Trihedron) myTrihedron;
+  Handle(Geom_Axis2Placement) myTrihedronAxis=new Geom_Axis2Placement(gp::XOY());
+  myTrihedron=new AIS_Trihedron(myTrihedronAxis);
+  myAISContext->Display(myTrihedron);
+  */
 }
 
 CViewer3dDoc::~CViewer3dDoc()
@@ -119,12 +119,12 @@ CViewer3dDoc::~CViewer3dDoc()
 #ifdef _DEBUG
 void CViewer3dDoc::AssertValid() const
 {
-       CDocument::AssertValid();
+  CDocument::AssertValid();
 }
 
 void CViewer3dDoc::Dump(CDumpContext& dc) const
 {
-       CDocument::Dump(dc);
+  CDocument::Dump(dc);
 }
 #endif //_DEBUG
 
@@ -133,9 +133,9 @@ void CViewer3dDoc::Dump(CDumpContext& dc) const
 
 void CViewer3dDoc::UpdateResultMessageDlg (CString theTitle, const TCollection_AsciiString& theMessage)
 {
-    CString aText (theMessage.ToCString());
-    myCResultDialog.SetText (aText);
-    myCResultDialog.SetTitle(theTitle);
+  CString aText (theMessage.ToCString());
+  myCResultDialog.SetText (aText);
+  myCResultDialog.SetTitle(theTitle);
 }
 
 void CViewer3dDoc::UpdateResultMessageDlg(CString theTitle, CString theMessage)
@@ -144,366 +144,347 @@ void CViewer3dDoc::UpdateResultMessageDlg(CString theTitle, CString theMessage)
   myCResultDialog.SetTitle(theTitle);
 }
 
-void CViewer3dDoc::OnBox() 
+void CViewer3dDoc::OnBox()
 {
-       if(myBox.IsNull()){
-               BRepPrimAPI_MakeBox B(gp_Pnt(0,-400,-100), 200.,150.,100.);
+  if(myBox.IsNull())
+  {
+    BRepPrimAPI_MakeBox B(gp_Pnt(0,-400,-100), 200.,150.,100.);
 
 
-               myBox = new AIS_Shape(B.Shape());
+    myBox = new AIS_Shape(B.Shape());
 
-               myAISContext->SetMaterial(myBox,Graphic3d_NOM_PEWTER);    
-               myAISContext->SetDisplayMode(myBox,1);
+    myAISContext->SetMaterial(myBox,Graphic3d_NOM_PEWTER);
+    myAISContext->SetDisplayMode(myBox,1);
 
-               myAISContext->Display(myBox);   
-               TCollection_AsciiString Message("\
+    myAISContext->Display(myBox);
+    TCollection_AsciiString Message("\
 BRepPrimAPI_MakeBox Box1(gp_Pnt(0,-400,-100), 200.,150.,100.);\n\
-               ");
-               
-               UpdateResultMessageDlg("Create Box",Message);
+    ");
 
-       }
+    UpdateResultMessageDlg("Create Box",Message);
+  }
 }
 
-void CViewer3dDoc::OnCylinder() 
+void CViewer3dDoc::OnCylinder()
 {
-       if(myCylinder.IsNull()) {
-               gp_Ax2 CylAx2(gp_Pnt(0,0,-100), gp_Dir(gp_Vec(gp_Pnt(0,0,-100),gp_Pnt(0,0,100))));
-
-               //BRepPrimAPI_MakeCylinder C(CylAx2, 80.,200.);
-               
-               myCylinder = new User_Cylinder(CylAx2, 80.,200.);
-               
-//             myCylinder = new AIS_Shape(C.Shape());
-/*
-               myCylinder->SetTransparency(0.5);               
+  if(myCylinder.IsNull())
+  {
+    gp_Ax2 CylAx2(gp_Pnt(0,0,-100), gp_Dir(gp_Vec(gp_Pnt(0,0,-100),gp_Pnt(0,0,100))));
+    myCylinder = new User_Cylinder(CylAx2, 80.,200.);
 
-               myAISContext->SetColor(myCylinder,Quantity_NOC_WHITE); 
-               myAISContext->SetMaterial(myCylinder,Graphic3d_NOM_SHINY_PLASTIC);    
-*/
-               myAISContext->SetDisplayMode(myCylinder,1);
+    myAISContext->SetDisplayMode(myCylinder,1);
 
-               myAISContext->Display(myCylinder);
+    myAISContext->Display(myCylinder);
 
-               TCollection_AsciiString Message("\
+    TCollection_AsciiString Message("\
 gp_Ax2 CylAx2(gp_Pnt(0,0,-100), gp_Dir(gp_Vec(gp_Pnt(0,0,-100),gp_Pnt(0,0,100))));\n\
 C = new User_Cylinder(CylAx2, 80.,200.);;\n\
-               ");
-               
-               UpdateResultMessageDlg("Create Cylinder",Message);
+    ");
 
-       }
+    UpdateResultMessageDlg("Create Cylinder",Message);
+  }
 }
 
-void CViewer3dDoc::OnSphere() 
+void CViewer3dDoc::OnSphere()
 {
-       if(mySphere.IsNull()){
-               BRepPrimAPI_MakeSphere S(gp_Pnt(0,300,0), 100.);
+  if(mySphere.IsNull())
+  {
+    BRepPrimAPI_MakeSphere S(gp_Pnt(0,300,0), 100.);
+
+    mySphere = new AIS_Shape(S.Shape());
 
-               mySphere = new AIS_Shape(S.Shape());
-               
-               myAISContext->SetMaterial(mySphere,Graphic3d_NOM_BRONZE);    
-               myAISContext->SetDisplayMode(mySphere,1);
+    myAISContext->SetMaterial(mySphere,Graphic3d_NOM_BRONZE);
+    myAISContext->SetDisplayMode(mySphere,1);
 
-               myAISContext->Display(mySphere);
-               TCollection_AsciiString Message("\
+    myAISContext->Display(mySphere);
+    TCollection_AsciiString Message("\
 BRepPrimAPI_MakeSphere S(gp_Pnt(0,300,0), 100.);\n\
-               ");
-               UpdateResultMessageDlg("Create Sphere",Message);
-       }
+    ");
+    UpdateResultMessageDlg("Create Sphere",Message);
+  }
 }
 
-void CViewer3dDoc::OnRemoveAll() 
+void CViewer3dDoc::OnRemoveAll()
 
 {
-       AIS_ListOfInteractive aListOfObjects;
-       myAISContext->ObjectsInside(aListOfObjects,AIS_KOI_Shape);
+  AIS_ListOfInteractive aListOfObjects;
+  myAISContext->ObjectsInside(aListOfObjects,AIS_KOI_Shape);
 
-       AIS_ListIteratorOfListOfInteractive aListIterator;
-       for(aListIterator.Initialize(aListOfObjects);aListIterator.More();aListIterator.Next()){
-               myAISContext->Remove(aListIterator.Value());
-       }
+  AIS_ListIteratorOfListOfInteractive aListIterator;
+  for(aListIterator.Initialize(aListOfObjects);aListIterator.More();aListIterator.Next()){
+    myAISContext->Remove(aListIterator.Value());
+  }
 
-       myAISContext->Remove(myCylinder);
+  myAISContext->Remove(myCylinder);
 
 
-       myCylinder.Nullify();
-       mySphere.Nullify();
-       myBox.Nullify();
-       myOverlappedCylinder.Nullify();
-       myOverlappedSphere.Nullify();
-       myOverlappedBox.Nullify();
-       if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
-               myOffsetDlg->UpdateValues();
+  myCylinder.Nullify();
+  mySphere.Nullify();
+  myBox.Nullify();
+  myOverlappedCylinder.Nullify();
+  myOverlappedSphere.Nullify();
+  myOverlappedBox.Nullify();
+  if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
+    myOffsetDlg->UpdateValues();
 }
 
 void CViewer3dDoc::OnOverlappedBox() 
 {
-       OnBox();
-       if(myOverlappedBox.IsNull()){
-               BRepPrimAPI_MakeBox B(gp_Pnt(0,-400,-100), 200.,150.,100.);
+  OnBox();
+  if(myOverlappedBox.IsNull()){
+    BRepPrimAPI_MakeBox B(gp_Pnt(0,-400,-100), 200.,150.,100.);
 
-               BRepBuilderAPI_NurbsConvert aNurbsConvert(B.Shape());
-               TopoDS_Shape aBoxShape2 = aNurbsConvert.Shape();
+    BRepBuilderAPI_NurbsConvert aNurbsConvert(B.Shape());
+    TopoDS_Shape aBoxShape2 = aNurbsConvert.Shape();
 
 
-               myOverlappedBox = new AIS_Shape(aBoxShape2);
+    myOverlappedBox = new AIS_Shape(aBoxShape2);
 
-               myAISContext->SetMaterial(myOverlappedBox,Graphic3d_NOM_GOLD);    
-               myAISContext->SetDisplayMode(myOverlappedBox,1);
+    myAISContext->SetMaterial(myOverlappedBox,Graphic3d_NOM_GOLD);
+    myAISContext->SetDisplayMode(myOverlappedBox,1);
 
-               myAISContext->Display(myOverlappedBox); 
-               TCollection_AsciiString Message("\
+    myAISContext->Display(myOverlappedBox);
+    TCollection_AsciiString Message("\
 BRepPrimAPI_MakeBox Box1(gp_Pnt(0,-400,-100), 200.,150.,100.);\n\
 \n\
 BRepPrimAPI_MakeBox Box2(gp_Pnt(0,-400,-100), 200.,150.,100.);\n\
 BRepBuilderAPI_NurbsConvert aNurbsConvert(Box2.Shape());\n\
-               ");
-               UpdateResultMessageDlg("Create overlapped boxes",Message);
-               if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
-                       myOffsetDlg->UpdateValues();
-
-
-       }
+    ");
+    UpdateResultMessageDlg("Create overlapped boxes",Message);
+    if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
+      myOffsetDlg->UpdateValues();
+  }
 }
 
-void CViewer3dDoc::OnOverlappedCylinder() 
+void CViewer3dDoc::OnOverlappedCylinder()
 {
-       OnCylinder();
+  OnCylinder();
+
+  if(myOverlappedCylinder.IsNull()){
+    gp_Ax2 CylAx2(gp_Pnt(0,0,-100), gp_Dir(gp_Vec(gp_Pnt(0,0,-100),gp_Pnt(0,0,100))));
+    BRepPrimAPI_MakeCylinder C(CylAx2, 80.,200.);
 
-       if(myOverlappedCylinder.IsNull()){
-               gp_Ax2 CylAx2(gp_Pnt(0,0,-100), gp_Dir(gp_Vec(gp_Pnt(0,0,-100),gp_Pnt(0,0,100))));
-               BRepPrimAPI_MakeCylinder C(CylAx2, 80.,200.);
+    BRepBuilderAPI_NurbsConvert aNurbsConvert(C.Shape());
+    TopoDS_Shape aCylShape2 = aNurbsConvert.Shape();
 
-               BRepBuilderAPI_NurbsConvert aNurbsConvert(C.Shape());
-               TopoDS_Shape aCylShape2 = aNurbsConvert.Shape();
+    myOverlappedCylinder = new AIS_Shape(aCylShape2);
 
-               myOverlappedCylinder = new AIS_Shape(aCylShape2);
 
-       
-               myAISContext->SetMaterial(myOverlappedCylinder,Graphic3d_NOM_GOLD);    
-               myAISContext->SetDisplayMode(myOverlappedCylinder,1);
+    myAISContext->SetMaterial(myOverlappedCylinder,Graphic3d_NOM_GOLD);    
+    myAISContext->SetDisplayMode(myOverlappedCylinder,1);
 
-               myAISContext->Display(myOverlappedCylinder);
+    myAISContext->Display(myOverlappedCylinder);
 
-               TCollection_AsciiString Message("\
+    TCollection_AsciiString Message("\
 gp_Ax2 CylAx2(gp_Pnt(0,0,-100), gp_Dir(gp_Vec(gp_Pnt(0,0,-100),gp_Pnt(0,0,100))));\n\
 Cylinder1 = new User_Cylinder(CylAx2, 80.,200.);\n\
 \n\
 BRepPrimAPI_MakeCylinder Cylinder2(CylAx2, 80.,200.);\n\
 BRepBuilderAPI_NurbsConvert aNurbsConvert(Cylinder2.Shape());\n\
-               ");
-               UpdateResultMessageDlg("Create overlapped cylinders",Message);
-               if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
-                       myOffsetDlg->UpdateValues();
-
-       }
+    ");
+    UpdateResultMessageDlg("Create overlapped cylinders",Message);
+    if (myOffsetDlg && myOffsetDlg->IsWindowVisible())
+    {
+      myOffsetDlg->UpdateValues();
+    }
+  }
 }
 
-void CViewer3dDoc::OnOverlappedSphere() 
+void CViewer3dDoc::OnOverlappedSphere()
 {
-       OnSphere();
-       if(myOverlappedSphere.IsNull()){
-               BRepPrimAPI_MakeSphere S(gp_Pnt(0,300,0), 100.);
+  OnSphere();
+  if(myOverlappedSphere.IsNull()){
+    BRepPrimAPI_MakeSphere S(gp_Pnt(0,300,0), 100.);
 
-               BRepBuilderAPI_NurbsConvert aNurbsConvert(S.Shape());
-               TopoDS_Shape aSphereShape2 = aNurbsConvert.Shape();
+    BRepBuilderAPI_NurbsConvert aNurbsConvert(S.Shape());
+    TopoDS_Shape aSphereShape2 = aNurbsConvert.Shape();
 
-               myOverlappedSphere = new AIS_Shape(aSphereShape2);
+    myOverlappedSphere = new AIS_Shape(aSphereShape2);
 
-               myAISContext->SetMaterial(myOverlappedSphere,Graphic3d_NOM_GOLD);    
+    myAISContext->SetMaterial(myOverlappedSphere,Graphic3d_NOM_GOLD);    
 
-               myAISContext->SetDisplayMode(myOverlappedSphere,1);
+    myAISContext->SetDisplayMode(myOverlappedSphere,1);
 
-               myAISContext->Display(myOverlappedSphere);
+    myAISContext->Display(myOverlappedSphere);
 
-               TCollection_AsciiString Message("\
+    TCollection_AsciiString Message("\
 BRepPrimAPI_MakeSphere Sphere1(gp_Pnt(0,300,0), 100.);\n\
 \n\
 BRepPrimAPI_MakeSphere Sphere2(gp_Pnt(0,300,0), 100.);\n\
 BRepBuilderAPI_NurbsConvert aNurbsConvert(Sphere2.Shape());\n\
-               ");
-               UpdateResultMessageDlg("Create overlapped spheres",Message);
-               if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
-                       myOffsetDlg->UpdateValues();
-
-       }
+    ");
+    UpdateResultMessageDlg("Create overlapped spheres",Message);
+    if (myOffsetDlg && myOffsetDlg->IsWindowVisible())
+    {
+      myOffsetDlg->UpdateValues();
+    }
+  }
 }
 
-void CViewer3dDoc::OnPolygonOffsets() 
+void CViewer3dDoc::OnPolygonOffsets()
 {
-
-       myOffsetDlg = new COffsetDlg(this);
-       myOffsetDlg->Create(COffsetDlg::IDD,NULL);
-       myAISContext->UpdateCurrentViewer();
-
+  myOffsetDlg = new COffsetDlg(this);
+  myOffsetDlg->Create(COffsetDlg::IDD,NULL);
+  myAISContext->UpdateCurrentViewer();
 }
 
 void CViewer3dDoc::OnUpdatePolygonOffsets(CCmdUI* pCmdUI) 
 {
-       Standard_Integer aOffsetMode;
-       Standard_ShortReal aFactor;
-       Standard_ShortReal aCylUnits = 0;
-       Standard_ShortReal aSphereUnits = 0;
-       Standard_ShortReal aBoxUnits = 0;
-
-       BOOL IsOverlappedCylinderDisplayed = myAISContext->IsDisplayed(myOverlappedCylinder);
-       BOOL IsOverlappedSphereDisplayed = myAISContext->IsDisplayed(myOverlappedSphere);
-       BOOL IsOverlappedBoxDisplayed = myAISContext->IsDisplayed(myOverlappedBox);
-       BOOL IsAnyOverlappedObjectDisplayed = 
-               IsOverlappedCylinderDisplayed || IsOverlappedSphereDisplayed || IsOverlappedBoxDisplayed;
-       
-       if(!myOverlappedCylinder.IsNull() && IsOverlappedCylinderDisplayed){
-               myOverlappedCylinder->PolygonOffsets(aOffsetMode,aFactor,aCylUnits);
-       }
-       
-       if(!myOverlappedSphere.IsNull() && IsOverlappedSphereDisplayed){
-               myOverlappedSphere->PolygonOffsets(aOffsetMode,aFactor,aSphereUnits);
-       }
-
-       if(!myOverlappedBox.IsNull() && IsOverlappedBoxDisplayed){
-               myOverlappedBox->PolygonOffsets(aOffsetMode,aFactor,aBoxUnits);
-       }
-
-       if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
-               pCmdUI->SetCheck(TRUE);
-       else
-               pCmdUI->SetCheck(FALSE);
-       if (IsAnyOverlappedObjectDisplayed)
-               if(myOffsetDlg)
-                       pCmdUI->Enable(!myOffsetDlg->IsWindowVisible());  
-               else
-                       pCmdUI->Enable(TRUE);
-       else 
-                       pCmdUI->Enable(FALSE);
-       
-       
+  Standard_Integer aOffsetMode;
+  Standard_ShortReal aFactor;
+  Standard_ShortReal aCylUnits = 0;
+  Standard_ShortReal aSphereUnits = 0;
+  Standard_ShortReal aBoxUnits = 0;
+
+  BOOL IsOverlappedCylinderDisplayed = myAISContext->IsDisplayed(myOverlappedCylinder);
+  BOOL IsOverlappedSphereDisplayed = myAISContext->IsDisplayed(myOverlappedSphere);
+  BOOL IsOverlappedBoxDisplayed = myAISContext->IsDisplayed(myOverlappedBox);
+  BOOL IsAnyOverlappedObjectDisplayed = 
+    IsOverlappedCylinderDisplayed || IsOverlappedSphereDisplayed || IsOverlappedBoxDisplayed;
+
+  if(!myOverlappedCylinder.IsNull() && IsOverlappedCylinderDisplayed){
+    myOverlappedCylinder->PolygonOffsets(aOffsetMode,aFactor,aCylUnits);
+  }
+
+  if(!myOverlappedSphere.IsNull() && IsOverlappedSphereDisplayed){
+    myOverlappedSphere->PolygonOffsets(aOffsetMode,aFactor,aSphereUnits);
+  }
+
+  if(!myOverlappedBox.IsNull() && IsOverlappedBoxDisplayed){
+    myOverlappedBox->PolygonOffsets(aOffsetMode,aFactor,aBoxUnits);
+  }
+
+  if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
+    pCmdUI->SetCheck(TRUE);
+  else
+    pCmdUI->SetCheck(FALSE);
+  if (IsAnyOverlappedObjectDisplayed)
+    if(myOffsetDlg)
+      pCmdUI->Enable(!myOffsetDlg->IsWindowVisible());
+    else
+      pCmdUI->Enable(TRUE);
+  else
+    pCmdUI->Enable(FALSE);
 }
 
-void CViewer3dDoc::OnUpdateCylinder(CCmdUI* pCmdUI) 
+void CViewer3dDoc::OnUpdateCylinder(CCmdUI* pCmdUI)
 {
-       pCmdUI->Enable(myCylinder.IsNull()); 
-               
+  pCmdUI->Enable(myCylinder.IsNull());
 }
 
-void CViewer3dDoc::OnUpdateSphere(CCmdUI* pCmdUI) 
+void CViewer3dDoc::OnUpdateSphere(CCmdUI* pCmdUI)
 {
-       pCmdUI->Enable(mySphere.IsNull()); 
-               
+  pCmdUI->Enable(mySphere.IsNull()); 
 }
 
-void CViewer3dDoc::OnUpdateBox(CCmdUI* pCmdUI) 
+void CViewer3dDoc::OnUpdateBox(CCmdUI* pCmdUI)
 {
-       pCmdUI->Enable(myBox.IsNull()); 
-               
+  pCmdUI->Enable(myBox.IsNull()); 
 }
 
-void CViewer3dDoc::OnUpdateOverlappedCylinder(CCmdUI* pCmdUI) 
+void CViewer3dDoc::OnUpdateOverlappedCylinder(CCmdUI* pCmdUI)
 {
-       pCmdUI->Enable   (myOverlappedCylinder.IsNull()
-                                               || myCylinder.IsNull());
-               
+  pCmdUI->Enable   (myOverlappedCylinder.IsNull()
+    || myCylinder.IsNull());
+
 }
 
-void CViewer3dDoc::OnUpdateOverlappedSphere(CCmdUI* pCmdUI) 
+void CViewer3dDoc::OnUpdateOverlappedSphere(CCmdUI* pCmdUI)
 {
-       pCmdUI->Enable   (myOverlappedSphere.IsNull()
-                                               || mySphere.IsNull());
+  pCmdUI->Enable   (myOverlappedSphere.IsNull()
+    || mySphere.IsNull());
 }
 
-void CViewer3dDoc::OnUpdateOverlappedBox(CCmdUI* pCmdUI) 
+void CViewer3dDoc::OnUpdateOverlappedBox(CCmdUI* pCmdUI)
 {
-       pCmdUI->Enable   (myOverlappedBox.IsNull()
-                                               || myBox.IsNull());
+  pCmdUI->Enable   (myOverlappedBox.IsNull()
+    || myBox.IsNull());
 }
 
-void CViewer3dDoc::OnObjectRemove() 
-
+void CViewer3dDoc::OnObjectRemove()
 {
+  if(myAISContext->IsCurrent(myBox))
+    myBox.Nullify();
 
-       if(myAISContext->IsCurrent(myBox))
-               myBox.Nullify();
+  if(myAISContext->IsCurrent(myCylinder))
+    myCylinder.Nullify();
 
-       if(myAISContext->IsCurrent(myCylinder))
-               myCylinder.Nullify();
+  if(myAISContext->IsCurrent(mySphere))
+    mySphere.Nullify();
 
-       if(myAISContext->IsCurrent(mySphere))
-               mySphere.Nullify();
+  if(myAISContext->IsCurrent(myOverlappedBox))
+    myOverlappedBox.Nullify();
 
-       if(myAISContext->IsCurrent(myOverlappedBox))
-               myOverlappedBox.Nullify();
+  if(myAISContext->IsCurrent(myOverlappedCylinder))
+    myOverlappedCylinder.Nullify();
 
-       if(myAISContext->IsCurrent(myOverlappedCylinder))
-               myOverlappedCylinder.Nullify();
+  if(myAISContext->IsCurrent(myOverlappedSphere))
+    myOverlappedSphere.Nullify();
 
-       if(myAISContext->IsCurrent(myOverlappedSphere))
-               myOverlappedSphere.Nullify();
 
-       
-       for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->InitCurrent())
-               myAISContext->Remove(myAISContext->Current(),Standard_True);
-
-       if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
-               myOffsetDlg->UpdateValues();
+  for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->InitCurrent())
+    myAISContext->Remove(myAISContext->Current(),Standard_True);
 
+  if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
+    myOffsetDlg->UpdateValues();
 }
 
-void CViewer3dDoc::OnObjectErase() 
+void CViewer3dDoc::OnObjectErase()
 
 {
-       OCC_3dBaseDoc::OnObjectErase(); 
-       if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
-               myOffsetDlg->UpdateValues();
+  OCC_3dBaseDoc::OnObjectErase();
+  if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
+    myOffsetDlg->UpdateValues();
 }
 
-void CViewer3dDoc::OnObjectDisplayall() 
+void CViewer3dDoc::OnObjectDisplayall()
 
 {
-       OCC_3dBaseDoc::OnObjectDisplayall(); 
-       if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
-               myOffsetDlg->UpdateValues();
+  OCC_3dBaseDoc::OnObjectDisplayall();
+  if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
+    myOffsetDlg->UpdateValues();
 }
 
-Handle_User_Cylinder CViewer3dDoc::GetCylinder()
+Handle(User_Cylinder) CViewer3dDoc::GetCylinder()
 {
-       return myCylinder;
+  return myCylinder;
 }
 
 
-Handle_AIS_Shape CViewer3dDoc::GetSphere()
+Handle(AIS_Shape) CViewer3dDoc::GetSphere()
 {
-       return mySphere;
+  return mySphere;
 }
 
-Handle_AIS_Shape CViewer3dDoc::GetBox()
+Handle(AIS_Shape) CViewer3dDoc::GetBox()
 {
-       return myBox;
+  return myBox;
 }
 
-Handle_AIS_Shape CViewer3dDoc::GetOverlappedCylinder()
+Handle(AIS_Shape) CViewer3dDoc::GetOverlappedCylinder()
 {
-       return myOverlappedCylinder;
+  return myOverlappedCylinder;
 }
 
 
-Handle_AIS_Shape CViewer3dDoc::GetOverlappedSphere()
+Handle(AIS_Shape) CViewer3dDoc::GetOverlappedSphere()
 {
-       return myOverlappedSphere;
+  return myOverlappedSphere;
 }
 
-Handle_AIS_Shape CViewer3dDoc::GetOverlappedBox()
+Handle(AIS_Shape) CViewer3dDoc::GetOverlappedBox()
 {
-       return myOverlappedBox;
+  return myOverlappedBox;
 }
 
-void CViewer3dDoc::DragEvent(const Standard_Integer  x        ,
-                                                 const Standard_Integer  y        ,
-                                                 const Standard_Integer  TheState ,
-                                  const Handle(V3d_View)& aView    )
+void CViewer3dDoc::DragEvent (const Standard_Integer theX,
+                              const Standard_Integer theY,
+                              const Standard_Integer theState,
+                              const Handle(V3d_View)& theView)
 {
-       OCC_3dBaseDoc::DragEvent(x,y, TheState,aView);
-       if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
-               myOffsetDlg->UpdateValues();
+  OCC_3dBaseDoc::DragEvent (theX, theY, theState, theView);
+  if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
+    myOffsetDlg->UpdateValues();
 }
 
 //-----------------------------------------------------------------------------------------
@@ -526,7 +507,7 @@ void CViewer3dDoc::InputEvent(const Standard_Integer /*x*/,
     myAISContext->InitSelected();
     if (myAISContext->MoreSelected())
     {
-      Handle_AIS_InteractiveObject Current = myAISContext->SelectedInteractive();
+      Handle(AIS_InteractiveObject) Current = myAISContext->SelectedInteractive();
       if (Current->HasColor())
       {
         CSFColor = myAISContext->Color (Current);
@@ -546,20 +527,10 @@ void CViewer3dDoc::InputEvent(const Standard_Integer /*x*/,
                                    GetBValue (MSColor)/255.0,
                                    Quantity_TOC_RGB);
 
-        TopoDS_Shape S = myAISContext->SelectedShape();
-        Handle(Geom_Surface) Surface = BRep_Tool::Surface (TopoDS::Face(S));
-        if (Surface->IsKind (STANDARD_TYPE (Geom_Plane)))
-        {
-          Handle(User_Cylinder)::DownCast (myAISContext->SelectedInteractive())
-            ->SetPlanarFaceColor (CSFColor.Name());
-        }
-        else
-        {
-          Handle(User_Cylinder)::DownCast (myAISContext->SelectedInteractive())
-            ->SetCylindricalFaceColor (CSFColor.Name());
-        }
-
-        myAISContext->Redisplay (myAISContext->SelectedInteractive());
+        Handle(AIS_InteractiveObject) aSelectedObject = myAISContext->SelectedInteractive();
+        Handle(User_Cylinder)::DownCast (aSelectedObject)->SetColor (CSFColor.Name());
+
+        myAISContext->Redisplay (aSelectedObject);
         myState = -1;
         myAISContext->CloseLocalContext();
       }
@@ -592,12 +563,12 @@ void CViewer3dDoc::InputEvent(const Standard_Integer /*x*/,
 //-----------------------------------------------------------------------------------------
 //
 //-----------------------------------------------------------------------------------------
-void CViewer3dDoc::ShiftDragEvent(const Standard_Integer  x        ,
-                                                                          const Standard_Integer  y        ,
-                                                                          const Standard_Integer  TheState ,
-                                       const Handle(V3d_View)& aView    ) 
+void CViewer3dDoc::ShiftDragEvent (const Standard_Integer theX,
+                                   const Standard_Integer  theY,
+                                   const Standard_Integer theState,
+                                   const Handle(V3d_View)& theView)
 {
-  OCC_3dBaseDoc::ShiftDragEvent(x,y,TheState,aView);
+  OCC_3dBaseDoc::ShiftDragEvent(theX, theY, theState, theView);
   if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
     myOffsetDlg->UpdateValues();
 }
@@ -606,17 +577,16 @@ void CViewer3dDoc::ShiftDragEvent(const Standard_Integer  x        ,
 //-----------------------------------------------------------------------------------------
 //
 //-----------------------------------------------------------------------------------------
-
-void CViewer3dDoc::ShiftInputEvent(const Standard_Integer  x       ,
-                                                                           const Standard_Integer  y       ,
-                                        const Handle(V3d_View)& aView   ) 
+void CViewer3dDoc::ShiftInputEvent (const Standard_Integer theX,
+                                    const Standard_Integer theY,
+                                    const Handle(V3d_View)& theView)
 {
-  OCC_3dBaseDoc::ShiftInputEvent(x,y,aView);
+  OCC_3dBaseDoc::ShiftInputEvent (theX, theY, theView);
   if(myOffsetDlg && myOffsetDlg->IsWindowVisible())
     myOffsetDlg->UpdateValues();
 }
 
-void CViewer3dDoc::OnObjectColoredMesh() 
+void CViewer3dDoc::OnObjectColoredMesh()
 {
   for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
     if (myAISContext->Current()->IsKind(STANDARD_TYPE(User_Cylinder)))
@@ -627,70 +597,69 @@ void CViewer3dDoc::OnObjectColoredMesh()
     }
 }
 
-void CViewer3dDoc::OnUpdateObjectColoredMesh(CCmdUI* pCmdUI) 
+void CViewer3dDoc::OnUpdateObjectColoredMesh(CCmdUI* pCmdUI)
 {
   bool CylinderIsCurrentAndDisplayed = false;
   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
-       if(myAISContext->Current()->IsKind(STANDARD_TYPE(User_Cylinder)))
-               CylinderIsCurrentAndDisplayed=true;
-  pCmdUI->Enable (CylinderIsCurrentAndDisplayed);      
+    if(myAISContext->Current()->IsKind(STANDARD_TYPE(User_Cylinder)))
+      CylinderIsCurrentAndDisplayed=true;
+  pCmdUI->Enable (CylinderIsCurrentAndDisplayed);
 }
 
-void CViewer3dDoc::OnUpdateObjectWireframe(CCmdUI* pCmdUI) 
+void CViewer3dDoc::OnUpdateObjectWireframe(CCmdUI* pCmdUI)
 {
   bool OneOrMoreInShadingOrColoredMesh = false;
   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
     if (myAISContext->IsDisplayed(myAISContext->Current(),1) || myAISContext->IsDisplayed(myAISContext->Current(),6)) 
-               OneOrMoreInShadingOrColoredMesh=true;
-       pCmdUI->Enable (OneOrMoreInShadingOrColoredMesh);       
+      OneOrMoreInShadingOrColoredMesh=true;
+  pCmdUI->Enable (OneOrMoreInShadingOrColoredMesh);
 }
 
 
-void CViewer3dDoc::OnUpdateObjectShading(CCmdUI* pCmdUI) 
+void CViewer3dDoc::OnUpdateObjectShading(CCmdUI* pCmdUI)
 {
   bool OneOrMoreInWireframeOrColoredMesh = false;
   for (myAISContext->InitCurrent();myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
     if (myAISContext->IsDisplayed(myAISContext->Current(),0) || myAISContext->IsDisplayed(myAISContext->Current(),6))
-               OneOrMoreInWireframeOrColoredMesh=true;
-       pCmdUI->Enable (OneOrMoreInWireframeOrColoredMesh);     
+      OneOrMoreInWireframeOrColoredMesh=true;
+  pCmdUI->Enable (OneOrMoreInWireframeOrColoredMesh);
 }
 
-
-void CViewer3dDoc::OnOptionsTrihedronDynamicTrihedron() 
+void CViewer3dDoc::OnOptionsTrihedronDynamicTrihedron()
 {
-       if (myAISContext -> IsDisplayed(myTrihedron))
-       {
-               myAISContext->Remove(myTrihedron);
-       }               
-       else
-       {
-               Handle(Geom_Axis2Placement) myTrihedronAxis=new Geom_Axis2Placement(gp::XOY());
-               myTrihedron=new AIS_Trihedron(myTrihedronAxis);
-               myAISContext->SetTrihedronSize(200, Standard_True);
-               myAISContext->Display(myTrihedron);     
-       }               
+  if (myAISContext -> IsDisplayed(myTrihedron))
+  {
+    myAISContext->Remove(myTrihedron);
+  }
+  else
+  {
+    Handle(Geom_Axis2Placement) myTrihedronAxis=new Geom_Axis2Placement(gp::XOY());
+    myTrihedron=new AIS_Trihedron(myTrihedronAxis);
+    myAISContext->SetTrihedronSize(200, Standard_True);
+    myAISContext->Display(myTrihedron);
+  }
 }
 
-void CViewer3dDoc::OnUpdateOptionsTrihedronDynamicTrihedron(CCmdUI* pCmdUI) 
+void CViewer3dDoc::OnUpdateOptionsTrihedronDynamicTrihedron(CCmdUI* pCmdUI)
 {
-       if (myAISContext->IsDisplayed(myTrihedron))
-               pCmdUI->SetCheck(1);
-       else
-               pCmdUI->SetCheck(0);
+  if (myAISContext->IsDisplayed(myTrihedron))
+    pCmdUI->SetCheck(1);
+  else
+    pCmdUI->SetCheck(0);
 }
 
 void CViewer3dDoc::SetMyStaticTrihedronAxisIsDisplayed(BOOL IsDisplayed)
 {
-       myStaticTrihedronAxisIsDisplayed = IsDisplayed;
+  myStaticTrihedronAxisIsDisplayed = IsDisplayed;
 }
 
 void CViewer3dDoc::OnUpdateOptionsTrihedronStaticTrihedron(CCmdUI* pCmdUI) 
 {
-       if (myStaticTrihedronAxisIsDisplayed)
-               pCmdUI->SetCheck(1);
-       else
-               pCmdUI->SetCheck(0);
-       
+  if (myStaticTrihedronAxisIsDisplayed)
+    pCmdUI->SetCheck(1);
+  else
+    pCmdUI->SetCheck(0);
+
 }
 
 void  CViewer3dDoc::Popup (const Standard_Integer  x,
@@ -791,22 +760,19 @@ void CViewer3dDoc::OnFillet3d()
   myAISContext->InitSelected();
   if (myAISContext->MoreSelected()) 
   {
-    Handle(AIS_Shape) S = Handle(AIS_Shape)::DownCast (myAISContext->SelectedInteractive());
-
-    if (S.IsNull())
+    Handle(AIS_Shape) aSelInteractive (Handle(AIS_Shape)::DownCast (myAISContext->SelectedInteractive()));
+    if (aSelInteractive.IsNull())
     {
       AfxMessageBox (L"It is necessary to activate the edges selection mode\n"
                      L"and select edges on an object before \nrunning this function");
       return;
     }
 
-    TopoDS_Shape Sh=S->Shape();
-
-    BRepFilletAPI_MakeFillet aFillet(Sh);
+    BRepFilletAPI_MakeFillet aFillet (aSelInteractive->Shape());
 
     for (myAISContext->InitSelected(); myAISContext->MoreSelected(); myAISContext->NextSelected())
     {
-      TopoDS_Shape aSelShape = myAISContext->SelectedShape();
+      const TopoDS_Shape& aSelShape = myAISContext->SelectedShape();
       if (aSelShape.ShapeType() != TopAbs_EDGE)
       {
         AfxMessageBox (L"It is necessary to activate the edges selection mode\n"
@@ -815,13 +781,16 @@ void CViewer3dDoc::OnFillet3d()
       }
     }
 
-    BoxRadius dlg(NULL,10.);
-    if (dlg.DoModal() == IDOK)
+    BoxRadius aDialog (NULL,10.);
+    if (aDialog.DoModal() == IDOK)
     {
       for (myAISContext->InitSelected(); myAISContext->MoreSelected(); myAISContext->NextSelected())
       {
-        TopoDS_Edge anEdge = TopoDS::Edge(myAISContext->SelectedShape());
-        aFillet.Add(dlg.m_radius,anEdge);
+        // Selected shape has its own location, and sub-shapes in the solid shape for fillet building
+        // don't have own locations. Fillet builder needs to know that input edge is just the same one as
+        // some sub-shape in our target solid shape, so no location is to be in input edge for fillet builder.
+        TopoDS_Shape aSelShape = myAISContext->SelectedShape().Located (TopLoc_Location());
+        aFillet.Add (aDialog.m_radius, TopoDS::Edge (aSelShape) );
       }
     }
     else
@@ -840,8 +809,8 @@ void CViewer3dDoc::OnFillet3d()
       return;
     }
 
-    S ->Set (aNewShape);
-    myAISContext->Redisplay (S);
+    aSelInteractive ->Set (aNewShape);
+    myAISContext->Redisplay (aSelInteractive);
   }
 
   myCResultDialog.SetTitle("Make a fillet");