X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FSketchPlugin%2FSketchPlugin_Sketch.cpp;h=1f0e100ac37bd6286dd20e2bd6e5dbf451262aa6;hb=bbd1c59b9adc714c5d7ad17b3dc496cf1091c549;hp=9a3624daf39295bae1573005d6092ae084019731;hpb=de0f49686ec6655ddc5816c8fa5383964662aec4;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Sketch.cpp b/src/SketchPlugin/SketchPlugin_Sketch.cpp index 9a3624daf..1f0e100ac 100644 --- a/src/SketchPlugin/SketchPlugin_Sketch.cpp +++ b/src/SketchPlugin/SketchPlugin_Sketch.cpp @@ -4,12 +4,18 @@ #include "SketchPlugin_Sketch.h" #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; +using namespace std; SketchPlugin_Sketch::SketchPlugin_Sketch() { @@ -17,23 +23,99 @@ SketchPlugin_Sketch::SketchPlugin_Sketch() void SketchPlugin_Sketch::initAttributes() { - //data()->addAttribute(PART_ATTR_DOC_REF, ModelAPI_AttributeDocRef::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() { + 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())); + + std::list aFeatures = aRefList->list(); + if (aFeatures.empty()) + return ; + + 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 aRes = + boost::dynamic_pointer_cast(aFeature->firstResult()); + if (aRes) { + boost::shared_ptr aShape = aRes->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); + 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(SketchPlugin_Sketch::FEATURES_ID())->append(theFeature); } -const shared_ptr& SketchPlugin_Sketch::preview() +boost::shared_ptr SketchPlugin_Sketch::to3D(const double theX, const double theY) { - if (!SketchPlugin_Feature::preview()) - { - - shared_ptr anOrigin(new GeomAPI_Pnt(0, 0, 0)); - shared_ptr aNormal(new GeomAPI_Dir(1, 0, 0)); - shared_ptr aFace = - GeomAlgoAPI_FaceBuilder::square(anOrigin, aNormal, PLANE_SIZE); - setPreview(aFace); - } - return SketchPlugin_Feature::preview(); + 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)); + + return boost::shared_ptr(new GeomAPI_Pnt(aSum)); +} + +bool SketchPlugin_Sketch::isPlaneSet() +{ + 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())); + + if (!anOrigin || !aNorm) + return boost::shared_ptr(); + + return boost::shared_ptr(new GeomAPI_Pln(anOrigin->pnt(), aNorm->dir())); }