0024668: Null flyout value case in AIS_Dimension::SetTextPosition() method is not...
authoraba <aba@opencascade.com>
Thu, 20 Mar 2014 09:44:02 +0000 (13:44 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 20 Mar 2014 09:44:40 +0000 (13:44 +0400)
Corrected checks of working plane and dimension geometry.

Corrected remarks: IsComputed flag was added to the SelectionGeometry to check if it is filled; AdjustParameters() methods became const ones.

minor remark

src/AIS/AIS_AngleDimension.cxx
src/AIS/AIS_AngleDimension.hxx
src/AIS/AIS_DiameterDimension.cxx
src/AIS/AIS_Dimension.cxx
src/AIS/AIS_Dimension.hxx
src/AIS/AIS_LengthDimension.cxx
src/AIS/AIS_RadiusDimension.cxx

index 48b182a..bf01091 100644 (file)
@@ -145,19 +145,17 @@ void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Edge& theFirstEdge,
 {
   gp_Pln aComputedPlane;
 
-  myFirstShape   = theFirstEdge;
-  mySecondShape  = theSecondEdge;
-  myThirdShape   = TopoDS_Shape();
-  myGeometryType = GeometryType_Edges;
-  myIsValid      = InitTwoEdgesAngle (aComputedPlane);
+  myFirstShape      = theFirstEdge;
+  mySecondShape     = theSecondEdge;
+  myThirdShape      = TopoDS_Shape();
+  myGeometryType    = GeometryType_Edges;
+  myIsGeometryValid = InitTwoEdgesAngle (aComputedPlane);
 
-  if (myIsValid && !myIsPlaneCustom)
+  if (myIsGeometryValid && !myIsPlaneCustom)
   {
     ComputePlane();
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -176,15 +174,13 @@ void AIS_AngleDimension::SetMeasuredGeometry (const gp_Pnt& theFirstPoint,
   mySecondShape   = BRepLib_MakeVertex (myCenterPoint);
   myThirdShape    = BRepLib_MakeVertex (mySecondPoint);
   myGeometryType  = GeometryType_Points;
-  myIsValid       = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint);
+  myIsGeometryValid       = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint);
 
-  if (myIsValid && !myIsPlaneCustom)
+  if (myIsGeometryValid && !myIsPlaneCustom)
   {
     ComputePlane();
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -196,22 +192,20 @@ void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Vertex& theFirstVerte
                                               const TopoDS_Vertex& theSecondVertex,
                                               const TopoDS_Vertex& theThirdVertex)
 {
-  myFirstShape   = theFirstVertex;
-  mySecondShape  = theSecondVertex;
-  myThirdShape   = theThirdVertex;
-  myFirstPoint   = BRep_Tool::Pnt (theFirstVertex);
-  myCenterPoint  = BRep_Tool::Pnt (theSecondVertex);
-  mySecondPoint  = BRep_Tool::Pnt (theThirdVertex);
-  myGeometryType = GeometryType_Points;
-  myIsValid      = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint);
-
-  if (myIsValid && !myIsPlaneCustom)
+  myFirstShape      = theFirstVertex;
+  mySecondShape     = theSecondVertex;
+  myThirdShape      = theThirdVertex;
+  myFirstPoint      = BRep_Tool::Pnt (theFirstVertex);
+  myCenterPoint     = BRep_Tool::Pnt (theSecondVertex);
+  mySecondPoint     = BRep_Tool::Pnt (theThirdVertex);
+  myGeometryType    = GeometryType_Points;
+  myIsGeometryValid = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint);
+
+  if (myIsGeometryValid && !myIsPlaneCustom)
   {
     ComputePlane();
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -221,19 +215,17 @@ void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Vertex& theFirstVerte
 //=======================================================================
 void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theCone)
 {
-  myFirstShape   = theCone;
-  mySecondShape  = TopoDS_Shape();
-  myThirdShape   = TopoDS_Shape();
-  myGeometryType = GeometryType_Face;
-  myIsValid      = InitConeAngle();
+  myFirstShape      = theCone;
+  mySecondShape     = TopoDS_Shape();
+  myThirdShape      = TopoDS_Shape();
+  myGeometryType    = GeometryType_Face;
+  myIsGeometryValid = InitConeAngle();
 
-  if (myIsValid && !myIsPlaneCustom)
+  if (myIsGeometryValid && !myIsPlaneCustom)
   {
     ComputePlane();
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -244,19 +236,17 @@ void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theCone)
 void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace,
                                               const TopoDS_Face& theSecondFace)
 {
-  myFirstShape   = theFirstFace;
-  mySecondShape  = theSecondFace;
-  myThirdShape   = TopoDS_Shape();
-  myGeometryType = GeometryType_Faces;
-  myIsValid      = InitTwoFacesAngle();
+  myFirstShape      = theFirstFace;
+  mySecondShape     = theSecondFace;
+  myThirdShape      = TopoDS_Shape();
+  myGeometryType    = GeometryType_Faces;
+  myIsGeometryValid = InitTwoFacesAngle();
 
-  if (myIsValid && !myIsPlaneCustom)
+  if (myIsGeometryValid && !myIsPlaneCustom)
   {
     ComputePlane();
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -268,19 +258,17 @@ void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace,
                                               const TopoDS_Face& theSecondFace,
                                               const gp_Pnt& thePoint)
 {
-  myFirstShape   = theFirstFace;
-  mySecondShape  = theSecondFace;
-  myThirdShape   = TopoDS_Shape();
-  myGeometryType = GeometryType_Faces;
-  myIsValid      = InitTwoFacesAngle (thePoint);
+  myFirstShape      = theFirstFace;
+  mySecondShape     = theSecondFace;
+  myThirdShape      = TopoDS_Shape();
+  myGeometryType    = GeometryType_Faces;
+  myIsGeometryValid = InitTwoFacesAngle (thePoint);
 
-  if (myIsValid && !myIsPlaneCustom)
+  if (myIsGeometryValid && !myIsPlaneCustom)
   {
     ComputePlane();
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -518,7 +506,7 @@ Standard_Boolean AIS_AngleDimension::CheckPlane (const gp_Pln& thePlane)const
 //=======================================================================
 void AIS_AngleDimension::ComputePlane()
 {
-  if (!IsValid())
+  if (!myIsGeometryValid)
   {
     return;
   }
@@ -626,7 +614,7 @@ void AIS_AngleDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*
 
   if (IsTextPositionCustom())
   {
-    AdjustParameters (myFixedTextPosition,anExtensionSize, aHorisontalTextPos);
+    AdjustParameters (myFixedTextPosition,anExtensionSize, aHorisontalTextPos, myFlyout);
   }
 
   // Handle user-defined and automatic arrow placement
@@ -810,7 +798,7 @@ void AIS_AngleDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*
     Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments);
   }
 
-  myIsComputed = Standard_True;
+  mySelectionGeom.IsComputed = Standard_True;
 }
 
 //=======================================================================
@@ -1243,12 +1231,13 @@ void AIS_AngleDimension::SetTextPosition (const gp_Pnt& theTextPos)
 }
 
 //=======================================================================
-//function : AdjustAspectParameters
+//function : AdjustParameters
 //purpose  : 
 //=======================================================================
 void AIS_AngleDimension::AdjustParameters (const gp_Pnt& theTextPos,
                                            Standard_Real& theExtensionSize,
-                                           Prs3d_DimensionTextHorizontalPosition& theAlignment)
+                                           Prs3d_DimensionTextHorizontalPosition& theAlignment,
+                                           Standard_Real& theFlyout) const
 {
   Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect();
   Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length();
@@ -1290,9 +1279,7 @@ void AIS_AngleDimension::AdjustParameters (const gp_Pnt& theTextPos,
   // Horizontal center
   if (aTextPar > aParamBeg && aTextPar < aParamEnd)
   {
-    myFlyout = aRadius;
-
-    SetToUpdate();
+    theFlyout = aRadius;
     return;
   }
 
@@ -1302,9 +1289,7 @@ void AIS_AngleDimension::AdjustParameters (const gp_Pnt& theTextPos,
 
   if (aTextPar > aParamBeg  && aTextPar < aParamEnd)
   {
-    myFlyout = -aRadius;
-
-    SetToUpdate();
+    theFlyout = -aRadius;
     return;
   }
 
@@ -1326,7 +1311,7 @@ void AIS_AngleDimension::AdjustParameters (const gp_Pnt& theTextPos,
 
     gp_Vec aPosFlyoutDir = gp_Vec (myCenterPoint, myFirstPoint).Normalized().Scaled (aRadius);
 
-    myFlyout = aFirstTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion()
+    theFlyout = aFirstTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion()
                 ? -aRadius : aRadius;
   }
   else
@@ -1341,7 +1326,7 @@ void AIS_AngleDimension::AdjustParameters (const gp_Pnt& theTextPos,
 
     gp_Vec aPosFlyoutDir = gp_Vec (myCenterPoint, mySecondPoint).Normalized().Scaled (aRadius);
 
-    myFlyout = aSecondTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion()
+    theFlyout = aSecondTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion()
                 ? -aRadius : aRadius;
   }
 }
index 6de359f..3a44956 100755 (executable)
@@ -272,13 +272,14 @@ protected:
 
   //! Adjusts aspect parameters according the text position:
   //! extension size, vertical text alignment and flyout.
-  //! It changes flyout of the dimension.
   //! @param theTextPos [in] the user defined 3d point of text position.
   //! @param theExtensionSize [out] the adjusted extension size.
   //! @param theAlignment [out] the horizontal label alignment.
+  //! @param theFlyout [out] the adjusted value of flyout.
   Standard_EXPORT void AdjustParameters (const gp_Pnt& theTextPos,
                                          Standard_Real& theExtensionSize,
-                                         Prs3d_DimensionTextHorizontalPosition& theAlignment);
+                                         Prs3d_DimensionTextHorizontalPosition& theAlignment,
+                                         Standard_Real& theFlyout) const;
 
 protected:
 
index f34620c..244f46e 100644 (file)
@@ -109,13 +109,13 @@ gp_Pnt AIS_DiameterDimension::AnchorPoint()
 //=======================================================================
 void AIS_DiameterDimension::SetMeasuredGeometry (const gp_Circ& theCircle)
 {
-  myCircle       = theCircle;
-  myGeometryType = GeometryType_Edge;
-  myShape        = BRepLib_MakeEdge (theCircle);
-  myAnchorPoint  = gp::Origin();
-  myIsValid      = IsValidCircle (myCircle);
+  myCircle          = theCircle;
+  myGeometryType    = GeometryType_Edge;
+  myShape           = BRepLib_MakeEdge (theCircle);
+  myAnchorPoint     = gp::Origin();
+  myIsGeometryValid = IsValidCircle (myCircle);
 
-  if (myIsValid && myIsPlaneCustom)
+  if (myIsGeometryValid && myIsPlaneCustom)
   {
     ComputeAnchorPoint();
   }
@@ -125,8 +125,6 @@ void AIS_DiameterDimension::SetMeasuredGeometry (const gp_Circ& theCircle)
     myAnchorPoint = ElCLib::Value (0.0, myCircle);
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -139,14 +137,14 @@ void AIS_DiameterDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape)
   gp_Pnt aDummyPnt (gp::Origin());
   Standard_Boolean isClosed = Standard_False;
 
-  myGeometryType = GeometryType_UndefShapes;
-  myShape        = theShape;
-  myAnchorPoint  = gp::Origin();
-  myIsValid      = InitCircularDimension (theShape, myCircle, aDummyPnt, isClosed)
-                 && IsValidCircle (myCircle)
-                 && isClosed;
+  myGeometryType    = GeometryType_UndefShapes;
+  myShape           = theShape;
+  myAnchorPoint     = gp::Origin();
+  myIsGeometryValid = InitCircularDimension (theShape, myCircle, aDummyPnt, isClosed)
+                      && IsValidCircle (myCircle)
+                      && isClosed;
 
-  if (myIsValid && myIsPlaneCustom)
+  if (myIsGeometryValid && myIsPlaneCustom)
   {
     ComputeAnchorPoint();
   }
@@ -156,8 +154,6 @@ void AIS_DiameterDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape)
     myAnchorPoint = ElCLib::Value (0.0, myCircle);
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -182,7 +178,7 @@ Standard_Boolean AIS_DiameterDimension::CheckPlane (const gp_Pln& thePlane) cons
 //=======================================================================
 void AIS_DiameterDimension::ComputePlane()
 {
-  if (!IsValid())
+  if (!myIsGeometryValid)
   {
     return;
   }
@@ -202,7 +198,7 @@ void AIS_DiameterDimension::ComputeAnchorPoint()
   GeomAPI_IntCS anIntersector (aCircle, aPlane);
   if (!anIntersector.IsDone())
   {
-    myIsValid = Standard_False;
+    myIsGeometryValid = Standard_False;
     return;
   }
 
@@ -210,7 +206,7 @@ void AIS_DiameterDimension::ComputeAnchorPoint()
   if (anIntersector.NbPoints() != 2)
   {
     myAnchorPoint = ElCLib::Value (0.0, myCircle);
-    myIsValid = Standard_True;
+    myIsGeometryValid = Standard_True;
     return;
   }
 
@@ -379,7 +375,7 @@ const gp_Pnt AIS_DiameterDimension::GetTextPosition() const
 //=======================================================================
 void AIS_DiameterDimension::SetTextPosition (const gp_Pnt& theTextPos)
 {
-  if (!myIsValid)
+  if (!IsValid())
   {
     return;
   }
index c3508be..52c7356 100755 (executable)
@@ -106,7 +106,7 @@ AIS_Dimension::AIS_Dimension (const AIS_KindOfDimension theType)
   myGeometryType (GeometryType_UndefShapes),
   myIsPlaneCustom (Standard_False),
   myFlyout (0.0),
-  myIsValid (Standard_False),
+  myIsGeometryValid (Standard_False),
   myKindOfDimension (theType)
 {
 }
@@ -156,13 +156,12 @@ void AIS_Dimension::SetCustomPlane (const gp_Pln& thePlane)
   myPlane = thePlane;
   myIsPlaneCustom = Standard_True;
 
-  // Disable fixed text position
+  // Disable fixed (custom) text position
   UnsetFixedTextPosition();
 
   // Check validity if geometry has been set already.
-  if (myIsValid)
+  if (IsValid())
   {
-    myIsValid &= CheckPlane (myPlane);
     SetToUpdate();
   }
 }
@@ -650,9 +649,11 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
   Prs3d_DimensionTextHorizontalPosition aHorisontalTextPos = aDimensionAspect->TextHorizontalPosition();
   if (IsTextPositionCustom())
   {
-    AdjustParametersForLinear (myFixedTextPosition, theFirstPoint, theSecondPoint,
-                               anExtensionSize, aHorisontalTextPos);
-
+    if (!AdjustParametersForLinear (myFixedTextPosition, theFirstPoint, theSecondPoint,
+                                    anExtensionSize, aHorisontalTextPos, myFlyout, myPlane, myIsPlaneCustom))
+    {
+      Standard_ProgramError::Raise ("Can not adjust plane to the custom label position.");
+    }
   }
 
   FitTextAlignmentForLinear (theFirstPoint, theSecondPoint, theIsOneSide, aHorisontalTextPos,
@@ -961,7 +962,7 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
     Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments);
   }
 
-  myIsComputed = Standard_True;
+  mySelectionGeom.IsComputed = Standard_True;
 }
 
 //=======================================================================
@@ -1187,7 +1188,7 @@ Standard_Boolean AIS_Dimension::InitCircularDimension (const TopoDS_Shape& theSh
 void AIS_Dimension::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
                                       const Standard_Integer theMode)
 {
-  if (!myIsComputed)
+  if (!mySelectionGeom.IsComputed)
   {
     return;
   }
@@ -1350,7 +1351,7 @@ gp_Pnt AIS_Dimension::GetTextPositionForLinear (const gp_Pnt& theFirstPoint,
                                                 const gp_Pnt& theSecondPoint,
                                                 const Standard_Boolean theIsOneSide) const
 {
-  if (!myIsValid)
+  if (!IsValid())
   {
     return gp::Origin();
   }
@@ -1418,30 +1419,43 @@ gp_Pnt AIS_Dimension::GetTextPositionForLinear (const gp_Pnt& theFirstPoint,
 }
 
 //=======================================================================
-//function : AdjustAspectParameters
+//function : AdjustParametersForLinear
 //purpose  : 
 //=======================================================================
-void AIS_Dimension::AdjustParametersForLinear (const gp_Pnt& theTextPos,
-                                               const gp_Pnt& theFirstPoint,
-                                               const gp_Pnt& theSecondPoint,
-                                               Standard_Real& theExtensionSize,
-                                               Prs3d_DimensionTextHorizontalPosition& theAlignment)
+Standard_Boolean AIS_Dimension::AdjustParametersForLinear (const gp_Pnt& theTextPos,
+                                                           const gp_Pnt& theFirstPoint,
+                                                           const gp_Pnt& theSecondPoint,
+                                                           Standard_Real& theExtensionSize,
+                                                           Prs3d_DimensionTextHorizontalPosition& theAlignment,
+                                                           Standard_Real& theFlyout,
+                                                           gp_Pln& thePlane,
+                                                           Standard_Boolean& theIsPlaneOld) const
 {
   Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect();
   Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length();
 
-  //Set new automatic plane.
-  myPlane = gce_MakePln (theTextPos, theFirstPoint, theSecondPoint);
-  myIsPlaneCustom = Standard_False;
-
-  // Compute dimension line points.
-  gp_Dir aPlaneNormal = GetPlane().Axis().Direction();
   gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint);
   gp_Vec aTargetPointsVec (theFirstPoint, theSecondPoint);
 
+  // Don't set new plane if the text position lies on the attachment points line.
+  gp_Lin aTargetPointsLin (theFirstPoint, aTargetPointsDir);
+  if (!aTargetPointsLin.Contains (theTextPos, Precision::Confusion()))
+  {
+    //Set new automatic plane.
+    thePlane = gce_MakePln (theTextPos, theFirstPoint, theSecondPoint);
+    theIsPlaneOld = Standard_False;
+  }
+
   // Compute flyout direction vector.
+  gp_Dir aPlaneNormal = GetPlane().Axis().Direction();
   gp_Dir aPositiveFlyout = aPlaneNormal ^ aTargetPointsDir;
 
+  // Additional check of collinearity of the plane normal and attachment points vector.
+  if (aPlaneNormal.IsParallel (aTargetPointsDir, Precision::Angular()))
+  {
+    return Standard_False;
+  }
+
   // Set flyout.
   gp_Vec aFirstToTextVec (theFirstPoint, theTextPos);
 
@@ -1453,15 +1467,19 @@ void AIS_Dimension::AdjustParametersForLinear (const gp_Pnt& theTextPos,
   // Compute flyout value and direction.
   gp_Vec aFlyoutVector = gp_Vec (aTextPosProj, theTextPos);
 
-  myFlyout = gp_Dir (aFlyoutVector).IsOpposite (aPositiveFlyout, Precision::Angular())
-              ? -aFlyoutVector.Magnitude()
-              :  aFlyoutVector.Magnitude();
-
+  theFlyout = 0.0;
+  if (aFlyoutVector.Magnitude() > Precision::Confusion())
+  {
+    theFlyout = gp_Dir (aFlyoutVector).IsOpposite (aPositiveFlyout, Precision::Angular())
+                ? -aFlyoutVector.Magnitude()
+                :  aFlyoutVector.Magnitude();
+  }
+  
   // Compute attach points (through which main dimension line passes).
   gp_Pnt aFirstAttach  = theFirstPoint.Translated (aFlyoutVector);
   gp_Pnt aSecondAttach = theSecondPoint.Translated (aFlyoutVector);
 
-  // Set horisontal text alignment.
+  // Set horizontal text alignment.
   if (aCos < 0.0)
   {
     theAlignment = Prs3d_DTHP_Left;
@@ -1480,6 +1498,7 @@ void AIS_Dimension::AdjustParametersForLinear (const gp_Pnt& theTextPos,
   {
     theAlignment = Prs3d_DTHP_Center;
   }
+  return Standard_True;
 }
 
 //=======================================================================
index 4b8aae0..f8c057d 100755 (executable)
@@ -370,9 +370,9 @@ public:
   //! Check that the input geometry for dimension is valid and the
   //! presentation can be successfully computed.
   //! @return TRUE if dimension geometry is ok.
-  Standard_Boolean IsValid() const
+  virtual Standard_Boolean IsValid() const
   {
-    return myIsValid;
+    return myIsGeometryValid && CheckPlane (GetPlane());
   }
 
 public:
@@ -506,26 +506,31 @@ protected:
   //! @param theIsArrowExternal [out] is the arrows external,
   //! if arrow orientation in the dimension aspect is Prs3d_DAO_Fit, it fits arrow
   //! orientation automatically.
-  void FitTextAlignmentForLinear (const gp_Pnt& theFirstPoint,
-                                  const gp_Pnt& theSecondPoint,
-                                  const Standard_Boolean theIsOneSide,
-                                  const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos,
-                                  Standard_Integer& theLabelPosition,
-                                  Standard_Boolean& theIsArrowsExternal) const;
+  Standard_EXPORT void FitTextAlignmentForLinear (const gp_Pnt& theFirstPoint,
+                                                  const gp_Pnt& theSecondPoint,
+                                                  const Standard_Boolean theIsOneSide,
+                                                  const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos,
+                                                  Standard_Integer& theLabelPosition,
+                                                  Standard_Boolean& theIsArrowsExternal) const;
 
   //! Adjusts aspect parameters according the text position:
   //! extension size, vertical text alignment and flyout.
-  //! It changes working plane and flyout of linear dimension.
   //! @param theTextPos [in] the user defined 3d point of text position
   //! @param theFirstPoint [in] the first point of linear measurement.
   //! @param theSecondPoint [in] the second point of linear measurement.
   //! @param theExtensionSize [out] the adjusted extension size
   //! @param theAlignment [out] the horizontal label alignment.
-  void AdjustParametersForLinear (const gp_Pnt& theTextPos,
-                                  const gp_Pnt& theFirstPoint,
-                                  const gp_Pnt& theSecondPoint,
-                                  Standard_Real& theExtensionSize,
-                                  Prs3d_DimensionTextHorizontalPosition& theAlignment);
+  //! @param theFlyout [out] the adjusted value of flyout.
+  //! @param thePlane [out] the new plane that contains theTextPos and attachment points.
+  //! @param theIsPlaneOld [out] shows if new plane is computed.
+  Standard_EXPORT Standard_Boolean AdjustParametersForLinear (const gp_Pnt& theTextPos,
+                                                              const gp_Pnt& theFirstPoint,
+                                                              const gp_Pnt& theSecondPoint,
+                                                              Standard_Real& theExtensionSize,
+                                                              Prs3d_DimensionTextHorizontalPosition& theAlignment,
+                                                              Standard_Real& theFlyout,
+                                                              gp_Pln& thePlane,
+                                                              Standard_Boolean& theIsPlaneOld) const;
 
 protected: //! @name Behavior to implement
 
@@ -587,6 +592,7 @@ protected: //! @name Selection geometry
     Standard_Real    TextHeight;         //!< Height of text label.
     SeqOfCurves      DimensionLine;      //!< Sequence of points for composing the segments of dimension line.
     SeqOfArrows      Arrows;             //!< Sequence of arrow geometries.
+    Standard_Boolean IsComputed;         //!< Shows if the selection geometry was filled.
 
   public:
 
@@ -607,6 +613,8 @@ protected: //! @name Selection geometry
         TextWidth  = 0.0;
         TextHeight = 0.0;
       }
+
+      IsComputed = Standard_False;
     }
 
     //! Add new curve entry and return the reference to populate it.
@@ -627,7 +635,6 @@ protected: //! @name Selection geometry
   } mySelectionGeom;
 
   Standard_Real mySelToleranceForText2d; //!< Sensitive point tolerance for 2d text selection.
-  Standard_Boolean myIsComputed;         //!< Shows if the presentation and selection was computed.
 
 protected: //! @name Value properties
 
@@ -648,10 +655,10 @@ protected: //! @name Geometrical properties
 
   GeometryType myGeometryType;  //!< defines type of shapes on which the dimension is to be built. 
 
-  gp_Pln           myPlane;         //!< Plane where dimension will be built (computed or user defined).
-  Standard_Boolean myIsPlaneCustom; //!< Is plane defined by user (otherwise it will be computed automatically).
-  Standard_Real    myFlyout;        //!< Flyout distance.
-  Standard_Boolean myIsValid;       //!< Is dimension geometry properly defined.
+  gp_Pln           myPlane;           //!< Plane where dimension will be built (computed or user defined).
+  Standard_Boolean myIsPlaneCustom;   //!< Is plane defined by user (otherwise it will be computed automatically).
+  Standard_Real    myFlyout;          //!< Flyout distance.
+  Standard_Boolean myIsGeometryValid; //!< Is dimension geometry properly defined.
 
 private:
 
index 2fc1f68..38d3448 100755 (executable)
@@ -108,13 +108,13 @@ void AIS_LengthDimension::SetMeasuredGeometry (const gp_Pnt& theFirstPoint,
                                                const gp_Pnt& theSecondPoint,
                                                const gp_Pln& thePlane)
 {
-  myFirstPoint   = theFirstPoint;
-  mySecondPoint  = theSecondPoint;
-  myFirstShape   = BRepLib_MakeVertex (myFirstPoint);
-  mySecondShape  = BRepLib_MakeVertex (mySecondPoint);
-  myGeometryType = GeometryType_Points;
+  myFirstPoint      = theFirstPoint;
+  mySecondPoint     = theSecondPoint;
+  myFirstShape      = BRepLib_MakeVertex (myFirstPoint);
+  mySecondShape     = BRepLib_MakeVertex (mySecondPoint);
+  myGeometryType    = GeometryType_Points;
   SetCustomPlane (thePlane);
-  myIsValid      = IsValidPoints (theFirstPoint, theSecondPoint) && CheckPlane (myPlane);
+  myIsGeometryValid = IsValidPoints (theFirstPoint, theSecondPoint);
 
   SetToUpdate();
 }
@@ -126,11 +126,11 @@ void AIS_LengthDimension::SetMeasuredGeometry (const gp_Pnt& theFirstPoint,
 void AIS_LengthDimension::SetMeasuredGeometry (const TopoDS_Edge& theEdge,
                                                const gp_Pln& thePlane)
 {
-  myFirstShape  = theEdge;
-  mySecondShape = TopoDS_Shape();
-  myGeometryType = GeometryType_Edge;
+  myFirstShape      = theEdge;
+  mySecondShape     = TopoDS_Shape();
+  myGeometryType    = GeometryType_Edge;
   SetCustomPlane (thePlane);
-  myIsValid     = InitOneShapePoints (myFirstShape) && CheckPlane (myPlane);
+  myIsGeometryValid = InitOneShapePoints (myFirstShape);
 
   SetToUpdate();
 }
@@ -164,11 +164,12 @@ void AIS_LengthDimension::SetMeasuredShapes (const TopoDS_Shape& theFirstShape,
 {
   gp_Pln aComputedPlane;
   Standard_Boolean isPlaneReturned = Standard_False;
-  myFirstShape   = theFirstShape;
-  mySecondShape  = theSecondShape;
-  myIsValid      = InitTwoShapesPoints (myFirstShape, mySecondShape, aComputedPlane, isPlaneReturned);
 
-  if (myIsValid && !myIsPlaneCustom)
+  myFirstShape      = theFirstShape;
+  mySecondShape     = theSecondShape;
+  myIsGeometryValid = InitTwoShapesPoints (myFirstShape, mySecondShape, aComputedPlane, isPlaneReturned);
+
+  if (myIsGeometryValid && !myIsPlaneCustom)
   {
     if (isPlaneReturned)
     {
@@ -176,12 +177,10 @@ void AIS_LengthDimension::SetMeasuredShapes (const TopoDS_Shape& theFirstShape,
     }
     else
     {
-      myIsValid = Standard_False;
+      myIsGeometryValid = Standard_False;
     }
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -730,7 +729,7 @@ const gp_Pnt AIS_LengthDimension::GetTextPosition() const
 //=======================================================================
 void AIS_LengthDimension::SetTextPosition (const gp_Pnt& theTextPos)
 {
-  if (!myIsValid)
+  if (!IsValid())
   {
     return;
   }
index e7d6778..2652011 100644 (file)
@@ -75,19 +75,17 @@ AIS_RadiusDimension::AIS_RadiusDimension (const TopoDS_Shape& theShape)
 //=======================================================================
 void AIS_RadiusDimension::SetMeasuredGeometry (const gp_Circ& theCircle)
 {
-  myCircle       = theCircle;
-  myGeometryType = GeometryType_Edge;
-  myShape        = BRepLib_MakeEdge (theCircle);
-  myAnchorPoint  = ElCLib::Value (0, myCircle);
-  myIsValid      = IsValidCircle (myCircle);
+  myCircle          = theCircle;
+  myGeometryType    = GeometryType_Edge;
+  myShape           = BRepLib_MakeEdge (theCircle);
+  myAnchorPoint     = ElCLib::Value (0, myCircle);
+  myIsGeometryValid = IsValidCircle (myCircle);
 
-  if (myIsValid)
+  if (myIsGeometryValid)
   {
     ComputePlane();
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -98,19 +96,17 @@ void AIS_RadiusDimension::SetMeasuredGeometry (const gp_Circ& theCircle)
 void AIS_RadiusDimension::SetMeasuredGeometry (const gp_Circ& theCircle,
                                                const gp_Pnt&  theAnchorPoint)
 {
-  myCircle       = theCircle;
-  myGeometryType = GeometryType_Edge;
-  myShape        = BRepLib_MakeEdge (theCircle);
-  myAnchorPoint  = theAnchorPoint;
-  myIsValid      = IsValidCircle (myCircle) && IsValidAnchor (myCircle, theAnchorPoint);
+  myCircle          = theCircle;
+  myGeometryType    = GeometryType_Edge;
+  myShape           = BRepLib_MakeEdge (theCircle);
+  myAnchorPoint     = theAnchorPoint;
+  myIsGeometryValid = IsValidCircle (myCircle) && IsValidAnchor (myCircle, theAnchorPoint);
 
-  if (myIsValid)
+  if (myIsGeometryValid)
   {
     ComputePlane();
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -121,18 +117,16 @@ void AIS_RadiusDimension::SetMeasuredGeometry (const gp_Circ& theCircle,
 void AIS_RadiusDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape)
 {
   Standard_Boolean isClosed = Standard_False;
-  myShape        = theShape;
-  myGeometryType = GeometryType_UndefShapes;
-  myIsValid      = InitCircularDimension (theShape, myCircle, myAnchorPoint, isClosed) 
-                && IsValidCircle (myCircle);
+  myShape                   = theShape;
+  myGeometryType            = GeometryType_UndefShapes;
+  myIsGeometryValid         = InitCircularDimension (theShape, myCircle, myAnchorPoint, isClosed) 
+                              && IsValidCircle (myCircle);
 
-  if (myIsValid)
+  if (myIsGeometryValid)
   {
     ComputePlane();
   }
 
-  myIsValid &= CheckPlane (myPlane);
-
   SetToUpdate();
 }
 
@@ -158,7 +152,7 @@ Standard_Boolean AIS_RadiusDimension::CheckPlane (const gp_Pln& thePlane) const
 //=======================================================================
 void AIS_RadiusDimension::ComputePlane()
 {
-  if (!IsValid())
+  if (!myIsGeometryValid)
   {
     return;
   }
@@ -284,7 +278,7 @@ const gp_Pnt AIS_RadiusDimension::GetTextPosition() const
 //=======================================================================
 void AIS_RadiusDimension::SetTextPosition (const gp_Pnt& theTextPos)
 {
-  if (!myIsValid)
+  if (!myIsGeometryValid)
   {
     return;
   }