Salome HOME
#2205 Ability to customize the arrows and texts of dimensions: GUI correction to...
[modules/shaper.git] / src / SketcherPrs / SketcherPrs_LengthDimension.cpp
index 34fb6a6eed108e69660e376bb0a35e19eec050a9..7472d956b1a723cc55d3ee5563be78d8ada2cfd3 100644 (file)
 
 #include <ModelAPI_Data.h>
 #include <ModelAPI_AttributeDouble.h>
+#include <ModelAPI_AttributeInteger.h>
 
 #include <AIS_DisplaySpecialSymbol.hxx>
 
-//#ifdef OCCT_28850_FIXED
+#define OCCT_28850_FIXED
 
 /// Creates an aspect to be shown in length/radius dimension presentations
 /// \return an instance of aspect
@@ -53,7 +54,7 @@ Handle(Prs3d_DimensionAspect) createDimensionAspect()
   anAspect->MakeText3d(false);
   anAspect->MakeTextShaded(false);
   anAspect->MakeUnitsDisplayed(false);
-  anAspect->TextAspect()->SetHeight(SketcherPrs_Tools::getDefaultTextHeight());
+  anAspect->TextAspect()->SetHeight(SketcherPrs_Tools::getConfigTextHeight());
   anAspect->ArrowAspect()->SetLength(SketcherPrs_Tools::getArrowSize());
 
   return anAspect;
@@ -64,21 +65,38 @@ Handle(Prs3d_DimensionAspect) createDimensionAspect()
 /// \param theDimValue an arrow value
 /// \param theTextSize an arrow value
 void updateArrows(Handle(Prs3d_DimensionAspect) theDimAspect,
-                  double theDimValue, double theTextSize)
+  double theDimValue, double theTextSize, SketcherPrs_Tools::LocationType theLocationType)
 {
-  double anArrowLength = theDimAspect->ArrowAspect()->Length();
-   // This is not realy correct way to get viewer scale.
-  double aViewerScale = (double) SketcherPrs_Tools::getDefaultArrowSize() / anArrowLength;
-
-  if(theTextSize > ((theDimValue - 3 * SketcherPrs_Tools::getArrowSize()) * aViewerScale)) {
-    theDimAspect->SetTextHorizontalPosition(Prs3d_DTHP_Left);
+  if (theLocationType == SketcherPrs_Tools::LOCATION_AUTOMATIC) {
+    double anArrowLength = theDimAspect->ArrowAspect()->Length();
+     // This is not realy correct way to get viewer scale.
+    double aViewerScale = (double) SketcherPrs_Tools::getConfigArrowSize() / anArrowLength;
+
+    if(theTextSize > ((theDimValue - 3 * SketcherPrs_Tools::getArrowSize()) * aViewerScale)) {
+      theDimAspect->SetTextHorizontalPosition(Prs3d_DTHP_Left);
+      theDimAspect->SetArrowOrientation(Prs3d_DAO_External);
+      theDimAspect->SetExtensionSize(
+        (theTextSize / aViewerScale + SketcherPrs_Tools::getArrowSize()) / 2.0);
+    } else {
+      theDimAspect->SetTextHorizontalPosition(Prs3d_DTHP_Center);
+      theDimAspect->SetArrowOrientation(Prs3d_DAO_Internal);
+    }
+  }
+  else if (theLocationType == SketcherPrs_Tools::LOCATION_RIGHT ||
+           theLocationType == SketcherPrs_Tools::LOCATION_LEFT) {
+    theDimAspect->SetTextHorizontalPosition(
+      theLocationType == SketcherPrs_Tools::LOCATION_LEFT ? Prs3d_DTHP_Left : Prs3d_DTHP_Right);
     theDimAspect->SetArrowOrientation(Prs3d_DAO_External);
+
+    double anArrowLength = theDimAspect->ArrowAspect()->Length();
+    // This is not realy correct way to get viewer scale.
+    double aViewerScale = (double) SketcherPrs_Tools::getConfigArrowSize() / anArrowLength;
     theDimAspect->SetExtensionSize(
-      (theTextSize / aViewerScale + SketcherPrs_Tools::getArrowSize()) / 2.0);
-  } else {
-    theDimAspect->SetTextHorizontalPosition(Prs3d_DTHP_Center);
-    theDimAspect->SetArrowOrientation(Prs3d_DAO_Internal);
+        (theTextSize / aViewerScale + SketcherPrs_Tools::getArrowSize()) / 2.0);
   }
+  theDimAspect->TextAspect()->SetFont(Config_PropManager::string(SKETCH_TAB_NAME,
+                                      "dimension_font").c_str());
+
   theDimAspect->SetArrowTailSize(theDimAspect->ArrowAspect()->Length());
   // The value of vertical aligment is sometimes changed
   theDimAspect->TextAspect()->SetVerticalJustification(Graphic3d_VTA_CENTER);
@@ -107,9 +125,9 @@ SketcherPrs_LengthDimension::SketcherPrs_LengthDimension(ModelAPI_Feature* theCo
 
 #ifdef OCCT_28850_FIXED
   if (theConstraint->getKind() == SketchPlugin_ConstraintDistanceHorizontal::ID())
-    SetDirection(true, mySketcherPlane->dirX()->impl<gp_Dir>());
+    SetDirection(mySketcherPlane->dirX()->impl<gp_Dir>(), true);
   else if (theConstraint->getKind() == SketchPlugin_ConstraintDistanceVertical::ID())
-    SetDirection(true, mySketcherPlane->dirY()->impl<gp_Dir>());
+    SetDirection(mySketcherPlane->dirY()->impl<gp_Dir>(), true);
 #endif
 }
 
@@ -152,7 +170,22 @@ void SketcherPrs_LengthDimension::Compute(
   double aTextSize = 0.0;
   GetValueString(aTextSize);
 
-  updateArrows(DimensionAspect(), GetValue(), aTextSize);
+  std::string aLocationAttribute;
+  std::string aConstraintKind = myConstraint->getKind();
+  if (aConstraintKind == SketchPlugin_ConstraintLength::ID())
+    aLocationAttribute = SketchPlugin_ConstraintLength::LOCATION_TYPE_ID();
+  else if (aConstraintKind == SketchPlugin_ConstraintDistance::ID())
+    aLocationAttribute = SketchPlugin_ConstraintDistance::LOCATION_TYPE_ID();
+  else if (aConstraintKind == SketchPlugin_ConstraintDistanceHorizontal::ID())
+    aLocationAttribute = SketchPlugin_ConstraintDistanceHorizontal::LOCATION_TYPE_ID();
+  else if (aConstraintKind == SketchPlugin_ConstraintDistanceVertical::ID())
+    aLocationAttribute = SketchPlugin_ConstraintDistanceVertical::LOCATION_TYPE_ID();
+
+  AttributeIntegerPtr aLocAttr = std::dynamic_pointer_cast<ModelAPI_AttributeInteger>
+    (myConstraint->data()->attribute(aLocationAttribute));
+  SketcherPrs_Tools::LocationType aLocationType = aLocAttr->isInitialized() ?
+    (SketcherPrs_Tools::LocationType)(aLocAttr->value()) : SketcherPrs_Tools::LOCATION_AUTOMATIC;
+  updateArrows(DimensionAspect(), GetValue(), aTextSize, aLocationType);
 
   // Update text visualization: parameter value or parameter text
   myStyleListener->updateDimensions(this, myValue);