X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketcherPrs%2FSketcherPrs_LengthDimension.cpp;h=24977ecee183754414167f5ef6bf6ea5e1cd766a;hb=497397f795254cb5adf0d727f5858d5aeb16eaf3;hp=0f5d2b8f022cd10c309f32b29242a57896ed5758;hpb=6aad051f35d9c375d4727ce5f4d1cbfe24fd3838;p=modules%2Fshaper.git diff --git a/src/SketcherPrs/SketcherPrs_LengthDimension.cpp b/src/SketcherPrs/SketcherPrs_LengthDimension.cpp index 0f5d2b8f0..24977ecee 100644 --- a/src/SketcherPrs/SketcherPrs_LengthDimension.cpp +++ b/src/SketcherPrs/SketcherPrs_LengthDimension.cpp @@ -23,21 +23,14 @@ #include -const int CONSTRAINT_TEXT_HEIGHT = 20; /// the text height of the constraint -const int CONSTRAINT_TEXT_SELECTION_TOLERANCE = 20; /// the text selection tolerance - - static const gp_Pnt MyDefStart(0,0,0); static const gp_Pnt MyDefEnd(1,0,0); static const gp_Pln MyDefPln(gp_Pnt(0,0,0), gp_Dir(0,0,1)); - - - IMPLEMENT_STANDARD_HANDLE(SketcherPrs_LengthDimension, AIS_LengthDimension); IMPLEMENT_STANDARD_RTTIEXT(SketcherPrs_LengthDimension, AIS_LengthDimension); -SketcherPrs_LengthDimension::SketcherPrs_LengthDimension(SketchPlugin_Constraint* theConstraint, +SketcherPrs_LengthDimension::SketcherPrs_LengthDimension(ModelAPI_Feature* theConstraint, const std::shared_ptr& thePlane) : AIS_LengthDimension(MyDefStart, MyDefEnd, MyDefPln), myConstraint(theConstraint), myPlane(thePlane) @@ -47,9 +40,11 @@ myConstraint(theConstraint), myPlane(thePlane) myAspect->MakeText3d(false); myAspect->MakeTextShaded(false); myAspect->MakeUnitsDisplayed(false); + myAspect->TextAspect()->SetHeight(SketcherPrs_Tools::getDefaultTextHeight()); + myAspect->ArrowAspect()->SetLength(SketcherPrs_Tools::getArrowSize()); + SetSelToleranceForText2d(SketcherPrs_Tools::getTextHeight()); SetDimensionAspect(myAspect); - SetSelToleranceForText2d(CONSTRAINT_TEXT_SELECTION_TOLERANCE); } @@ -60,47 +55,26 @@ void SketcherPrs_LengthDimension::Compute(const Handle(PrsMgr_PresentationManage gp_Pnt aPnt1, aPnt2; if (!getPoints(aPnt1, aPnt2)) return; - DataPtr aData = myConstraint->data(); - AttributePtr aFlyOutAttribute = aData->attribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT()); - if (!aFlyOutAttribute->isInitialized()) { - return; // not possible to show length because points are not defined - } - std::shared_ptr aFlyOutAttr = - std::dynamic_pointer_cast(aFlyOutAttribute); - std::shared_ptr aFlyoutPnt = myPlane->to3D(aFlyOutAttr->x(), aFlyOutAttr->y()); - gp_Pnt aFlyPnt = aFlyoutPnt->impl(); - - double aDistance = aPnt1.Distance(aPnt2); - - double aFlyout = 0; - double aDist = 0.0; - if (aDistance < Precision::Confusion()) - aDist = aPnt1.Distance(aFlyPnt); - else { - gp_Lin aLine(aPnt1, gp_Vec(aPnt1, aPnt2)); - aDist = aLine.Distance(aFlyPnt); - } - - gp_XYZ aLineDir = aPnt2.XYZ().Subtracted(aPnt1.XYZ()); - gp_XYZ aFOutDir = aFlyPnt.XYZ().Subtracted(aPnt1.XYZ()); - gp_XYZ aNorm = myPlane->norm()->xyz()->impl(); - if (aLineDir.Crossed(aFOutDir).Dot(aNorm) < 0) - aDist = -aDist; - aFlyout = aDist; + // compute flyout distance + double aD = SketcherPrs_Tools::getFlyoutDistance(myConstraint); + SetFlyout(SketcherPrs_Tools::getFlyoutDistance(myConstraint)); + SetMeasuredGeometry(aPnt1, aPnt2, myPlane->impl()); - SetFlyout(aFlyout); - myAspect->TextAspect()->SetHeight(CONSTRAINT_TEXT_HEIGHT); - myAspect->ArrowAspect()->SetLength(CONSTRAINT_TEXT_HEIGHT * 2); + // Update variable aspect parameters (depending on viewer scale) + myAspect->SetExtensionSize(myAspect->ArrowAspect()->Length()); + myAspect->SetArrowTailSize(myAspect->ArrowAspect()->Length()); + // The value of vertical aligment is sometimes changed + myAspect->TextAspect()->SetVerticalJustification(Graphic3d_VTA_CENTER); - SetMeasuredGeometry(aPnt1, aPnt2, myPlane->impl()); AIS_LengthDimension::Compute(thePresentationManager, thePresentation, theMode); } -bool SketcherPrs_LengthDimension::getPoints(gp_Pnt& thePnt1, gp_Pnt& thePnt2) const +bool SketcherPrs_LengthDimension::getPoints(gp_Pnt& thePnt1, gp_Pnt& thePnt2) { DataPtr aData = myConstraint->data(); if (myConstraint->getKind() == SketchPlugin_ConstraintLength::ID()) { + // The constraint is length std::shared_ptr anAttr = std::dynamic_pointer_cast (aData->attribute(SketchPlugin_Constraint::ENTITY_A())); @@ -111,6 +85,7 @@ bool SketcherPrs_LengthDimension::getPoints(gp_Pnt& thePnt1, gp_Pnt& thePnt2) co if (!aFeature || aFeature->getKind() != SketchPlugin_Line::ID()) return false; + // Get geometry of the object DataPtr aLineData = aFeature->data(); std::shared_ptr aStartPoint = std::dynamic_pointer_cast @@ -123,34 +98,39 @@ bool SketcherPrs_LengthDimension::getPoints(gp_Pnt& thePnt1, gp_Pnt& thePnt2) co return true; } else if (myConstraint->getKind() == SketchPlugin_ConstraintDistance::ID()) { + // The constraint is distance std::shared_ptr aPoint_A = SketcherPrs_Tools::getFeaturePoint( - aData, SketchPlugin_Constraint::ENTITY_A()); + aData, SketchPlugin_Constraint::ENTITY_A(), myPlane); std::shared_ptr aPoint_B = SketcherPrs_Tools::getFeaturePoint( - aData, SketchPlugin_Constraint::ENTITY_B()); + aData, SketchPlugin_Constraint::ENTITY_B(), myPlane); std::shared_ptr aPnt_A; std::shared_ptr aPnt_B; if (aPoint_A && aPoint_B) { + // Both objects are points aPnt_A = aPoint_A->pnt(); aPnt_B = aPoint_B->pnt(); } else if (!aPoint_A && aPoint_B) { - std::shared_ptr aLine = SketcherPrs_Tools::getFeatureLine( + // First object is line + FeaturePtr aLine = SketcherPrs_Tools::getFeatureLine( aData, SketchPlugin_Constraint::ENTITY_A()); if (aLine) { aPnt_B = aPoint_B->pnt(); aPnt_A = SketcherPrs_Tools::getProjectionPoint(aLine, aPnt_B); } } else if (aPoint_A && !aPoint_B) { - std::shared_ptr aLine = SketcherPrs_Tools::getFeatureLine( + // Second object is line + FeaturePtr aLine = SketcherPrs_Tools::getFeatureLine( aData, SketchPlugin_Constraint::ENTITY_B()); if (aLine) { aPnt_A = aPoint_A->pnt(); aPnt_B = SketcherPrs_Tools::getProjectionPoint(aLine, aPnt_A); } } - if (!aPnt_A || !aPnt_B) + if (!aPnt_A || !aPnt_B) // Objects not found return false; + // Get points from these objects std::shared_ptr aPoint1 = myPlane->to3D(aPnt_A->x(), aPnt_A->y()); std::shared_ptr aPoint2 = myPlane->to3D(aPnt_B->x(), aPnt_B->y()); thePnt1 = aPoint1->impl(); @@ -159,3 +139,33 @@ bool SketcherPrs_LengthDimension::getPoints(gp_Pnt& thePnt1, gp_Pnt& thePnt2) co } return false; } + + + +void SketcherPrs_LengthDimension::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 + aMode = 0; + break; + case SketcherPrs_Tools::Sel_Dimension_All: + aMode = 0; + break; + case SketcherPrs_Tools::Sel_Dimension_Line: + aMode = 1; + break; + case SketcherPrs_Tools::Sel_Dimension_Text: + aMode = 2; + break; + default: { + // there are own selection modes, so the others should be ignored + // otherwise, the text selection appears in the viewer + return; + } + } + SetSelToleranceForText2d(SketcherPrs_Tools::getTextHeight()); + AIS_LengthDimension::ComputeSelection(aSelection, aMode); +}