X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=d2c0d9de888270eb9e21938692d81e911602edaa;hb=d22fc665c79c31c9eea0625e04c2e941adfdf7be;hp=ec21e026619bcc21858f88d50e4c5a3254956d19;hpb=cd9217d7e87997ec8bc150a6d8c389e742ca0f84;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index ec21e0266..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,16 +17,17 @@ #include #include #include +#include #include +#include +#include #include #include #include #include #include -#include -#include #include #include #include @@ -37,17 +37,21 @@ #include #include +#include #include #include #include #include -#include -#include +//#include +//#include #include #include #include +#include + +#include #include #include @@ -61,52 +65,38 @@ #endif /*!Create and return new instance of XGUI_Module*/ -extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(XGUI_Workshop* theWshop) +extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop) { return new PartSet_Module(theWshop); } -PartSet_Module::PartSet_Module(XGUI_Workshop* theWshop) +PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) + : ModuleBase_IModule(theWshop) { - myWorkshop = theWshop; + //myWorkshop = theWshop; myListener = new PartSet_Listener(this); - XGUI_OperationMgr* anOperationMgr = myWorkshop->operationMgr(); + connect(myWorkshop, SIGNAL(operationStarted(ModuleBase_Operation*)), + this, SLOT(onOperationStarted(ModuleBase_Operation*))); - connect(anOperationMgr, SIGNAL(operationStarted()), this, SLOT(onOperationStarted())); - - connect(anOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), this, + connect(myWorkshop, SIGNAL(operationStopped(ModuleBase_Operation*)), this, SLOT(onOperationStopped(ModuleBase_Operation*))); - XGUI_ContextMenuMgr* aContextMenuMgr = myWorkshop->contextMenuMgr(); + XGUI_Workshop* aXWshop = xWorkshop(); + XGUI_ContextMenuMgr* aContextMenuMgr = aXWshop->contextMenuMgr(); 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() { } -XGUI_Workshop* PartSet_Module::workshop() const -{ - return myWorkshop; -} - void PartSet_Module::createFeatures() { //Registering of validators - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); aFactory->registerValidator("PartSet_DistanceValidator", new PartSet_DistanceValidator); aFactory->registerValidator("PartSet_LengthValidator", new PartSet_LengthValidator); @@ -124,11 +114,6 @@ void PartSet_Module::featureCreated(QAction* theFeature) connect(theFeature, SIGNAL(triggered(bool)), this, SLOT(onFeatureTriggered())); } -QStringList PartSet_Module::nestedFeatures(QString) -{ - return QStringList(); -} - std::string PartSet_Module::featureFile(const std::string& theFeatureId) { return myFeaturesInFiles[theFeatureId]; @@ -139,11 +124,6 @@ std::string PartSet_Module::featureFile(const std::string& theFeatureId) */ void PartSet_Module::onFeatureTriggered() { - //PartSet_TestOCC::local_selection_change_shape(myWorkshop->viewer()->AISContext(), - // myWorkshop->viewer()->activeView()); - - //PartSet_TestOCC::local_selection_erase(myWorkshop->viewer()->AISContext(), - // myWorkshop->viewer()->activeView()); QAction* aCmd = dynamic_cast(sender()); //Do nothing on uncheck if (aCmd->isCheckable() && !aCmd->isChecked()) @@ -151,28 +131,31 @@ void PartSet_Module::onFeatureTriggered() launchOperation(aCmd->data().toString()); } -void PartSet_Module::launchOperation(const QString& theCmdId) -{ - ModuleBase_Operation* anOperation = createOperation(theCmdId.toStdString()); - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); - if (aPreviewOp) { - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); - // Initialise operation with preliminary selection - std::list aSelected = aSelection->getSelected(); - std::list aHighlighted = aSelection->getHighlighted(); - aPreviewOp->initSelection(aSelected, aHighlighted); - } - sendOperation(anOperation); -} -void PartSet_Module::onOperationStarted() +void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) { - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(myWorkshop - ->operationMgr()->currentOperation()); + XGUI_Workshop* aXWshp = xWorkshop(); + XGUI_Displayer* aDisplayer = aXWshp->displayer(); + PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(theOperation); if (aPreviewOp) { - XGUI_PropertyPanel* aPropPanel = myWorkshop->propertyPanel(); + XGUI_PropertyPanel* aPropPanel = aXWshp->propertyPanel(); connect(aPropPanel, SIGNAL(storedPoint2D(ObjectPtr, const std::string&)), this, SLOT(onStorePoint2D(ObjectPtr, const std::string&)), Qt::UniqueConnection); + + //aDisplayer->deactivateObjectsOutOfContext(); + PartSet_OperationSketch* aSketchOp = dynamic_cast(aPreviewOp); + if (aSketchOp) { + if (aSketchOp->isEditOperation()) { + setSketchingMode(getSketchPlane(aSketchOp->feature())); + } else { + aDisplayer->openLocalContext(); + aDisplayer->activateObjectsOutOfContext(QIntList()); + myPlaneFilter = new StdSelect_FaceFilter(StdSelect_Plane); + aDisplayer->addSelectionFilter(myPlaneFilter); + QIntList aModes = sketchSelectionModes(aPreviewOp->feature()); + aDisplayer->setSelectionModes(aModes); + } + } } } @@ -180,26 +163,46 @@ void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) { if (!theOperation) return; + XGUI_Workshop* aXWshp = xWorkshop(); + XGUI_Displayer* aDisplayer = aXWshp->displayer(); PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(theOperation); if (aPreviewOp) { - XGUI_PropertyPanel* aPropPanel = myWorkshop->propertyPanel(); - //disconnect(aPropPanel, SIGNAL(storedPoint2D(ObjectPtr, const std::string&)), - // this, SLOT(onStorePoint2D(ObjectPtr, const std::string&))); - } else { - // Activate results of current feature for selection - FeaturePtr aFeature = theOperation->feature(); - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - std::list aResults = aFeature->results(); - std::list::const_iterator aIt; - for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { - aDisplayer->activate(*aIt); + XGUI_PropertyPanel* aPropPanel = aXWshp->propertyPanel(); + + PartSet_OperationSketch* aSketchOp = dynamic_cast(aPreviewOp); + if (aSketchOp) { + aDisplayer->closeLocalContexts(); + } else { + PartSet_OperationFeatureCreate* aCreationOp = + dynamic_cast(aPreviewOp); + if (aCreationOp) { + // Activate just created object for selection + FeaturePtr aFeature = aCreationOp->feature(); + QIntList aModes = sketchSelectionModes(aFeature); + const std::list& aResults = aFeature->results(); + std::list::const_iterator anIt, aLast = aResults.end(); + for (anIt = aResults.begin(); anIt != aLast; anIt++) { + aDisplayer->activate(*anIt, aModes); + } + aDisplayer->activate(aFeature, aModes); + aDisplayer->clearSelected(); + } } - } + }// else { + // Activate results of current feature for selection + //FeaturePtr aFeature = theOperation->feature(); + //XGUI_Displayer* aDisplayer = aXWshp->displayer(); + //std::list aResults = aFeature->results(); + //std::list::const_iterator aIt; + //for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { + // aDisplayer->activate(*aIt); + //} + //} } void PartSet_Module::onContextMenuCommand(const QString& theId, bool isChecked) { - QList aFeatures = myWorkshop->selector()->selection()->selectedObjects(); + QList aFeatures = workshop()->selection()->selectedObjects(); if (theId == "EDIT_CMD" && (aFeatures.size() > 0)) { FeaturePtr aFeature = boost::dynamic_pointer_cast(aFeatures.first()); if (aFeature) @@ -209,46 +212,37 @@ void PartSet_Module::onContextMenuCommand(const QString& theId, bool isChecked) void PartSet_Module::onMousePressed(QMouseEvent* theEvent) { - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(myWorkshop - ->operationMgr()->currentOperation()); - Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); - if (aPreviewOp && (!aView.IsNull())) { - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); - // Initialise operation with preliminary selection - std::list aSelected = aSelection->getSelected(); - std::list aHighlighted = aSelection->getHighlighted(); - - aPreviewOp->mousePressed(theEvent, aView, aSelected, aHighlighted); + XGUI_Workshop* aXWshp = xWorkshop(); + PartSet_OperationSketchBase* aPreviewOp = + dynamic_cast(workshop()->currentOperation()); + if (aPreviewOp) { + ModuleBase_ISelection* aSelection = workshop()->selection(); + aPreviewOp->mousePressed(theEvent, myWorkshop->viewer(), aSelection); } } void PartSet_Module::onMouseReleased(QMouseEvent* theEvent) { - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(myWorkshop - ->operationMgr()->currentOperation()); - Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); - if (aPreviewOp && (!aView.IsNull())) { - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); + PartSet_OperationSketchBase* aPreviewOp = + dynamic_cast(myWorkshop->currentOperation()); + 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); } } void PartSet_Module::onMouseMoved(QMouseEvent* theEvent) { - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(myWorkshop - ->operationMgr()->currentOperation()); - Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); - if (aPreviewOp && (!aView.IsNull())) - aPreviewOp->mouseMoved(theEvent, aView); + PartSet_OperationSketchBase* aPreviewOp = + dynamic_cast(myWorkshop->currentOperation()); + if (aPreviewOp) + aPreviewOp->mouseMoved(theEvent, myWorkshop->viewer()); } void PartSet_Module::onKeyRelease(QKeyEvent* theEvent) { - ModuleBase_Operation* anOperation = myWorkshop->operationMgr()->currentOperation(); + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); if (aPreviewOp) { aPreviewOp->keyReleased(theEvent->key()); @@ -257,25 +251,28 @@ void PartSet_Module::onKeyRelease(QKeyEvent* theEvent) void PartSet_Module::onMouseDoubleClick(QMouseEvent* theEvent) { - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(myWorkshop - ->operationMgr()->currentOperation()); + PartSet_OperationSketchBase* aPreviewOp = + dynamic_cast(myWorkshop->currentOperation()); Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); if (aPreviewOp && (!aView.IsNull())) { - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); + 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) { - //erasePlanes(); myWorkshop->viewer()->setViewProjection(theX, theY, theZ); - myWorkshop->actionsMgr()->update(); +} - //PartSet_TestOCC::testSelection(myWorkshop); +void PartSet_Module::onSketchLaunched() +{ + xWorkshop()->actionsMgr()->update(); + // Set working plane + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + FeaturePtr aSketch = anOperation->feature(); + setSketchingMode(getSketchPlane(aSketch)); } void PartSet_Module::onFitAllView() @@ -283,27 +280,28 @@ void PartSet_Module::onFitAllView() myWorkshop->viewer()->fitAll(); } -void PartSet_Module::onLaunchOperation(std::string theName, ObjectPtr theObject) +void PartSet_Module::onRestartOperation(std::string theName, ObjectPtr theObject) { FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); - if (!aFeature) { - qDebug("Warning! Restart operation without feature!"); - return; - } - ModuleBase_Operation* anOperation = createOperation(theName.c_str(), - aFeature ? aFeature->getKind() : ""); - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); - if (aPreviewOp) { - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); + + std::string aKind = aFeature ? aFeature->getKind() : ""; + ModuleBase_Operation* anOperation = createOperation(theName, aKind); + + PartSet_OperationSketchBase* aSketchOp = dynamic_cast(anOperation); + if (aSketchOp) { + PartSet_OperationFeatureCreate* aCreateOp = dynamic_cast(anOperation); + if (aCreateOp) + aCreateOp->initFeature(aFeature); + else { + anOperation->setFeature(aFeature); + } + ModuleBase_ISelection* aSelection = workshop()->selection(); // Initialise operation with preliminary selection - std::list aSelected = aSelection->getSelected(); - std::list aHighlighted = aSelection->getHighlighted(); - aPreviewOp->initFeature(aFeature); - aPreviewOp->initSelection(aSelected, aHighlighted); - } else { - anOperation->setEditingFeature(aFeature); - //Deactivate result of current feature in order to avoid its selection - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + 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) { @@ -311,27 +309,26 @@ void PartSet_Module::onLaunchOperation(std::string theName, ObjectPtr theObject) } } sendOperation(anOperation); - myWorkshop->actionsMgr()->updateCheckState(); + xWorkshop()->actionsMgr()->updateCheckState(); } void PartSet_Module::onMultiSelectionEnabled(bool theEnabled) { - XGUI_ViewerProxy* aViewer = myWorkshop->viewer(); + ModuleBase_IViewer* aViewer = myWorkshop->viewer(); aViewer->enableMultiselection(theEnabled); } void PartSet_Module::onStopSelection(const QList& theFeatures, const bool isStop) { - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - if (!isStop) { - foreach(ObjectPtr aObject, theFeatures) - { - activateFeature(aObject, false); - } - } + XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); + //if (!isStop) { + // foreach(ObjectPtr aObject, theFeatures) { + // activateFeature(aObject); + // } + //} aDisplayer->stopSelection(theFeatures, isStop, false); - XGUI_ViewerProxy* aViewer = myWorkshop->viewer(); + ModuleBase_IViewer* aViewer = myWorkshop->viewer(); aViewer->enableSelection(!isStop); aDisplayer->updateViewer(); @@ -339,65 +336,57 @@ void PartSet_Module::onStopSelection(const QList& theFeatures, const void PartSet_Module::onSetSelection(const QList& theFeatures) { - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); aDisplayer->setSelected(theFeatures, false); aDisplayer->updateViewer(); } -void PartSet_Module::onCloseLocalContext() +void PartSet_Module::setSketchingMode(const gp_Pln& thePln) { - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - aDisplayer->closeLocalContexts(); + XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); + if (!myPlaneFilter.IsNull()) { + aDisplayer->removeSelectionFilter(myPlaneFilter); + myPlaneFilter.Nullify(); + } + QIntList aModes; + // 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); } void PartSet_Module::onFeatureConstructed(ObjectPtr theFeature, int theMode) { bool isDisplay = theMode != PartSet_OperationSketchBase::FM_Hide; - ModuleBase_Operation* aCurOperation = myWorkshop->operationMgr()->currentOperation(); + ModuleBase_Operation* aCurOperation = myWorkshop->currentOperation(); PartSet_OperationSketchBase* aPrevOp = dynamic_cast(aCurOperation); if (aPrevOp) { std::list aList = aPrevOp->subFeatures(); - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - std::list aModes = aPrevOp->getSelectionModes(aPrevOp->feature()); + XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); + QIntList aModes = sketchSelectionModes(aPrevOp->feature()); std::list::iterator aSFIt; for (aSFIt = aList.begin(); aSFIt != aList.end(); ++aSFIt) { std::list aResults = (*aSFIt)->results(); std::list::iterator aIt; for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { - if (isDisplay) - aDisplayer->activateInLocalContext((*aIt), aModes, false); - else + if (!isDisplay) aDisplayer->erase((*aIt), false); } if (!isDisplay) aDisplayer->erase((*aSFIt), false); } + //aDisplayer->deactivateObjectsOutOfContext(); } if (isDisplay) ModelAPI_EventCreator::get()->sendUpdated( theFeature, Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)); - /* bool isDisplay = theMode != PartSet_OperationSketchBase::FM_Hide; - // TODO visualizePreview(theFeature, isDisplay, false); - if (!isDisplay) { - ModuleBase_Operation* aCurOperation = myWorkshop->operationMgr()->currentOperation(); - FeaturePtr aSketch; - PartSet_OperationSketchBase* aPrevOp = dynamic_cast(aCurOperation); - if (aPrevOp) { - std::list aList = aPrevOp->subFeatures(); - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - std::list aModes = aPrevOp->getSelectionModes(aPrevOp->feature()); - - std::list::const_iterator anIt = aList.begin(), - aLast = aList.end(); - //TODO for (; anIt != aLast; anIt++) - // visualizePreview((*anIt), false, false); - //aDisplayer->updateViewer(); - } - } - - if (theMode == PartSet_OperationSketchBase::FM_Activation || - theMode == PartSet_OperationSketchBase::FM_Deactivation) - activateFeature(theFeature, true);*/ } ModuleBase_Operation* PartSet_Module::createOperation(const std::string& theCmdId, @@ -408,17 +397,17 @@ ModuleBase_Operation* PartSet_Module::createOperation(const std::string& theCmdI if (theCmdId == PartSet_OperationSketch::Type()) { anOperation = new PartSet_OperationSketch(theCmdId.c_str(), this); } else { - ModuleBase_Operation* aCurOperation = myWorkshop->operationMgr()->currentOperation(); - FeaturePtr aSketch; + ModuleBase_Operation* aCurOperation = myWorkshop->currentOperation(); + CompositeFeaturePtr aSketch; PartSet_OperationSketchBase* aPrevOp = dynamic_cast(aCurOperation); - if (aPrevOp) + if (aPrevOp) { aSketch = aPrevOp->sketch(); - if (PartSet_OperationFeatureCreate::canProcessKind(theCmdId)) + } + 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()) + } else if (theCmdId == PartSet_OperationFeatureEdit::Type()) { anOperation = new PartSet_OperationFeatureEdit(theCmdId.c_str(), this, aSketch); + } } if (!anOperation) { @@ -434,97 +423,42 @@ ModuleBase_Operation* PartSet_Module::createOperation(const std::string& theCmdI std::string aXmlCfg = aWdgReader.featureWidgetCfg(aFeatureKind); std::string aDescription = aWdgReader.featureDescription(aFeatureKind); - //QString aXmlRepr = QString::fromStdString(aXmlCfg); - //ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aXmlRepr.toStdString(), - // myWorkshop->moduleConnector()); - //QWidget* aContent = myWorkshop->propertyPanel()->contentWidget(); - //qDeleteAll(aContent->children()); - //aFactory.createWidget(aContent); - anOperation->getDescription()->setDescription(QString::fromStdString(aDescription)); anOperation->getDescription()->setXmlRepresentation(QString::fromStdString(aXmlCfg)); - //anOperation->setModelWidgets(aXmlRepr.toStdString(), aFactory.getModelWidgets()); - // connect the operation PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); if (aPreviewOp) { connect(aPreviewOp, SIGNAL(featureConstructed(ObjectPtr, int)), this, SLOT(onFeatureConstructed(ObjectPtr, int))); - connect(aPreviewOp, SIGNAL(launchOperation(std::string, ObjectPtr)), this, - SLOT(onLaunchOperation(std::string, ObjectPtr))); - connect(aPreviewOp, SIGNAL(multiSelectionEnabled(bool)), this, - SLOT(onMultiSelectionEnabled(bool))); + connect(aPreviewOp, SIGNAL(restartRequired(std::string, ObjectPtr)), this, + SLOT(onRestartOperation(std::string, ObjectPtr))); + // 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))); connect(aPreviewOp, SIGNAL(setSelection(const QList&)), this, SLOT(onSetSelection(const QList&))); - connect(aPreviewOp, SIGNAL(closeLocalContext()), this, SLOT(onCloseLocalContext())); - PartSet_OperationSketch* aSketchOp = dynamic_cast(aPreviewOp); if (aSketchOp) { 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())); } } return anOperation; } -void PartSet_Module::sendOperation(ModuleBase_Operation* theOperation) -{ - static Events_ID aModuleEvent = Events_Loop::eventByName(EVENT_OPERATION_LAUNCHED); - Config_PointerMessage aMessage(aModuleEvent, this); - aMessage.setPointer(theOperation); - Events_Loop::loop()->send(aMessage); -} - -/*void PartSet_Module::visualizePreview(FeaturePtr theFeature, bool isDisplay, - const bool isUpdateViewer) - { - ModuleBase_Operation* anOperation = myWorkshop->operationMgr()->currentOperation(); - if (!anOperation) - return; - - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); - if (!aPreviewOp) - return; - - ResultPtr aResult = theFeature->firstResult(); - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - if (isDisplay) { - boost::shared_ptr aSPFeature = - boost::dynamic_pointer_cast(theFeature); - if (aSPFeature) { - PartSet_OperationSketch* aSketchOp = dynamic_cast(aPreviewOp); - if (aSketchOp && !aSketchOp->hasSketchPlane()) - showPlanes(); - } - } - else - aDisplayer->erase(aResult, false); - - if (isUpdateViewer) - aDisplayer->updateViewer(); - }*/ - -void PartSet_Module::activateFeature(ObjectPtr theFeature, const bool isUpdateViewer) -{ - ModuleBase_Operation* anOperation = myWorkshop->operationMgr()->currentOperation(); - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); - if (aPreviewOp) { - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - std::list aModes = aPreviewOp->getSelectionModes(theFeature); - aDisplayer->activateInLocalContext(theFeature, aModes, isUpdateViewer); - } -} void PartSet_Module::updateCurrentPreview(const std::string& theCmdId) { - ModuleBase_Operation* anOperation = myWorkshop->operationMgr()->currentOperation(); + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); if (!anOperation) return; @@ -536,7 +470,7 @@ void PartSet_Module::updateCurrentPreview(const std::string& theCmdId) if (!aFeature || aFeature->getKind() != theCmdId) return; - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); + XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); // Hide result of sketch std::list aResults = aFeature->results(); std::list::const_iterator aIt; @@ -544,7 +478,6 @@ void PartSet_Module::updateCurrentPreview(const std::string& theCmdId) aDisplayer->erase(*aIt, false); std::list aList = aPreviewOp->subFeatures(); - std::list aModes = aPreviewOp->getSelectionModes(aPreviewOp->feature()); std::list::const_iterator anIt = aList.begin(), aLast = aList.end(); for (; anIt != aLast; anIt++) { @@ -556,10 +489,10 @@ void PartSet_Module::updateCurrentPreview(const std::string& theCmdId) std::list::const_iterator aRIt; for (aRIt = aResults.cbegin(); aRIt != aResults.cend(); ++aRIt) { aDisplayer->display((*aRIt), false); - aDisplayer->activateInLocalContext((*aRIt), aModes, false); + aDisplayer->activate((*aRIt), sketchSelectionModes((*aRIt))); } aDisplayer->display(aSPFeature, false); - aDisplayer->activateInLocalContext(aSPFeature, aModes, false); + aDisplayer->activate(aSPFeature, sketchSelectionModes(aSPFeature)); } aDisplayer->updateViewer(); } @@ -577,7 +510,7 @@ void PartSet_Module::editFeature(FeaturePtr theFeature) //} //if (aFeature) { - onLaunchOperation(theFeature->getKind(), theFeature); + onRestartOperation(theFeature->getKind(), theFeature); updateCurrentPreview(theFeature->getKind()); //} // } @@ -587,8 +520,8 @@ void PartSet_Module::onStorePoint2D(ObjectPtr theFeature, const std::string& the { FeaturePtr aFeature = boost::dynamic_pointer_cast(theFeature); - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(myWorkshop - ->operationMgr()->currentOperation()); + PartSet_OperationSketchBase* aPreviewOp = + dynamic_cast(myWorkshop->currentOperation()); if (!aPreviewOp) return; @@ -599,35 +532,81 @@ void PartSet_Module::onStorePoint2D(ObjectPtr theFeature, const std::string& the aPoint->y()); } -/*bool PartSet_Module::isFeatureEnabled(const QString& theCmdId) const - { - XGUI_OperationMgr* aOpMgr = myWorkshop->operationMgr(); - XGUI_ActionsMgr* aActMgr = myWorkshop->actionsMgr(); - - ModuleBase_Operation* aOperation = aOpMgr->currentOperation(); - if (!aOperation) - return !aActMgr->isNested(theCmdId); - - PartSet_OperationFeatureEdit* aSketchEdtOp = dynamic_cast(aOperation); - if (aSketchEdtOp) { - QStringList aConstraintList; - aConstraintList<<"SketchConstraintDistance"<<"SketchConstraintLength" - <<"SketchConstraintRadius"<<"SketchConstraintParallel"<<"SketchConstraintPerpendicular"; - return aConstraintList.contains(theCmdId); - } - QStringList aList = aActMgr->nestedCommands(aOperation->id()); - return aList.contains(theCmdId); - }*/ - QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* theParent, Config_WidgetAPI* theWidgetApi, QList& theModelWidgets) { if (theType == "sketch-start-label") { PartSet_WidgetSketchLabel* aWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, ""); - aWgt->setOperationsMgr(myWorkshop->operationMgr()); + aWgt->setOperationsMgr(xWorkshop()->operationMgr()); theModelWidgets.append(aWgt); return aWgt->getControl(); } else return 0; } + + +XGUI_Workshop* PartSet_Module::xWorkshop() const +{ + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + if (aConnector) { + return aConnector->workshop(); + } + return 0; +} + + +QIntList PartSet_Module::sketchSelectionModes(ObjectPtr theFeature) +{ + QIntList aModes; + FeaturePtr aFeature = boost::dynamic_pointer_cast(theFeature); + if (aFeature) { + if (aFeature->getKind() == SketchPlugin_Sketch::ID()) { + aModes.append(TopAbs_FACE); + return aModes; + } else if (PartSet_Tools::isConstraintFeature(aFeature->getKind())) { + aModes.append(AIS_DSM_Text); + aModes.append(AIS_DSM_Line); + return aModes; + } + } + aModes.append(AIS_Shape::SelectionMode((TopAbs_ShapeEnum) TopAbs_VERTEX)); + 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); + } + } +}