X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintLength.cpp;h=dac5f926b3824aa66eefcaf3f7237fe8d296f549;hb=47d69c6e766821c1296c5147a6248ae49020c7dd;hp=7218a5341a6cafca97d0d5359bb0609bff2207d0;hpb=8ef37902d880bc2e74f2ae46880aaee1b4c19307;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintLength.cpp b/src/SketchPlugin/SketchPlugin_ConstraintLength.cpp index 7218a5341..dac5f926b 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintLength.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintLength.cpp @@ -3,12 +3,22 @@ // Author: Artem ZHIDKOV #include "SketchPlugin_ConstraintLength.h" +#include #include #include #include +#include + +#include +#include + +#include +#include +#include + SketchPlugin_ConstraintLength::SketchPlugin_ConstraintLength() { } @@ -16,18 +26,136 @@ SketchPlugin_ConstraintLength::SketchPlugin_ConstraintLength() void SketchPlugin_ConstraintLength::initAttributes() { data()->addAttribute(CONSTRAINT_ATTR_VALUE, ModelAPI_AttributeDouble::type()); - data()->addAttribute(CONSTRAINT_ATTR_FLYOUT_VALUE, ModelAPI_AttributeDouble::type()); data()->addAttribute(CONSTRAINT_ATTR_FLYOUT_VALUE_PNT, GeomDataAPI_Point2D::type()); data()->addAttribute(CONSTRAINT_ATTR_ENTITY_A, ModelAPI_AttributeRefAttr::type()); } void SketchPlugin_ConstraintLength::execute() { + if (data()->attribute(CONSTRAINT_ATTR_ENTITY_A)->isInitialized() && + !data()->attribute(CONSTRAINT_ATTR_VALUE)->isInitialized()) { + + boost::shared_ptr aRef = + boost::dynamic_pointer_cast(data()->attribute(CONSTRAINT_ATTR_ENTITY_A)); + FeaturePtr aFeature = aRef->feature(); + if (aFeature) { + // set length value + boost::shared_ptr aPoint1 = + boost::dynamic_pointer_cast(aFeature->data()->attribute(LINE_ATTR_START)); + boost::shared_ptr aPoint2 = + boost::dynamic_pointer_cast(aFeature->data()->attribute(LINE_ATTR_END)); + + double aLenght = aPoint1->pnt()->distance(aPoint2->pnt()); + + boost::shared_ptr aValueAttr = + boost::dynamic_pointer_cast(data()->attribute(CONSTRAINT_ATTR_VALUE)); + aValueAttr->setValue(aLenght); + } + } } -const boost::shared_ptr& SketchPlugin_ConstraintLength::preview() +Handle(AIS_InteractiveObject) SketchPlugin_ConstraintLength::getAISShape( + Handle_AIS_InteractiveObject thePrevious) { - /// \todo Preview for distance constraint - return getPreview(); + if (!sketch()) + return thePrevious; + + boost::shared_ptr aPlane = sketch()->plane(); + + boost::shared_ptr anAttr = + boost::dynamic_pointer_cast(data()->attribute(CONSTRAINT_ATTR_ENTITY_A)); + if (!anAttr) + return thePrevious; + FeaturePtr aFeature = anAttr->feature(); + if (!aFeature || aFeature->getKind() != SKETCH_LINE_KIND) + return thePrevious; + + // fly out calculation + boost::shared_ptr aFlyOutAttr = + boost::dynamic_pointer_cast(data()->attribute(CONSTRAINT_ATTR_FLYOUT_VALUE_PNT)); + double aFlyout = 0; + if (aFlyOutAttr->isInitialized()) { + boost::shared_ptr aFlyOutPnt = aFlyOutAttr->pnt(); + + boost::shared_ptr aStartPoint = + boost::dynamic_pointer_cast(aFeature->data()->attribute(LINE_ATTR_START)); + boost::shared_ptr anEndPoint = + boost::dynamic_pointer_cast(aFeature->data()->attribute(LINE_ATTR_END)); + + boost::shared_ptr aFeatureLin = boost::shared_ptr + (new GeomAPI_Lin2d(aStartPoint->x(), aStartPoint->y(), + anEndPoint->x(), anEndPoint->y())); + boost::shared_ptr aProjectedPoint = aFeatureLin->project(aFlyOutPnt); + double aDistance = aFlyOutPnt->distance(aProjectedPoint); + if (!aFeatureLin->isRight(aFlyOutPnt)) + aDistance = -aDistance; + aFlyout = aDistance; + } + // value + boost::shared_ptr aValueAttr = + boost::dynamic_pointer_cast(data()->attribute(CONSTRAINT_ATTR_VALUE)); + double aValue = aValueAttr->value(); + + boost::shared_ptr aData = aFeature->data(); + if (!aData->isValid()) + return thePrevious; + + boost::shared_ptr aPointStart = + boost::dynamic_pointer_cast(aData->attribute(LINE_ATTR_START)); + boost::shared_ptr aPointEnd = + boost::dynamic_pointer_cast(aData->attribute(LINE_ATTR_END)); + + //Build dimension here + boost::shared_ptr aPoint1 = sketch()->to3D(aPointStart->x(), aPointStart->y()); + boost::shared_ptr aPoint2 = sketch()->to3D(aPointEnd->x(), aPointEnd->y()); + + Handle(AIS_InteractiveObject) anAIS = thePrevious; + if (anAIS.IsNull()) + { + Handle(AIS_LengthDimension) aDimAIS = + new AIS_LengthDimension(aPoint1->impl(), aPoint2->impl(), aPlane->impl()); + aDimAIS->SetCustomValue(aValue); + + Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect(); + anAspect->MakeArrows3d (Standard_False); + anAspect->MakeText3d(false/*is text 3d*/); + anAspect->TextAspect()->SetHeight(CONSTRAINT_TEXT_HEIGHT); + anAspect->MakeTextShaded(false/*is test shaded*/); + aDimAIS->DimensionAspect()->MakeUnitsDisplayed(false/*is units displayed*/); + /*if (isUnitsDisplayed) + { + aDimAIS->SetDisplayUnits (aDimDlg->GetUnits ()); + }*/ + aDimAIS->SetDimensionAspect (anAspect); + aDimAIS->SetFlyout(aFlyout); + aDimAIS->SetSelToleranceForText2d(CONSTRAINT_TEXT_SELECTION_TOLERANCE); + + anAIS = aDimAIS; + } + else + { + // update presentation + Handle(AIS_LengthDimension) aDimAIS = Handle(AIS_LengthDimension)::DownCast(anAIS); + if (!aDimAIS.IsNull()) + { + aDimAIS->SetMeasuredGeometry(aPoint1->impl(), aPoint2->impl(), aPlane->impl()); + aDimAIS->SetCustomValue(aValue); + aDimAIS->SetFlyout(aFlyout); + + aDimAIS->Redisplay(Standard_True); + } + } + return anAIS; +} + +void SketchPlugin_ConstraintLength::move(double theDeltaX, double theDeltaY) +{ + boost::shared_ptr aData = data(); + if (!aData->isValid()) + return; + + boost::shared_ptr aPoint1 = + boost::dynamic_pointer_cast(aData->attribute(CONSTRAINT_ATTR_FLYOUT_VALUE_PNT)); + aPoint1->setValue(aPoint1->x() + theDeltaX, aPoint1->y() + theDeltaY); }