X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=d2c0d9de888270eb9e21938692d81e911602edaa;hb=d22fc665c79c31c9eea0625e04c2e941adfdf7be;hp=d1b54dcc16f9280e216b543e9f2cf8b86ded07ed;hpb=7778069b85fb13f2cd02c3cf5ad8ba6233b24e11;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index d1b54dcc1..d2c0d9de8 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include @@ -18,8 +17,11 @@ #include #include #include +#include #include +#include +#include #include #include @@ -35,6 +37,7 @@ #include #include +#include #include #include @@ -84,16 +87,6 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) connect(aContextMenuMgr, SIGNAL(actionTriggered(const QString&, bool)), this, SLOT(onContextMenuCommand(const QString&, bool))); - connect(myWorkshop->viewer(), SIGNAL(mousePress(QMouseEvent*)), this, - SLOT(onMousePressed(QMouseEvent*))); - connect(myWorkshop->viewer(), SIGNAL(mouseRelease(QMouseEvent*)), this, - SLOT(onMouseReleased(QMouseEvent*))); - connect(myWorkshop->viewer(), SIGNAL(mouseMove(QMouseEvent*)), this, - SLOT(onMouseMoved(QMouseEvent*))); - connect(myWorkshop->viewer(), SIGNAL(keyRelease(QKeyEvent*)), this, - SLOT(onKeyRelease(QKeyEvent*))); - connect(myWorkshop->viewer(), SIGNAL(mouseDoubleClick(QMouseEvent*)), this, - SLOT(onMouseDoubleClick(QMouseEvent*))); } PartSet_Module::~PartSet_Module() @@ -153,7 +146,7 @@ void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) PartSet_OperationSketch* aSketchOp = dynamic_cast(aPreviewOp); if (aSketchOp) { if (aSketchOp->isEditOperation()) { - setSketchingMode(); + setSketchingMode(getSketchPlane(aSketchOp->feature())); } else { aDisplayer->openLocalContext(); aDisplayer->activateObjectsOutOfContext(QIntList()); @@ -192,9 +185,10 @@ void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) aDisplayer->activate(*anIt, aModes); } aDisplayer->activate(aFeature, aModes); + aDisplayer->clearSelected(); } } - } else { + }// else { // Activate results of current feature for selection //FeaturePtr aFeature = theOperation->feature(); //XGUI_Displayer* aDisplayer = aXWshp->displayer(); @@ -202,13 +196,8 @@ void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) //std::list::const_iterator aIt; //for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { // aDisplayer->activate(*aIt); - //} - - - - } - // Clear selection done during operation - aDisplayer->clearSelected(); + //} + //} } void PartSet_Module::onContextMenuCommand(const QString& theId, bool isChecked) @@ -226,14 +215,9 @@ void PartSet_Module::onMousePressed(QMouseEvent* theEvent) XGUI_Workshop* aXWshp = xWorkshop(); PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(workshop()->currentOperation()); - Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); - if (aPreviewOp && (!aView.IsNull())) { + if (aPreviewOp) { ModuleBase_ISelection* aSelection = workshop()->selection(); - // Initialise operation with preliminary selection - std::list aSelected = aSelection->getSelected(); - std::list aHighlighted = aSelection->getHighlighted(); - - aPreviewOp->mousePressed(theEvent, aView, aSelected, aHighlighted); + aPreviewOp->mousePressed(theEvent, myWorkshop->viewer(), aSelection); } } @@ -241,14 +225,10 @@ void PartSet_Module::onMouseReleased(QMouseEvent* theEvent) { PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(myWorkshop->currentOperation()); - Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); - if (aPreviewOp && (!aView.IsNull())) { + if (aPreviewOp) { ModuleBase_ISelection* aSelection = workshop()->selection(); // Initialise operation with preliminary selection - std::list aSelected = aSelection->getSelected(); - std::list aHighlighted = aSelection->getHighlighted(); - - aPreviewOp->mouseReleased(theEvent, aView, aSelected, aHighlighted); + aPreviewOp->mouseReleased(theEvent, myWorkshop->viewer(), aSelection); } } @@ -256,9 +236,8 @@ void PartSet_Module::onMouseMoved(QMouseEvent* theEvent) { PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(myWorkshop->currentOperation()); - Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); - if (aPreviewOp && (!aView.IsNull())) - aPreviewOp->mouseMoved(theEvent, aView); + if (aPreviewOp) + aPreviewOp->mouseMoved(theEvent, myWorkshop->viewer()); } void PartSet_Module::onKeyRelease(QKeyEvent* theEvent) @@ -278,17 +257,22 @@ void PartSet_Module::onMouseDoubleClick(QMouseEvent* theEvent) if (aPreviewOp && (!aView.IsNull())) { ModuleBase_ISelection* aSelection = workshop()->selection(); // Initialise operation with preliminary selection - std::list aSelected = aSelection->getSelected(); - std::list aHighlighted = aSelection->getHighlighted(); - aPreviewOp->mouseDoubleClick(theEvent, aView, aSelected, aHighlighted); + aPreviewOp->mouseDoubleClick(theEvent, aView, aSelection); } } void PartSet_Module::onPlaneSelected(double theX, double theY, double theZ) { myWorkshop->viewer()->setViewProjection(theX, theY, theZ); +} + +void PartSet_Module::onSketchLaunched() +{ xWorkshop()->actionsMgr()->update(); - setSketchingMode(); + // Set working plane + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + FeaturePtr aSketch = anOperation->feature(); + setSketchingMode(getSketchPlane(aSketch)); } void PartSet_Module::onFitAllView() @@ -313,19 +297,17 @@ void PartSet_Module::onRestartOperation(std::string theName, ObjectPtr theObject } ModuleBase_ISelection* aSelection = workshop()->selection(); // Initialise operation with preliminary selection - std::list aSelected = aSelection->getSelected(); - std::list aHighlighted = aSelection->getHighlighted(); - aSketchOp->initSelection(aSelected, aHighlighted); - } //else if (aFeature) { - //anOperation->setFeature(aFeature); + aSketchOp->initSelection(aSelection, myWorkshop->viewer()); + } else if (aFeature) { // In case of edit operation: set the previously created feature to the operation + anOperation->setFeature(aFeature); ////Deactivate result of current feature in order to avoid its selection - //XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); - //std::list aResults = aFeature->results(); - //std::list::const_iterator aIt; - //for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { - // aDisplayer->deactivate(*aIt); - //} - //} + XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); + std::list aResults = aFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { + aDisplayer->deactivate(*aIt); + } + } sendOperation(anOperation); xWorkshop()->actionsMgr()->updateCheckState(); } @@ -359,7 +341,7 @@ void PartSet_Module::onSetSelection(const QList& theFeatures) aDisplayer->updateViewer(); } -void PartSet_Module::setSketchingMode() +void PartSet_Module::setSketchingMode(const gp_Pln& thePln) { XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); if (!myPlaneFilter.IsNull()) { @@ -367,10 +349,14 @@ void PartSet_Module::setSketchingMode() myPlaneFilter.Nullify(); } QIntList aModes; - //aModes << TopAbs_VERTEX << TopAbs_EDGE; - //aModes << AIS_DSM_Text << AIS_DSM_Line; + // Clear standard selection modes aDisplayer->setSelectionModes(aModes); aDisplayer->openLocalContext(); + + // Set filter + mySketchFilter = new ModuleBase_ShapeInPlaneFilter(thePln); + aDisplayer->addSelectionFilter(mySketchFilter); + // Get default selection modes aModes = sketchSelectionModes(ObjectPtr()); aDisplayer->activateObjectsOutOfContext(aModes); @@ -412,15 +398,13 @@ ModuleBase_Operation* PartSet_Module::createOperation(const std::string& theCmdI anOperation = new PartSet_OperationSketch(theCmdId.c_str(), this); } else { ModuleBase_Operation* aCurOperation = myWorkshop->currentOperation(); - FeaturePtr aSketch; + CompositeFeaturePtr aSketch; PartSet_OperationSketchBase* aPrevOp = dynamic_cast(aCurOperation); if (aPrevOp) { aSketch = aPrevOp->sketch(); } if (PartSet_OperationFeatureCreate::canProcessKind(theCmdId)) { anOperation = new PartSet_OperationFeatureCreate(theCmdId.c_str(), this, aSketch); - } else if (theCmdId == PartSet_OperationFeatureEditMulti::Type()) { - anOperation = new PartSet_OperationFeatureEditMulti(theCmdId.c_str(), this, aSketch); } else if (theCmdId == PartSet_OperationFeatureEdit::Type()) { anOperation = new PartSet_OperationFeatureEdit(theCmdId.c_str(), this, aSketch); } @@ -449,8 +433,10 @@ ModuleBase_Operation* PartSet_Module::createOperation(const std::string& theCmdI SLOT(onFeatureConstructed(ObjectPtr, int))); connect(aPreviewOp, SIGNAL(restartRequired(std::string, ObjectPtr)), this, SLOT(onRestartOperation(std::string, ObjectPtr))); - connect(aPreviewOp, SIGNAL(multiSelectionEnabled(bool)), this, - SLOT(onMultiSelectionEnabled(bool))); + // If manage multi selection the it will be impossible to select more then one + // object under operation Edit +// connect(aPreviewOp, SIGNAL(multiSelectionEnabled(bool)), this, +// SLOT(onMultiSelectionEnabled(bool))); connect(aPreviewOp, SIGNAL(stopSelection(const QList&, const bool)), this, SLOT(onStopSelection(const QList&, const bool))); @@ -462,6 +448,7 @@ ModuleBase_Operation* PartSet_Module::createOperation(const std::string& theCmdI connect(aSketchOp, SIGNAL(planeSelected(double, double, double)), this, SLOT(onPlaneSelected(double, double, double))); connect(aSketchOp, SIGNAL(fitAllView()), this, SLOT(onFitAllView())); + connect(aSketchOp, SIGNAL(launchSketch()), this, SLOT(onSketchLaunched())); } } @@ -587,3 +574,39 @@ QIntList PartSet_Module::sketchSelectionModes(ObjectPtr theFeature) aModes.append(AIS_Shape::SelectionMode((TopAbs_ShapeEnum) TopAbs_EDGE)); return aModes; } + + +gp_Pln PartSet_Module::getSketchPlane(FeaturePtr theSketch) const +{ + DataPtr aData = theSketch->data(); + boost::shared_ptr anOrigin = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + boost::shared_ptr aNorm = boost::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::NORM_ID())); + gp_Pnt aOrig(anOrigin->x(), anOrigin->y(), anOrigin->z()); + gp_Dir aDir(aNorm->x(), aNorm->y(), aNorm->z()); + return gp_Pln(aOrig, aDir); +} + + +void PartSet_Module::onSelectionChanged() +{ + ModuleBase_ISelection* aSelect = myWorkshop->selection(); + QList aSelected = aSelect->getSelected(); + // We need to stop edit operation if selection is cleared + if (aSelected.size() == 0) { + // do not perform commit of the current edit operation here, because + // this functionality is realized inside this operation + /*PartSet_OperationFeatureEdit* anEditOp = + dynamic_cast(myWorkshop->currentOperation()); + if (!anEditOp) + return; + anEditOp->commit();*/ + } else { + PartSet_OperationSketchBase* aSketchOp = + dynamic_cast(myWorkshop->currentOperation()); + if (aSketchOp) { + aSketchOp->selectionChanged(aSelect); + } + } +}