X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_SketcherMgr.cpp;h=1576ff0b1e61b4cae4b34ded6ec5295608ccc9ac;hb=e983f3f4fd2886547669584821c4c9abfa30b573;hp=40925340bfeae306f3c609731460c9ad00e19e61;hpb=4c74e5b864eef28128e27b3ece944990ca8f3fbe;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_SketcherMgr.cpp b/src/PartSet/PartSet_SketcherMgr.cpp index 40925340b..1576ff0b1 100644 --- a/src/PartSet/PartSet_SketcherMgr.cpp +++ b/src/PartSet/PartSet_SketcherMgr.cpp @@ -119,9 +119,14 @@ //#define DEBUG_DO_NOT_BY_ENTER //#define DEBUG_SKETCHER_ENTITIES //#define DEBUG_SKETCH_ENTITIES_ON_MOVE - +//#define DRAGGING_DEBUG //#define DEBUG_CURSOR + +#ifdef DRAGGING_DEBUG +#include +#endif + /// Fills attribute and result lists by the selected owner. In case if the attribute is found, /// by the owner shape, it is put to the list. Otherwise if type of owner shape is edge, /// put the function result as is to the list of results. @@ -163,7 +168,7 @@ PartSet_SketcherMgr::PartSet_SketcherMgr(PartSet_Module* theModule) : QObject(theModule), myModule(theModule), myIsEditLaunching(false), myIsDragging(false), myDragDone(false), myIsMouseOverWindow(false), myIsMouseOverViewProcessed(true), myPreviousUpdateViewerEnabled(true), - myIsPopupMenuActive(false), myExternalPointsMgr(0) + myIsPopupMenuActive(false), myExternalPointsMgr(0), myNoDragMoving(false) { ModuleBase_IWorkshop* anIWorkshop = myModule->workshop(); ModuleBase_IViewer* aViewer = anIWorkshop->viewer(); @@ -348,15 +353,23 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); ModuleBase_IViewer* aViewer = aWorkshop->viewer(); - if (!aViewer->canDragByMouse()) - return; + //if (!aViewer->canDragByMouse()) + // return; ModuleBase_OperationFeature* aFOperation = dynamic_cast (getCurrentOperation()); if (!aFOperation) return; - if (aFOperation->isEditOperation()) { + bool isEditing = aFOperation->isEditOperation(); + bool aCanDrag = aViewer->canDragByMouse(); + + //if (!aViewer->canDragByMouse() && isEditing) { + // // Do not edit by dragging + // return; + //} + + if (isEditing) { // If the current widget is a selector, do nothing, it processes the mouse press ModuleBase_ModelWidget* anActiveWidget = getActiveWidget(); if(anActiveWidget && anActiveWidget->isViewerSelector()) { @@ -376,16 +389,10 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE if ((!isSketchOpe) && (!isSketcher)) return; - bool isEditing = aFOperation->isEditOperation(); - // Ignore creation sketch operation if ((!isSketcher) && (!isEditing)) return; - Handle(AIS_InteractiveContext) aContext = aViewer->AISContext(); - // Remember highlighted objects for editing - ModuleBase_ISelection* aSelect = aWorkshop->selection(); - bool aHasShift = (theEvent->modifiers() & Qt::ShiftModifier); storeSelection(aHasShift ? ST_SelectAndHighlightType : ST_HighlightType, myCurrentSelection); @@ -401,9 +408,10 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE get2dPoint(theWnd, theEvent, myCurrentPoint); if (isSketcher) { - myIsDragging = true; - myDragDone = false; - + if (aCanDrag) { + myIsDragging = true; + myDragDone = false; + } myPreviousDrawModeEnabled = aViewer->enableDrawMode(false); launchEditing(); if (aFeature.get() != NULL) { @@ -429,9 +437,10 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE myIsEditLaunching = !myModule->sketchReentranceMgr()->isInternalEditActive(); aFOperation->commit(); - myIsDragging = true; - myDragDone = false; - + if (aCanDrag) { + myIsDragging = true; + myDragDone = false; + } myPreviousDrawModeEnabled = aViewer->enableDrawMode(false); launchEditing(); myIsEditLaunching = aPrevLaunchingState; @@ -454,37 +463,56 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { + ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); + if (myIsDragging) + aWorkshop->viewer()->enableDrawMode(myPreviousDrawModeEnabled); + bool aWasDragging = myIsDragging; myIsDragging = false; - if (myModule->sketchReentranceMgr()->processMouseReleased(theWnd, theEvent)) + if (myModule->sketchReentranceMgr()->processMouseReleased(theWnd, theEvent)) { return; - + } // if mouse is pressed when it was over view and at release the mouse is out of view, do nothing - if (!myIsMouseOverViewProcessed) + if (!myIsMouseOverViewProcessed) { return; - - ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); + } ModuleBase_IViewer* aViewer = aWorkshop->viewer(); - if (!aViewer->canDragByMouse()) - return; - ModuleBase_Operation* aOp = getCurrentOperation(); + //if (!aViewer->canDragByMouse()) + // return; + ModuleBase_OperationFeature* aOp = + dynamic_cast(getCurrentOperation()); if (aOp) { - if (isNestedSketchOperation(aOp)) { - // Only for sketcher operations - if (aWasDragging) { - if (myDragDone) { - /// the previous selection is lost by mouse release in the viewer(Select method), but - /// it is still stored in myCurrentSelection. So, it is possible to restore selection - /// It is important for drag(edit with mouse) of sketch entities. - restoreSelection(myCurrentSelection); - myCurrentSelection.clear(); + bool aStartNoDragOperation = !aViewer->canDragByMouse() && aOp->isEditOperation(); + if (aStartNoDragOperation || myNoDragMoving) { + // Process edit operation without dragging + if (myCurrentSelection.size() > 0) + myNoDragMoving = !myNoDragMoving; + else + myNoDragMoving = false; + if (myNoDragMoving) + return; + else { + restoreSelection(myCurrentSelection); + myCurrentSelection.clear(); + } + } + else { + if (isNestedSketchOperation(aOp)) { + // Only for sketcher operations + if (aWasDragging) { + if (myDragDone) { + /// the previous selection is lost by mouse release in the viewer(Select method), but + /// it is still stored in myCurrentSelection. So, it is possible to restore selection + /// It is important for drag(edit with mouse) of sketch entities. + restoreSelection(myCurrentSelection); + myCurrentSelection.clear(); + } } } } } - aWorkshop->viewer()->enableDrawMode(myPreviousDrawModeEnabled); ModuleBase_ModelWidget* anActiveWidget = getActiveWidget(); PartSet_MouseProcessor* aProcessor = dynamic_cast(anActiveWidget); @@ -507,11 +535,14 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve qDebug(QString("%1").arg(anInfo.size()).arg(anInfoStr).toStdString().c_str()); } #endif - if (myModule->sketchReentranceMgr()->processMouseMoved(theWnd, theEvent)) return; if (isNestedCreateOperation(getCurrentOperation(), activeSketch())) { +#ifdef DRAGGING_DEBUG + QTime t; + t.start(); +#endif // 1. perform the widget mouse move functionality and display the presentation // the mouse move should be processed in the widget, if it can in order to visualize correct // presentation. These widgets correct the feature attribute according to the mouse position @@ -525,37 +556,44 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve // the feature is to be erased here, but it is correct to call canDisplayObject because // there can be additional check (e.g. editor widget in distance constraint) ModuleBase_OperationFeature* aFOperation = dynamic_cast - (getCurrentOperation()); + (getCurrentOperation()); if (aFOperation) { FeaturePtr aFeature = aFOperation->feature(); visualizeFeature(aFeature, aFOperation->isEditOperation(), canDisplayObject(aFeature)); } } +#ifdef DRAGGING_DEBUG + cout << "Mouse move processing " << t.elapsed() << endl; +#endif } //myClickedPoint.clear(); - if (myIsDragging) { + if (myIsDragging || myNoDragMoving) { // 1. the current selection is saved in the mouse press method in order to restore it after // moving // 2. the enable selection in the viewer should be temporary switched off in order to ignore // mouse press signal in the viewer(it call Select for AIS context and the dragged objects are // deselected). This flag should be restored in the slot, processed the mouse release signal. - ModuleBase_Operation* aCurrentOperation = getCurrentOperation(); if (!aCurrentOperation) return; if (isSketchOperation(aCurrentOperation)) return; // No edit operation activated +#ifdef DRAGGING_DEBUG + QTime t; + t.start(); +#endif + Handle(V3d_View) aView = theWnd->v3dView(); gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView); Point aMousePnt; get2dPoint(theWnd, theEvent, aMousePnt); std::shared_ptr anOriginalPosition = std::shared_ptr( - new GeomAPI_Pnt2d(myCurrentPoint.myCurX, myCurrentPoint.myCurY)); + new GeomAPI_Pnt2d(myCurrentPoint.myCurX, myCurrentPoint.myCurY)); std::shared_ptr aCurrentPosition = std::shared_ptr( - new GeomAPI_Pnt2d(aMousePnt.myCurX, aMousePnt.myCurY)); + new GeomAPI_Pnt2d(aMousePnt.myCurX, aMousePnt.myCurY)); ModuleBase_IWorkshop* aWorkshop = myModule->workshop(); XGUI_ModuleConnector* aConnector = dynamic_cast(aWorkshop); @@ -568,7 +606,7 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve static Events_ID aMoveEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED); //static Events_ID aUpdateEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); FeatureToSelectionMap::const_iterator anIt = myCurrentSelection.begin(), - aLast = myCurrentSelection.end(); + aLast = myCurrentSelection.end(); // 4. the features and attributes modification(move) bool isModified = false; for (; anIt != aLast; anIt++) { @@ -578,7 +616,7 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve // Process selection by attribute: the priority to the attribute if (!anAttributes.empty()) { std::set::const_iterator anAttIt = anAttributes.begin(), - anAttLast = anAttributes.end(); + anAttLast = anAttributes.end(); for (; anAttIt != anAttLast; anAttIt++) { AttributePtr anAttr = *anAttIt; if (anAttr.get() == NULL) @@ -592,7 +630,7 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve bool isImmutable = aPoint->setImmutable(true); std::shared_ptr aMessage = std::shared_ptr - (new ModelAPI_ObjectMovedMessage(this)); + (new ModelAPI_ObjectMovedMessage(this)); aMessage->setMovedAttribute(aPoint); aMessage->setOriginalPosition(anOriginalPosition); aMessage->setCurrentPosition(aCurrentPosition); @@ -603,13 +641,14 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve } } } - } else { + } + else { // Process selection by feature std::shared_ptr aSketchFeature = std::dynamic_pointer_cast(aFeature); if (aSketchFeature) { std::shared_ptr aMessage = std::shared_ptr - (new ModelAPI_ObjectMovedMessage(this)); + (new ModelAPI_ObjectMovedMessage(this)); aMessage->setMovedObject(aFeature); aMessage->setOriginalPosition(anOriginalPosition); aMessage->setCurrentPosition(aCurrentPosition); @@ -632,6 +671,10 @@ void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEve aDisplayer->enableUpdateViewer(isEnableUpdateViewer); aDisplayer->updateViewer(); +#ifdef DRAGGING_DEBUG + cout << "Mouse move processing " << t.elapsed() << endl; +#endif + myDragDone = true; myCurrentPoint = aMousePnt; } @@ -947,6 +990,8 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation) if (!aFOperation) return; + SketcherPrs_Tools::setPixelRatio(ModuleBase_Tools::currentPixelRatio()); + myModule->onViewTransformed(); // Display all sketcher sub-Objects @@ -1054,10 +1099,20 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation) myExternalPointsMgr = new PartSet_ExternalPointsMgr(myModule->workshop(), myCurrentSketch); workshop()->viewer()->set2dMode(true); + + PartSet_Fitter* aFitter = new PartSet_Fitter(myCurrentSketch); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + aWorkshop->viewer()->setFitter(aFitter); } void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation) { + XGUI_ModuleConnector* aConnector = dynamic_cast(myModule->workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + PartSet_Fitter* aFitter = (PartSet_Fitter*)aWorkshop->viewer()->currentFitter(); + aWorkshop->viewer()->unsetFitter(); + delete aFitter; + myIsMouseOverWindow = false; myIsConstraintsShown[PartSet_Tools::Geometrical] = true; myIsConstraintsShown[PartSet_Tools::Dimensional] = true; @@ -1069,8 +1124,6 @@ void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation) } onShowPoints(false); - XGUI_ModuleConnector* aConnector = dynamic_cast(myModule->workshop()); - DataPtr aData = myCurrentSketch->data(); if (!aData->isValid()) { XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); @@ -1186,13 +1239,13 @@ void PartSet_SketcherMgr::commitNestedSketch(ModuleBase_Operation* theOperation) } } -bool PartSet_SketcherMgr::sketchSelectionFilter(const XGUI_SelectionFilterType theFilterType) +bool PartSet_SketcherMgr::sketchSelectionFilter(const ModuleBase_SelectionFilterType theFilterType) { return mySelectionFilterTypes.find(theFilterType) != mySelectionFilterTypes.end(); } -void PartSet_SketcherMgr::registerSelectionFilter(const XGUI_SelectionFilterType theFilterType, - const Handle(SelectMgr_Filter)& theFilter) +void PartSet_SketcherMgr::registerSelectionFilter( + const ModuleBase_SelectionFilterType theFilterType, const Handle(SelectMgr_Filter)& theFilter) { mySelectionFilterTypes.insert(theFilterType); myModule->registerSelectionFilter(theFilterType, theFilter); @@ -2055,3 +2108,28 @@ void PartSet_SketcherMgr::onShowPoints(bool toShow) if (aToUpdate) aViewer->update(); } + + +void PartSet_Fitter::fitScene(Handle(V3d_View) theView) +{ + Bnd_Box aBndBox; + int aNumberOfSubs = mySketch->numberOfSubs(); + for (int i = 0; i < aNumberOfSubs; i++) { + FeaturePtr aFeature = mySketch->subFeature(i); + std::list aResults = aFeature->results(); + std::list::const_iterator aIt; + ResultPtr aRes; + double aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; + for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { + aRes = (*aIt); + if (aRes->isDisplayed()) { + GeomShapePtr aShape = aRes->shape(); + aShape->computeSize(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); + Bnd_Box aBox; + aBox.Update(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); + aBndBox.Add(aBox); + } + } + } + theView->FitAll(aBndBox, 0.01); +}