From f15c5f90c3b0600f5095d623ad9f7d874d0036ce Mon Sep 17 00:00:00 2001 From: aba Date: Wed, 24 Oct 2018 19:25:12 +0300 Subject: [PATCH] 0030291: Visualization - manipulator crashes when is attached with scaling mode disabled - in ComputeSelection() method checks are added to avoid taking triangulation of manipulator parts that are not computed --- src/AIS/AIS_Manipulator.cxx | 26 +++++++++++++++++++++++++- src/AIS/AIS_Manipulator.hxx | 6 ++++++ tests/v3d/manipulator/disable_parts | 25 +++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 tests/v3d/manipulator/disable_parts diff --git a/src/AIS/AIS_Manipulator.cxx b/src/AIS/AIS_Manipulator.cxx index 9da4a17cb5..367b7bae18 100644 --- a/src/AIS/AIS_Manipulator.cxx +++ b/src/AIS/AIS_Manipulator.cxx @@ -271,6 +271,18 @@ void AIS_Manipulator::SetPart (const Standard_Integer theAxisIndex, const AIS_Ma } } +//======================================================================= +//function : SetPart +//purpose : +//======================================================================= +void AIS_Manipulator::SetPart (const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled) +{ + for (Standard_Integer anIt = 0; anIt < 3; ++anIt) + { + SetPart (anIt, theMode, theIsEnabled); + } +} + //======================================================================= //function : EnableMode //purpose : @@ -995,10 +1007,14 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe { for (Standard_Integer anIt = 0; anIt < 3; ++anIt) { + if (!myAxes[anIt].HasTranslation()) + { + continue; + } const Axis& anAxis = myAxes[anIt]; if (aMode != AIS_MM_None) { - anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Translation, 9); + anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Translation, 9); } // define sensitivity by line Handle(Select3D_SensitiveSegment) aLine = new Select3D_SensitiveSegment (anOwner, gp::Origin(), anAxis.TranslatorTipPosition()); @@ -1016,6 +1032,10 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe { for (Standard_Integer anIt = 0; anIt < 3; ++anIt) { + if (!myAxes[anIt].HasRotation()) + { + continue; + } const Axis& anAxis = myAxes[anIt]; if (aMode != AIS_MM_None) { @@ -1036,6 +1056,10 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe { for (Standard_Integer anIt = 0; anIt < 3; ++anIt) { + if (!myAxes[anIt].HasScaling()) + { + continue; + } if (aMode != AIS_MM_None) { anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Scaling, 9); diff --git a/src/AIS/AIS_Manipulator.hxx b/src/AIS/AIS_Manipulator.hxx index d3c2947abf..1ba8d1cb18 100644 --- a/src/AIS/AIS_Manipulator.hxx +++ b/src/AIS/AIS_Manipulator.hxx @@ -112,6 +112,12 @@ public: //! @warning Raises program error if axis index is < 0 or > 2. Standard_EXPORT void SetPart (const Standard_Integer theAxisIndex, const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled); + //! Disable or enable visual parts for translation, rotation or scaling for ALL axes. + //! By default all parts are enabled (will be displayed). + //! @warning Enabling or disabling of visual parts of manipulator does not manage the manipulation (selection) mode. + //! @warning Raises program error if axis index is < 0 or > 2. + Standard_EXPORT void SetPart (const AIS_ManipulatorMode theMode, const Standard_Boolean theIsEnabled); + //! Behavior settings to be applied when performing transformation: //! - FollowTranslation - whether the manipulator will be moved together with an object. //! - FollowRotation - whether the manipulator will be rotated together with an object. diff --git a/tests/v3d/manipulator/disable_parts b/tests/v3d/manipulator/disable_parts new file mode 100644 index 0000000000..def2450d3e --- /dev/null +++ b/tests/v3d/manipulator/disable_parts @@ -0,0 +1,25 @@ +puts "=====================================" +puts "Disable functional parts for manipulator axes" +puts "=====================================" + +pload MODELING VISUALIZATION +vclear +vclose ALL +vinit View1 +vaxo +vzbufftrihedron + +box b 500 500 1 50 100 150 +vdisplay b -dispMode 1 +vfit + +vmanipulator m -attach b -part 0 1 0 +vdump $imagedir/${casename}_1.png +vmanipulator m -detach + +vmanipulator m -attach b -part 0 2 0 +vdump $imagedir/${casename}_2.png +vmanipulator m -detach + +vmanipulator m -attach b -part 0 3 0 +vdump $imagedir/${casename}_3.png -- 2.20.1