]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue 1299 Angle presentation: 1. flyout point for AIS angle is always positive to...
authornds <nds@opencascade.com>
Fri, 18 Mar 2016 04:20:46 +0000 (07:20 +0300)
committernds <nds@opencascade.com>
Fri, 18 Mar 2016 04:20:46 +0000 (07:20 +0300)
src/PartSet/PartSet_SketcherMgr.cpp
src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp
src/SketchPlugin/SketchPlugin_ConstraintAngle.h
src/SketcherPrs/SketcherPrs_Angle.cpp

index 869ee082b33616d5db73e77f5476affd639b8e84..236124f63403168fd4daa1802849363696ff6d4b 100755 (executable)
@@ -611,7 +611,8 @@ void PartSet_SketcherMgr::onMouseDoubleClick(ModuleBase_IViewWindow* theWnd, QMo
       QList<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
       // Find corresponded widget to activate value editing
       foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
-        if (aWgt->attributeID() == "ConstraintValue") {
+        if (aWgt->attributeID() == "ConstraintValue" ||
+            aWgt->attributeID() == "AngleValue") {
           PartSet_WidgetEditor* anEditor = dynamic_cast<PartSet_WidgetEditor*>(aWgt);
           if (anEditor)
             anEditor->showPopupEditor();
index 348abe242fe88dbd685d4f9cb682cf8c69702a3b..728d7dfd180a6c5736f2a0248da64463c28e9370 100644 (file)
@@ -190,19 +190,32 @@ double SketchPlugin_ConstraintAngle::calculateAngle()
   if (aDirAngle < 0)
     aDirAngle += 2.0 * PI;
   anAngle = fabs(aDirAngle) * 180.0 / PI;
-  //anAngle = fabs(aDirA->angle(aDirB)) * 180.0 / PI;
+  /// an angle value should be corrected by the current angle type
+  anAngle = getAngleForType(anAngle);
+  return anAngle;
+}
+
+double SketchPlugin_ConstraintAngle::getAngleForType(double theAngle)
+{
+  double anAngle = theAngle;
+
+  std::shared_ptr<GeomAPI_Ax3> aPlane = SketchPlugin_Sketch::plane(sketch());
+  std::shared_ptr<GeomAPI_Dir> aNormal = aPlane->normal();
+  bool aPositiveNormal = !(aNormal->x() < 0 || aNormal->y() < 0 || aNormal->z() < 0);
 
+  std::shared_ptr<ModelAPI_Data> aData = data();
   std::shared_ptr<ModelAPI_AttributeInteger> aTypeAttr = std::dynamic_pointer_cast<
       ModelAPI_AttributeInteger>(aData->attribute(SketchPlugin_ConstraintAngle::TYPE_ID()));
   SketcherPrs_Tools::AngleType anAngleType = (SketcherPrs_Tools::AngleType)(aTypeAttr->value());
   switch (anAngleType) {
     case SketcherPrs_Tools::ANGLE_DIRECT:
+      anAngle = aPositiveNormal ? theAngle : 360 - theAngle;
     break;
     case SketcherPrs_Tools::ANGLE_COMPLEMENTARY:
-      anAngle = 180 - anAngle;
+      anAngle = 180 - theAngle;
     break;
     case SketcherPrs_Tools::ANGLE_BACKWARD:
-      anAngle = 360 - anAngle;
+      anAngle = aPositiveNormal ? 360 - theAngle : theAngle;
     break;
     default:
       break;
@@ -216,22 +229,8 @@ void SketchPlugin_ConstraintAngle::updateAngleValue()
     ModelAPI_AttributeDouble>(data()->attribute(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID()));
   double anAngle = aValueAttr->value();
 
-  std::shared_ptr<ModelAPI_Data> aData = data();
-  std::shared_ptr<ModelAPI_AttributeInteger> aTypeAttr = std::dynamic_pointer_cast<
-      ModelAPI_AttributeInteger>(aData->attribute(SketchPlugin_ConstraintAngle::TYPE_ID()));
-  SketcherPrs_Tools::AngleType anAngleType = (SketcherPrs_Tools::AngleType)(aTypeAttr->value());
-  switch (anAngleType) {
-    case SketcherPrs_Tools::ANGLE_DIRECT:
-    break;
-    case SketcherPrs_Tools::ANGLE_COMPLEMENTARY:
-      anAngle = 180 - anAngle;
-    break;
-    case SketcherPrs_Tools::ANGLE_BACKWARD:
-      anAngle = 360 - anAngle;
-    break;
-    default:
-      break;
-  }
+  /// an angle value should be corrected by the current angle type
+  anAngle = getAngleForType(anAngle);
   aValueAttr = std::dynamic_pointer_cast<
                   ModelAPI_AttributeDouble>(data()->attribute(SketchPlugin_Constraint::VALUE()));
   aValueAttr->setValue(anAngle);
index c0f1c712c49a10da4a0c7e9e64ae309cf934a21d..d3dd5c8adab1268f4c73c9e352045893fa71509e 100644 (file)
@@ -78,6 +78,12 @@ class SketchPlugin_ConstraintAngle : public SketchPlugin_ConstraintBase
   /// Calculate current value of the angle
   double calculateAngle();
 
+  /// Converts the angle value according to the current angle type and sketch plane normal.
+  /// The in/out angle is in degree.
+  /// \param theAngle a source for the calculated angle
+  /// \param a double angle value
+  double getAngleForType(double theAngle);
+
   /// Update value of VALUE attribute by the combination of the current angle type and angle value
   void updateAngleValue();
 
index 2d4e5838e0602850e304151545f1a75a9efeb906..d26d5999cfb89e626c455a32a0b5d10d443bc1fc 100644 (file)
@@ -154,6 +154,8 @@ void SketcherPrs_Angle::Compute(const Handle(PrsMgr_PresentationManager3d)& theP
   gp_Pnt aFlyPnt(aFlyoutPnt->x(), aFlyoutPnt->y(), aFlyoutPnt->z());
   gp_XYZ aFlyDir = aFlyPnt.XYZ() - aCenter.XYZ();
   double aDist = aFlyDir.Dot(aBisector.XYZ());
+  // make a positive distance in order to AIS angle presentation is not reversed
+  aDist = fabs(aDist);
   SetFlyout(aDist);
 
   // Angle value is in degrees