X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSketchPlugin%2FSketchPlugin_Sketch.cpp;h=8e9644e459fac19d312d3fd04a9281abf99902df;hb=28d5d911e78c187ce729f155d8b2074f0d3561c3;hp=4902305a8b34bb67ee8a530db671d0106ca67a9c;hpb=35a88fdd724349275bbff32b9596a44e7cd422e2;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Sketch.cpp b/src/SketchPlugin/SketchPlugin_Sketch.cpp index 4902305a8..8e9644e45 100644 --- a/src/SketchPlugin/SketchPlugin_Sketch.cpp +++ b/src/SketchPlugin/SketchPlugin_Sketch.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + // File: SketchPlugin_Sketch.cxx // Created: 27 Mar 2014 // Author: Mikhail PONIKAROV @@ -215,45 +217,45 @@ std::shared_ptr SketchPlugin_Sketch::plane() return std::shared_ptr(new GeomAPI_Pln(anOrigin->pnt(), aNorm->dir())); } -void addPlane(double theX, double theY, double theZ, - std::list >& theShapes) -{ - std::shared_ptr anOrigin(new GeomAPI_Pnt(0, 0, 0)); - std::shared_ptr aNormal(new GeomAPI_Dir(theX, theY, theZ)); - double aSize = Config_PropManager::integer("Sketch planes", "Size of planes", PLANE_SIZE); - std::shared_ptr aFace = GeomAlgoAPI_FaceBuilder::square(anOrigin, aNormal, - aSize); - theShapes.push_back(aFace); -} - -AISObjectPtr SketchPlugin_Sketch::getAISObject(AISObjectPtr thePrevious) -{ - std::shared_ptr aNorm = std::dynamic_pointer_cast( - data()->attribute(SketchPlugin_Sketch::NORM_ID())); - - if (!aNorm || (aNorm->x() == 0 && aNorm->y() == 0 && aNorm->z() == 0)) { - AISObjectPtr aAIS = thePrevious; - if (!aAIS) { - std::list > aFaces; - - addPlane(1, 0, 0, aFaces); // YZ plane - addPlane(0, 1, 0, aFaces); // XZ plane - addPlane(0, 0, 1, aFaces); // XY plane - std::shared_ptr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aFaces); - aAIS = AISObjectPtr(new GeomAPI_AISObject()); - aAIS->createShape(aCompound); - - std::vector aRGB = Config_PropManager::color("Sketch planes", "planes_color", - SKETCH_PLANE_COLOR); - aAIS->setColor(aRGB[0], aRGB[1], aRGB[2]); - - aAIS->setWidth(Config_PropManager::integer("Sketch planes", "planes_thickness", - SKETCH_WIDTH)); - } - return aAIS; - } - return AISObjectPtr(); -} +//void addPlane(double theX, double theY, double theZ, +// std::list >& theShapes) +//{ +// std::shared_ptr anOrigin(new GeomAPI_Pnt(0, 0, 0)); +// std::shared_ptr aNormal(new GeomAPI_Dir(theX, theY, theZ)); +// double aSize = Config_PropManager::integer("Sketch planes", "Size of planes", PLANE_SIZE); +// std::shared_ptr aFace = GeomAlgoAPI_FaceBuilder::square(anOrigin, aNormal, +// aSize); +// theShapes.push_back(aFace); +//} + +//AISObjectPtr SketchPlugin_Sketch::getAISObject(AISObjectPtr thePrevious) +//{ +// std::shared_ptr aNorm = std::dynamic_pointer_cast( +// data()->attribute(SketchPlugin_Sketch::NORM_ID())); +// +// if (!aNorm || (aNorm->x() == 0 && aNorm->y() == 0 && aNorm->z() == 0)) { +// AISObjectPtr aAIS = thePrevious; +// if (!aAIS) { +// std::list > aFaces; +// +// addPlane(1, 0, 0, aFaces); // YZ plane +// addPlane(0, 1, 0, aFaces); // XZ plane +// addPlane(0, 0, 1, aFaces); // XY plane +// std::shared_ptr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aFaces); +// aAIS = AISObjectPtr(new GeomAPI_AISObject()); +// aAIS->createShape(aCompound); +// +// std::vector aRGB = Config_PropManager::color("Sketch planes", "planes_color", +// SKETCH_PLANE_COLOR); +// aAIS->setColor(aRGB[0], aRGB[1], aRGB[2]); +// +// aAIS->setWidth(Config_PropManager::integer("Sketch planes", "planes_thickness", +// SKETCH_WIDTH)); +// } +// return aAIS; +// } +// return AISObjectPtr(); +//} void SketchPlugin_Sketch::erase() { @@ -271,66 +273,46 @@ void SketchPlugin_Sketch::erase() ModelAPI_CompositeFeature::erase(); } -void SketchPlugin_Sketch::attributeChanged() { - static bool kIsUpdated = false; // to avoid infinitive cycle on attrubtes change - static bool kIsAttrChanged = false; - std::shared_ptr aSelection = - data()->selection(SketchPlugin_Feature::EXTERNAL_ID())->value(); - if (aSelection && !kIsUpdated) { // update arguments due to the selection value - kIsUpdated = true; - // update the sketch plane - std::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 - std::shared_ptr aNormDir(new GeomAPI_Dir(anA, aB, aC)); - std::shared_ptr aCoords = aNormDir->xyz(); - std::shared_ptr aZero(new GeomAPI_XYZ(0, 0, 0)); - aCoords = aCoords->multiplied(-aD * aCoords->distance(aZero)); - std::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; - std::shared_ptr aTempDir( - isX ? new GeomAPI_Dir(0, 1, 0) : new GeomAPI_Dir(1, 0, 0)); - std::shared_ptr aYDir(new GeomAPI_Dir(aNormDir->cross(aTempDir))); - std::shared_ptr aXDir(new GeomAPI_Dir(aYDir->cross(aNormDir))); - - kIsAttrChanged = false; // track the attributes were really changed during the plane update - std::shared_ptr anOrigin = std::dynamic_pointer_cast - (data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); - anOrigin->setValue(anOrigPnt); - std::shared_ptr aNormal = std::dynamic_pointer_cast( - data()->attribute(SketchPlugin_Sketch::NORM_ID())); - aNormal->setValue(aNormDir); - std::shared_ptr aDirX = std::dynamic_pointer_cast( - data()->attribute(SketchPlugin_Sketch::DIRX_ID())); - aDirX->setValue(aXDir); - std::shared_ptr aDirY = std::dynamic_pointer_cast( - data()->attribute(SketchPlugin_Sketch::DIRY_ID())); - aDirY->setValue(aYDir); - std::shared_ptr aDir = aPlane->direction(); - - if (kIsAttrChanged) { - /* now it is in updater - // the plane was changed, so reexecute sub-elements to update shapes (located in new plane) - ModelAPI_ValidatorsFactory* aFactory = ModelAPI_Session::get()->validators(); - list aSubs = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->list(); - for(list::iterator aSubIt = aSubs.begin(); aSubIt != aSubs.end(); aSubIt++) { - std::shared_ptr aFeature = - std::dynamic_pointer_cast(*aSubIt); - if (aFeature && aFactory->validate(aFeature)) { - aFeature->execute(); - } - } - */ - kIsAttrChanged = false; +void SketchPlugin_Sketch::attributeChanged(const std::string& theID) { + if (theID == SketchPlugin_Feature::EXTERNAL_ID()) { + std::shared_ptr aSelection = + data()->selection(SketchPlugin_Feature::EXTERNAL_ID())->value(); + if (aSelection) { // update arguments due to the selection value + // update the sketch plane + std::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 + std::shared_ptr aNormDir(new GeomAPI_Dir(anA, aB, aC)); + std::shared_ptr aCoords = aNormDir->xyz(); + std::shared_ptr aZero(new GeomAPI_XYZ(0, 0, 0)); + aCoords = aCoords->multiplied(-aD * aCoords->distance(aZero)); + std::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; + std::shared_ptr aTempDir( + isX ? new GeomAPI_Dir(0, 1, 0) : new GeomAPI_Dir(1, 0, 0)); + std::shared_ptr aYDir(new GeomAPI_Dir(aNormDir->cross(aTempDir))); + std::shared_ptr aXDir(new GeomAPI_Dir(aYDir->cross(aNormDir))); + + // update position of the sketch + std::shared_ptr anOrigin = std::dynamic_pointer_cast + (data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + anOrigin->setValue(anOrigPnt); + std::shared_ptr aNormal = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::NORM_ID())); + aNormal->setValue(aNormDir); + std::shared_ptr aDirX = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRX_ID())); + aDirX->setValue(aXDir); + std::shared_ptr aDirY = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRY_ID())); + aDirY->setValue(aYDir); + std::shared_ptr aDir = aPlane->direction(); } } - kIsUpdated = false; - } else if (kIsUpdated) { // other attributes are updated during the selection comupation - kIsAttrChanged = true; } }