From f875cd6c265f294012cbe7fe1cc42a9ffcf7f52e Mon Sep 17 00:00:00 2001 From: nds Date: Thu, 30 Oct 2014 13:34:16 +0300 Subject: [PATCH] Preview of an arc object to visualize presentation even when not all attributes are initialized. --- src/SketchPlugin/SketchPlugin_Arc.cpp | 148 +++++++++++++++++--------- src/SketchPlugin/SketchPlugin_Arc.h | 14 ++- 2 files changed, 105 insertions(+), 57 deletions(-) diff --git a/src/SketchPlugin/SketchPlugin_Arc.cpp b/src/SketchPlugin/SketchPlugin_Arc.cpp index d9afa4fa9..b2615a6bb 100644 --- a/src/SketchPlugin/SketchPlugin_Arc.cpp +++ b/src/SketchPlugin/SketchPlugin_Arc.cpp @@ -37,68 +37,100 @@ void SketchPlugin_Arc::initAttributes() void SketchPlugin_Arc::execute() { SketchPlugin_Sketch* aSketch = sketch(); - if (aSketch) { - std::list > aShapes; - + // result for the arc is set only when all obligatory attributes are initialized, + // 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())); // compute the arc start point boost::shared_ptr aStartAttr = boost::dynamic_pointer_cast< GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::START_ID())); - if (aCenterAttr->isInitialized() && aStartAttr->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); - boost::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( - 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())); - if (anEndAttr->isInitialized()) { - 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); - //aShapes.push_back(aCircleShape); + + boost::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( + data(), 0); + aConstr1->setShape(aCenterPointShape); + aConstr1->setIsInHistory(false); + setResult(aConstr1, 0); + + // make a visible circle + boost::shared_ptr aNDir = boost::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); + } + } + } +} + +AISObjectPtr SketchPlugin_Arc::getAISObject(AISObjectPtr thePrevious) +{ + SketchPlugin_Sketch* aSketch = sketch(); + 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())); + 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); + + boost::shared_ptr aStartAttr = boost::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( + 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( + aCenter, aStartPoint, aStartPoint, aNormal); + if (aCircleShape) { + aShapes.push_back(aCircleShape); + } + } } } - /* - boost::shared_ptr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aShapes); - // store the result - boost::shared_ptr aConstr = - document()->createConstruction(data()); - aConstr->setShape(aCompound); - aConstr->setIsInHistory(false); - setResult(aConstr); - */ + 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(); } void SketchPlugin_Arc::move(double theDeltaX, double theDeltaY) @@ -147,3 +179,15 @@ double SketchPlugin_Arc::distanceToPoint(const boost::shared_ptr& bool SketchPlugin_Arc::isFixed() { return data()->selection(EXTERNAL_ID())->context(); } + +bool SketchPlugin_Arc::isFeatureValid() +{ + boost::shared_ptr aCenterAttr = boost::dynamic_pointer_cast< + GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::CENTER_ID())); + boost::shared_ptr aStartAttr = boost::dynamic_pointer_cast< + GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::START_ID())); + boost::shared_ptr anEndAttr = boost::dynamic_pointer_cast< + GeomDataAPI_Point2D>(data()->attribute(SketchPlugin_Arc::END_ID())); + + return aCenterAttr->isInitialized() && aStartAttr->isInitialized() && anEndAttr->isInitialized(); +} diff --git a/src/SketchPlugin/SketchPlugin_Arc.h b/src/SketchPlugin/SketchPlugin_Arc.h index 3ee2ba8e7..a60774336 100644 --- a/src/SketchPlugin/SketchPlugin_Arc.h +++ b/src/SketchPlugin/SketchPlugin_Arc.h @@ -13,8 +13,11 @@ /**\class SketchPlugin_Arc * \ingroup DataModel * \brief Feature for creation of the new arc of circle in PartSet. + * The visualization of this object is separated in two parts. The first one is an AIS object + * calculated when there is non-initialized attributes of the arc. The second is a result and + * it is calculated if all attributes are initialized. */ -class SketchPlugin_Arc : public SketchPlugin_Feature //, public GeomAPI_IPresentable +class SketchPlugin_Arc : public SketchPlugin_Feature, public GeomAPI_IPresentable { public: /// Arc feature kind @@ -60,10 +63,7 @@ class SketchPlugin_Arc : public SketchPlugin_Feature //, public GeomAPI_IPresen SKETCHPLUGIN_EXPORT virtual void initAttributes(); /// Returns the AIS preview - virtual AISObjectPtr getAISObject(AISObjectPtr thePrevious) - { - return simpleAISObject(firstResult(), thePrevious); - } + virtual AISObjectPtr getAISObject(AISObjectPtr thePrevious); /// Moves the feature /// \param theDeltaX the delta for X coordinate is moved @@ -76,6 +76,10 @@ class SketchPlugin_Arc : public SketchPlugin_Feature //, public GeomAPI_IPresen /// Use plugin manager for features creation SketchPlugin_Arc(); + +private: + /// Returns true if all obligatory attributes are initialized + bool isFeatureValid(); }; #endif -- 2.39.2