X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Sketch.cpp;h=8e9644e459fac19d312d3fd04a9281abf99902df;hb=28d5d911e78c187ce729f155d8b2074f0d3561c3;hp=7bc0ec60084671eb3367d3baf5f3986fecbec408;hpb=142e6a7451245b1c39e5d0afbabb5dc4f678520e;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Sketch.cpp b/src/SketchPlugin/SketchPlugin_Sketch.cpp index 7bc0ec600..8e9644e45 100644 --- a/src/SketchPlugin/SketchPlugin_Sketch.cpp +++ b/src/SketchPlugin/SketchPlugin_Sketch.cpp @@ -1,26 +1,41 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + // File: SketchPlugin_Sketch.cxx // Created: 27 Mar 2014 // Author: Mikhail PONIKAROV -#include "SketchPlugin_Sketch.h" -#include -#include +#include + +#include +#include + #include +#include +#include #include + #include #include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include -const int SKETCH_PLANE_COLOR = Colors::COLOR_BROWN; /// the plane edge color -const double SKETCH_WIDTH = 4.0; /// the plane edge width +#include -using namespace std; +#include +#include -// face of the square-face displayed for selection of general plane -const double PLANE_SIZE = 200; +using namespace std; SketchPlugin_Sketch::SketchPlugin_Sketch() { @@ -28,132 +43,276 @@ SketchPlugin_Sketch::SketchPlugin_Sketch() void SketchPlugin_Sketch::initAttributes() { - data()->addAttribute(SKETCH_ATTR_ORIGIN, GeomDataAPI_Point::type()); - data()->addAttribute(SKETCH_ATTR_DIRX, GeomDataAPI_Dir::type()); - data()->addAttribute(SKETCH_ATTR_DIRY, GeomDataAPI_Dir::type()); - data()->addAttribute(SKETCH_ATTR_NORM, GeomDataAPI_Dir::type()); - data()->addAttribute(SKETCH_ATTR_FEATURES, ModelAPI_AttributeRefList::type()); + data()->addAttribute(SketchPlugin_Sketch::ORIGIN_ID(), GeomDataAPI_Point::type()); + data()->addAttribute(SketchPlugin_Sketch::DIRX_ID(), GeomDataAPI_Dir::type()); + 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() +void SketchPlugin_Sketch::execute() { if (!data()->isValid()) - return ; - boost::shared_ptr aRefList = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_FEATURES)); - - boost::shared_ptr anOrigin = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_ORIGIN)); - boost::shared_ptr aDirX = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_DIRX)); - boost::shared_ptr aDirY = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_DIRY)); - boost::shared_ptr aNorm = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_NORM)); - - std::list > aFeatures = aRefList->list(); - if (aFeatures.empty()) - return ; + return; + std::shared_ptr aRefList = std::dynamic_pointer_cast< + ModelAPI_AttributeRefList>(data()->attribute(SketchPlugin_Sketch::FEATURES_ID())); + + std::shared_ptr anOrigin = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + std::shared_ptr aDirX = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRX_ID())); + std::shared_ptr aDirY = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRY_ID())); + std::shared_ptr aNorm = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::NORM_ID())); - std::list >::const_iterator anIt = aFeatures.begin(), - aLast = aFeatures.end(); + std::list aFeatures = aRefList->list(); + if (aFeatures.empty()) + return; - boost::shared_ptr aFeature; - std::list< boost::shared_ptr > aFeaturesPreview; + std::list::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end(); + std::shared_ptr aFeature; + std::list > aFeaturesPreview; for (; anIt != aLast; anIt++) { - aFeature = boost::dynamic_pointer_cast(*anIt); - boost::shared_ptr aPreview = aFeature->preview(); - if (aPreview) - aFeaturesPreview.push_back(aPreview); + aFeature = std::dynamic_pointer_cast(*anIt); + if (aFeature) { + if (!aFeature->sketch()) // on load document the back references are missed + aFeature->setSketch(this); + // do not include the external edges into the result + if (aFeature->data()->attribute(SketchPlugin_Feature::EXTERNAL_ID())) { + if (aFeature->data()->selection(SketchPlugin_Feature::EXTERNAL_ID())->value()) + continue; + } + + const std::list >& aRes = aFeature->results(); + std::list >::const_iterator aResIter = aRes.cbegin(); + for (; aResIter != aRes.cend(); aResIter++) { + std::shared_ptr aConstr = std::dynamic_pointer_cast< + ModelAPI_ResultConstruction>(*aResIter); + if (aConstr) { + std::shared_ptr aShape = aConstr->shape(); + if (aShape) + aFeaturesPreview.push_back(aShape); + } + } + } } if (aFeaturesPreview.empty()) - return ; - std::list< boost::shared_ptr > aLoops; - std::list< boost::shared_ptr > aWires; - GeomAlgoAPI_SketchBuilder::createFaces(anOrigin->pnt(), aDirX->dir(), aDirY->dir(), aNorm->dir(), - aFeaturesPreview, aLoops, aWires); - - aLoops.insert(aLoops.end(), aWires.begin(), aWires.end()); - boost::shared_ptr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aLoops); - data()->store(aCompound); + return; + + // Collect all edges as one big wire + std::shared_ptr aBigWire(new GeomAPI_PlanarEdges); + std::list >::const_iterator aShapeIt = aFeaturesPreview.begin(); + for (; aShapeIt != aFeaturesPreview.end(); ++aShapeIt) { + aBigWire->addEdge(*aShapeIt); + } + aBigWire->setOrigin(anOrigin->pnt()); + aBigWire->setDirX(aDirX->dir()); + aBigWire->setDirY(aDirY->dir()); + aBigWire->setNorm(aNorm->dir()); + +// GeomAlgoAPI_SketchBuilder::createFaces(anOrigin->pnt(), aDirX->dir(), aDirY->dir(), aNorm->dir(), +// aFeaturesPreview, aLoops, aWires); + std::shared_ptr aConstr = document()->createConstruction(data()); + aConstr->setShape(aBigWire); + setResult(aConstr); +} + +std::shared_ptr SketchPlugin_Sketch::addFeature(std::string theID) +{ + std::shared_ptr aNew = document()->addFeature(theID); + if (aNew) { + std::dynamic_pointer_cast(aNew)->setSketch(this); + data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->append(aNew); + } + return aNew; } -boost::shared_ptr SketchPlugin_Sketch::getAISObject( - boost::shared_ptr thePrevious) +int SketchPlugin_Sketch::numberOfSubs() const { - boost::shared_ptr anAIS = prepareAISShape(thePrevious); - anAIS->setColor(SKETCH_PLANE_COLOR); - anAIS->setWidth(SKETCH_WIDTH); - //anAIS->Redisplay(); - return anAIS; + return data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->size(); } -const boost::shared_ptr& SketchPlugin_Sketch::preview() +std::shared_ptr SketchPlugin_Sketch::subFeature(const int theIndex) const { - if (isPlaneSet()) { - setPreview(boost::shared_ptr()); - } - else { - std::list > aFaces; - - addPlane(1, 0, 0, aFaces); // YZ plane - addPlane(0, 1, 0, aFaces); // XZ plane - addPlane(0, 0, 1, aFaces); // XY plane - boost::shared_ptr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aFaces); - setPreview(aCompound); - } - return getPreview(); + ObjectPtr anObj = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->object(theIndex); + return std::dynamic_pointer_cast(anObj); } -const void SketchPlugin_Sketch::addSub(const FeaturePtr& theFeature) +int SketchPlugin_Sketch::subFeatureId(const int theIndex) const { - boost::dynamic_pointer_cast(theFeature)->setSketch(this); - data()->reflist(SKETCH_ATTR_FEATURES)->append(theFeature); + return subFeature(theIndex)->data()->featureId(); } -void SketchPlugin_Sketch::addPlane(double theX, double theY, double theZ, - std::list >& theShapes) const +bool SketchPlugin_Sketch::isSub(ObjectPtr theObject) const { - boost::shared_ptr anOrigin(new GeomAPI_Pnt(0, 0, 0)); - boost::shared_ptr aNormal(new GeomAPI_Dir(theX, theY, theZ)); - boost::shared_ptr aFace = - GeomAlgoAPI_FaceBuilder::square(anOrigin, aNormal, PLANE_SIZE); - theShapes.push_back(aFace); + // check is this feature of result + FeaturePtr aFeature = std::dynamic_pointer_cast(theObject); + if (!aFeature) { + ResultPtr aRes = std::dynamic_pointer_cast(theObject); + if (aRes) + aFeature = document()->feature(aRes); + } + if (aFeature) { + list aSubs = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->list(); + for(list::iterator aSubIt = aSubs.begin(); aSubIt != aSubs.end(); aSubIt++) { + if (*aSubIt == aFeature) + return true; + } + } + return false; } -boost::shared_ptr SketchPlugin_Sketch::to3D(const double theX, const double theY) +std::shared_ptr SketchPlugin_Sketch::to3D(const double theX, const double theY) { - boost::shared_ptr aC = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_ORIGIN)); - boost::shared_ptr aX = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_DIRX)); - boost::shared_ptr aY = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_DIRY)); + std::shared_ptr aC = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + std::shared_ptr aX = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRX_ID())); + std::shared_ptr aY = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRY_ID())); - boost::shared_ptr aSum = aC->pnt()->xyz()->added( - aX->dir()->xyz()->multiplied(theX))->added(aY->dir()->xyz()->multiplied(theY)); + std::shared_ptr aSum = aC->pnt()->xyz()->added(aX->dir()->xyz()->multiplied(theX)) + ->added(aY->dir()->xyz()->multiplied(theY)); - return boost::shared_ptr(new GeomAPI_Pnt(aSum)); + return std::shared_ptr(new GeomAPI_Pnt(aSum)); } +std::shared_ptr SketchPlugin_Sketch::to2D( + const std::shared_ptr& thePnt) +{ + std::shared_ptr aC = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + std::shared_ptr aX = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRX_ID())); + std::shared_ptr aY = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRY_ID())); + return thePnt->to2D(aC->pnt(), aX->dir(), aY->dir()); +} + + bool SketchPlugin_Sketch::isPlaneSet() { - boost::shared_ptr aNormal = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_NORM)); + std::shared_ptr aNormal = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::NORM_ID())); return aNormal && !(aNormal->x() == 0 && aNormal->y() == 0 && aNormal->z() == 0); } -boost::shared_ptr SketchPlugin_Sketch::plane() +std::shared_ptr SketchPlugin_Sketch::plane() { - boost::shared_ptr anOrigin = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_ORIGIN)); - boost::shared_ptr aNorm = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_NORM)); + std::shared_ptr anOrigin = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + std::shared_ptr aNorm = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::NORM_ID())); if (!anOrigin || !aNorm) - return boost::shared_ptr(); + return std::shared_ptr(); - return boost::shared_ptr(new GeomAPI_Pln(anOrigin->pnt(), aNorm->dir())); + 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 SketchPlugin_Sketch::erase() +{ + std::shared_ptr aRefList = std::dynamic_pointer_cast< + ModelAPI_AttributeRefList>(data()->attribute(SketchPlugin_Sketch::FEATURES_ID())); + std::list aFeatures = aRefList->list(); + std::list::const_iterator anIt = aFeatures.begin(); + for (; anIt != aFeatures.end(); anIt++) { + FeaturePtr aFeature = std::dynamic_pointer_cast(*anIt); + if (aFeature) { + // subs are referenced from sketch, but must be removed for sure, so not checkings + document()->removeFeature(aFeature, false); + } + } + ModelAPI_CompositeFeature::erase(); +} + +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(); + } + } + } }