// Created on: 2013-11-11
// Created by: Anastasia BORISOVA
-// Copyright (c) 2013 OPEN CASCADE SAS
+// Copyright (c) 2013-2014 OPEN CASCADE SAS
//
-// The content of this file is subject to the Open CASCADE Technology Public
-// License Version 6.5 (the "License"). You may not use the content of this file
-// except in compliance with the License. Please obtain a copy of the License
-// at http://www.opencascade.org and read it completely before using this file.
+// This file is part of Open CASCADE Technology software library.
//
-// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
-// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
//
-// The Original Code and all software distributed under the License is
-// distributed on an "AS IS" basis, without warranty of any kind, and the
-// Initial Developer hereby disclaims all such warranties, including without
-// limitation, any warranties of merchantability, fitness for a particular
-// purpose or non-infringement. Please see the License for the specific terms
-// and conditions governing the rights and limitations under the License.
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
#include <AIS_Dimension.hxx>
#include <Bnd_Box.hxx>
#include <ElCLib.hxx>
#include <Font_BRepFont.hxx>
+#include <Font_BRepTextBuilder.hxx>
#include <GC_MakeCircle.hxx>
+#include <Geom_Line.hxx>
#include <GeomAdaptor_Curve.hxx>
#include <Geom_Circle.hxx>
#include <Geom_TrimmedCurve.hxx>
#include <gce_MakeDir.hxx>
#include <gce_MakeLin.hxx>
+#include <gce_MakePln.hxx>
#include <Graphic3d_ArrayOfSegments.hxx>
#include <Graphic3d_ArrayOfTriangles.hxx>
#include <Graphic3d_AspectLine3d.hxx>
#include <SelectMgr_EntityOwner.hxx>
#include <SelectMgr_Selection.hxx>
#include <SelectMgr_SequenceOfOwner.hxx>
-#include <Select3D_ListIteratorOfListOfSensitive.hxx>
-#include <Select3D_ListOfSensitive.hxx>
#include <Select3D_SensitiveCircle.hxx>
#include <Select3D_SensitiveGroup.hxx>
#include <Select3D_SensitiveCurve.hxx>
#include <Select3D_SensitiveSegment.hxx>
-#include <Select3D_SensitiveFace.hxx>
#include <Select3D_SensitiveTriangle.hxx>
+#include <Select3D_SensitiveTriangulation.hxx>
+#include <Poly_Array1OfTriangle.hxx>
+#include <Poly_Triangulation.hxx>
#include <Standard_CString.hxx>
+#include <Standard_ProgramError.hxx>
#include <StdPrs_ShadedShape.hxx>
#include <StdPrs_WFShape.hxx>
#include <TCollection_AsciiString.hxx>
#include <TCollection_ExtendedString.hxx>
#include <TopExp_Explorer.hxx>
#include <TopoDS.hxx>
+#include <TopoDS_Edge.hxx>
#include <TopoDS_Vertex.hxx>
#include <Units.hxx>
#include <Units_UnitsDictionary.hxx>
#include <UnitsAPI.hxx>
#include <UnitsAPI_SystemUnits.hxx>
-#include <Standard_ProgramError.hxx>
-IMPLEMENT_STANDARD_HANDLE(AIS_Dimension, AIS_InteractiveObject)
-IMPLEMENT_STANDARD_RTTIEXT(AIS_Dimension, AIS_InteractiveObject)
+
+IMPLEMENT_STANDARD_RTTIEXT(AIS_Dimension,AIS_InteractiveObject)
namespace
{
// default text strings
- static const Standard_Utf32Char THE_FILL_CHARACTER ('0');
static const TCollection_ExtendedString THE_EMPTY_LABEL;
static const TCollection_AsciiString THE_UNDEFINED_UNITS;
// default selection priorities
static const Standard_Integer THE_NEUTRAL_SEL_PRIORITY = 5;
static const Standard_Integer THE_LOCAL_SEL_PRIORITY = 6;
-};
+}
//=======================================================================
//function : Constructor
//purpose :
//=======================================================================
AIS_Dimension::AIS_Dimension (const AIS_KindOfDimension theType)
-: AIS_InteractiveObject(),
- myCustomValue (0.0),
- myIsValueCustom (Standard_False),
- mySpecialSymbol (' '),
+: AIS_InteractiveObject (),
+ mySelToleranceForText2d(0.0),
+ myValueType (ValueType_Computed),
+ myCustomValue (0.0),
+ myCustomStringValue (),
+ myIsTextPositionFixed (Standard_False),
+ mySpecialSymbol (' '),
myDisplaySpecialSymbol (AIS_DSS_No),
- myGeometryType (GeometryType_UndefShapes),
- myIsPlaneCustom (Standard_False),
- myFlyout (0.0),
- myIsValid (Standard_False),
- myKindOfDimension (theType)
+ myGeometryType (GeometryType_UndefShapes),
+ myIsPlaneCustom (Standard_False),
+ myFlyout (0.0),
+ myIsGeometryValid (Standard_False),
+ myKindOfDimension (theType)
{
}
//=======================================================================
void AIS_Dimension::SetCustomValue (const Standard_Real theValue)
{
- if (myIsValueCustom && myCustomValue == theValue)
+ if (myValueType == ValueType_CustomReal && myCustomValue == theValue)
{
return;
}
- myIsValueCustom = Standard_True;
-
+ myValueType = ValueType_CustomReal;
myCustomValue = theValue;
SetToUpdate();
}
//=======================================================================
-//function : GetPlane
+//function : SetCustomValue
//purpose :
//=======================================================================
-const gp_Pln& AIS_Dimension::GetPlane() const
+void AIS_Dimension::SetCustomValue (const TCollection_ExtendedString& theValue)
{
- return myPlane;
+ if (myValueType == ValueType_CustomText && myCustomStringValue == theValue)
+ {
+ return;
+ }
+
+ myValueType = ValueType_CustomText;
+ myCustomStringValue = theValue;
+
+ SetToUpdate();
+}
+
+//=======================================================================
+//function : GetCustomValue
+//purpose :
+//=======================================================================
+const TCollection_ExtendedString& AIS_Dimension::GetCustomValue () const
+{
+ return myCustomStringValue;
}
//=======================================================================
-//function : GetGeometryType
+//function : GetPlane
//purpose :
//=======================================================================
-const Standard_Integer AIS_Dimension::GetGeometryType () const
+const gp_Pln& AIS_Dimension::GetPlane() const
{
- return myGeometryType;
+ return myPlane;
}
//=======================================================================
myPlane = thePlane;
myIsPlaneCustom = Standard_True;
+ // Disable fixed (custom) text position
+ UnsetFixedTextPosition();
+
// Check validity if geometry has been set already.
- if (myIsValid)
+ if (IsValid())
{
- myIsValid &= CheckPlane (myPlane);
SetToUpdate();
}
}
myFlyout = theFlyout;
+ // Disable fixed text position
+ UnsetFixedTextPosition();
+
SetToUpdate();
}
//=======================================================================
TCollection_ExtendedString AIS_Dimension::GetValueString (Standard_Real& theWidth) const
{
- // format value string using "sprintf"
- TCollection_AsciiString aFormatStr = myDrawer->DimensionAspect()->ValueStringFormat();
+ TCollection_ExtendedString aValueStr;
+ if (myValueType == ValueType_CustomText)
+ {
+ aValueStr = myCustomStringValue;
+ }
+ else
+ {
+ // format value string using "sprintf"
+ TCollection_AsciiString aFormatStr = myDrawer->DimensionAspect()->ValueStringFormat();
- char aFmtBuffer[256];
- sprintf (aFmtBuffer, aFormatStr.ToCString(), ValueToDisplayUnits());
- TCollection_ExtendedString aValueStr = TCollection_ExtendedString (aFmtBuffer);
+ char aFmtBuffer[256];
+ sprintf (aFmtBuffer, aFormatStr.ToCString(), ValueToDisplayUnits());
+ aValueStr = TCollection_ExtendedString (aFmtBuffer);
+ }
// add units to values string
if (myDrawer->DimensionAspect()->IsUnitsDisplayed())
}
// Get text style parameters
- Quantity_Color aColor;
- Standard_CString aFontName;
- Standard_Real aFactor;
- Standard_Real aSpace;
- myDrawer->DimensionAspect()->TextAspect()->Aspect()->Values (aColor, aFontName, aFactor, aSpace);
- Font_FontAspect aFontAspect = myDrawer->DimensionAspect()->TextAspect()->Aspect()->GetTextFontAspect();
- Standard_Real aFontHeight = myDrawer->DimensionAspect()->TextAspect()->Height();
-
- NCollection_Utf8String anUTFString = (Standard_Utf16Char* )aValueStr.ToExtString();
+ Handle(Prs3d_TextAspect) aTextAspect = myDrawer->DimensionAspect()->TextAspect();
+ NCollection_Utf8String anUTFString (aValueStr.ToExtString());
theWidth = 0.0;
if (myDrawer->DimensionAspect()->IsText3d())
{
// text width produced by BRepFont
- Font_BRepFont aFont (aFontName, aFontAspect, aFontHeight);
+ Font_BRepFont aFont (aTextAspect->Aspect()->Font().ToCString(),
+ aTextAspect->Aspect()->GetTextFontAspect(),
+ aTextAspect->Height());
for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; )
{
{
// Text width for 1:1 scale 2D case
Handle(Font_FTFont) aFont = new Font_FTFont();
- aFont->Init (aFontName, aFontAspect, (const unsigned int)aFontHeight, THE_2D_TEXT_RESOLUTION);
+ aFont->Init (aTextAspect->Aspect()->Font().ToCString(),
+ aTextAspect->Aspect()->GetTextFontAspect(),
+ (const unsigned int)aTextAspect->Height(),
+ THE_2D_TEXT_RESOLUTION);
for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; )
{
const gp_Pnt& theLocation,
const gp_Dir& theDirection)
{
- Prs3d_Root::NewGroup (thePresentation);
+ Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePresentation);
- Quantity_Length aLength = myDrawer->DimensionAspect()->ArrowAspect()->Length();
- Standard_Real anAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle();
+ Standard_Real aLength = myDrawer->DimensionAspect()->ArrowAspect()->Length();
+ Standard_Real anAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle();
if (myDrawer->DimensionAspect()->IsArrows3d())
{
- Prs3d_Arrow::Draw (thePresentation,
+ Prs3d_Arrow::Draw (aGroup,
theLocation,
theDirection,
anAngle,
aLength);
+ aGroup->SetGroupPrimitivesAspect (myDrawer->DimensionAspect()->ArrowAspect()->Aspect());
}
else
{
anArrow->AddVertex (aRightPoint);
// Set aspect for arrow triangles
- Quantity_Color aColor;
- Aspect_TypeOfLine aTOL;
- Standard_Real aWidth;
- myDrawer->DimensionAspect()->ArrowAspect()->Aspect()->Values (aColor, aTOL, aWidth);
Graphic3d_MaterialAspect aShadeMat (Graphic3d_NOM_DEFAULT);
aShadeMat.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
aShadeMat.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
aShadeMat.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
Handle(Prs3d_ShadingAspect) aShadingStyle = new Prs3d_ShadingAspect();
- aShadingStyle->SetColor (aColor);
+ aShadingStyle->SetColor (myDrawer->DimensionAspect()->ArrowAspect()->Aspect()->Color());
aShadingStyle->SetMaterial (aShadeMat);
- Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aShadingStyle->Aspect());
- Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (anArrow);
+ aGroup->SetPrimitivesAspect (aShadingStyle->Aspect());
+ aGroup->AddPrimitiveArray (anArrow);
}
SelectionGeometry::Arrow& aSensitiveArrow = mySelectionGeom.NewArrow();
}
//=======================================================================
-//function : DrawText
-//purpose :
+//function : drawText
+//purpose :
//=======================================================================
-void AIS_Dimension::DrawText (const Handle(Prs3d_Presentation)& thePresentation,
+void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation,
const gp_Pnt& theTextPos,
const gp_Dir& theTextDir,
const TCollection_ExtendedString& theText,
if (myDrawer->DimensionAspect()->IsText3d())
{
// getting font parameters
- Quantity_Color aColor;
- Standard_CString aFontName;
- Standard_Real anExpansionFactor;
- Standard_Real aSpace;
- myDrawer->DimensionAspect()->TextAspect()->Aspect()->Values (aColor, aFontName, anExpansionFactor, aSpace);
- Font_FontAspect aFontAspect = myDrawer->DimensionAspect()->TextAspect()->Aspect()->GetTextFontAspect();
- Standard_Real aFontHeight = myDrawer->DimensionAspect()->TextAspect()->Height();
+ Handle(Prs3d_TextAspect) aTextAspect = myDrawer->DimensionAspect()->TextAspect();
+ Quantity_Color aColor = aTextAspect->Aspect()->Color();
+ Font_FontAspect aFontAspect = aTextAspect->Aspect()->GetTextFontAspect();
+ Standard_Real aFontHeight = aTextAspect->Height();
// creating TopoDS_Shape for text
- Font_BRepFont aFont (aFontName, aFontAspect, aFontHeight);
- NCollection_Utf8String anUTFString = (Standard_Utf16Char* )theText.ToExtString();
- TopoDS_Shape aTextShape = aFont.RenderText (anUTFString);
+ Font_BRepFont aFont (aTextAspect->Aspect()->Font().ToCString(),
+ aFontAspect, aFontHeight);
+ NCollection_Utf8String anUTFString (theText.ToExtString());
+
+ Font_BRepTextBuilder aBuilder;
+ TopoDS_Shape aTextShape = aBuilder.Perform (aFont, anUTFString);
// compute text width with kerning
Standard_Real aTextWidth = 0.0;
if (myDrawer->DimensionAspect()->IsTextShaded())
{
// Setting text shading and color parameters
+ if (!myDrawer->HasOwnShadingAspect())
+ {
+ myDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
+ }
+
Graphic3d_MaterialAspect aShadeMat (Graphic3d_NOM_DEFAULT);
aShadeMat.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
aShadeMat.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
}
else
{
- // setting color for text
+ // Setting color for text
+ if (!myDrawer->HasOwnFreeBoundaryAspect())
+ {
+ myDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (aColor, Aspect_TOL_SOLID, 1.0));
+ }
+
myDrawer->FreeBoundaryAspect()->Aspect()->SetColor (aColor);
+
// drawing text
StdPrs_WFShape::Add (thePresentation, aTextShape, myDrawer);
}
// generate primitives for 2D text
myDrawer->DimensionAspect()->TextAspect()->Aspect()->SetDisplayType (Aspect_TODT_DIMENSION);
- Prs3d_Text::Draw (thePresentation,
+ Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (thePresentation),
myDrawer->DimensionAspect()->TextAspect(),
theText,
theTextPos);
gp_Pnt aTextPos = ElCLib::Value (theExtensionSize, anExtensionLine);
gp_Dir aTextDir = theExtensionDir;
- DrawText (thePresentation,
+ drawText (thePresentation,
aTextPos,
aTextDir,
theLabelString,
// do not build any dimension for equal points
if (theFirstPoint.IsEqual (theSecondPoint, Precision::Confusion()))
{
- Standard_ProgramError::Raise ("Can not build presentation for equal points.");
+ throw Standard_ProgramError("Can not build presentation for equal points.");
}
- // compute dimension line points
- gp_Ax1 aPlaneNormal = GetPlane().Axis();
- gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint);
-
- // compute flyout direction vector
- gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector;
-
- // create lines for layouts
- gp_Lin aLine1 (theFirstPoint, aFlyoutVector);
- gp_Lin aLine2 (theSecondPoint, aFlyoutVector);
-
- // Get flyout end points
- gp_Pnt aLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1);
- gp_Pnt aLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2);
-
Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect();
- gp_Lin aDimensionLine = gce_MakeLin (aLineBegPoint, aLineEndPoint);
-
// For extensions we need to know arrow size, text size and extension size: get it from aspect
- Quantity_Length anArrowLength = aDimensionAspect->ArrowAspect()->Length();
- Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize();
+ Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length();
+ Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize();
// prepare label string and compute its geometrical width
Standard_Real aLabelWidth;
TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth);
}
// handle user-defined and automatic arrow placement
- bool isArrowsExternal = false;
- switch (aDimensionAspect->ArrowOrientation())
+ Standard_Boolean isArrowsExternal = Standard_False;
+ Standard_Integer aLabelPosition = LabelPosition_None;
+
+ Prs3d_DimensionTextHorizontalPosition aHorisontalTextPos = aDimensionAspect->TextHorizontalPosition();
+ if (IsTextPositionCustom())
{
- case Prs3d_DAO_External: isArrowsExternal = true; break;
- case Prs3d_DAO_Internal: isArrowsExternal = false; break;
- case Prs3d_DAO_Fit:
+ if (!AdjustParametersForLinear (myFixedTextPosition, theFirstPoint, theSecondPoint,
+ anExtensionSize, aHorisontalTextPos, myFlyout, myPlane, myIsPlaneCustom))
{
- // add margin to ensure a small tail between text and arrow
- Standard_Real anArrowMargin = aDimensionAspect->IsText3d()
- ? aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN
- : 0.0;
-
- Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint);
- Standard_Real anArrowsWidth = theIsOneSide
- ? anArrowLength + anArrowMargin
- : (anArrowLength + anArrowMargin) * 2.0;
-
- isArrowsExternal = aDimensionWidth < aLabelWidth + anArrowsWidth;
- break;
+ throw Standard_ProgramError("Can not adjust plane to the custom label position.");
}
}
+ FitTextAlignmentForLinear (theFirstPoint, theSecondPoint, theIsOneSide, aHorisontalTextPos,
+ aLabelPosition, isArrowsExternal);
+
+ // compute dimension line points
+ gp_Pnt aLineBegPoint, aLineEndPoint;
+ ComputeFlyoutLinePoints (theFirstPoint, theSecondPoint, aLineBegPoint, aLineEndPoint);
+ gp_Lin aDimensionLine = gce_MakeLin (aLineBegPoint, aLineEndPoint);
+
// compute arrows positions and directions
gp_Dir aFirstArrowDir = aDimensionLine.Direction().Reversed();
gp_Dir aSecondArrowDir = aDimensionLine.Direction();
gp_Pnt aCenterLineEnd = isArrowsExternal || theIsOneSide
? aLineEndPoint : aSecondArrowEnd;
- Standard_Integer aLabelPosition = LabelPosition_None;
-
- // handle user-defined and automatic text placement
- switch (aDimensionAspect->TextHorizontalPosition())
- {
- case Prs3d_DTHP_Left : aLabelPosition |= LabelPosition_Left; break;
- case Prs3d_DTHP_Right : aLabelPosition |= LabelPosition_Right; break;
- case Prs3d_DTHP_Center: aLabelPosition |= LabelPosition_HCenter; break;
- case Prs3d_DTHP_Fit:
- {
- Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint);
- Standard_Real anArrowsWidth = theIsOneSide ? anArrowLength : 2.0 * anArrowLength;
- Standard_Real aContentWidth = isArrowsExternal ? aLabelWidth : aLabelWidth + anArrowsWidth;
-
- aLabelPosition |= aDimensionWidth < aContentWidth ? LabelPosition_Left : LabelPosition_HCenter;
- break;
- }
- }
-
- // handle vertical text placement options
- switch (aDimensionAspect->TextVerticalPosition())
- {
- case Prs3d_DTVP_Above : aLabelPosition |= LabelPosition_Above; break;
- case Prs3d_DTVP_Below : aLabelPosition |= LabelPosition_Below; break;
- case Prs3d_DTVP_Center : aLabelPosition |= LabelPosition_VCenter; break;
- }
switch (aLabelPosition & LabelPosition_HMask)
{
// add label on dimension or extension line to presentation
Prs3d_Root::NewGroup (thePresentation);
- gp_Pnt aTextPos = (aCenterLineBegin.XYZ() + aCenterLineEnd.XYZ()) * 0.5;
+ gp_Pnt aTextPos = IsTextPositionCustom() ? myFixedTextPosition
+ : (aCenterLineBegin.XYZ() + aCenterLineEnd.XYZ()) * 0.5;
gp_Dir aTextDir = aDimensionLine.Direction();
// add text primitives
if (theMode == ComputeMode_All || theMode == ComputeMode_Text)
{
- DrawText (thePresentation,
+ drawText (thePresentation,
aTextPos,
aTextDir,
aLabelString,
// add arrow extension lines to presentation
Prs3d_Root::NewGroup (thePresentation);
- DrawExtension (thePresentation, anExtensionSize,
+ DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
aFirstArrowEnd, aFirstExtensionDir,
THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
if (!theIsOneSide)
{
- DrawExtension (thePresentation, anExtensionSize,
+ DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
aSecondArrowEnd, aSecondExtensionDir,
THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
}
// add extension lines for external arrows
Prs3d_Root::NewGroup (thePresentation);
- DrawExtension (thePresentation, anExtensionSize,
+ DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
aSecondArrowEnd, aSecondExtensionDir,
THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
}
// add extension lines for external arrows
Prs3d_Root::NewGroup (thePresentation);
- DrawExtension (thePresentation, anExtensionSize,
+ DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
aFirstArrowEnd, aFirstExtensionDir,
THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
}
aPrimSegments->AddVertex (theSecondPoint);
aPrimSegments->AddVertex (aLineEndPoint);
- Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect();
Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments);
}
- myIsComputed = Standard_True;
+ mySelectionGeom.IsComputed = Standard_True;
+}
+
+//=======================================================================
+//function : ComputeFlyoutLinePoints
+//purpose :
+//=======================================================================
+void AIS_Dimension::ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint,
+ gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint)
+{
+ // compute dimension line points
+ gp_Ax1 aPlaneNormal = GetPlane().Axis();
+ // compute flyout direction vector
+ gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint);
+ gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector;
+ // create lines for layouts
+ gp_Lin aLine1 (theFirstPoint, aFlyoutVector);
+ gp_Lin aLine2 (theSecondPoint, aFlyoutVector);
+
+ // Get flyout end points
+ theLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1);
+ theLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2);
}
//=======================================================================
return Standard_False;
}
+//=======================================================================
+//function : CircleFromEdge
+//purpose : if possible computes circle from edge
+//=======================================================================
+Standard_Boolean AIS_Dimension::CircleFromEdge (const TopoDS_Edge& theEdge,
+ gp_Circ& theCircle,
+ gp_Pnt& theFirstPoint,
+ gp_Pnt& theLastPoint)
+{
+ BRepAdaptor_Curve anAdaptedCurve (theEdge);
+ switch (anAdaptedCurve.GetType())
+ {
+ case GeomAbs_Circle:
+ {
+ theCircle = anAdaptedCurve.Circle();
+ break;
+ }
+ case GeomAbs_Ellipse:
+ {
+ gp_Elips anEll = anAdaptedCurve.Ellipse();
+ if ((anEll.MinorRadius() - anEll.MajorRadius()) >= Precision::Confusion())
+ {
+ return Standard_False;
+ }
+ theCircle = gp_Circ(anEll.Position(),anEll.MinorRadius());
+ break;
+ }
+ case GeomAbs_Line:
+ case GeomAbs_Hyperbola:
+ case GeomAbs_Parabola:
+ case GeomAbs_BezierCurve:
+ case GeomAbs_BSplineCurve:
+ case GeomAbs_OtherCurve:
+ default:
+ return Standard_False;
+ }
+
+ theFirstPoint = anAdaptedCurve.Value (anAdaptedCurve.FirstParameter());
+ theLastPoint = anAdaptedCurve.Value (anAdaptedCurve.LastParameter());
+ return Standard_True;
+}
+
//=======================================================================
//function : InitCircularDimension
//purpose :
Standard_Real aFirstParam = 0.0;
Standard_Real aLastParam = 0.0;
- // discover circular geometry
- if (theShape.ShapeType() == TopAbs_FACE)
+ // Discover circular geometry
+ switch (theShape.ShapeType())
{
- AIS::GetPlaneFromFace (TopoDS::Face (theShape), aPln, aBasisSurf, aSurfType, anOffset);
-
- if (aSurfType == AIS_KOS_Plane)
+ case TopAbs_FACE:
{
- Handle(Geom_Curve) aCurve;
- if (!CircleFromPlanarFace (TopoDS::Face (theShape), aCurve, aFirstPoint, aLastPoint))
- {
- return Standard_False;
- }
+ AIS::GetPlaneFromFace (TopoDS::Face (theShape), aPln, aBasisSurf, aSurfType, anOffset);
- theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ();
- }
- else
- {
- gp_Pnt aCurPos;
- BRepAdaptor_Surface aSurf1 (TopoDS::Face (theShape));
- Standard_Real aFirstU = aSurf1.FirstUParameter();
- Standard_Real aLastU = aSurf1.LastUParameter();
- Standard_Real aFirstV = aSurf1.FirstVParameter();
- Standard_Real aLastV = aSurf1.LastVParameter();
- Standard_Real aMidU = (aFirstU + aLastU) * 0.5;
- Standard_Real aMidV = (aFirstV + aLastV) * 0.5;
- aSurf1.D0 (aMidU, aMidV, aCurPos);
- Handle (Adaptor3d_HCurve) aBasisCurve;
- Standard_Boolean isExpectedType = Standard_False;
- if (aSurfType == AIS_KOS_Cylinder)
+ if (aSurfType == AIS_KOS_Plane)
{
- isExpectedType = Standard_True;
+ Handle(Geom_Curve) aCurve;
+ if (!CircleFromPlanarFace (TopoDS::Face (theShape), aCurve, aFirstPoint, aLastPoint))
+ {
+ return Standard_False;
+ }
+
+ theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ();
}
else
{
- if (aSurfType == AIS_KOS_Revolution)
+ gp_Pnt aCurPos;
+ BRepAdaptor_Surface aSurf1 (TopoDS::Face (theShape));
+ Standard_Real aFirstU = aSurf1.FirstUParameter();
+ Standard_Real aLastU = aSurf1.LastUParameter();
+ Standard_Real aFirstV = aSurf1.FirstVParameter();
+ Standard_Real aLastV = aSurf1.LastVParameter();
+ Standard_Real aMidU = (aFirstU + aLastU) * 0.5;
+ Standard_Real aMidV = (aFirstV + aLastV) * 0.5;
+ aSurf1.D0 (aMidU, aMidV, aCurPos);
+ Handle (Adaptor3d_HCurve) aBasisCurve;
+ Standard_Boolean isExpectedType = Standard_False;
+ if (aSurfType == AIS_KOS_Cylinder)
{
- aBasisCurve = aSurf1.BasisCurve();
- if (aBasisCurve->GetType() == GeomAbs_Line)
- {
- isExpectedType = Standard_True;
- }
+ isExpectedType = Standard_True;
}
- else if (aSurfType == AIS_KOS_Extrusion)
+ else
{
- aBasisCurve = aSurf1.BasisCurve();
- if (aBasisCurve->GetType() == GeomAbs_Circle)
+ if (aSurfType == AIS_KOS_Revolution)
{
- isExpectedType = Standard_True;
+ aBasisCurve = aSurf1.BasisCurve();
+ if (aBasisCurve->GetType() == GeomAbs_Line)
+ {
+ isExpectedType = Standard_True;
+ }
+ }
+ else if (aSurfType == AIS_KOS_Extrusion)
+ {
+ aBasisCurve = aSurf1.BasisCurve();
+ if (aBasisCurve->GetType() == GeomAbs_Circle)
+ {
+ isExpectedType = Standard_True;
+ }
}
}
- }
- if (!isExpectedType)
- {
- return Standard_False;
- }
+ if (!isExpectedType)
+ {
+ return Standard_False;
+ }
- Handle(Geom_Curve) aCurve;
- aCurve = aBasisSurf->VIso(aMidV);
- if (aCurve->DynamicType() == STANDARD_TYPE (Geom_Circle))
- {
- theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ();
- }
- else if (aCurve->DynamicType() == STANDARD_TYPE (Geom_TrimmedCurve))
- {
- Handle(Geom_TrimmedCurve) aTrimmedCurve = Handle(Geom_TrimmedCurve)::DownCast (aCurve);
- aFirstU = aTrimmedCurve->FirstParameter();
- aLastU = aTrimmedCurve->LastParameter();
- if (aTrimmedCurve->DynamicType() == STANDARD_TYPE (Geom_Circle))
+ Handle(Geom_Curve) aCurve = aBasisSurf->VIso(aMidV);
+ if (aCurve->DynamicType() == STANDARD_TYPE (Geom_Circle))
{
- theCircle = Handle(Geom_Circle)::DownCast(aTrimmedCurve)->Circ();
+ theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ();
+ }
+ else if (aCurve->DynamicType() == STANDARD_TYPE (Geom_TrimmedCurve))
+ {
+ Handle(Geom_TrimmedCurve) aTrimmedCurve = Handle(Geom_TrimmedCurve)::DownCast (aCurve);
+ aFirstU = aTrimmedCurve->FirstParameter();
+ aLastU = aTrimmedCurve->LastParameter();
+ if (aTrimmedCurve->BasisCurve()->DynamicType() == STANDARD_TYPE (Geom_Circle))
+ {
+ theCircle = Handle(Geom_Circle)::DownCast(aTrimmedCurve->BasisCurve())->Circ();
+ }
+ }
+ else
+ {
+ // Compute a circle from 3 points on "aCurve"
+ gp_Pnt aP1, aP2;
+ aSurf1.D0 (aFirstU, aMidV, aP1);
+ aSurf1.D0 (aLastU, aMidV, aP2);
+ GC_MakeCircle aMkCirc (aP1, aCurPos, aP2);
+ theCircle = aMkCirc.Value()->Circ();
}
- }
- else
- {
- // Compute a circle from 3 points on "aCurve"
- gp_Pnt aP1, aP2;
- aSurf1.D0 (aFirstU, aMidV, aP1);
- aSurf1.D0 (aLastU, aMidV, aP2);
- GC_MakeCircle aMkCirc (aP1, aCurPos, aP2);
- theCircle = aMkCirc.Value()->Circ();
- }
- gp_Vec aVec = gp_Vec (theCircle.Location(), aCurPos).Normalized();
- aFirstPoint = ElCLib::Value (aFirstU, theCircle);
- aLastPoint = ElCLib::Value (aLastU, theCircle);
+ aFirstPoint = ElCLib::Value (aFirstU, theCircle);
+ aLastPoint = ElCLib::Value (aLastU, theCircle);
+ }
+ break;
}
- }
- else // TopAbs_EDGE | TopAbs_WIRE
- {
- TopoDS_Edge anEdge;
- if (theShape.ShapeType() == TopAbs_WIRE)
+ case TopAbs_WIRE:
{
+ TopoDS_Edge anEdge;
TopExp_Explorer anIt (theShape, TopAbs_EDGE);
if (anIt.More())
{
anEdge = TopoDS::Edge (anIt.Current());
}
+ if (!AIS_Dimension::CircleFromEdge (anEdge, theCircle, aFirstPoint, aLastPoint))
+ {
+ return Standard_False;
+ }
+ break;
}
- else if (theShape.ShapeType() == TopAbs_EDGE)
- {
- anEdge = TopoDS::Edge (theShape);
- }
- else // Unexpected type of shape
+ case TopAbs_EDGE:
{
- return Standard_False;
+ TopoDS_Edge anEdge = TopoDS::Edge (theShape);
+ if (!AIS_Dimension::CircleFromEdge (anEdge, theCircle, aFirstPoint, aLastPoint))
+ {
+ return Standard_False;
+ }
+ break;
}
-
- BRepAdaptor_Curve anAdaptedCurve (anEdge);
- if (!anAdaptedCurve.GetType() == GeomAbs_Circle)
- {
+ case TopAbs_COMPOUND:
+ case TopAbs_COMPSOLID:
+ case TopAbs_SOLID:
+ case TopAbs_SHELL:
+ case TopAbs_VERTEX:
+ case TopAbs_SHAPE:
+ default:
return Standard_False;
- }
-
- theCircle = anAdaptedCurve.Circle();
- aFirstPoint = anAdaptedCurve.Value (anAdaptedCurve.FirstParameter());
- aLastPoint = anAdaptedCurve.Value (anAdaptedCurve.LastParameter());
}
theIsClosed = aFirstPoint.IsEqual (aLastPoint, Precision::Confusion());
void AIS_Dimension::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
const Standard_Integer theMode)
{
- if (!myIsComputed)
+ if (!mySelectionGeom.IsComputed)
{
return;
}
aGroupOfSensitives->Add (new Select3D_SensitiveCurve (aSensitiveOwner, aSensitivePnts));
}
- Quantity_Length anArrowLength = myDrawer->DimensionAspect()->ArrowAspect()->Length();
- Standard_Real anArrowAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle();
+ Standard_Real anArrowLength = myDrawer->DimensionAspect()->ArrowAspect()->Length();
+ Standard_Real anArrowAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle();
// sensitives for arrows
SelectionGeometry::SeqOfArrows::Iterator anArrowIt (mySelectionGeom.Arrows);
gp_Trsf aLabelPlane;
aLabelPlane.SetTransformation (aTextAxes, gp::XOY());
- TColgp_Array1OfPnt aRectanglePoints (1, 4);
- aRectanglePoints.ChangeValue (1) = gp_Pnt (-aDx, -aDy, 0.0).Transformed (aLabelPlane);
- aRectanglePoints.ChangeValue (2) = gp_Pnt (-aDx, aDy, 0.0).Transformed (aLabelPlane);
- aRectanglePoints.ChangeValue (3) = gp_Pnt ( aDx, aDy, 0.0).Transformed (aLabelPlane);
- aRectanglePoints.ChangeValue (4) = gp_Pnt ( aDx, -aDy, 0.0).Transformed (aLabelPlane);
+ TColgp_Array1OfPnt aRectanglePoints(1, 4);
+ aRectanglePoints.ChangeValue(1) = gp_Pnt (-aDx, -aDy, 0.0).Transformed (aLabelPlane);
+ aRectanglePoints.ChangeValue(2) = gp_Pnt (-aDx, aDy, 0.0).Transformed (aLabelPlane);
+ aRectanglePoints.ChangeValue(3) = gp_Pnt ( aDx, aDy, 0.0).Transformed (aLabelPlane);
+ aRectanglePoints.ChangeValue(4) = gp_Pnt ( aDx, -aDy, 0.0).Transformed (aLabelPlane);
+
+ Poly_Array1OfTriangle aTriangles(1, 2);
+ aTriangles.ChangeValue(1) = Poly_Triangle(1, 2, 3);
+ aTriangles.ChangeValue(2) = Poly_Triangle(1, 3, 4);
+
+ Handle(Poly_Triangulation) aRectanglePoly =
+ new Poly_Triangulation(aRectanglePoints, aTriangles);
- aTextSensitive = new Select3D_SensitiveFace (aSensitiveOwner, aRectanglePoints);
+ aTextSensitive =
+ new Select3D_SensitiveTriangulation (aSensitiveOwner, aRectanglePoly, TopLoc_Location(), Standard_True);
}
else
{
theSidePnt1 = ElCLib::Value ( anEdgeLength, anEdgeLin);
theSidePnt2 = ElCLib::Value (-anEdgeLength, anEdgeLin);
}
+
+//=======================================================================
+//function : GetTextPositionForLinear
+//purpose :
+//=======================================================================
+gp_Pnt AIS_Dimension::GetTextPositionForLinear (const gp_Pnt& theFirstPoint,
+ const gp_Pnt& theSecondPoint,
+ const Standard_Boolean theIsOneSide) const
+{
+ if (!IsValid())
+ {
+ return gp::Origin();
+ }
+
+ gp_Pnt aTextPosition (gp::Origin());
+
+ Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect();
+
+ // Get label alignment and arrow orientation.
+ Standard_Integer aLabelPosition = 0;
+ Standard_Boolean isArrowsExternal = Standard_False;
+ FitTextAlignmentForLinear (theFirstPoint, theSecondPoint, theIsOneSide,
+ aDimensionAspect->TextHorizontalPosition(),
+ aLabelPosition, isArrowsExternal);
+
+ // Compute dimension line points.
+ gp_Dir aPlaneNormal = GetPlane().Axis().Direction();
+ gp_Vec aTargetPointsVec (theFirstPoint, theSecondPoint);
+
+ // Compute flyout direction vector
+ gp_Dir aFlyoutVector = aPlaneNormal ^ gp_Dir (aTargetPointsVec);
+
+ // create lines for layouts
+ gp_Lin aLine1 (theFirstPoint, aFlyoutVector);
+ gp_Lin aLine2 (theSecondPoint, aFlyoutVector);
+ // Get flyout end points
+ gp_Pnt aLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1);
+ gp_Pnt aLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2);
+
+ // Get text position.
+ switch (aLabelPosition & LabelPosition_HMask)
+ {
+ case LabelPosition_Left:
+ {
+ gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint);
+ Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize();
+
+ Standard_Real anOffset = isArrowsExternal
+ ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length()
+ : anExtensionSize;
+ gp_Vec anExtensionVec = gp_Vec (aTargetPointsDir) * -anOffset;
+ aTextPosition = aLineEndPoint.Translated (anExtensionVec);
+ }
+ break;
+ case LabelPosition_Right:
+ {
+ gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint);
+ Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize();
+
+ Standard_Real anOffset = isArrowsExternal
+ ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length()
+ : anExtensionSize;
+ gp_Vec anExtensionVec = gp_Vec (aTargetPointsDir) * anOffset;
+ aTextPosition = aLineBegPoint.Translated (anExtensionVec);
+ }
+ break;
+ case LabelPosition_HCenter:
+ {
+ aTextPosition = (aLineBegPoint.XYZ() + aLineEndPoint.XYZ()) * 0.5;
+ }
+ break;
+ }
+
+ return aTextPosition;
+}
+
+//=======================================================================
+//function : AdjustParametersForLinear
+//purpose :
+//=======================================================================
+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();
+
+ 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);
+
+ Standard_Real aCos = aFirstToTextVec.Normalized() * gp_Vec (aTargetPointsDir);
+
+ gp_Pnt aTextPosProj = theFirstPoint.Translated
+ (gp_Vec (aTargetPointsDir) * aFirstToTextVec.Magnitude() * aCos);
+
+ // Compute flyout value and direction.
+ gp_Vec aFlyoutVector = gp_Vec (aTextPosProj, theTextPos);
+
+ 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 horizontal text alignment.
+ if (aCos < 0.0)
+ {
+ theAlignment = Prs3d_DTHP_Left;
+
+ Standard_Real aNewExtSize = theTextPos.Distance (aFirstAttach) - anArrowLength;
+ theExtensionSize = aNewExtSize < 0.0 ? 0.0 : aNewExtSize;
+ }
+ else if (aTextPosProj.Distance (theFirstPoint) > theFirstPoint.Distance (theSecondPoint))
+ {
+ theAlignment = Prs3d_DTHP_Right;
+
+ Standard_Real aNewExtSize = theTextPos.Distance (aSecondAttach) - anArrowLength;
+ theExtensionSize = aNewExtSize < 0.0 ? 0.0 : aNewExtSize;
+ }
+ else
+ {
+ theAlignment = Prs3d_DTHP_Center;
+ }
+ return Standard_True;
+}
+
+//=======================================================================
+//function : FitTextAlignmentForLinear
+//purpose :
+//=======================================================================
+void AIS_Dimension::FitTextAlignmentForLinear (const gp_Pnt& theFirstPoint,
+ const gp_Pnt& theSecondPoint,
+ const Standard_Boolean theIsOneSide,
+ const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos,
+ Standard_Integer& theLabelPosition,
+ Standard_Boolean& theIsArrowsExternal) const
+{
+ theLabelPosition = LabelPosition_None;
+ theIsArrowsExternal = Standard_False;
+
+ // Compute dimension line points
+ gp_Ax1 aPlaneNormal = GetPlane().Axis();
+ gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint);
+
+ // compute flyout direction vector
+ gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector;
+
+ // create lines for layouts
+ gp_Lin aLine1 (theFirstPoint, aFlyoutVector);
+ gp_Lin aLine2 (theSecondPoint, aFlyoutVector);
+
+ // Get flyout end points
+ gp_Pnt aLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1);
+ gp_Pnt aLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2);
+
+ Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect();
+
+ // For extensions we need to know arrow size, text size and extension size: get it from aspect
+ Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length();
+
+ // prepare label string and compute its geometrical width
+ Standard_Real aLabelWidth;
+ TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth);
+
+ // Add margins to cut dimension lines for 3d text
+ if (aDimensionAspect->IsText3d())
+ {
+ aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0;
+ }
+
+ // Handle user-defined and automatic arrow placement
+ switch (aDimensionAspect->ArrowOrientation())
+ {
+ case Prs3d_DAO_External: theIsArrowsExternal = true; break;
+ case Prs3d_DAO_Internal: theIsArrowsExternal = false; break;
+ case Prs3d_DAO_Fit:
+ {
+ // Add margin to ensure a small tail between text and arrow
+ Standard_Real anArrowMargin = aDimensionAspect->IsText3d()
+ ? aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN
+ : 0.0;
+
+ Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint);
+ Standard_Real anArrowsWidth = theIsOneSide
+ ? anArrowLength + anArrowMargin
+ : (anArrowLength + anArrowMargin) * 2.0;
+
+ theIsArrowsExternal = aDimensionWidth < aLabelWidth + anArrowsWidth;
+ break;
+ }
+ }
+
+ // Handle user-defined and automatic text placement
+ switch (theHorizontalTextPos)
+ {
+ case Prs3d_DTHP_Left : theLabelPosition |= LabelPosition_Left; break;
+ case Prs3d_DTHP_Right : theLabelPosition |= LabelPosition_Right; break;
+ case Prs3d_DTHP_Center: theLabelPosition |= LabelPosition_HCenter; break;
+ case Prs3d_DTHP_Fit:
+ {
+ Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint);
+ Standard_Real anArrowsWidth = theIsOneSide ? anArrowLength : 2.0 * anArrowLength;
+ Standard_Real aContentWidth = theIsArrowsExternal ? aLabelWidth : aLabelWidth + anArrowsWidth;
+
+ theLabelPosition |= aDimensionWidth < aContentWidth ? LabelPosition_Left : LabelPosition_HCenter;
+ break;
+ }
+ }
+
+ // Handle vertical text placement options
+ switch (aDimensionAspect->TextVerticalPosition())
+ {
+ case Prs3d_DTVP_Above : theLabelPosition |= LabelPosition_Above; break;
+ case Prs3d_DTVP_Below : theLabelPosition |= LabelPosition_Below; break;
+ case Prs3d_DTVP_Center : theLabelPosition |= LabelPosition_VCenter; break;
+ }
+}
+
+//=======================================================================
+//function : UnsetFixedTextPosition
+//purpose :
+//=======================================================================
+void AIS_Dimension::UnsetFixedTextPosition()
+{
+ myIsTextPositionFixed = Standard_False;
+ myFixedTextPosition = gp::Origin();
+}