]> OCCT Git - occt-copy.git/commitdiff
Add the ability to make the arrow in the dimension zoomable or not zoomable
authormzernova <mzernova@opencascade.com>
Sun, 21 Jun 2020 22:40:02 +0000 (01:40 +0300)
committerNatalia Ermolaeva <natalia.ermolaeva@opencascade.com>
Tue, 15 Jun 2021 07:35:47 +0000 (10:35 +0300)
bugs/vis/bug27919: test case added

(cherry picked from commit 957fe01c241a87fb1a6e5f49c12ea187922d6874)
(cherry picked from commit 7640d07d284ebbafc48177d2ad4e76cd9ffd8095)
(cherry picked from commit 35f302fa341f3ca62d428882a760775c795f5c7c)
(cherry picked from commit ba0adbfc419a3a564a638bdbf8db500bba799c17)
(cherry picked from commit 43967a7bef6270292e0ef861ff3ed6049ba3f565)
(cherry picked from commit 2f47659bdd93deedf03f11b7f0758f6545a855f3)
(cherry picked from commit 5cc4ee90777566ac49a7e3eab04978711c531882)

src/OpenGl/OpenGl_Structure.cxx
src/Prs3d/Prs3d_ArrowAspect.cxx
src/Prs3d/Prs3d_ArrowAspect.hxx
src/PrsDim/PrsDim_AngleDimension.cxx
src/PrsDim/PrsDim_Dimension.cxx
src/ViewerTest/ViewerTest_RelationCommands.cxx
tests/bugs/vis/bug27919 [new file with mode: 0644]

index 72df9594ad51856aed224b6263416caf21aa0bda..d8c3c718e2d2128cc863672fa6048ec55dd781ef 100644 (file)
@@ -403,7 +403,7 @@ void OpenGl_Structure::renderGeometry (const Handle(OpenGl_Workspace)& theWorksp
         OpenGl_Mat4& aModelWorld = aCtx->ModelWorldState.ChangeCurrent();
         aStartPnt = aTrsfPersistence->AnchorPoint();
         Graphic3d_Vec4 anAnchorPoint = aModelWorld * Graphic3d_Vec4 (aStartPnt.X(), aStartPnt.Y(), aStartPnt.Z(), 1.0);
-        aModelWorld.InitIdentity();
+        aModelWorld.SetColumn (3, Graphic3d_Vec4 (Graphic3d_Vec3 (0.0), 1.0));
         aTrsfPersistence->SetAnchorPoint (gp_Pnt (anAnchorPoint.x(), anAnchorPoint.y(), anAnchorPoint.z()));
       }
       applyPersistence (aCtx, aTrsfPersistence, Standard_True);
index 130d868900a712d4966f70dbfa1ce61e13e3a7b8..aac00a74ef583f1979ae0bf9742b335335fae807 100644 (file)
@@ -26,7 +26,8 @@ IMPLEMENT_STANDARD_RTTIEXT(Prs3d_ArrowAspect, Prs3d_BasicAspect)
 Prs3d_ArrowAspect::Prs3d_ArrowAspect()
 : myArrowAspect (new Graphic3d_AspectLine3d (Quantity_Color(Quantity_NOC_WHITE), Aspect_TOL_SOLID, 1.0)),
   myAngle (M_PI / 180.0 * 10.0),
-  myLength(1.0)
+  myLength (1.0),
+  myIsZoomable (Standard_True)
 {
   //
 }
index f63e59a41790194aa0c1300817ab320a3965d4b9..0c9276f0615881271934132f6b343803de644242 100644 (file)
@@ -51,6 +51,12 @@ public:
   //! Returns the current value of the length used when drawing an arrow.
   Standard_Real Length() const { return myLength; }
 
+  //! Turns usage of arrow zoomable on/off
+  void SetZoomable (bool theIsZoomable) { myIsZoomable = theIsZoomable; }
+
+  //! Returns TRUE when the Arrow Zoomable is on.
+  bool Zoomable() const { return myIsZoomable; }
+
   void SetColor (const Quantity_Color& theColor) { myArrowAspect->SetColor (theColor); }
   
   const Handle(Graphic3d_AspectLine3d)& Aspect() const { return myArrowAspect; }
@@ -65,6 +71,7 @@ protected:
   Handle(Graphic3d_AspectLine3d) myArrowAspect;
   Standard_Real myAngle;
   Standard_Real myLength;
+  Standard_Boolean myIsZoomable;
 
 };
 
index d3e9c16b51e2fe9e0f55aca56bbb0be259ecbfa7..f0bf97e3e5f07555dc2267d0c78042e31e4f3bdd 100644 (file)
@@ -691,8 +691,14 @@ void PrsDim_AngleDimension::Compute (const Handle(PrsMgr_PresentationManager3d)&
 
   aFirstArrowBegin  = aFirstAttach;
   aSecondArrowBegin = aSecondAttach;
-  aFirstArrowEnd    = aFirstAttach.Translated (-aFirstArrowVec);
-  aSecondArrowEnd   = aSecondAttach.Translated (-aSecondArrowVec);
+  aFirstArrowEnd    = aFirstAttach;
+  aSecondArrowEnd   = aSecondAttach;
+
+  if (aDimensionAspect->ArrowAspect()->Zoomable())
+  {
+    aFirstArrowEnd.Translate (-aFirstArrowVec);
+    aSecondArrowEnd.Translate (-aSecondArrowVec);
+  }
 
   // Group1: stenciling text and the angle dimension arc
   thePresentation->NewGroup();
index aa20c851017508433dee2cd2a44f691da02b6a81..878115eead935592ac587b62af573a9fd3b46319 100644 (file)
@@ -363,6 +363,7 @@ void PrsDim_Dimension::DrawArrow (const Handle(Prs3d_Presentation)& thePresentat
 
   Standard_Real aLength = myDrawer->DimensionAspect()->ArrowAspect()->Length();
   Standard_Real anAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle();
+  Standard_Boolean isZoomable = myDrawer->DimensionAspect()->ArrowAspect()->Zoomable();
 
   if (myDrawer->DimensionAspect()->IsArrows3d())
   {
@@ -375,16 +376,17 @@ void PrsDim_Dimension::DrawArrow (const Handle(Prs3d_Presentation)& thePresentat
   }
   else
   {
+    gp_Pnt aLocation = isZoomable ? theLocation : gp::Origin();
     gp_Pnt aLeftPoint (gp::Origin());
     gp_Pnt aRightPoint (gp::Origin());
     const gp_Dir& aPlane = GetPlane().Axis().Direction();
 
-    PointsForArrow (theLocation, theDirection, aPlane, aLength, anAngle, aLeftPoint, aRightPoint);
+    PointsForArrow (aLocation, theDirection, aPlane, aLength, anAngle, aLeftPoint, aRightPoint);
 
     Handle(Graphic3d_ArrayOfTriangles) anArrow = new Graphic3d_ArrayOfTriangles(3);
 
     anArrow->AddVertex (aLeftPoint);
-    anArrow->AddVertex (theLocation);
+    anArrow->AddVertex (aLocation);
     anArrow->AddVertex (aRightPoint);
 
     // Set aspect for arrow triangles
@@ -400,6 +402,10 @@ void PrsDim_Dimension::DrawArrow (const Handle(Prs3d_Presentation)& thePresentat
 
     aGroup->SetPrimitivesAspect (aShadingStyle);
     aGroup->AddPrimitiveArray (anArrow);
+    if (!isZoomable)
+    {
+      aGroup->SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_ZoomPers, theLocation));
+    }
   }
 
   SelectionGeometry::Arrow& aSensitiveArrow = mySelectionGeom.NewArrow();
@@ -707,10 +713,16 @@ void PrsDim_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& th
 
   aFirstArrowBegin  = aLineBegPoint;
   aSecondArrowBegin = aLineEndPoint;
-  aFirstArrowEnd    = aLineBegPoint.Translated (-gp_Vec (aFirstArrowDir).Scaled (anArrowLength));
-  aSecondArrowEnd   = aLineEndPoint.Translated (-gp_Vec (aSecondArrowDir).Scaled (anArrowLength));
+  aFirstArrowEnd    = aLineBegPoint;
+  aSecondArrowEnd   = aLineEndPoint;
+
+  if (aDimensionAspect->ArrowAspect()->Zoomable())
+  {
+    aFirstArrowEnd.Translate (-gp_Vec (aFirstArrowDir).Scaled (anArrowLength));
+    aSecondArrowEnd.Translate (-gp_Vec (aSecondArrowDir).Scaled (anArrowLength));
+  }
 
-  gp_Pnt aCenterLineBegin = isArrowsExternal 
+  gp_Pnt aCenterLineBegin = isArrowsExternal
     ? aLineBegPoint : aFirstArrowEnd;
 
   gp_Pnt aCenterLineEnd = isArrowsExternal || theIsOneSide
index 351a2cb93ead34bea304a200da3244e73bdafd6a..23ba7239ef3d9b6dd27b489807170f1e9e0454b3 100644 (file)
@@ -377,6 +377,16 @@ static int ParseDimensionParams (Standard_Integer  theArgNum,
       if (aLocalParam == "internal") { theAspect->SetArrowOrientation (Prs3d_DAO_Internal); }
       if (aLocalParam == "fit")      { theAspect->SetArrowOrientation (Prs3d_DAO_Fit); }
     }
+    else if (aParam.IsEqual ("-zoomablearrow"))
+    {
+      TCollection_AsciiString aValue (theArgVec[++anIt]);
+      if (!aValue.IsIntegerValue())
+      {
+        Message::SendFail() << "Error: zoomable arrow value should be 0 or 1.";
+        return 1;
+      }
+      theAspect->ArrowAspect()->SetZoomable (Draw::Atoi (aValue.ToCString()) != 0);
+    }
     else if (aParam.IsEqual ("-arrowlength") || aParam.IsEqual ("-arlen"))
     {
       TCollection_AsciiString aValue (theArgVec[++anIt]);
@@ -1926,6 +1936,7 @@ void ViewerTest::RelationCommands(Draw_Interpretor& theCommands)
       "[-font FontName]\n"
       "[-label left|right|hcenter|hfit top|bottom|vcenter|vfit]\n"
       "[-arrow external|internal|fit]\n"
+      "[-zoomablearrow 0|1]\n"
       "[{-arrowlength|-arlen} RealArrowLength]\n"
       "[{-arrowangle|-arangle} ArrowAngle(degrees)]\n"
       "[-plane xoy|yoz|zox]\n"
@@ -1961,6 +1972,7 @@ void ViewerTest::RelationCommands(Draw_Interpretor& theCommands)
     "[-font FontName]\n"
     "[-label left|right|hcenter|hfit top|bottom|vcenter|vfit]\n"
     "[-arrow external|internal|fit]\n"
+    "[-zoomablearrow 0|1]\n"
     "[{-arrowlength|-arlen} RealArrowLength]\n"
     "[{-arrowangle|-arangle} ArrowAngle(degrees)]\n"
     "[-plane xoy|yoz|zox]\n"
diff --git a/tests/bugs/vis/bug27919 b/tests/bugs/vis/bug27919
new file mode 100644 (file)
index 0000000..038837c
--- /dev/null
@@ -0,0 +1,25 @@
+puts "============="
+puts "0027919: Visualization - support multiple transformation persistence groups within single presentation"
+puts "============="
+
+vinit 
+vtrihedron t1
+
+vpoint p11 -25 50 0
+vpoint p12 25 50 0
+vdimension dim -length -plane xoy -shapes p11 p12
+vdimparam dim -flyout 1 -arrowlength 30 -arrow internal -label hcenter -zoomablearrow 0
+
+vpoint p21 -100 0 0
+vpoint p22 0 0 0
+vpoint p23 100 0 0
+vdimension angle -angle -shapes p21 p22 p23 -arrowlength 30 -zoomablearrow 0
+
+vtop 
+vfit
+vzoom 1.5
+
+if {[vreadpixel 182 119 rgb name] != "BLACK"} { puts "ERROR: the arrow of the dimension should not be zoomable" }
+if {[vreadpixel 149 195 rgb name] != "BLACK"} { puts "ERROR: the arrow of the angle dimension should not be zoomable" }
+
+vdump $imagedir/${casename}.png