X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Sketch.cpp;h=049d0e8c50abcf5da599fb5f91d7387cc9b07af7;hb=e2c1d6fb594fe1234fa7a0786801d8c1c92d7ac6;hp=024bda4b473b92fc0f3298be8a6d80b914894535;hpb=1b303fb931f07905222fe2a6b80d3bfa20e167d6;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Sketch.cpp b/src/SketchPlugin/SketchPlugin_Sketch.cpp index 024bda4b4..049d0e8c5 100644 --- a/src/SketchPlugin/SketchPlugin_Sketch.cpp +++ b/src/SketchPlugin/SketchPlugin_Sketch.cpp @@ -12,12 +12,12 @@ #include #include #include -#include -#include -#include #include +#include +#include + #include #include #include @@ -29,6 +29,7 @@ #include #include +#include #include @@ -43,15 +44,14 @@ SketchPlugin_Sketch::SketchPlugin_Sketch() void SketchPlugin_Sketch::initAttributes() { - 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()); + data()->addAttribute(SketchPlugin_Sketch::ORIGIN_ID(), GeomDataAPI_Point::typeId()); + data()->addAttribute(SketchPlugin_Sketch::DIRX_ID(), GeomDataAPI_Dir::typeId()); + data()->addAttribute(SketchPlugin_Sketch::NORM_ID(), GeomDataAPI_Dir::typeId()); + data()->addAttribute(SketchPlugin_Sketch::FEATURES_ID(), ModelAPI_AttributeRefList::typeId()); // the selected face, base for the sketcher plane, not obligatory - data()->addAttribute(SketchPlugin_Feature::EXTERNAL_ID(), ModelAPI_AttributeSelection::type()); + data()->addAttribute(SketchPlugin_SketchEntity::EXTERNAL_ID(), ModelAPI_AttributeSelection::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory( - getKind(), SketchPlugin_Feature::EXTERNAL_ID()); + getKind(), SketchPlugin_SketchEntity::EXTERNAL_ID()); } void SketchPlugin_Sketch::execute() @@ -65,8 +65,6 @@ void SketchPlugin_Sketch::execute() 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())); @@ -83,8 +81,13 @@ void SketchPlugin_Sketch::execute() 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()) + if (aFeature->data()->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID())) { + if (aFeature->data()->selection(SketchPlugin_SketchEntity::EXTERNAL_ID())->value()) + continue; + } + // do not include the construction entities in the result + if (aFeature->data()->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID())) { + if (aFeature->data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID())->value()) continue; } @@ -111,13 +114,7 @@ void SketchPlugin_Sketch::execute() 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); + aBigWire->setPlane(anOrigin->pnt(), aDirX->dir(), aNorm->dir()); std::shared_ptr aConstr = document()->createConstruction(data()); aConstr->setShape(aBigWire); setResult(aConstr); @@ -133,6 +130,29 @@ std::shared_ptr SketchPlugin_Sketch::addFeature(std::string th return aNew; } +void SketchPlugin_Sketch::removeFeature(std::shared_ptr theFeature) +{ + if (!data().get()) // sketch is already removed (case on undo of sketch), sync is not needed + return; + list aSubs = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->list(); + list::iterator aSubIt = aSubs.begin(), aLastIt = aSubs.end(); + bool isRemoved = false; + bool aHasEmtpyFeature = false; + for(; aSubIt != aLastIt && !isRemoved; aSubIt++) { + std::shared_ptr aFeature = std::dynamic_pointer_cast(*aSubIt); + if (aFeature.get() != NULL && aFeature == theFeature) { + data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->remove(aFeature); + isRemoved = true; + } + else if (aFeature.get() == NULL) + aHasEmtpyFeature = true; + } + // if the object is not found in the sketch sub-elements, that means that the object is removed already. + // Find the first empty element and remove it + if (!isRemoved && aHasEmtpyFeature) + data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->remove(ObjectPtr()); +} + int SketchPlugin_Sketch::numberOfSubs() const { return data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->size(); @@ -168,94 +188,6 @@ bool SketchPlugin_Sketch::isSub(ObjectPtr theObject) const return false; } -std::shared_ptr SketchPlugin_Sketch::to3D(const double theX, const double theY) -{ - 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())); - - std::shared_ptr aSum = aC->pnt()->xyz()->added(aX->dir()->xyz()->multiplied(theX)) - ->added(aY->dir()->xyz()->multiplied(theY)); - - 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() -{ - 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); -} - -std::shared_ptr SketchPlugin_Sketch::plane() -{ - 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 std::shared_ptr(); - - 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() { @@ -274,9 +206,9 @@ void SketchPlugin_Sketch::erase() } void SketchPlugin_Sketch::attributeChanged(const std::string& theID) { - if (theID == SketchPlugin_Feature::EXTERNAL_ID()) { + if (theID == SketchPlugin_SketchEntity::EXTERNAL_ID()) { std::shared_ptr aSelection = - data()->selection(SketchPlugin_Feature::EXTERNAL_ID())->value(); + data()->selection(SketchPlugin_SketchEntity::EXTERNAL_ID())->value(); if (aSelection) { // update arguments due to the selection value // update the sketch plane std::shared_ptr aPlane = GeomAlgoAPI_FaceBuilder::plane(aSelection); @@ -308,11 +240,30 @@ void SketchPlugin_Sketch::attributeChanged(const std::string& theID) { 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(); } } } } + +void SketchPlugin_Sketch::createPoint2DResult(ModelAPI_Feature* theFeature, + SketchPlugin_Sketch* theSketch, + const std::string& theAttributeID, const int theIndex) +{ + std::shared_ptr aPoint = std::dynamic_pointer_cast( + theFeature->attribute(theAttributeID)); + + if (!aPoint || !aPoint->isInitialized()) + return; + + std::shared_ptr aCenter(theSketch->to3D(aPoint->x(), aPoint->y())); + //std::cout<<"Execute circle "<x()<<" "<y()<<" "<z()< aCenterPointShape = GeomAlgoAPI_PointBuilder::point(aCenter); + std::shared_ptr aResult = theFeature->document()->createConstruction( + theFeature->data(), theIndex); + aResult->setShape(aCenterPointShape); + aResult->setIsInHistory(false); + + theFeature->setResult(aResult, theIndex); +}