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)
{
+ // Set default values of the presentation
myAspect = new Prs3d_DimensionAspect();
myAspect->MakeArrows3d(false);
myAspect->MakeText3d(false);
aRadius = aCenterAttr->pnt()->distance(aStartAttr->pnt());
}
std::shared_ptr<GeomAPI_Pnt> aCenter = myPlane->to3D(aCenterAttr->x(), aCenterAttr->y());
- std::shared_ptr<GeomAPI_Dir> aNormal = myPlane->norm();
+ std::shared_ptr<GeomAPI_Dir> aNormal = myPlane->normal();
GeomAPI_Circ aCircle(aCenter, aNormal, aRadius);
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);
}
void SketcherPrs_Radius::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
const Standard_Integer theMode)
{
+ // Map the application selection modes to standard ones
Standard_Integer aMode;
switch (theMode) {
case 0: // we should use selection of all objects