X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Sketch.cpp;h=81ead9d7ded55fffa4dd660608b21e10f8e138dd;hb=47d69c6e766821c1296c5147a6248ae49020c7dd;hp=2eaa512c80813ea8adb60d0e405f91b6d29e419e;hpb=cf45387763e7aec06b955f71082eba8d65057b49;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Sketch.cpp b/src/SketchPlugin/SketchPlugin_Sketch.cpp index 2eaa512c8..81ead9d7d 100644 --- a/src/SketchPlugin/SketchPlugin_Sketch.cpp +++ b/src/SketchPlugin/SketchPlugin_Sketch.cpp @@ -4,8 +4,21 @@ #include "SketchPlugin_Sketch.h" #include +#include +#include +#include +#include #include #include +#include + +#include +#include + +#include + +const Quantity_NameOfColor SKETCH_PLANE_COLOR = Quantity_NOC_CHOCOLATE; /// the plane edge color +const int SKETCH_WIDTH = 4; /// the plane edge width using namespace std; @@ -18,26 +31,88 @@ SketchPlugin_Sketch::SketchPlugin_Sketch() void SketchPlugin_Sketch::initAttributes() { - //data()->addAttribute(PART_ATTR_DOC_REF, ModelAPI_AttributeDocRef::type()); + 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()); } 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 ; + + 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); + } + + 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); } -const boost::shared_ptr& SketchPlugin_Sketch::preview() +Handle(AIS_InteractiveObject) SketchPlugin_Sketch::getAISShape(Handle(AIS_InteractiveObject) thePrevious) { - std::list > aFaces; + Handle(AIS_InteractiveObject) anAIS = SketchPlugin_Feature::getAISShape(thePrevious); + Handle(AIS_Shape) aShapeAIS = Handle(AIS_Shape)::DownCast(anAIS); + aShapeAIS->SetColor(Quantity_Color(SKETCH_PLANE_COLOR)); + aShapeAIS->SetWidth(SKETCH_WIDTH); + aShapeAIS->Redisplay(); + return anAIS; +} - 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); +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(); } +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 { @@ -47,3 +122,39 @@ void SketchPlugin_Sketch::addPlane(double theX, double theY, double theZ, GeomAlgoAPI_FaceBuilder::square(anOrigin, aNormal, PLANE_SIZE); theShapes.push_back(aFace); } + +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::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)); + + 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(SKETCH_ATTR_NORM)); + + 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(SKETCH_ATTR_ORIGIN)); + boost::shared_ptr aNorm = + boost::dynamic_pointer_cast(data()->attribute(SKETCH_ATTR_NORM)); + + if (!anOrigin || !aNorm) + return boost::shared_ptr(); + + return boost::shared_ptr(new GeomAPI_Pln(anOrigin->pnt(), aNorm->dir())); +}