Salome HOME
Bug #1279: Bad display of distance constraint in the sktech
[modules/shaper.git] / src / SketcherPrs / SketcherPrs_Radius.cpp
index 0846607545204f88e73403d9734f3b077025f423..56f9d7f0e252e12b4cef13725cff88cf535a0eb2 100644 (file)
@@ -25,6 +25,9 @@ static const gp_Circ MyDefCirc(gp_Ax2(gp_Pnt(0,0,0), gp_Dir(0,0,1)), 1);
 IMPLEMENT_STANDARD_HANDLE(SketcherPrs_Radius, AIS_RadiusDimension);
 IMPLEMENT_STANDARD_RTTIEXT(SketcherPrs_Radius, AIS_RadiusDimension);
 
+static const Standard_ExtCharacter MyEmptySymbol(' ');
+static const Standard_ExtCharacter MySummSymbol(0x03A3);
+
 SketcherPrs_Radius::SketcherPrs_Radius(ModelAPI_Feature* theConstraint, 
                                        const std::shared_ptr<GeomAPI_Ax3>& thePlane)
 : AIS_RadiusDimension(MyDefCirc), myConstraint(theConstraint), myPlane(thePlane)
@@ -99,11 +102,38 @@ void SketcherPrs_Radius::Compute(const Handle(PrsMgr_PresentationManager3d)& the
   SetMeasuredGeometry(aCirc, anAncorPnt);
   SetCustomValue(aRadius);
 
-  myAspect->SetExtensionSize(myAspect->ArrowAspect()->Length());
+  // Update variable aspect parameters (depending on viewer scale)
+  double anArrowLength = myAspect->ArrowAspect()->Length();
+   // This is not realy correct way to get viewer scale.
+  double aViewerScale = (double) SketcherPrs_Tools::getDefaultArrowSize() / anArrowLength;
+  double aDimensionValue = GetValue();
+  double aTextSize = 0.0;
+  GetValueString(aTextSize);
+
+  if(aTextSize > ((aDimensionValue - 2 * SketcherPrs_Tools::getArrowSize()) * aViewerScale)) {
+    myAspect->SetTextHorizontalPosition(Prs3d_DTHP_Left);
+    myAspect->SetArrowOrientation(Prs3d_DAO_External);
+    myAspect->SetExtensionSize(aTextSize / aViewerScale - SketcherPrs_Tools::getArrowSize() / 2.0);
+  } else {
+    myAspect->SetTextHorizontalPosition(Prs3d_DTHP_Center);
+    myAspect->SetArrowOrientation(Prs3d_DAO_Internal);
+  }
   myAspect->SetArrowTailSize(myAspect->ArrowAspect()->Length());
+
   // The value of vertical aligment is sometimes changed
   myAspect->TextAspect()->SetVerticalJustification(Graphic3d_VTA_CENTER);
 
+  AttributeDoublePtr aValue = myConstraint->data()->real(SketchPlugin_Constraint::VALUE());
+  std::set<std::string> aParams = aValue->usedParameters();
+  if (aParams.size() > 0) {
+    SetSpecialSymbol(MySummSymbol);
+    SetDisplaySpecialSymbol(AIS_DSS_Before);
+  }
+  else {
+    SetSpecialSymbol(MyEmptySymbol);
+    SetDisplaySpecialSymbol(AIS_DSS_Before);
+  }
+
   AIS_RadiusDimension::Compute(thePresentationManager, thePresentation, theMode);
 }