X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_OperationFeatureBase.cpp;h=2d53041c0fefa5ef2e8bd84cb707fbfb3e644e53;hb=d22fc665c79c31c9eea0625e04c2e941adfdf7be;hp=0363a3eaedd4cb4c962469b6fd8b00aba863b8a1;hpb=5886d3bb6adb74533e2dbac1bcb0addcad68014a;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_OperationFeatureBase.cpp b/src/PartSet/PartSet_OperationFeatureBase.cpp index 0363a3eae..2d53041c0 100644 --- a/src/PartSet/PartSet_OperationFeatureBase.cpp +++ b/src/PartSet/PartSet_OperationFeatureBase.cpp @@ -24,13 +24,13 @@ #include #include #include -#include +#include "ModuleBase_IPropertyPanel.h" +#include "ModuleBase_ISelection.h" +#include "ModuleBase_IViewer.h" #include #include -#include -#include #include #ifdef _DEBUG @@ -44,10 +44,9 @@ using namespace std; PartSet_OperationFeatureBase::PartSet_OperationFeatureBase(const QString& theId, QObject* theParent, - FeaturePtr theFeature) + CompositeFeaturePtr theFeature) : PartSet_OperationSketchBase(theId, theParent), - mySketch(theFeature), - myActiveWidget(NULL) + mySketch(theFeature) { } @@ -55,51 +54,35 @@ PartSet_OperationFeatureBase::~PartSet_OperationFeatureBase() { } -void PartSet_OperationFeatureBase::initSelection( - const std::list& theSelected, - const std::list& /*theHighlighted*/) -{ - myPreSelection = theSelected; -} - -void PartSet_OperationFeatureBase::initFeature(FeaturePtr theFeature) -{ - myInitFeature = theFeature; -} - -FeaturePtr PartSet_OperationFeatureBase::sketch() const +CompositeFeaturePtr PartSet_OperationFeatureBase::sketch() const { return mySketch; } -void PartSet_OperationFeatureBase::mouseReleased(QMouseEvent* theEvent, Handle(V3d_View) theView, - const std::list& theSelected, - const std::list& /*theHighlighted*/) +void PartSet_OperationFeatureBase::mouseReleased(QMouseEvent* theEvent, ModuleBase_IViewer* theViewer, + ModuleBase_ISelection* theSelection) { - gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theView); + Handle(V3d_View) aView = theViewer->activeView(); + gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView); double aX = aPoint.X(), anY = aPoint.Y(); + QList aSelected = theSelection->getSelected(); - if (theSelected.empty()) { - PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY); + if (aSelected.empty()) { + PartSet_Tools::convertTo2D(aPoint, sketch(), aView, aX, anY); } else { - ModuleBase_ViewerPrs aPrs = theSelected.front(); + ModuleBase_ViewerPrs aPrs = aSelected.first(); + if (getViewerPoint(aPrs, theViewer, aX, anY)) { + ModuleBase_ModelWidget* aActiveWgt = myPropertyPanel->activeWidget(); + PartSet_Tools::setConstraints(sketch(), feature(), aActiveWgt->attributeID(), aX, anY); + } const TopoDS_Shape& aShape = aPrs.shape(); - if (!aShape.IsNull()) { - if (aShape.ShapeType() == TopAbs_VERTEX) { // a point is selected - const TopoDS_Vertex& aVertex = TopoDS::Vertex(aShape); - if (!aVertex.IsNull()) { - aPoint = BRep_Tool::Pnt(aVertex); - PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY); - PartSet_Tools::setConstraints(sketch(), feature(), myActiveWidget->attributeID(), aX, anY); - } - } else if (aShape.ShapeType() == TopAbs_EDGE) { // a line is selected - PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY); - } + if (!aShape.IsNull() && aShape.ShapeType() == TopAbs_EDGE) { // a line is selected + PartSet_Tools::convertTo2D(aPoint, sketch(), aView, aX, anY); } } ObjectPtr aFeature; - if (!theSelected.empty()) { - ModuleBase_ViewerPrs aPrs = theSelected.front(); + if (!aSelected.empty()) { + ModuleBase_ViewerPrs aPrs = aSelected.first(); aFeature = aPrs.object(); } else { aFeature = feature(); // for the widget distance only @@ -108,42 +91,36 @@ void PartSet_OperationFeatureBase::mouseReleased(QMouseEvent* theEvent, Handle(V bool isApplyed = setWidgetValue(aFeature, aX, anY); if (isApplyed) { flushUpdated(); - emit activateNextWidget(myActiveWidget); + myPropertyPanel->activateNextWidget(); } - commit(); + // the operation can be committed only when there is no an active widget anymore + // if this check is absent, the edit operation for constraint perpendicular is stopped + // after the first object selection in the viewer(there are two objects to be selected) + // the second case is the constraint distance, the edit is stopped after any mouse click + // in the viewer whenever it is applyed or not to the selection control + if (!myPropertyPanel->activeWidget()) + commit(); } -void PartSet_OperationFeatureBase::onWidgetActivated(ModuleBase_ModelWidget* theWidget) +bool PartSet_OperationFeatureBase::getViewerPoint(ModuleBase_ViewerPrs thePrs, + ModuleBase_IViewer* theViewer, + double& theX, double& theY) { - myActiveWidget = theWidget; - if ((myPreSelection.size() > 0) && myActiveWidget) { - const ModuleBase_ViewerPrs& aPrs = myPreSelection.front(); - ModuleBase_WidgetValueFeature aValue; - aValue.setObject(aPrs.object()); - if (myActiveWidget->setValue(&aValue)) { - myPreSelection.remove(aPrs); - emit activateNextWidget(myActiveWidget); - } - } - if (myInitFeature && myActiveWidget) { - ModuleBase_WidgetPoint2D* aWgt = dynamic_cast(myActiveWidget); - if (aWgt && aWgt->initFromPrevious(myInitFeature)) { - myInitFeature = FeaturePtr(); - emit activateNextWidget(myActiveWidget); - } - } + return PartSet_Tools::hasVertexShape(thePrs, sketch(), theViewer->activeView(), + theX, theY); } -bool PartSet_OperationFeatureBase::setWidgetValue(ObjectPtr theFeature, double theX, double theY) +/*bool PartSet_OperationFeatureBase::setWidgetValue(ObjectPtr theFeature, double theX, double theY) { - if (!myActiveWidget) + ModuleBase_ModelWidget* aActiveWgt = myPropertyPanel->activeWidget(); + if (!aActiveWgt) return false; ModuleBase_WidgetValueFeature* aValue = new ModuleBase_WidgetValueFeature(); aValue->setObject(theFeature); aValue->setPoint(boost::shared_ptr(new GeomAPI_Pnt2d(theX, theY))); - bool isApplyed = myActiveWidget->setValue(aValue); + bool isApplyed = aActiveWgt->setValue(aValue); delete aValue; myIsModified = (myIsModified || isApplyed); return isApplyed; -} +}*/