From c6ec08d06c779c0902f57c8f9189ac6b6ef8a097 Mon Sep 17 00:00:00 2001 From: mpv Date: Fri, 31 Oct 2014 11:05:58 +0300 Subject: [PATCH] Issues #208 : added sketch possibility to reference parametrically to the external face --- src/SketchPlugin/SketchPlugin_Sketch.cpp | 52 ++++++++++++++++++++++++ src/SketchPlugin/SketchPlugin_Sketch.h | 1 + 2 files changed, 53 insertions(+) diff --git a/src/SketchPlugin/SketchPlugin_Sketch.cpp b/src/SketchPlugin/SketchPlugin_Sketch.cpp index c97018e34..14a9d4897 100644 --- a/src/SketchPlugin/SketchPlugin_Sketch.cpp +++ b/src/SketchPlugin/SketchPlugin_Sketch.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -21,8 +22,11 @@ #include #include #include +#include +#include #include +#include #include @@ -41,6 +45,10 @@ void SketchPlugin_Sketch::initAttributes() data()->addAttribute(SketchPlugin_Sketch::DIRY_ID(), GeomDataAPI_Dir::type()); data()->addAttribute(SketchPlugin_Sketch::NORM_ID(), GeomDataAPI_Dir::type()); data()->addAttribute(SketchPlugin_Sketch::FEATURES_ID(), ModelAPI_AttributeRefList::type()); + // the selected face, base for the sketcher plane, not obligatory + data()->addAttribute(SketchPlugin_Feature::EXTERNAL_ID(), ModelAPI_AttributeSelection::type()); + ModelAPI_Session::get()->validators()->registerNotObligatory( + getKind(), SketchPlugin_Feature::EXTERNAL_ID()); } void SketchPlugin_Sketch::execute() @@ -259,3 +267,47 @@ void SketchPlugin_Sketch::erase() } ModelAPI_CompositeFeature::erase(); } + +void SketchPlugin_Sketch::attributeChanged() { + static bool myIsUpdated = false; // to avoid infinitive cycle on attrubtes change + boost::shared_ptr aSelection = + data()->selection(SketchPlugin_Feature::EXTERNAL_ID())->value(); + if (aSelection && !myIsUpdated) { // update arguments due to the selection value + myIsUpdated = true; + // update the sketch plane + boost::shared_ptr aPlane = GeomAlgoAPI_FaceBuilder::plane(aSelection); + if (aPlane) { + double anA, aB, aC, aD; + aPlane->coefficients(anA, aB, aC, aD); + + // calculate attributes of the sketch + boost::shared_ptr aNormDir(new GeomAPI_Dir(anA, aB, aC)); + boost::shared_ptr aCoords = aNormDir->xyz(); + boost::shared_ptr aZero(new GeomAPI_XYZ(0, 0, 0)); + aCoords = aCoords->multiplied(-aD * aCoords->distance(aZero)); + boost::shared_ptr anOrigPnt(new GeomAPI_Pnt(aCoords)); + // X axis is preferable to be dirX on the sketch + static const double tol = 1.e-7; + bool isX = fabs(anA - 1.0) < tol && fabs(aB) < tol && fabs(aC) < tol; + boost::shared_ptr aTempDir( + isX ? new GeomAPI_Dir(0, 1, 0) : new GeomAPI_Dir(1, 0, 0)); + boost::shared_ptr aYDir(new GeomAPI_Dir(aNormDir->cross(aTempDir))); + boost::shared_ptr aXDir(new GeomAPI_Dir(aYDir->cross(aNormDir))); + + boost::shared_ptr anOrigin = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + anOrigin->setValue(anOrigPnt); + boost::shared_ptr aNormal = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::NORM_ID())); + aNormal->setValue(aNormDir); + boost::shared_ptr aDirX = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRX_ID())); + aDirX->setValue(aXDir); + boost::shared_ptr aDirY = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRY_ID())); + aDirY->setValue(aYDir); + boost::shared_ptr aDir = aPlane->direction(); + } + myIsUpdated = false; + } +} diff --git a/src/SketchPlugin/SketchPlugin_Sketch.h b/src/SketchPlugin/SketchPlugin_Sketch.h index 637bd34a9..6a07b55c9 100644 --- a/src/SketchPlugin/SketchPlugin_Sketch.h +++ b/src/SketchPlugin/SketchPlugin_Sketch.h @@ -135,6 +135,7 @@ class SketchPlugin_Sketch : public ModelAPI_CompositeFeature, public GeomAPI_IPr /// Returns the point projected into the sketch plane boost::shared_ptr to2D(const boost::shared_ptr& thePnt); + SKETCHPLUGIN_EXPORT virtual void attributeChanged(); protected: /// Creates a plane and append it to the list /// \param theX the X normal value -- 2.39.2