Salome HOME
Fix for the issue #1928
[modules/shaper.git] / src / GeomAPI / GeomAPI_AISObject.cpp
index 3f7646688b80eab7f6c9736522d5c8b05eec0de3..7f2fd801116d550a4a2752e46ab45659a217ef85 100644 (file)
@@ -44,7 +44,7 @@ GeomAPI_AISObject::GeomAPI_AISObject()
 GeomAPI_AISObject::~GeomAPI_AISObject()
 {
   if (!empty()) {
-    // This is necessary for correct deletion of Handle entity. 
+    // This is necessary for correct deletion of Handle entity.
     // Without this Handle does not decremented counter to 0
     Handle(AIS_InteractiveObject) *anAIS = implPtr<Handle(AIS_InteractiveObject)>();
     anAIS->Nullify();
@@ -75,7 +75,7 @@ void GeomAPI_AISObject::createShape(std::shared_ptr<GeomAPI_Shape> theShape)
     // Set default point as a '+' symbol
     Handle(AIS_Shape) aShape = new AIS_Shape(aTDS);
     Handle(Prs3d_Drawer) aDrawer = aShape->Attributes();
-    if (aDrawer->HasOwnPointAspect()) 
+    if (aDrawer->HasOwnPointAspect())
       aDrawer->PointAspect()->SetTypeOfMarker(Aspect_TOM_PLUS);
     else
       aDrawer->SetPointAspect(new Prs3d_PointAspect(Aspect_TOM_PLUS, Quantity_NOC_YELLOW, 1.));
@@ -181,7 +181,7 @@ void GeomAPI_AISObject::createRadius(std::shared_ptr<GeomAPI_Circ> theCircle,
   // TODO: a bug in AIS_RadiusDimension:
   // The anchor point can't be myCirc.Location() - an exception is raised.
   // But we need exactly this case...
-  // We want to show a radius dimension starting from the circle centre and 
+  // We want to show a radius dimension starting from the circle centre and
   // ending at the user-defined point.
   // Also, if anchor point coincides with myP2, the radius dimension is not displayed at all.
   std::shared_ptr<GeomAPI_Pnt> anAnchor = theCircle->project(theFlyoutPoint);
@@ -374,6 +374,41 @@ void GeomAPI_AISObject::getColor(int& theR, int& theG, int& theB)
   theB = (int)(aColor.Blue()*255.);
 }
 
+bool GeomAPI_AISObject::setDeflection(const double theDeflection)
+{
+  bool isModified = false;
+  Handle(AIS_InteractiveObject) anAIS = impl<Handle(AIS_InteractiveObject)>();
+  if (!anAIS.IsNull()) {
+    Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(anAIS);
+    if (!anAISShape.IsNull()) {
+      Standard_Real aCoefficient, aPreviousCoefficient;
+      anAISShape->OwnDeviationCoefficient(aCoefficient, aPreviousCoefficient);
+      if (fabs(aCoefficient-theDeflection) > Precision::Confusion()) {
+        isModified = true;
+        anAISShape->SetOwnDeviationCoefficient(theDeflection);
+        // redisplay is necessary here to update presentation in all modes
+        // Standard True flag. Displayer uses Standard False flag. If it will be changed in
+        // displayer, redisplay here will not be necessary. But performance should be checked.
+        anAISShape->Redisplay(Standard_True);
+      }
+    }
+  }
+  return isModified;
+}
+
+double GeomAPI_AISObject::getDeflection() const
+{
+  double aDeflection = -1;
+
+  Handle(AIS_InteractiveObject) anAIS = impl<Handle(AIS_InteractiveObject)>();
+  if (!anAIS.IsNull()) {
+    Handle(Prs3d_Drawer) aDrawer = anAIS->Attributes();
+    aDeflection = aDrawer->DeviationCoefficient();
+  }
+  return aDeflection;
+}
+
+
 bool GeomAPI_AISObject::empty() const
 {
   Handle(AIS_InteractiveObject) anAIS = const_cast<GeomAPI_AISObject*>(this)