X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_OperationSketch.cpp;h=c3ca9d922d802d974e962a87ac41eddf62f6983c;hb=d22fc665c79c31c9eea0625e04c2e941adfdf7be;hp=8d2b7e5fcf994d60987d0aa801d6c5ea4c7384e2;hpb=09360d321e48c3749afa582c0958a28ea7bf9200;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_OperationSketch.cpp b/src/PartSet/PartSet_OperationSketch.cpp index 8d2b7e5fc..c3ca9d922 100644 --- a/src/PartSet/PartSet_OperationSketch.cpp +++ b/src/PartSet/PartSet_OperationSketch.cpp @@ -5,7 +5,6 @@ #include #include -#include #include #include @@ -14,6 +13,7 @@ #include #include #include +#include #include #include @@ -21,6 +21,9 @@ #include #include +#include +#include +#include #include #include @@ -37,10 +40,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,104 +49,141 @@ PartSet_OperationSketch::~PartSet_OperationSketch() { } -std::list PartSet_OperationSketch::getSelectionModes(ObjectPtr theFeature) const +CompositeFeaturePtr PartSet_OperationSketch::sketch() const { - std::list aModes; - if (!hasSketchPlane()) - aModes.push_back(TopAbs_FACE); - else - aModes = PartSet_OperationSketchBase::getSelectionModes(theFeature); - - return aModes; + return boost::dynamic_pointer_cast(feature()); } - -/// Initializes the operation with previously created feature. It is used in sequental operations -void PartSet_OperationSketch::initFeature(FeaturePtr theFeature) +void PartSet_OperationSketch::mousePressed(QMouseEvent* theEvent, ModuleBase_IViewer* theViewer, ModuleBase_ISelection* theSelection) { - if (theFeature) - setEditingFeature(theFeature); + 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); + QList aSelected = theSelection->getSelected(); + QList aHighlighted = theSelection->getHighlighted(); + // commented: the next code is commented because the nearestFeature check the highlighting + // and selection inside + //if (aHasShift && (aSelected.size() > 0)) { + // foreach(ModuleBase_ViewerPrs aPrs, aHighlighted) + // aSelected.append(aPrs); + //} + //if (aHasShift && aSelected.size() > 0) + // return; + + // there should be a start of operation, which uses the pre-highlighted objects, + // the selected ones are collected here and are processed by a mouse move + //if (aHighlighted.size() == 1) { + //if (aSelected.size() > 0) { + // ObjectPtr aFeature = aSelected.first().object(); + // if (aFeature) { + // commented: end + Handle(V3d_View) aView = theViewer->activeView(); + ObjectPtr aFeature = PartSet_Tools::nearestFeature(theEvent->pos(), aView, feature(), + aSelected, aHighlighted); + if (aFeature) + restartOperation(PartSet_OperationFeatureEdit::Type(), aFeature); + //} + //} + //else + // myFeatures = aHighlighted; + //else + //myFeatures = aSelected; + } } -FeaturePtr PartSet_OperationSketch::sketch() const -{ - return feature(); -} -void PartSet_OperationSketch::mousePressed(QMouseEvent* theEvent, Handle_V3d_View theView, - const std::list& theSelected, - const std::list& theHighlighted) +void PartSet_OperationSketch::selectionChanged(ModuleBase_ISelection* theSelection) { - 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); - if (aHasShift && theSelected.size() > 0) - return; - - if (theHighlighted.size() == 1) { - ObjectPtr aFeature = theHighlighted.front().object(); - if (aFeature) { - std::string anOperationType = (theSelected.size() > 1)? - PartSet_OperationFeatureEditMulti::Type() : - PartSet_OperationFeatureEdit::Type(); - restartOperation(anOperationType, aFeature); + if (hasSketchPlane()) + return; + + QList aSelected = theSelection->getSelected(); + if (!aSelected.empty()) { + ModuleBase_ViewerPrs aPrs = aSelected.first(); + // We have to select a plane before any operation + TopoDS_Shape aShape = aPrs.shape(); + if (!aShape.IsNull()) { + boost::shared_ptr aDir = setSketchPlane(aShape); + flushUpdated(); + emit featureConstructed(feature(), FM_Hide); + // If selection is not a sketcher presentation then it has to be stored as + // External shape + if (feature() != aPrs.object()) { + //boost::shared_ptr aSketch = + // boost::dynamic_pointer_cast(feature()); + DataPtr aData = feature()->data(); + AttributeSelectionPtr aSelAttr = + boost::dynamic_pointer_cast + (aData->attribute(SketchPlugin_Feature::EXTERNAL_ID())); + if (aSelAttr) { + ResultPtr aRes = boost::dynamic_pointer_cast(aPrs.object()); + if (aRes) { + GeomShapePtr aShapePtr(new GeomAPI_Shape()); + aShapePtr->setImpl(new TopoDS_Shape(aShape)); + aSelAttr->setValue(aRes, aShapePtr); + } + } + } else { + // Turn viewer to the plane + emit planeSelected(aDir->x(), aDir->y(), aDir->z()); } - } - else - myFeatures = theHighlighted; - - } else { - if (!theHighlighted.empty()) { - ModuleBase_ViewerPrs aPrs = theHighlighted.front(); - const TopoDS_Shape& aShape = aPrs.shape(); - if (!aShape.IsNull()) - setSketchPlane(aShape); + emit updatePropPanel(); + emit launchSketch(); } } } -void PartSet_OperationSketch::mouseReleased(QMouseEvent* theEvent, Handle_V3d_View theView, - const std::list& theSelected, - const std::list& theHighlighted) + +void PartSet_OperationSketch::mouseReleased(QMouseEvent* theEvent, ModuleBase_IViewer* theViewer, + ModuleBase_ISelection* theSelection) { + QList aSelected = theSelection->getSelected(); if (hasSketchPlane()) { /// TODO: OCC bug: 25034 - the highlighted list should be filled not only for AIS_Shape /// but for other IO, for example constraint dimensions. /// 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); + if (aSelected.size() == 1) { + ObjectPtr aObject = aSelected.first().object(); + if (aObject) { + restartOperation(PartSet_OperationFeatureEdit::Type(), aObject); + } } } } -void PartSet_OperationSketch::mouseMoved(QMouseEvent* theEvent, Handle(V3d_View) theView) +void PartSet_OperationSketch::mouseMoved(QMouseEvent* theEvent, ModuleBase_IViewer* theViewer) { - 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); + // myFeatures are not filled in the previous realization, so, this code is just commented + // because has no effect + /*if (myFeatures.size() != 1) { + Handle(V3d_View) aView = theViewer->activeView(); + ObjectPtr aFeature = PartSet_Tools::nearestFeature(theEvent->pos(), aView, feature(), + myFeatures); if (aFeature) - restartOperation(PartSet_OperationFeatureEditMulti::Type(), aFeature); - } + restartOperation(PartSet_OperationFeatureEdit::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) @@ -158,7 +196,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 @@ -166,7 +215,6 @@ bool PartSet_OperationSketch::isNestedOperationsEnabled() const return hasSketchPlane(); } - void PartSet_OperationSketch::startOperation() { PartSet_OperationSketchBase::startOperation(); @@ -181,17 +229,17 @@ 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; } -void PartSet_OperationSketch::setSketchPlane(const TopoDS_Shape& theShape) +boost::shared_ptr PartSet_OperationSketch::setSketchPlane(const TopoDS_Shape& theShape) { if (theShape.IsNull()) - return; + return boost::shared_ptr(); // get selected shape boost::shared_ptr aGShape(new GeomAPI_Shape); @@ -214,27 +262,31 @@ 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(); + return aDir; +} - 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; } +