X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_OperationFeatureEdit.cpp;h=a9d85bb8c194c18af1a0b9c15ae47bd6b77abf21;hb=09f9714f3df9f24a6dd80e0219a94d347dad9cd2;hp=c6ad6130ecb2902f917ec9247192110e79d12a93;hpb=3868952ce179012a7ca56f6c8d1f271ecdb17f73;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_OperationFeatureEdit.cpp b/src/PartSet/PartSet_OperationFeatureEdit.cpp index c6ad6130e..a9d85bb8c 100644 --- a/src/PartSet/PartSet_OperationFeatureEdit.cpp +++ b/src/PartSet/PartSet_OperationFeatureEdit.cpp @@ -5,20 +5,24 @@ #include #include #include +#include #include #include #include #include +#include +#include +#include #include #include #include + #include #include - #include #include @@ -26,6 +30,9 @@ #include #include +#include +#include +#include #include #include @@ -38,113 +45,255 @@ using namespace std; PartSet_OperationFeatureEdit::PartSet_OperationFeatureEdit(const QString& theId, - QObject* theParent, - FeaturePtr theFeature) -: PartSet_OperationSketchBase(theId, theParent), mySketch(theFeature), myIsBlockedSelection(false) + QObject* theParent, + CompositeFeaturePtr theFeature) + : PartSet_OperationFeatureBase(theId, theParent, theFeature), + myIsBlockedSelection(false) { + myIsEditing = true; } PartSet_OperationFeatureEdit::~PartSet_OperationFeatureEdit() { } -bool PartSet_OperationFeatureEdit::isGranted(ModuleBase_IOperation* theOperation) const -{ - return theOperation->getDescription()->operationId().toStdString() == PartSet_OperationSketch::Type(); -} - -std::list PartSet_OperationFeatureEdit::getSelectionModes(FeaturePtr theFeature) const +void PartSet_OperationFeatureEdit::initSelection(ModuleBase_ISelection* theSelection, + ModuleBase_IViewer* theViewer) { - return PartSet_OperationSketchBase::getSelectionModes(theFeature); -} - -void PartSet_OperationFeatureEdit::initFeature(FeaturePtr theFeature) -{ - setEditingFeature(theFeature); -} - + PartSet_OperationFeatureBase::initSelection(theSelection, theViewer); + // 1. unite selected and hightlighted objects in order to have an opportunity to drag + // by the highlighted object + QList aFeatures = theSelection->getSelected(); + QList aHighlighted = theSelection->getHighlighted(); + // add highlighted elements if they are not selected + foreach (ModuleBase_ViewerPrs aPrs, aHighlighted) { + if (!PartSet_Tools::isContainPresentation(aFeatures, aPrs)) + aFeatures.append(aPrs); + } -FeaturePtr PartSet_OperationFeatureEdit::sketch() const -{ - return mySketch; + // 1. find all features with skipping features with selected vertex shapes + myFeature2Attribute.clear(); + // firstly, collect the features without local selection + /*foreach (ModuleBase_ViewerPrs aPrs, aFeatures) { + const TopoDS_Shape& aShape = aPrs.shape(); + if (!aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX) { // a point is selected + const TopoDS_Vertex& aVertex = TopoDS::Vertex(aShape); + if (!aVertex.IsNull()) { + continue; + } + } + else { + ObjectPtr aObject = aPrs.object(); + if (!aObject) + continue; + FeaturePtr aFeature = ModelAPI_Feature::feature(aObject); + if (aFeature && myFeature2Attribute.find(aFeature) == myFeature2Attribute.end()) { + std::list aList; + // using an empty list as a sign, that this feature should be moved itself + myFeature2Attribute[aFeature] = aList; + } + } + }*/ + // 2. collect the features with a local selection on them. + // if the list already has this feature, the local selection is skipped + // that means that if the selection contains a feature and a feature with local selected point, + // the edit is performed for a full feature + Handle(V3d_View) aView = theViewer->activeView(); + foreach (ModuleBase_ViewerPrs aPrs, aFeatures) { + const TopoDS_Shape& aShape = aPrs.shape(); + if (!aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX) { // a point is selected + const TopoDS_Vertex& aVertex = TopoDS::Vertex(aShape); + if (aVertex.IsNull()) + continue; + ObjectPtr aObject = aPrs.object(); + if (!aObject) + continue; + FeaturePtr aFeature = ModelAPI_Feature::feature(aObject); + if (!aFeature) + continue; + // if the feature is already moved, do nothing for this feature local selection + if (myFeature2Attribute.find(aFeature) != myFeature2Attribute.end()) + continue; + + // append the attribute of the vertex if it is found on the current feature + gp_Pnt aPoint = BRep_Tool::Pnt(aVertex); + double aVX, aVY; + PartSet_Tools::convertTo2D(aPoint, sketch(), aView, aVX, aVY); + boost::shared_ptr aPoint2D = PartSet_Tools::getFeaturePoint( + aFeature, aVX, aVY); + std::string anAttribute = aFeature->data()->id(aPoint2D); + std::list aList; + if (myFeature2Attribute.find(aFeature) != myFeature2Attribute.end()) + aList = myFeature2Attribute[aFeature]; + + aList.push_back(anAttribute); + myFeature2Attribute[aFeature] = aList; + } + } } -void PartSet_OperationFeatureEdit::mousePressed(QMouseEvent* theEvent, Handle(V3d_View) theView, - const std::list& theSelected, - const std::list& theHighlighted) +void PartSet_OperationFeatureEdit::mousePressed(QMouseEvent* theEvent, ModuleBase_IViewer* theViewer, ModuleBase_ISelection* theSelection) { - FeaturePtr aFeature; - if (!theHighlighted.empty()) - aFeature = theHighlighted.front().feature(); - if (!aFeature && !theSelected.empty()) // changed for a constrain - aFeature = theSelected.front().feature(); - - if (!aFeature || aFeature != feature()) - { - commit(); - emit featureConstructed(feature(), FM_Deactivation); - - bool aHasShift = (theEvent->modifiers() & Qt::ShiftModifier); - if(aHasShift && !theHighlighted.empty()) { - QFeatureList aSelected; - aSelected.push_back(feature()); - aSelected.push_back(theHighlighted.front().feature()); - emit setSelection(aSelected); + ModuleBase_ModelWidget* aActiveWgt = myPropertyPanel->activeWidget(); + if(aActiveWgt && aActiveWgt->isViewerSelector()) { + // Almost do nothing, all stuff in on PartSet_OperationFeatureBase::mouseReleased + PartSet_OperationFeatureBase::mousePressed(theEvent, theViewer, theSelection); + return; + } + QList aSelected = theSelection->getSelected(); + QList aHighlighted = theSelection->getHighlighted(); + bool aHasShift = (theEvent->modifiers() & Qt::ShiftModifier); + if (aHasShift && !aHighlighted.empty()) { + foreach (ModuleBase_ViewerPrs aPrs, aHighlighted) { + aSelected.append(aPrs); } - else if (aFeature) { - restartOperation(PartSet_OperationFeatureEdit::Type(), aFeature); + } + ObjectPtr aObject; + if (!aSelected.empty()) { + aObject = aSelected.first().object(); + } else { + if (!aHighlighted.empty()) + aObject = aHighlighted.first().object(); + } + //if (!theHighlighted.empty()) + // aObject = theHighlighted.front().object(); + //if (!aObject && !theSelected.empty()) // changed for a constrain + // aObject = theSelected.front().object(); + + FeaturePtr aFeature = ModelAPI_Feature::feature(aObject); + if (!aFeature || aFeature != feature() || (aSelected.size() > 1)) { + if (commit()) { + theViewer->enableSelection(true); + emit featureConstructed(feature(), FM_Deactivation); + + // If we have selection and prehilighting with shift pressed + // Then we have to select all these objects and restart as multi edit operfation + //bool aHasShift = (theEvent->modifiers() & Qt::ShiftModifier); + //if (aHasShift && !theHighlighted.empty()) { + // QList aSelected; + // std::list::const_iterator aIt; + // for (aIt = theSelected.cbegin(); aIt != theSelected.cend(); ++aIt) + // aSelected.append((*aIt).object()); + + // for (aIt = theHighlighted.cbegin(); aIt != theHighlighted.cend(); ++aIt) { + // if (!aSelected.contains((*aIt).object())) + // aSelected.append((*aIt).object()); + // } + // emit setSelection(aSelected); + //} else + if (aFeature) { + std::string anOperationType = + (aSelected.size() > 1) ? + PartSet_OperationFeatureEditMulti::Type() : PartSet_OperationFeatureEdit::Type(); + restartOperation(anOperationType, aFeature); + } + //} } } } -void PartSet_OperationFeatureEdit::mouseMoved(QMouseEvent* theEvent, Handle(V3d_View) theView) +void PartSet_OperationFeatureEdit::mouseMoved(QMouseEvent* theEvent, ModuleBase_IViewer* theViewer) { - if (!(theEvent->buttons() & Qt::LeftButton)) + if (!(theEvent->buttons() & Qt::LeftButton)) return; + Handle(V3d_View) aView = theViewer->activeView(); + gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView); - gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theView); + theViewer->enableSelection(false); - blockSelection(true); + //blockSelection(true); if (myCurPoint.myIsInitialized) { double aCurX, aCurY; - PartSet_Tools::convertTo2D(myCurPoint.myPoint, sketch(), theView, aCurX, aCurY); + PartSet_Tools::convertTo2D(myCurPoint.myPoint, sketch(), aView, aCurX, aCurY); double aX, anY; - PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY); + PartSet_Tools::convertTo2D(aPoint, sketch(), aView, aX, anY); double aDeltaX = aX - aCurX; double aDeltaY = anY - aCurY; - boost::shared_ptr aSketchFeature = - boost::dynamic_pointer_cast(feature()); - aSketchFeature->move(aDeltaX, aDeltaY); + boost::shared_ptr aSketchFeature = boost::dynamic_pointer_cast< + SketchPlugin_Feature>(feature()); + + bool isMoved = false; + // the functionality to move the feature attribute if it exists in the internal map + std::map>::iterator aFeatIter = myFeature2Attribute.begin(); + while (aFeatIter != myFeature2Attribute.end()) { + FeaturePtr aFeature = aFeatIter->first; + std::list anAttributes = aFeatIter->second; + // perform edit for the feature + /*if (anAttributes.empty()) { + boost::shared_ptr aSketchFeature = + boost::dynamic_pointer_cast(aFeature); + if (aSketchFeature) { + aSketchFeature->move(aDeltaX, aDeltaY); + } + }*/ + // perform edit for the feature's attribute + //else { + if (!anAttributes.empty()) { + std::list::const_iterator anAttrIter = anAttributes.begin(), + anAttrEnd = anAttributes.end(); + for (; anAttrIter != anAttrEnd; anAttrIter++) { + boost::shared_ptr aPointAttr = boost::dynamic_pointer_cast< + GeomDataAPI_Point2D>(aFeature->data()->attribute(*anAttrIter)); + if (aPointAttr) { + aPointAttr->move(aDeltaX, aDeltaY); + isMoved = true; + } + } + } + aFeatIter++; + } + + // the feature is moved only if there is no a local selection on this feature + if (!isMoved) { + // MPV: added condition because it could be external edge of some object, not sketch + if (aSketchFeature && aSketchFeature->sketch() == sketch().get()) { + aSketchFeature->move(aDeltaX, aDeltaY); + static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY); + ModelAPI_EventCreator::get()->sendUpdated(feature(), anEvent); + } + } } sendFeatures(); myCurPoint.setPoint(aPoint); } -void PartSet_OperationFeatureEdit::mouseReleased(QMouseEvent* theEvent, Handle(V3d_View) theView, - const std::list& /*theSelected*/, - const std::list& /*theHighlighted*/) +void PartSet_OperationFeatureEdit::mouseReleased( + QMouseEvent* theEvent, ModuleBase_IViewer* theViewer, + ModuleBase_ISelection* theSelection) { - blockSelection(false); + theViewer->enableSelection(true); + ModuleBase_ModelWidget* aActiveWgt = 0; + if (myPropertyPanel) + aActiveWgt = myPropertyPanel->activeWidget(); + if(aActiveWgt && aActiveWgt->isViewerSelector()) { + // Almost do nothing, all stuff in on PartSet_OperationFeatureBase::mouseReleased + PartSet_OperationFeatureBase::mouseReleased(theEvent, theViewer, theSelection); + }// else { + //blockSelection(false); + //} } -void PartSet_OperationFeatureEdit::mouseDoubleClick(QMouseEvent* theEvent, Handle_V3d_View theView, - const std::list& theSelected, - const std::list& theHighlighted) +void PartSet_OperationFeatureEdit::mouseDoubleClick( + QMouseEvent* theEvent, Handle_V3d_View theView, + ModuleBase_ISelection* theSelection) { // TODO the functionality is important only for constraint feature. Should be moved in another place - if (!theSelected.empty()) { - ModuleBase_ViewerPrs aFeaturePrs = theSelected.front(); + QList aSelected = theSelection->getSelected(); + if (!aSelected.empty()) { + ModuleBase_ViewerPrs aFeaturePrs = aSelected.first(); if (!aFeaturePrs.owner().IsNull()) { - Handle(AIS_DimensionOwner) anOwner = Handle(AIS_DimensionOwner)::DownCast(aFeaturePrs.owner()); + Handle(AIS_DimensionOwner) anOwner = Handle(AIS_DimensionOwner)::DownCast( + aFeaturePrs.owner()); if (!anOwner.IsNull() && anOwner->SelectionMode() == AIS_DSM_Text) { bool isValid; - double aValue = PartSet_Tools::featureValue(feature(), CONSTRAINT_ATTR_VALUE, isValid); + double aValue = PartSet_Tools::featureValue(feature(), SketchPlugin_Constraint::VALUE(), + isValid); if (isValid) { - ModuleBase_WidgetEditor::editFeatureValue(feature(), CONSTRAINT_ATTR_VALUE); + ModuleBase_WidgetEditor::editFeatureValue(feature(), SketchPlugin_Constraint::VALUE()); flushUpdated(); } } @@ -155,39 +304,39 @@ void PartSet_OperationFeatureEdit::mouseDoubleClick(QMouseEvent* theEvent, Handl void PartSet_OperationFeatureEdit::startOperation() { PartSet_OperationSketchBase::startOperation(); - emit multiSelectionEnabled(false); + //emit multiSelectionEnabled(false); myCurPoint.clear(); } void PartSet_OperationFeatureEdit::stopOperation() { - emit multiSelectionEnabled(true); - - blockSelection(false, false); -} + //emit multiSelectionEnabled(true); -void PartSet_OperationFeatureEdit::blockSelection(bool isBlocked, const bool isRestoreSelection) -{ - if (myIsBlockedSelection == isBlocked) - return; - - myIsBlockedSelection = isBlocked; - QFeatureList aFeatureList; - aFeatureList.append(feature()); - - if (isBlocked) { - emit setSelection(QFeatureList()); - emit stopSelection(aFeatureList, true); - } - else { - emit stopSelection(aFeatureList, false); - if (isRestoreSelection) - emit setSelection(aFeatureList); - } + //blockSelection(false, false); } -FeaturePtr PartSet_OperationFeatureEdit::createFeature(const bool /*theFlushMessage*/) +//void PartSet_OperationFeatureEdit::blockSelection(bool isBlocked, const bool isRestoreSelection) +//{ +// if (myIsBlockedSelection == isBlocked) +// return; +// +// myIsBlockedSelection = isBlocked; +// QList aFeatureList; +// aFeatureList.append(feature()); +// +// //if (isBlocked) { +// // emit setSelection(QList()); +// // emit stopSelection(aFeatureList, true); +// //} else { +// // emit stopSelection(aFeatureList, false); +// // if (isRestoreSelection) +// // emit setSelection(aFeatureList); +// //} +//} + +FeaturePtr PartSet_OperationFeatureEdit::createFeature(const bool theFlushMessage, + CompositeFeaturePtr theCompositeFeature) { // do nothing in order to do not create a new feature return FeaturePtr(); @@ -195,7 +344,7 @@ FeaturePtr PartSet_OperationFeatureEdit::createFeature(const bool /*theFlushMess void PartSet_OperationFeatureEdit::sendFeatures() { - static Events_ID anEvent = Events_Loop::eventByName(EVENT_FEATURE_MOVED); + static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED); FeaturePtr aFeature = feature(); ModelAPI_EventCreator::get()->sendUpdated(aFeature, anEvent);