X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Sketch.cpp;h=c97018e340ee99c7913f41a644aa214faedffc60;hb=f57633e7e47026f501b94c38989e39450a946ce4;hp=0b0381ab7eb647bedd648eca91db1374a47409ab;hpb=57c61908ce2c9d9386762d76c7606eeaa7f8a48c;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Sketch.cpp b/src/SketchPlugin/SketchPlugin_Sketch.cpp index 0b0381ab7..c97018e34 100644 --- a/src/SketchPlugin/SketchPlugin_Sketch.cpp +++ b/src/SketchPlugin/SketchPlugin_Sketch.cpp @@ -2,22 +2,33 @@ // 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 -using namespace std; +#include + +#include +using namespace std; SketchPlugin_Sketch::SketchPlugin_Sketch() { @@ -32,39 +43,43 @@ void SketchPlugin_Sketch::initAttributes() data()->addAttribute(SketchPlugin_Sketch::FEATURES_ID(), ModelAPI_AttributeRefList::type()); } -void SketchPlugin_Sketch::execute() +void SketchPlugin_Sketch::execute() { if (!data()->isValid()) - return ; - boost::shared_ptr aRefList = - boost::dynamic_pointer_cast( - data()->attribute(SketchPlugin_Sketch::FEATURES_ID())); - - boost::shared_ptr anOrigin = - boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); - boost::shared_ptr aDirX = - boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::DIRX_ID())); - boost::shared_ptr aDirY = - boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::DIRY_ID())); - boost::shared_ptr aNorm = - boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::NORM_ID())); + return; + boost::shared_ptr aRefList = boost::dynamic_pointer_cast< + ModelAPI_AttributeRefList>(data()->attribute(SketchPlugin_Sketch::FEATURES_ID())); + + boost::shared_ptr anOrigin = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + boost::shared_ptr aDirX = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRX_ID())); + boost::shared_ptr aDirY = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRY_ID())); + boost::shared_ptr aNorm = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::NORM_ID())); std::list aFeatures = aRefList->list(); if (aFeatures.empty()) - return ; + return; std::list::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end(); boost::shared_ptr aFeature; - std::list< boost::shared_ptr > aFeaturesPreview; + std::list > aFeaturesPreview; for (; anIt != aLast; anIt++) { aFeature = boost::dynamic_pointer_cast(*anIt); if (aFeature) { + // 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++) { - boost::shared_ptr aConstr = - boost::dynamic_pointer_cast(*aResIter); + for (; aResIter != aRes.cend(); aResIter++) { + boost::shared_ptr aConstr = boost::dynamic_pointer_cast< + ModelAPI_ResultConstruction>(*aResIter); if (aConstr) { boost::shared_ptr aShape = aConstr->shape(); if (aShape) @@ -75,54 +90,113 @@ void SketchPlugin_Sketch::execute() } 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); + return; + + // Collect all edges as one big wire + boost::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); boost::shared_ptr aConstr = document()->createConstruction(data()); - aConstr->setShape(aCompound); + aConstr->setShape(aBigWire); setResult(aConstr); } -const void SketchPlugin_Sketch::addSub(const FeaturePtr& theFeature) +boost::shared_ptr SketchPlugin_Sketch::addFeature(std::string theID) { - boost::dynamic_pointer_cast(theFeature)->setSketch(this); - data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->append(theFeature); + boost::shared_ptr aNew = document()->addFeature(theID); + if (aNew) { + boost::dynamic_pointer_cast(aNew)->setSketch(this); + data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->append(aNew); + } + return aNew; +} + +int SketchPlugin_Sketch::numberOfSubs() const +{ + return data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->size(); +} + +boost::shared_ptr SketchPlugin_Sketch::subFeature(const int theIndex) const +{ + ObjectPtr anObj = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->object(theIndex); + return boost::dynamic_pointer_cast(anObj); +} + +int SketchPlugin_Sketch::subFeatureId(const int theIndex) const +{ + return subFeature(theIndex)->data()->featureId(); +} + +bool SketchPlugin_Sketch::isSub(ObjectPtr theObject) const +{ + // check is this feature of result + FeaturePtr aFeature = boost::dynamic_pointer_cast(theObject); + if (!aFeature) { + ResultPtr aRes = boost::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) { - boost::shared_ptr aC = - boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); - boost::shared_ptr aX = - boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::DIRX_ID())); - boost::shared_ptr aY = - boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::DIRY_ID())); + boost::shared_ptr aC = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + boost::shared_ptr aX = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRX_ID())); + boost::shared_ptr aY = boost::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)); + boost::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)); } +boost::shared_ptr SketchPlugin_Sketch::to2D( + const boost::shared_ptr& thePnt) +{ + boost::shared_ptr aC = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + boost::shared_ptr aX = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::DIRX_ID())); + boost::shared_ptr aY = boost::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(SketchPlugin_Sketch::NORM_ID())); + boost::shared_ptr aNormal = boost::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() { - boost::shared_ptr anOrigin = - boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); - boost::shared_ptr aNorm = - boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::NORM_ID())); + boost::shared_ptr anOrigin = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + boost::shared_ptr aNorm = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::NORM_ID())); if (!anOrigin || !aNorm) return boost::shared_ptr(); @@ -130,44 +204,58 @@ boost::shared_ptr SketchPlugin_Sketch::plane() return boost::shared_ptr(new GeomAPI_Pln(anOrigin->pnt(), aNorm->dir())); } -void addPlane(double theX, double theY, double theZ, std::list >& theShapes) +void addPlane(double theX, double theY, double theZ, + std::list >& theShapes) { boost::shared_ptr anOrigin(new GeomAPI_Pnt(0, 0, 0)); boost::shared_ptr aNormal(new GeomAPI_Dir(theX, theY, theZ)); - double aSize = Config_PropManager::integer("Sketch definition", "Size of planes", PLANE_SIZE); - boost::shared_ptr aFace = - GeomAlgoAPI_FaceBuilder::square(anOrigin, aNormal, aSize); + double aSize = Config_PropManager::integer("Sketch planes", "Size of planes", PLANE_SIZE); + boost::shared_ptr aFace = GeomAlgoAPI_FaceBuilder::square(anOrigin, aNormal, + aSize); theShapes.push_back(aFace); } -boost::shared_ptr SketchPlugin_Sketch:: - getAISObject(boost::shared_ptr thePrevious) +AISObjectPtr SketchPlugin_Sketch::getAISObject(AISObjectPtr thePrevious) { - boost::shared_ptr aNorm = - boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::NORM_ID())); + boost::shared_ptr aNorm = boost::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Sketch::NORM_ID())); if (!aNorm || (aNorm->x() == 0 && aNorm->y() == 0 && aNorm->z() == 0)) { - boost::shared_ptr aAIS = thePrevious; + 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 + 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); - aAIS = boost::shared_ptr(new GeomAPI_AISObject()); + aAIS = AISObjectPtr(new GeomAPI_AISObject()); aAIS->createShape(aCompound); - std::vector aRGB = Config_PropManager::color("Sketch definition", - "planes_color", - SKETCH_PLANE_COLOR); + 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 definition", - "planes_thikness", - SKETCH_WIDTH)); + aAIS->setWidth(Config_PropManager::integer("Sketch planes", "planes_thickness", + SKETCH_WIDTH)); } return aAIS; } - return boost::shared_ptr(); + return AISObjectPtr(); +} + +void SketchPlugin_Sketch::erase() +{ + boost::shared_ptr aRefList = boost::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 = boost::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(); }