X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSketchPlugin%2FSketchPlugin_Sketch.cpp;h=9236aa008ae5959a34ba9841cacde849b2d2dc44;hb=a85c123c5bc7c48588a5cd648110d66ae1544f8c;hp=850058e8c1d438da7edb4a59c41fcac9d05ded49;hpb=0abd0043fd4578da0b345b63f8c4e025adc9ef61;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Sketch.cpp b/src/SketchPlugin/SketchPlugin_Sketch.cpp index 850058e8c..9236aa008 100644 --- a/src/SketchPlugin/SketchPlugin_Sketch.cpp +++ b/src/SketchPlugin/SketchPlugin_Sketch.cpp @@ -5,17 +5,19 @@ #include "SketchPlugin_Sketch.h" #include #include +#include #include #include #include #include #include #include +#include + +#include using namespace std; -// face of the square-face displayed for selection of general plane -const double PLANE_SIZE = 200; SketchPlugin_Sketch::SketchPlugin_Sketch() { @@ -23,11 +25,11 @@ 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()); } void SketchPlugin_Sketch::execute() @@ -35,82 +37,71 @@ void SketchPlugin_Sketch::execute() if (!data()->isValid()) return ; boost::shared_ptr aRefList = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_FEATURES)); + 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(SKETCH_ATTR_DIRX)); + boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::DIRX_ID())); boost::shared_ptr aDirY = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_DIRY)); + boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::DIRY_ID())); boost::shared_ptr aNorm = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_NORM)); + boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::NORM_ID())); - std::list > aFeatures = aRefList->list(); + std::list aFeatures = aRefList->list(); if (aFeatures.empty()) return ; - std::list >::const_iterator anIt = aFeatures.begin(), - aLast = aFeatures.end(); - + std::list::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end(); boost::shared_ptr aFeature; std::list< boost::shared_ptr > aFeaturesPreview; for (; anIt != aLast; anIt++) { aFeature = boost::dynamic_pointer_cast(*anIt); - boost::shared_ptr aPreview = aFeature->preview(); - if (aPreview) - aFeaturesPreview.push_back(aPreview); + if (aFeature) { + + 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); + if (aConstr) { + boost::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(aDirX->dir(), aDirY->dir(), aNorm->dir(), + 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); -} - -const boost::shared_ptr& SketchPlugin_Sketch::preview() -{ - 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(); + boost::shared_ptr aConstr = document()->createConstruction(data()); + aConstr->setShape(aCompound); + setResult(aConstr); } const void SketchPlugin_Sketch::addSub(const FeaturePtr& theFeature) { boost::dynamic_pointer_cast(theFeature)->setSketch(this); - data()->reflist(SKETCH_ATTR_FEATURES)->append(theFeature); -} - -void SketchPlugin_Sketch::addPlane(double theX, double theY, double theZ, - std::list >& theShapes) 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); + data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->append(theFeature); } boost::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::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::ORIGIN_ID())); boost::shared_ptr aX = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_DIRX)); + boost::dynamic_pointer_cast(data()->attribute(SketchPlugin_Sketch::DIRX_ID())); boost::shared_ptr aY = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_DIRY)); + 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)); @@ -121,7 +112,61 @@ boost::shared_ptr SketchPlugin_Sketch::to3D(const double theX, cons bool SketchPlugin_Sketch::isPlaneSet() { boost::shared_ptr aNormal = - boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_NORM)); + 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())); + + if (!anOrigin || !aNorm) + return boost::shared_ptr(); + + return boost::shared_ptr(new GeomAPI_Pln(anOrigin->pnt(), aNorm->dir())); +} + +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); + theShapes.push_back(aFace); +} + +AISObjectPtr SketchPlugin_Sketch::getAISObject(AISObjectPtr thePrevious) +{ + 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)) { + 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 + boost::shared_ptr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aFaces); + aAIS = AISObjectPtr(new GeomAPI_AISObject()); + aAIS->createShape(aCompound); + + std::vector aRGB = Config_PropManager::color("Sketch definition", + "planes_color", + SKETCH_PLANE_COLOR); + aAIS->setColor(aRGB[0], aRGB[1], aRGB[2]); + + aAIS->setWidth(Config_PropManager::integer("Sketch definition", + "planes_thikness", + SKETCH_WIDTH)); + } + return aAIS; + } + return AISObjectPtr(); +}