const Standard_Integer theMode)
{
//Check mode
- AIS_ManipulatorMode aMode = (AIS_ManipulatorMode) theMode;
+ const AIS_ManipulatorMode aMode = (AIS_ManipulatorMode) theMode;
if (aMode == AIS_MM_None)
{
return;
}
Handle(SelectMgr_EntityOwner) anOwner;
- if (aMode == AIS_MM_None)
- {
- anOwner = new SelectMgr_EntityOwner (this, 5);
- }
- if (aMode == AIS_MM_Translation || aMode == AIS_MM_None)
+ // Sensitivity calculation for manipulator parts allows to avoid
+ // overlapping of sensitive areas when size of manipulator is small.
+ // Sensitivity is calculated relative to the default size of the manipulator (100.0f).
+ const Standard_ShortReal aSensitivityCoef = myAxes[0].Size() / 100.0f;
+ const Standard_Integer aHighSensitivity = Max (Min (RealToInt (aSensitivityCoef * 15), 15), 3); // clamp sensitivity within range [3, 15]
+ const Standard_Integer aLowSensitivity = Max (Min (RealToInt (aSensitivityCoef * 10), 10), 2); // clamp sensitivity within range [2, 10]
+
+ switch (aMode)
+ {
+ case AIS_MM_Translation:
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
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());
- aLine->SetSensitivityFactor (15);
+ Handle(Select3D_SensitiveSegment) aLine = new Select3D_SensitiveSegment(anOwner, gp::Origin(), anAxis.TranslatorTipPosition());
+ aLine->SetSensitivityFactor (aHighSensitivity);
theSelection->Add (aLine);
// enlarge sensitivity by triangulation
- Handle(Select3D_SensitivePrimitiveArray) aTri = new Select3D_SensitivePrimitiveArray (anOwner);
+ Handle(Select3D_SensitivePrimitiveArray) aTri = new Select3D_SensitivePrimitiveArray(anOwner);
aTri->InitTriangulation (anAxis.TriangleArray()->Attributes(), anAxis.TriangleArray()->Indices(), TopLoc_Location());
theSelection->Add (aTri);
}
+ break;
}
-
- if (aMode == AIS_MM_Rotation || aMode == AIS_MM_None)
+ case AIS_MM_Rotation:
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
continue;
}
const Axis& anAxis = myAxes[anIt];
- if (aMode != AIS_MM_None)
- {
- anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Rotation, 9);
- }
+ anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Rotation, 9);
+
// define sensitivity by circle
- const gp_Circ aGeomCircle (gp_Ax2 (gp::Origin(), anAxis.ReferenceAxis().Direction()), anAxis.RotatorDiskRadius());
- Handle(Select3D_SensitiveCircle) aCircle = new ManipSensCircle (anOwner, aGeomCircle);
- aCircle->SetSensitivityFactor (15);
- theSelection->Add (aCircle);
+ const gp_Circ aGeomCircle (gp_Ax2(gp::Origin(), anAxis.ReferenceAxis().Direction()), anAxis.RotatorDiskRadius());
+ Handle(Select3D_SensitiveCircle) aCircle = new ManipSensCircle(anOwner, aGeomCircle);
+ aCircle->SetSensitivityFactor (aLowSensitivity);
+ theSelection->Add(aCircle);
// enlarge sensitivity by triangulation
- Handle(Select3D_SensitiveTriangulation) aTri = new ManipSensTriangulation (anOwner, myAxes[anIt].RotatorDisk().Triangulation(), anAxis.ReferenceAxis().Direction());
+ Handle(Select3D_SensitiveTriangulation) aTri = new ManipSensTriangulation(anOwner, myAxes[anIt].RotatorDisk().Triangulation(), anAxis.ReferenceAxis().Direction());
theSelection->Add (aTri);
}
+ break;
}
-
- if (aMode == AIS_MM_Scaling || aMode == AIS_MM_None)
+ case AIS_MM_Scaling:
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
{
continue;
}
- if (aMode != AIS_MM_None)
- {
- anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Scaling, 9);
- }
+ anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Scaling, 9);
+
// define sensitivity by point
- Handle(Select3D_SensitivePoint) aPnt = new Select3D_SensitivePoint (anOwner, myAxes[anIt].ScalerCubePosition());
- aPnt->SetSensitivityFactor (15);
+ Handle(Select3D_SensitivePoint) aPnt = new Select3D_SensitivePoint(anOwner, myAxes[anIt].ScalerCubePosition());
+ aPnt->SetSensitivityFactor (aHighSensitivity);
theSelection->Add (aPnt);
// enlarge sensitivity by triangulation
- Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation (anOwner, myAxes[anIt].ScalerCube().Triangulation(), TopLoc_Location(), Standard_True);
+ Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation(anOwner, myAxes[anIt].ScalerCube().Triangulation(), TopLoc_Location(), Standard_True);
theSelection->Add (aTri);
}
+ break;
}
-
- if (aMode == AIS_MM_TranslationPlane || aMode == AIS_MM_None)
+ case AIS_MM_TranslationPlane:
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
{
continue;
}
- if (aMode != AIS_MM_None)
- {
- anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_TranslationPlane, 9);
- }
+ anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_TranslationPlane, 9);
// define sensitivity by two crossed lines
- gp_Pnt aP1, aP2;
- aP1 = myAxes[((anIt + 1) % 3)].TranslatorTipPosition();
- aP2 = myAxes[((anIt + 2) % 3)].TranslatorTipPosition();
+ Standard_Real aSensitivityOffset = ZoomPersistence() ? aHighSensitivity * (0.5 + M_SQRT2) : 0.0;
+ gp_Pnt aP1 = myAxes[((anIt + 1) % 3)].TranslatorTipPosition().Translated (myAxes[((anIt + 2) % 3)].ReferenceAxis().Direction().XYZ() * aSensitivityOffset);
+ gp_Pnt aP2 = myAxes[((anIt + 2) % 3)].TranslatorTipPosition().Translated (myAxes[((anIt + 1) % 3)].ReferenceAxis().Direction().XYZ() * aSensitivityOffset);
gp_XYZ aMidP = (aP1.XYZ() + aP2.XYZ()) / 2.0;
+ gp_XYZ anOrig = aMidP.Normalized().Multiplied (aSensitivityOffset);
Handle(Select3D_SensitiveSegment) aLine1 = new Select3D_SensitiveSegment(anOwner, aP1, aP2);
- aLine1->SetSensitivityFactor(10);
- theSelection->Add(aLine1);
- Handle(Select3D_SensitiveSegment) aLine2 = new Select3D_SensitiveSegment(anOwner, gp::Origin(), aMidP);
- aLine2->SetSensitivityFactor(10);
- theSelection->Add(aLine2);
+ aLine1->SetSensitivityFactor(aLowSensitivity);
+ theSelection->Add (aLine1);
+ Handle(Select3D_SensitiveSegment) aLine2 = new Select3D_SensitiveSegment(anOwner, anOrig, aMidP);
+ aLine2->SetSensitivityFactor (aLowSensitivity);
+ theSelection->Add (aLine2);
// enlarge sensitivity by triangulation
- Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation(anOwner, myAxes[anIt].DraggerSector().Triangulation(), TopLoc_Location(), Standard_True);
- theSelection->Add(aTri);
+ Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation(anOwner, myAxes[anIt].DraggerSector().Triangulation(), TopLoc_Location(), Standard_True);
+ theSelection->Add (aTri);
}
+ break;
+ }
+ default:
+ {
+ anOwner = new SelectMgr_EntityOwner(this, 5);
+ break;
+ }
}
}