0030626: Visualization - manipulator crashes when is attached with scaling mode disabled IR-WEEK14
authoriko <iko@opencascade.com>
Tue, 2 Apr 2019 10:58:32 +0000 (13:58 +0300)
committerapn <apn@opencascade.com>
Wed, 3 Apr 2019 16:05:38 +0000 (19:05 +0300)
AIS_Manipulator crashes on SetPart method when 2 inputs (AIS_ManipulatorMode, Standard_Boolean) has been fixed up.
Test case for this bug has been added.

src/AIS/AIS_Manipulator.cxx
src/ViewerTest/ViewerTest_ViewerCommands.cxx
tests/v3d/manipulator/disable_parts

index 0692d19..6413b1f 100644 (file)
@@ -297,7 +297,7 @@ void AIS_Manipulator::SetPart (const Standard_Integer theAxisIndex, const AIS_Ma
 //=======================================================================
 void AIS_Manipulator::SetPart (const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled)
 {
-  for (Standard_Integer anIt = 0; anIt < 4; ++anIt)
+  for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
   {
     SetPart (anIt, theMode, theIsEnabled);
   }
index f52df39..08edc43 100644 (file)
@@ -12002,6 +12002,7 @@ static int VManipulator (Draw_Interpretor& theDi,
   aCmd.AddOption ("followDragging",    "... {0|1} - set following dragging transform");
   aCmd.AddOption ("gap",               "... value - set gap between sub-parts");
   aCmd.AddOption ("part",              "... axis mode {0|1} - set visual part");
+  aCmd.AddOption ("parts",             "... all axes mode {0|1} - set visual part");
   aCmd.AddOption ("pos",               "... x y z [nx ny nz [xx xy xz]] - set position of manipulator");
   aCmd.AddOption ("size",              "... size - set size of manipulator");
   aCmd.AddOption ("zoomable",          "... {0|1} - set zoom persistence");
@@ -12109,6 +12110,18 @@ static int VManipulator (Draw_Interpretor& theDi,
 
     aManipulator->SetPart (anAxis, static_cast<AIS_ManipulatorMode> (aMode), aOnOff);
   }
+  if (aCmd.HasOption("parts", 2, Standard_True))
+  {
+    Standard_Integer aMode = aCmd.ArgInt("parts", 0);
+    Standard_Boolean aOnOff = aCmd.ArgBool("parts", 1);
+    if (aMode < 1 || aMode > 4)
+    {
+      std::cerr << theArgVec[0] << " error: mode value should be in range [1, 4].\n";
+      return 1;
+    }
+
+    aManipulator->SetPart(static_cast<AIS_ManipulatorMode>(aMode), aOnOff);
+  }
   if (aCmd.HasOption ("pos", 3, Standard_True))
   {
     gp_Pnt aLocation = aCmd.ArgPnt ("pos", 0);
@@ -13365,6 +13378,7 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
       "\n      '-followDragging    {0|1}'        - set following dragging transform"
       "\n      '-gap value'                      - set gap between sub-parts"
       "\n      '-part axis mode    {0|1}'        - set visual part"
+      "\n      '-parts axis mode   {0|1}'        - set visual part"
       "\n      '-pos x y z [nx ny nz [xx xy xz]' - set position of manipulator"
       "\n      '-size value'                     - set size of manipulator"
       "\n      '-zoomable {0|1}'                 - set zoom persistence",
index def2450..66e980f 100644 (file)
@@ -23,3 +23,9 @@ vmanipulator m -detach
 
 vmanipulator m -attach b -part 0 3 0
 vdump $imagedir/${casename}_3.png
+vmanipulator m -detach
+
+vmanipulator m -attach b -parts 1 0
+vdump $imagedir/${casename}_4.png
+
+set to_dump_screen 0