X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_OperationSketch.cpp;h=6deab5b2801ddc8ff68401fefd96e418e62be863;hb=add875fff5ce228a4914fcc323fdb911a1042b21;hp=88a0e156e94139b6cad956ec126a5493510195bd;hpb=0c3a8a03ec5405d00c23a1cf9f20185d979ece1d;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_OperationSketch.cpp b/src/PartSet/PartSet_OperationSketch.cpp index 88a0e156e..6deab5b28 100644 --- a/src/PartSet/PartSet_OperationSketch.cpp +++ b/src/PartSet/PartSet_OperationSketch.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -21,6 +22,7 @@ #include #include +#include #include #include @@ -37,10 +39,8 @@ using namespace std; - -PartSet_OperationSketch::PartSet_OperationSketch(const QString& theId, - QObject* theParent) -: PartSet_OperationSketchBase(theId, theParent) +PartSet_OperationSketch::PartSet_OperationSketch(const QString& theId, QObject* theParent) + : PartSet_OperationSketchBase(theId, theParent) { } @@ -48,35 +48,16 @@ PartSet_OperationSketch::~PartSet_OperationSketch() { } -std::list PartSet_OperationSketch::getSelectionModes(FeaturePtr theFeature) const -{ - std::list aModes; - if (!hasSketchPlane()) - aModes.push_back(TopAbs_FACE); - else - aModes = PartSet_OperationSketchBase::getSelectionModes(theFeature); - - return aModes; -} - - -/// Initializes the operation with previously created feature. It is used in sequental operations -void PartSet_OperationSketch::initFeature(FeaturePtr theFeature) -{ - if (theFeature) - setEditingFeature(theFeature); -} - -FeaturePtr PartSet_OperationSketch::sketch() const +CompositeFeaturePtr PartSet_OperationSketch::sketch() const { - return feature(); + return boost::dynamic_pointer_cast(feature()); } void PartSet_OperationSketch::mousePressed(QMouseEvent* theEvent, Handle_V3d_View theView, const std::list& theSelected, const std::list& theHighlighted) { - if (hasSketchPlane()){ + if (hasSketchPlane()) { // if shift button is pressed and there are some already selected objects, the operation should // not be started. We just want to combine some selected objects. bool aHasShift = (theEvent->modifiers() & Qt::ShiftModifier); @@ -86,15 +67,21 @@ void PartSet_OperationSketch::mousePressed(QMouseEvent* theEvent, Handle_V3d_Vie if (theHighlighted.size() == 1) { ObjectPtr aFeature = theHighlighted.front().object(); if (aFeature) { - std::string anOperationType = (theSelected.size() > 1)? - PartSet_OperationFeatureEditMulti::Type() : - PartSet_OperationFeatureEdit::Type(); + std::string anOperationType = + (theSelected.size() > 1) ? + PartSet_OperationFeatureEditMulti::Type() : PartSet_OperationFeatureEdit::Type(); restartOperation(anOperationType, aFeature); } - } - else + } else myFeatures = theHighlighted; + } else { + if (!theHighlighted.empty()) { + ModuleBase_ViewerPrs aPrs = theHighlighted.front(); + const TopoDS_Shape& aShape = aPrs.shape(); + if (!aShape.IsNull()) + setSketchPlane(aShape); + } } } @@ -108,37 +95,42 @@ void PartSet_OperationSketch::mouseReleased(QMouseEvent* theEvent, Handle_V3d_Vi /// It is empty and we have to use the process mouse release to start edition operation /// for these objects if (theSelected.size() == 1) { - ObjectPtr aFeature = theSelected.front().object(); - if (aFeature) - restartOperation(PartSet_OperationFeatureEdit::Type(), aFeature); + ObjectPtr aObject = theSelected.front().object(); + if (aObject) { + restartOperation(PartSet_OperationFeatureEdit::Type(), aObject); + } } } } void PartSet_OperationSketch::mouseMoved(QMouseEvent* theEvent, Handle(V3d_View) theView) { - if (!hasSketchPlane() || !(theEvent->buttons() & Qt::LeftButton) || myFeatures.empty()) + if (!hasSketchPlane() || !(theEvent->buttons() & Qt::LeftButton) || myFeatures.empty()) return; if (myFeatures.size() != 1) { FeaturePtr aFeature = PartSet_Tools::nearestFeature(theEvent->pos(), theView, feature(), myFeatures); if (aFeature) - restartOperation(PartSet_OperationFeatureEditMulti::Type(), aFeature); + restartOperation(PartSet_OperationFeatureEditMulti::Type(), aFeature); } } std::list PartSet_OperationSketch::subFeatures() const { - boost::shared_ptr aData = feature()->data(); + std::list aFeaList; + FeaturePtr aFeature = feature(); + if (!aFeature) + return aFeaList; + + boost::shared_ptr aData = aFeature->data(); if (!aData->isValid()) return std::list(); - boost::shared_ptr aRefList = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::FEATURES_ID())); + boost::shared_ptr aRefList = boost::dynamic_pointer_cast< + ModelAPI_AttributeRefList>(aData->attribute(SketchPlugin_Sketch::FEATURES_ID())); std::list aList = aRefList->list(); std::list::iterator aIt; - std::list aFeaList; for (aIt = aList.begin(); aIt != aList.end(); ++aIt) { FeaturePtr aFeature = boost::dynamic_pointer_cast(*aIt); if (aFeature) @@ -151,7 +143,18 @@ void PartSet_OperationSketch::stopOperation() { PartSet_OperationSketchBase::stopOperation(); emit featureConstructed(feature(), FM_Hide); - emit closeLocalContext(); +} + +void PartSet_OperationSketch::afterCommitOperation() +{ + FeaturePtr aFeature = feature(); + std::list aResults = aFeature->results(); + std::list::const_iterator aIt; + Events_ID anEvent = Events_Loop::loop()->eventByName(EVENT_OBJECT_TOSHOW); + for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { + ModelAPI_EventCreator::get()->sendUpdated(*aIt, anEvent); + } + Events_Loop::loop()->flush(anEvent); } bool PartSet_OperationSketch::isNestedOperationsEnabled() const @@ -159,7 +162,6 @@ bool PartSet_OperationSketch::isNestedOperationsEnabled() const return hasSketchPlane(); } - void PartSet_OperationSketch::startOperation() { PartSet_OperationSketchBase::startOperation(); @@ -174,8 +176,8 @@ bool PartSet_OperationSketch::hasSketchPlane() const if (feature()) { boost::shared_ptr aData = feature()->data(); AttributeDoublePtr anAttr; - boost::shared_ptr aNormal = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::NORM_ID())); + boost::shared_ptr aNormal = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::NORM_ID())); aHasPlane = aNormal && !(aNormal->x() == 0 && aNormal->y() == 0 && aNormal->z() == 0); } return aHasPlane; @@ -207,27 +209,35 @@ void PartSet_OperationSketch::setSketchPlane(const TopoDS_Shape& theShape) // X axis is preferable to be dirX on the sketch const double tol = Precision::Confusion(); bool isX = fabs(anA - 1.0) < tol && fabs(aB) < tol && fabs(aC) < tol; - boost::shared_ptr aTempDir(isX ? new GeomAPI_Dir(0, 1, 0) : new GeomAPI_Dir(1, 0, 0)); + boost::shared_ptr aTempDir( + isX ? new GeomAPI_Dir(0, 1, 0) : new GeomAPI_Dir(1, 0, 0)); boost::shared_ptr aYDir(new GeomAPI_Dir(aNormDir->cross(aTempDir))); boost::shared_ptr aXDir(new GeomAPI_Dir(aYDir->cross(aNormDir))); - boost::shared_ptr anOrigin = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + boost::shared_ptr anOrigin = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); anOrigin->setValue(anOrigPnt); - boost::shared_ptr aNormal = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::NORM_ID())); + boost::shared_ptr aNormal = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::NORM_ID())); aNormal->setValue(aNormDir); - boost::shared_ptr aDirX = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::DIRX_ID())); + boost::shared_ptr aDirX = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::DIRX_ID())); aDirX->setValue(aXDir); - boost::shared_ptr aDirY = - boost::dynamic_pointer_cast(aData->attribute(SketchPlugin_Sketch::DIRY_ID())); + boost::shared_ptr aDirY = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::DIRY_ID())); aDirY->setValue(aYDir); boost::shared_ptr aDir = aPlane->direction(); flushUpdated(); - + emit featureConstructed(feature(), FM_Hide); - emit closeLocalContext(); emit planeSelected(aDir->x(), aDir->y(), aDir->z()); } + + +bool PartSet_OperationSketch::isGranted(ModuleBase_Operation* theOperation) const +{ + PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(theOperation); + return aPreviewOp != NULL; +} +