X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Arc.cpp;h=6295057977b2fc058736979d944cdfb1f3797114;hb=refs%2Fheads%2FDev_1.0.1;hp=b2615a6bbc98d8b220215fa306b4f9f9d9f7f27d;hpb=a91a2bfe4817a8bc8a1dc0b14463dab38595e60c;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Arc.cpp b/src/SketchPlugin/SketchPlugin_Arc.cpp index b2615a6bb..629505797 100644 --- a/src/SketchPlugin/SketchPlugin_Arc.cpp +++ b/src/SketchPlugin/SketchPlugin_Arc.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + // File: SketchPlugin_Arc.cpp // Created: 26 Apr 2014 // Author: Artem ZHIDKOV @@ -23,14 +25,16 @@ const double tolerance = 1e-7; SketchPlugin_Arc::SketchPlugin_Arc() : SketchPlugin_Feature() { + myStartUpdate = false; + myEndUpdate = false; } void SketchPlugin_Arc::initAttributes() { - data()->addAttribute(CENTER_ID(), GeomDataAPI_Point2D::type()); - data()->addAttribute(START_ID(), GeomDataAPI_Point2D::type()); - data()->addAttribute(END_ID(), GeomDataAPI_Point2D::type()); - data()->addAttribute(EXTERNAL_ID(), ModelAPI_AttributeSelection::type()); + data()->addAttribute(CENTER_ID(), GeomDataAPI_Point2D::typeId()); + data()->addAttribute(START_ID(), GeomDataAPI_Point2D::typeId()); + data()->addAttribute(END_ID(), GeomDataAPI_Point2D::typeId()); + data()->addAttribute(EXTERNAL_ID(), ModelAPI_AttributeSelection::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), EXTERNAL_ID()); } @@ -41,48 +45,47 @@ void SketchPlugin_Arc::execute() // otherwise AIS object is used to visualize the arc's preview if (aSketch && isFeatureValid()) { // compute a circle point in 3D view - boost::shared_ptr aCenterAttr = boost::dynamic_pointer_cast< - GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::CENTER_ID())); + std::shared_ptr aCenterAttr = std::dynamic_pointer_cast< + GeomDataAPI_Point2D>(data()->attribute(CENTER_ID())); // compute the arc start point - boost::shared_ptr aStartAttr = boost::dynamic_pointer_cast< - GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::START_ID())); + std::shared_ptr aStartAttr = std::dynamic_pointer_cast< + GeomDataAPI_Point2D>(data()->attribute(START_ID())); - boost::shared_ptr aCenter(aSketch->to3D(aCenterAttr->x(), aCenterAttr->y())); + std::shared_ptr aCenter(aSketch->to3D(aCenterAttr->x(), aCenterAttr->y())); // make a visible point - boost::shared_ptr aCenterPointShape = GeomAlgoAPI_PointBuilder::point(aCenter); - boost::shared_ptr aConstr1 = document()->createConstruction( + std::shared_ptr aCenterPointShape = GeomAlgoAPI_PointBuilder::point(aCenter); + std::shared_ptr aConstr1 = document()->createConstruction( data(), 0); aConstr1->setShape(aCenterPointShape); aConstr1->setIsInHistory(false); setResult(aConstr1, 0); // make a visible circle - boost::shared_ptr aNDir = boost::dynamic_pointer_cast( + std::shared_ptr aNDir = std::dynamic_pointer_cast( aSketch->data()->attribute(SketchPlugin_Sketch::NORM_ID())); - bool aHasPlane = aNDir && !(aNDir->x() == 0 && aNDir->y() == 0 && aNDir->z() == 0); - if (aHasPlane) { - boost::shared_ptr aNormal = aNDir->dir(); - boost::shared_ptr aStartPoint(aSketch->to3D(aStartAttr->x(), aStartAttr->y())); - - // compute and change the arc end point - boost::shared_ptr anEndAttr = boost::dynamic_pointer_cast< - GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::END_ID())); - boost::shared_ptr aCircleForArc( - new GeomAPI_Circ2d(aCenterAttr->pnt(), aStartAttr->pnt())); - boost::shared_ptr aProjection = aCircleForArc->project(anEndAttr->pnt()); - if (aProjection && anEndAttr->pnt()->distance(aProjection) > tolerance) - anEndAttr->setValue(aProjection); - boost::shared_ptr aEndPoint(aSketch->to3D(anEndAttr->x(), anEndAttr->y())); - - boost::shared_ptr aCircleShape = GeomAlgoAPI_EdgeBuilder::lineCircleArc( - aCenter, aStartPoint, aEndPoint, aNormal); - if (aCircleShape) { - boost::shared_ptr aConstr2 = document()->createConstruction( - data(), 1); - aConstr2->setShape(aCircleShape); - aConstr2->setIsInHistory(false); - setResult(aConstr2, 1); - } + std::shared_ptr aNormal = aNDir->dir(); + std::shared_ptr aStartPoint(aSketch->to3D(aStartAttr->x(), aStartAttr->y())); + + // compute and change the arc end point + std::shared_ptr anEndAttr = std::dynamic_pointer_cast< + GeomDataAPI_Point2D>(data()->attribute(END_ID())); + /* must be automatically done in attributeChanged + std::shared_ptr aCircleForArc( + new GeomAPI_Circ2d(aCenterAttr->pnt(), aStartAttr->pnt())); + std::shared_ptr aProjection = aCircleForArc->project(anEndAttr->pnt()); + if (aProjection && anEndAttr->pnt()->distance(aProjection) > tolerance) + anEndAttr->setValue(aProjection); + */ + std::shared_ptr aEndPoint(aSketch->to3D(anEndAttr->x(), anEndAttr->y())); + + std::shared_ptr aCircleShape = GeomAlgoAPI_EdgeBuilder::lineCircleArc( + aCenter, aStartPoint, aEndPoint, aNormal); + if (aCircleShape) { + std::shared_ptr aConstr2 = document()->createConstruction( + data(), 1); + aConstr2->setShape(aCircleShape); + aConstr2->setIsInHistory(false); + setResult(aConstr2, 1); } } } @@ -93,41 +96,45 @@ AISObjectPtr SketchPlugin_Arc::getAISObject(AISObjectPtr thePrevious) if (aSketch) { // if the feature is valid, the execute() method should be performed, AIS object is empty if (!isFeatureValid()) { - std::list > aShapes; - // compute a circle point in 3D view - boost::shared_ptr aCenterAttr = boost::dynamic_pointer_cast< - GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::CENTER_ID())); + std::shared_ptr aCenterAttr = std::dynamic_pointer_cast< + GeomDataAPI_Point2D>(data()->attribute(CENTER_ID())); if (aCenterAttr->isInitialized()) { - boost::shared_ptr aCenter(aSketch->to3D(aCenterAttr->x(), aCenterAttr->y())); - // make a visible point - boost::shared_ptr aCenterPointShape = GeomAlgoAPI_PointBuilder::point(aCenter); - aShapes.push_back(aCenterPointShape); + std::shared_ptr aCenter(aSketch->to3D(aCenterAttr->x(), aCenterAttr->y())); - boost::shared_ptr aStartAttr = boost::dynamic_pointer_cast< + std::shared_ptr aStartAttr = std::dynamic_pointer_cast< GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::START_ID())); if (aStartAttr->isInitialized()) { // make a visible circle - boost::shared_ptr aNDir = boost::dynamic_pointer_cast( + std::shared_ptr aNDir = std::dynamic_pointer_cast( aSketch->data()->attribute(SketchPlugin_Sketch::NORM_ID())); bool aHasPlane = aNDir && !(aNDir->x() == 0 && aNDir->y() == 0 && aNDir->z() == 0); if (aHasPlane) { - boost::shared_ptr aNormal = aNDir->dir(); - boost::shared_ptr aStartPoint(aSketch->to3D(aStartAttr->x(), aStartAttr->y())); - boost::shared_ptr aCircleShape = GeomAlgoAPI_EdgeBuilder::lineCircleArc( + std::shared_ptr aNormal = aNDir->dir(); + std::shared_ptr aStartPoint(aSketch->to3D(aStartAttr->x(), aStartAttr->y())); + std::shared_ptr aCircleShape = GeomAlgoAPI_EdgeBuilder::lineCircleArc( aCenter, aStartPoint, aStartPoint, aNormal); if (aCircleShape) { + std::list > aShapes; + // make a visible point + std::shared_ptr aCenterPointShape = GeomAlgoAPI_PointBuilder::point(aCenter); + aShapes.push_back(aCenterPointShape); + aShapes.push_back(aCircleShape); + if (!aShapes.empty()) + { + std::shared_ptr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aShapes); + AISObjectPtr anAIS = thePrevious; + if (!anAIS) + anAIS = AISObjectPtr(new GeomAPI_AISObject); + anAIS->createShape(aCompound); + anAIS->setWidth(3); + return anAIS; + } } } } } - boost::shared_ptr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aShapes); - AISObjectPtr anAIS = thePrevious; - if (!anAIS) - anAIS = AISObjectPtr(new GeomAPI_AISObject); - anAIS->createShape(aCompound); - return anAIS; } } return AISObjectPtr(); @@ -135,39 +142,43 @@ AISObjectPtr SketchPlugin_Arc::getAISObject(AISObjectPtr thePrevious) void SketchPlugin_Arc::move(double theDeltaX, double theDeltaY) { - boost::shared_ptr aData = data(); + std::shared_ptr aData = data(); if (!aData->isValid()) return; - boost::shared_ptr aPoint1 = boost::dynamic_pointer_cast( + std::shared_ptr aPoint1 = std::dynamic_pointer_cast( aData->attribute(SketchPlugin_Arc::CENTER_ID())); aPoint1->move(theDeltaX, theDeltaY); - boost::shared_ptr aPoint2 = boost::dynamic_pointer_cast( + myStartUpdate = true; + myEndUpdate = true; + std::shared_ptr aPoint2 = std::dynamic_pointer_cast( aData->attribute(SketchPlugin_Arc::START_ID())); aPoint2->move(theDeltaX, theDeltaY); - boost::shared_ptr aPoint3 = boost::dynamic_pointer_cast( + std::shared_ptr aPoint3 = std::dynamic_pointer_cast( aData->attribute(SketchPlugin_Arc::END_ID())); aPoint3->move(theDeltaX, theDeltaY); + myStartUpdate = false; + myEndUpdate = false; } -double SketchPlugin_Arc::distanceToPoint(const boost::shared_ptr& thePoint) +double SketchPlugin_Arc::distanceToPoint(const std::shared_ptr& thePoint) { double aDelta = 0; - boost::shared_ptr aData = data(); + std::shared_ptr aData = data(); - boost::shared_ptr aPoint1 = boost::dynamic_pointer_cast( + std::shared_ptr aPoint1 = std::dynamic_pointer_cast( aData->attribute(SketchPlugin_Arc::CENTER_ID())); aDelta = aPoint1->pnt()->distance(thePoint); - boost::shared_ptr aPoint2 = boost::dynamic_pointer_cast( + std::shared_ptr aPoint2 = std::dynamic_pointer_cast( aData->attribute(SketchPlugin_Arc::START_ID())); double aDistance = aPoint2->pnt()->distance(thePoint); if (aDelta < aDistance) aDelta = aDistance; - boost::shared_ptr aPoint3 = boost::dynamic_pointer_cast( + std::shared_ptr aPoint3 = std::dynamic_pointer_cast( aData->attribute(SketchPlugin_Arc::END_ID())); aDistance = aPoint3->pnt()->distance(thePoint); if (aDelta < aDistance) @@ -177,17 +188,63 @@ double SketchPlugin_Arc::distanceToPoint(const boost::shared_ptr& } bool SketchPlugin_Arc::isFixed() { - return data()->selection(EXTERNAL_ID())->context(); + return data()->selection(EXTERNAL_ID())->context().get(); } bool SketchPlugin_Arc::isFeatureValid() { - boost::shared_ptr aCenterAttr = boost::dynamic_pointer_cast< + std::shared_ptr aCenterAttr = std::dynamic_pointer_cast< GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::CENTER_ID())); - boost::shared_ptr aStartAttr = boost::dynamic_pointer_cast< + std::shared_ptr aStartAttr = std::dynamic_pointer_cast< GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::START_ID())); - boost::shared_ptr anEndAttr = boost::dynamic_pointer_cast< + std::shared_ptr anEndAttr = std::dynamic_pointer_cast< GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::END_ID())); return aCenterAttr->isInitialized() && aStartAttr->isInitialized() && anEndAttr->isInitialized(); } + +void SketchPlugin_Arc::attributeChanged(const std::string& theID) +{ + std::shared_ptr aCenterAttr = std::dynamic_pointer_cast< + GeomDataAPI_Point2D>(data()->attribute(CENTER_ID())); + if (!aCenterAttr->isInitialized()) + return; + std::shared_ptr aStartAttr = std::dynamic_pointer_cast< + GeomDataAPI_Point2D>(data()->attribute(START_ID())); + if (!aStartAttr->isInitialized()) + return; + std::shared_ptr anEndAttr = std::dynamic_pointer_cast< + GeomDataAPI_Point2D>(data()->attribute(END_ID())); + if (!anEndAttr->isInitialized()) + return; + + // update the points in accordance to the changed point changes + if (theID == END_ID() && !myEndUpdate) { + myEndUpdate = true; + // compute and change the arc end point + std::shared_ptr aCircleForArc( + new GeomAPI_Circ2d(aCenterAttr->pnt(), aStartAttr->pnt())); + std::shared_ptr aProjection = aCircleForArc->project(anEndAttr->pnt()); + if (aProjection && anEndAttr->pnt()->distance(aProjection) > tolerance) + anEndAttr->setValue(aProjection); + myEndUpdate = false; + } else if (theID == START_ID() && !myStartUpdate) { + myStartUpdate = true; + // compute and change the arc end point + std::shared_ptr aCircleForArc( + new GeomAPI_Circ2d(aCenterAttr->pnt(), anEndAttr->pnt())); + std::shared_ptr aProjection = aCircleForArc->project(aStartAttr->pnt()); + if (aProjection && aStartAttr->pnt()->distance(aProjection) > tolerance) + aStartAttr->setValue(aProjection); + myStartUpdate = false; + } else if (theID == CENTER_ID() && !myEndUpdate) { + myEndUpdate = true; + // compute and change the arc end point + std::shared_ptr aCircleForArc( + new GeomAPI_Circ2d(aCenterAttr->pnt(), aStartAttr->pnt())); + std::shared_ptr aProjection = aCircleForArc->project(anEndAttr->pnt()); + if (aProjection && anEndAttr->pnt()->distance(aProjection) > tolerance) + anEndAttr->setValue(aProjection); + myEndUpdate = false; + } +}