X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintDistance.cpp;h=de504f56ea4b1ca99cc88607c51d4dba6df46f09;hb=3ce4e2cad0e6802282a5a1d10c49c041e8a9f287;hp=d6e2b0075c7958cdbff8f71c55da53209fbd6f6f;hpb=d48cb022ea8263c47120dfc6787156cf663eede0;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp index d6e2b0075..de504f56e 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp @@ -3,50 +3,190 @@ // Author: Artem ZHIDKOV #include "SketchPlugin_ConstraintDistance.h" +#include +#include +#include -#include "GeomDataAPI_Point2D.h" +#include +#include +#include #include #include -#include + SketchPlugin_ConstraintDistance::SketchPlugin_ConstraintDistance() { } +//************************************************************************************* void SketchPlugin_ConstraintDistance::initAttributes() { - data()->addAttribute(CONSTRAINT_ATTR_VALUE, ModelAPI_AttributeDouble::type()); - data()->addAttribute(CONSTRAINT_ATTR_FLYOUT_VALUE_PNT, GeomDataAPI_Point2D::type()); - data()->addAttribute(CONSTRAINT_ATTR_ENTITY_A, ModelAPI_AttributeRefAttr::type()); - data()->addAttribute(CONSTRAINT_ATTR_ENTITY_B, ModelAPI_AttributeRefAttr::type()); + data()->addAttribute(SketchPlugin_Constraint::VALUE(), ModelAPI_AttributeDouble::type()); + data()->addAttribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT(), GeomDataAPI_Point2D::type()); + data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::type()); + data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::type()); } +//************************************************************************************* void SketchPlugin_ConstraintDistance::execute() { boost::shared_ptr aData = data(); + AttributeDoublePtr anAttr_Value = + boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Constraint::VALUE())); + + if (!anAttr_Value->isInitialized()) { + boost::shared_ptr aPoint_A = + getFeaturePoint(aData, SketchPlugin_Constraint::ENTITY_A()); + boost::shared_ptr aPoint_B = + getFeaturePoint(aData, SketchPlugin_Constraint::ENTITY_B()); + + if (aPoint_A && aPoint_B) { // both points + anAttr_Value->setValue(aPoint_A->pnt()->distance(aPoint_B->pnt())); + } else { + if (!aPoint_A && aPoint_B) { //Line and point + boost::shared_ptr aLine = + getFeatureLine(aData, SketchPlugin_Constraint::ENTITY_A()); + if (aLine) + anAttr_Value->setValue(aLine->distanceToPoint(aPoint_B->pnt())); + } else if (aPoint_A && !aPoint_B) { // Point and line + boost::shared_ptr aLine = + getFeatureLine(aData, SketchPlugin_Constraint::ENTITY_B()); + if(aLine) + anAttr_Value->setValue(aLine->distanceToPoint(aPoint_A->pnt())); + } + } + } +} + +//************************************************************************************* +boost::shared_ptr SketchPlugin_ConstraintDistance::getAISObject( + boost::shared_ptr thePrevious) +{ + if (!sketch()) + return thePrevious; + + boost::shared_ptr aPlane = sketch()->plane(); + + DataPtr aData = data(); + boost::shared_ptr aPoint_A = getFeaturePoint(aData, SketchPlugin_Constraint::ENTITY_A()); + boost::shared_ptr aPoint_B = getFeaturePoint(aData, SketchPlugin_Constraint::ENTITY_B()); + + boost::shared_ptr aPnt_A; + boost::shared_ptr aPnt_B; + + if (aPoint_A && aPoint_B) { + aPnt_A = aPoint_A->pnt(); + aPnt_B = aPoint_B->pnt(); + } else if (!aPoint_A && aPoint_B) { + boost::shared_ptr aLine = + getFeatureLine(aData, SketchPlugin_Constraint::ENTITY_A()); + if (aLine) { + aPnt_B = aPoint_B->pnt(); + aPnt_A = getProjectionPoint(aLine, aPnt_B); + } + } else if (aPoint_A && !aPoint_B) { + boost::shared_ptr aLine = + getFeatureLine(aData, SketchPlugin_Constraint::ENTITY_B()); + if (aLine) { + aPnt_A = aPoint_A->pnt(); + aPnt_B = getProjectionPoint(aLine, aPnt_A); + } + } + if (!aPnt_A || !aPnt_B) + return thePrevious; + + boost::shared_ptr aFlyOutAttr = + boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT())); + + boost::shared_ptr aPoint1 = sketch()->to3D(aPnt_A->x(), aPnt_A->y()); + boost::shared_ptr aPoint2 = sketch()->to3D(aPnt_B->x(), aPnt_B->y()); + boost::shared_ptr aFlyoutPnt = aFlyOutAttr->isInitialized() ? + sketch()->to3D(aFlyOutAttr->x(), aFlyOutAttr->y()) : + boost::shared_ptr(); + + // value calculation + boost::shared_ptr aValueAttr = + boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Constraint::VALUE())); + double aValue = aValueAttr->value(); + + boost::shared_ptr anAIS = thePrevious; + if (!anAIS) + anAIS = boost::shared_ptr(new GeomAPI_AISObject); + anAIS->createDistance(aPoint1, aPoint2, aFlyoutPnt, aPlane, aValue); + return anAIS; +} + +//************************************************************************************* +void SketchPlugin_ConstraintDistance::move(double theDeltaX, double theDeltaY) +{ + boost::shared_ptr aData = data(); + if (!aData->isValid()) + return; - boost::shared_ptr anAttr_A = - boost::dynamic_pointer_cast(aData->attribute(CONSTRAINT_ATTR_ENTITY_A)); - boost::shared_ptr anAttr_B = - boost::dynamic_pointer_cast(aData->attribute(CONSTRAINT_ATTR_ENTITY_B)); + boost::shared_ptr aPoint1 = + boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT())); + aPoint1->setValue(aPoint1->x() + theDeltaX, aPoint1->y() + theDeltaY); +} + +//************************************************************************************* +boost::shared_ptr getFeaturePoint(DataPtr theData, + const std::string& theAttribute) +{ + boost::shared_ptr aPointAttr; - AttributeDoublePtr anAttribute = - boost::dynamic_pointer_cast(aData->attribute(CONSTRAINT_ATTR_VALUE)); + if (!theData) + return aPointAttr; - if (anAttr_A && anAttr_B && anAttribute->value() == 0) - { - FeaturePtr aFeature_A = anAttr_A->feature(); - FeaturePtr aFeature_B = anAttr_B->feature(); + FeaturePtr aFeature; + boost::shared_ptr anAttr = + boost::dynamic_pointer_cast(theData->attribute(theAttribute)); + if (anAttr) + aFeature = ModelAPI_Feature::feature(anAttr->object()); - double aValue = 40; // TODO - anAttribute->setValue(aValue); + if (aFeature && aFeature->getKind() == SketchPlugin_Point::ID()) + aPointAttr = boost::dynamic_pointer_cast + (aFeature->data()->attribute(SketchPlugin_Point::COORD_ID())); + else if (aFeature && aFeature->getKind() == SketchPlugin_Circle::ID()) + aPointAttr = boost::dynamic_pointer_cast + (aFeature->data()->attribute(SketchPlugin_Circle::CENTER_ID())); + else if (anAttr->attr()) { + aPointAttr = boost::dynamic_pointer_cast(anAttr->attr()); } + return aPointAttr; } -const boost::shared_ptr& SketchPlugin_ConstraintDistance::preview() +//************************************************************************************* +boost::shared_ptr getFeatureLine(DataPtr theData, const std::string& theAttribute) { - /// \todo Preview for distance constraint - return getPreview(); + boost::shared_ptr aLine; + if (!theData) + return aLine; + + boost::shared_ptr anAttr = + boost::dynamic_pointer_cast(theData->attribute(theAttribute)); + if (anAttr) { + FeaturePtr aFeature = ModelAPI_Feature::feature(anAttr->object()); + if (aFeature && aFeature->getKind() == SketchPlugin_Line::ID()) { + aLine = boost::dynamic_pointer_cast(aFeature); + } + } + return aLine; } +//************************************************************************************* +boost::shared_ptr getProjectionPoint(const boost::shared_ptr& theLine, + const boost::shared_ptr& thePoint) +{ + boost::shared_ptr aData = theLine->data(); + boost::shared_ptr aPoint1 = + boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Line::START_ID())); + boost::shared_ptr aPoint2 = + boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Line::END_ID())); + + GeomAPI_Lin2d aLin2d(aPoint1->x(), aPoint1->y(), aPoint2->x(), aPoint2->y()); + return aLin2d.project(thePoint); +} \ No newline at end of file