X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=2b92c351a5ec2fdf8a88d31fd0c77168050d70cb;hb=6f84fd29d85b783864cdbb3ac9fdd6a3ad3cbb7c;hp=99d36b0ad8f3400c492f6a56e866447672ea5c6b;hpb=31e7d42a5c5527a40094a3d1992258a989eb64f9;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 99d36b0ad..2b92c351a 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -1,56 +1,70 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + +#include "PartSet_Module.h" #include #include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include #include - #include +#include +#include + #include -#include +#include +#include -#include #include -#include #include #include -#include -#include -#include -#include -#include -#include #include #include #include +#include +#include #include +//#include +//#include +#include +#include +#include +#include +#include +//#include -#include -#include -#include #include -#include -#include +#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include +#include +#include #include #include @@ -59,564 +73,358 @@ #include #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), + myRestartingMode(RM_None) { - myWorkshop = theWshop; - myListener = new PartSet_Listener(this); - - XGUI_OperationMgr* anOperationMgr = myWorkshop->operationMgr(); - - connect(anOperationMgr, SIGNAL(operationStarted()), - this, SLOT(onOperationStarted())); - - connect(anOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), - this, SLOT(onOperationStopped(ModuleBase_Operation*))); - - XGUI_ContextMenuMgr* aContextMenuMgr = myWorkshop->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*))); -} + //myWorkshop = dynamic_cast(theWshop); + mySketchMgr = new PartSet_SketcherMgr(this); -PartSet_Module::~PartSet_Module() -{ + XGUI_ModuleConnector* aConnector = dynamic_cast(theWshop); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + + XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); + connect(anOpMgr, SIGNAL(keyEnterReleased()), this, SLOT(onEnterReleased())); + connect(anOpMgr, SIGNAL(operationActivatedByPreselection()), + this, SLOT(onOperationActivatedByPreselection())); + + ModuleBase_IViewer* aViewer = theWshop->viewer(); + connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)), + this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*))); } -XGUI_Workshop* PartSet_Module::workshop() const +PartSet_Module::~PartSet_Module() { - return myWorkshop; + if (!myDocumentShapeFilter.IsNull()) + myDocumentShapeFilter.Nullify(); } -void PartSet_Module::createFeatures() +void PartSet_Module::registerValidators() { - Config_ModuleReader aXMLReader = Config_ModuleReader(); - aXMLReader.readAll(); - myFeaturesInFiles = aXMLReader.featuresInFiles(); - - //!! Test registering of validators - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + //Registering of validators + SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); aFactory->registerValidator("PartSet_DistanceValidator", new PartSet_DistanceValidator); aFactory->registerValidator("PartSet_LengthValidator", new PartSet_LengthValidator); aFactory->registerValidator("PartSet_PerpendicularValidator", new PartSet_PerpendicularValidator); aFactory->registerValidator("PartSet_ParallelValidator", new PartSet_ParallelValidator); aFactory->registerValidator("PartSet_RadiusValidator", new PartSet_RadiusValidator); + aFactory->registerValidator("PartSet_RigidValidator", new PartSet_RigidValidator); + aFactory->registerValidator("PartSet_DifferentObjects", new PartSet_DifferentObjectsValidator); + aFactory->registerValidator("PartSet_DifferentShapes", new ModelAPI_ShapeValidator); + aFactory->registerValidator("PartSet_SketchValidator", new PartSet_SketchValidator); } -void PartSet_Module::featureCreated(QAction* theFeature) +void PartSet_Module::registerFilters() { - connect(theFeature, SIGNAL(triggered(bool)), this, SLOT(onFeatureTriggered())); -} + //Registering of selection filters + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + ModuleBase_FilterFactory* aFactory = aConnector->selectionFilters(); -QStringList PartSet_Module::nestedFeatures(QString) -{ - return QStringList(); + aFactory->registerFilter("EdgeFilter", new ModuleBase_FilterLinearEdge); + aFactory->registerFilter("FaceFilter", new ModuleBase_FilterFace); + aFactory->registerFilter("MultiFilter", new ModuleBase_FilterMulti); + Handle(SelectMgr_Filter) aSelectFilter = new ModuleBase_FilterNoConsructionSubShapes(workshop()); + aFactory->registerFilter("NoConstructionSubShapesFilter", + new ModuleBase_FilterCustom(aSelectFilter)); } -std::string PartSet_Module::featureFile(const std::string& theFeatureId) +void PartSet_Module::registerProperties() { - return myFeaturesInFiles[theFeatureId]; + Config_PropManager::registerProp("Sketch planes", "planes_size", "Size", Config_Prop::Double, + PLANE_SIZE); + Config_PropManager::registerProp("Sketch planes", "planes_thickness", "Thickness", + Config_Prop::Integer, SKETCH_WIDTH); } -/* - * - */ -void PartSet_Module::onFeatureTriggered() +void PartSet_Module::operationCommitted(ModuleBase_Operation* theOperation) { - //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()) + if (theOperation->isEditOperation()) return; - 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() -{ - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast( - myWorkshop->operationMgr()->currentOperation()); - if (aPreviewOp) { - XGUI_PropertyPanel* aPropPanel = myWorkshop->propertyPanel(); - connect(aPropPanel, SIGNAL(storedPoint2D(FeaturePtr, const std::string&)), - this, SLOT(onStorePoint2D(FeaturePtr, const std::string&)), Qt::UniqueConnection); + // the selection is cleared after commit the create operation + // in order to do not use the same selected objects in the restarted operation + // for common behaviour, the selection is cleared even if the operation is not restarted + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (!aContext.IsNull()) + aContext->ClearSelected(); + + /// Restart sketcher operations automatically + FeaturePtr aFeature = theOperation->feature(); + std::shared_ptr aSPFeature = + std::dynamic_pointer_cast(aFeature); + if (aSPFeature && (myRestartingMode == RM_LastFeatureUsed || + myRestartingMode == RM_EmptyFeatureUsed)) { + myLastOperationId = theOperation->id(); + myLastFeature = myRestartingMode == RM_LastFeatureUsed ? theOperation->feature() : FeaturePtr(); + + launchOperation(myLastOperationId); } + breakOperationSequence(); } -void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) +void PartSet_Module::breakOperationSequence() { - if (!theOperation) - return; - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(theOperation); - if (aPreviewOp) { - XGUI_PropertyPanel* aPropPanel = myWorkshop->propertyPanel(); - //disconnect(aPropPanel, SIGNAL(storedPoint2D(FeaturePtr, const std::string&)), - // this, SLOT(onStorePoint2D(FeaturePtr, const std::string&))); - } + myLastOperationId = ""; + myLastFeature = FeaturePtr(); + myRestartingMode = RM_None; } -void PartSet_Module::onContextMenuCommand(const QString& theId, bool isChecked) +void PartSet_Module::operationAborted(ModuleBase_Operation* theOperation) { - QList aFeatures = myWorkshop->selector()->selection()->selectedObjects(); - if (theId == "EDIT_CMD" && (aFeatures.size() > 0)) { - FeaturePtr aFeature = boost::dynamic_pointer_cast(aFeatures.first()); - if (aFeature) - editFeature(aFeature); - } + breakOperationSequence(); } -void PartSet_Module::onMousePressed(QMouseEvent* theEvent) +void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation) { - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast( - myWorkshop->operationMgr()->currentOperation()); - if (aPreviewOp) { - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); - // Initialise operation with preliminary selection - std::list aSelected = aSelection->getSelected(); - std::list aHighlighted = aSelection->getHighlighted(); - - aPreviewOp->mousePressed(theEvent, myWorkshop->viewer()->activeView(), aSelected, aHighlighted); + if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) { + mySketchMgr->startSketch(theOperation); } + if (myDocumentShapeFilter.IsNull()) + myDocumentShapeFilter = new PartSet_GlobalFilter(myWorkshop); + myWorkshop->viewer()->addSelectionFilter(myDocumentShapeFilter); } -void PartSet_Module::onMouseReleased(QMouseEvent* theEvent) +void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation) { - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast( - myWorkshop->operationMgr()->currentOperation()); - if (aPreviewOp) { - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); - // Initialise operation with preliminary selection - std::list aSelected = aSelection->getSelected(); - std::list aHighlighted = aSelection->getHighlighted(); - - aPreviewOp->mouseReleased(theEvent, myWorkshop->viewer()->activeView(), aSelected, aHighlighted); + if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) { + mySketchMgr->stopSketch(theOperation); } + myWorkshop->viewer()->removeSelectionFilter(myDocumentShapeFilter); } -void PartSet_Module::onMouseMoved(QMouseEvent* theEvent) +bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const { - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast( - myWorkshop->operationMgr()->currentOperation()); - if (aPreviewOp) - aPreviewOp->mouseMoved(theEvent, myWorkshop->viewer()->activeView()); -} + bool aCanDisplay = false; + CompositeFeaturePtr aSketchFeature = mySketchMgr->activeSketch(); + if (aSketchFeature.get() != NULL) { + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); -void PartSet_Module::onKeyRelease(QKeyEvent* theEvent) -{ - ModuleBase_Operation* anOperation = myWorkshop->operationMgr()->currentOperation(); - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); - if (aPreviewOp) { - aPreviewOp->keyReleased(theEvent->key()); + // MPV: the second and third conditions to avoid crash on exit for application + if (aFeature.get() != NULL && aFeature->data().get() && aFeature->data()->isValid()) { + if (aFeature == aSketchFeature) { + aCanDisplay = false; + } + else if (aSketchFeature.get() && aSketchFeature->data().get() && + aSketchFeature->data()->isValid()) { + for (int i = 0; i < aSketchFeature->numberOfSubs() && !aCanDisplay; i++) { + FeaturePtr aSubFeature = aSketchFeature->subFeature(i); + std::list aResults = aSubFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResults.begin(); aIt != aResults.end() && !aCanDisplay; ++aIt) { + if (theObject == (*aIt)) + aCanDisplay = true; + } + if (aSubFeature == theObject) + aCanDisplay = true; + } + } + } } -} - -void PartSet_Module::onMouseDoubleClick(QMouseEvent* theEvent) -{ - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast( - myWorkshop->operationMgr()->currentOperation()); - if (aPreviewOp) - { - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); - // Initialise operation with preliminary selection - std::list aSelected = aSelection->getSelected(); - std::list aHighlighted = aSelection->getHighlighted(); - aPreviewOp->mouseDoubleClick(theEvent, myWorkshop->viewer()->activeView(), aSelected, - aHighlighted); + else { + aCanDisplay = ModuleBase_IModule::canDisplayObject(theObject); } + return aCanDisplay; } -void PartSet_Module::onPlaneSelected(double theX, double theY, double theZ) +void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) { - //erasePlanes(); - myWorkshop->viewer()->setViewProjection(theX, theY, theZ); - myWorkshop->actionsMgr()->update(); - - //PartSet_TestOCC::testSelection(myWorkshop); -} - -void PartSet_Module::onFitAllView() -{ - myWorkshop->viewer()->fitAll(); -} - -void PartSet_Module::onLaunchOperation(std::string theName, ObjectPtr theFeature) -{ - FeaturePtr aFeature = boost::dynamic_pointer_cast(theFeature); - if (!aFeature) { - qDebug("Warning! Restart operation without feature!"); - return; - } - ModuleBase_Operation* anOperation = createOperation(theName.c_str(), - theFeature ? aFeature->getKind() : ""); - 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->initFeature(aFeature); - aPreviewOp->initSelection(aSelected, aHighlighted); - } else { - anOperation->setEditingFeature(aFeature); + ModuleBase_IPropertyPanel* aPanel = theOperation->propertyPanel(); + if ((theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) && + (theOperation->isEditOperation())) { + // we have to manually activate the sketch label in edit mode + aPanel->activateWidget(aPanel->modelWidgets().first()); + return; } - sendOperation(anOperation); - myWorkshop->actionsMgr()->updateCheckState(); -} - -void PartSet_Module::onMultiSelectionEnabled(bool theEnabled) -{ - XGUI_ViewerProxy* 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); + // Restart last operation type + if ((theOperation->id() == myLastOperationId) && myLastFeature) { + ModuleBase_ModelWidget* aWgt = aPanel->activeWidget(); + if (theOperation->id().toStdString() == SketchPlugin_Line::ID()) { + // Initialise new line with first point equal to end of previous + PartSet_WidgetPoint2D* aPnt2dWgt = dynamic_cast(aWgt); + if (aPnt2dWgt) { + std::shared_ptr aData = myLastFeature->data(); + std::shared_ptr aPoint = + std::dynamic_pointer_cast(aData->attribute(SketchPlugin_Line::END_ID())); + if (aPoint) { + aPnt2dWgt->setPoint(aPoint->x(), aPoint->y()); + PartSet_Tools::setConstraints(mySketchMgr->activeSketch(), theOperation->feature(), + aWgt->attributeID(), aPoint->x(), aPoint->y()); + aPanel->activateNextWidget(aPnt2dWgt); + } + } } - } - //ObjectPtr aResults; - //foreach(ObjectPtr aFeature, theFeatures) { -/* TODO if (aFeature->results().size() > 0) { - const std::list& aResList = aFeature->results(); - std::list::const_iterator aIt; - for (aIt = aResList.cbegin(); aIt != aResList.cend(); ++aIt) - aResults.append(*aIt); + } else { + // Start editing constraint + if (theOperation->isEditOperation()) { + // TODO: #391 - to be removed + std::string aId = theOperation->id().toStdString(); + if (PartSet_SketcherMgr::sketchOperationIdList().contains(QString(aId.c_str()))) { + if ((aId == SketchPlugin_ConstraintRadius::ID()) || + (aId == SketchPlugin_ConstraintLength::ID()) || + (aId == SketchPlugin_ConstraintDistance::ID())) { + // Find and activate widget for management of point for dimension line position + QList aWidgets = aPanel->modelWidgets(); + foreach (ModuleBase_ModelWidget* aWgt, aWidgets) { + PartSet_WidgetPoint2D* aPntWgt = dynamic_cast(aWgt); + if (aPntWgt) { + aPanel->activateWidget(aPntWgt); + return; + } + } + } + } } - }*/ - aDisplayer->stopSelection(theFeatures, isStop, false); - - XGUI_ViewerProxy* aViewer = myWorkshop->viewer(); - aViewer->enableSelection(!isStop); - - aDisplayer->updateViewer(); + } } -void PartSet_Module::onSetSelection(const QList& theFeatures) -{ - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - aDisplayer->setSelected(theFeatures, false); - aDisplayer->updateViewer(); -} -void PartSet_Module::onCloseLocalContext() +void PartSet_Module::onSelectionChanged() { - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - aDisplayer->closeLocalContexts(); -} + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (!aOperation) + return; -void PartSet_Module::onFeatureConstructed(FeaturePtr theFeature, int theMode) -{ -// bool isDisplay = theMode != PartSet_OperationSketchBase::FM_Hide; -// if (isDisplay) { - ModuleBase_Operation* aCurOperation = myWorkshop->operationMgr()->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()); - 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) { - aDisplayer->activateInLocalContext((*aIt), aModes, false); - } - } - } -/* FeaturePtr aFeature = aPrevOp->feature(); + bool isSketcherOp = false; + // An edit operation is enable only if the current opeation is the sketch operation + if (mySketchMgr->activeSketch()) { + if (PartSet_Tools::sketchPlane(mySketchMgr->activeSketch())) + isSketcherOp = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()); + } + if (isSketcherOp) { + // Editing of constraints can be done on selection + ModuleBase_ISelection* aSelect = myWorkshop->selection(); + QList aSelected = aSelect->getSelected(); + if (aSelected.size() == 1) { + ModuleBase_ViewerPrs aPrs = aSelected.first(); + ObjectPtr aObject = aPrs.object(); + FeaturePtr aFeature = ModelAPI_Feature::feature(aObject); if (aFeature) { - std::list aResList = aFeature->results(); - std::list::iterator aIt; - for (aIt = aResList.begin(); aIt != aResList.end(); ++aIt) { - aDisplayer->deactivate((*aIt), false); + std::string aId = aFeature->getKind(); + if ((aId == SketchPlugin_ConstraintRadius::ID()) || + (aId == SketchPlugin_ConstraintLength::ID()) || + (aId == SketchPlugin_ConstraintDistance::ID())) { + editFeature(aFeature); } } - }*/ - ModelAPI_EventCreator::get()->sendUpdated(theFeature, - Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)); -// } -// else -// ->erase(theFeature->firstResult(), true); -/* 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, - const std::string& theFeatureKind) +void PartSet_Module::onKeyRelease(ModuleBase_IViewWindow* theWnd, QKeyEvent* theEvent) { - // create the operation - ModuleBase_Operation* anOperation = 0; - if (theCmdId == PartSet_OperationSketch::Type()) { - anOperation = new PartSet_OperationSketch(theCmdId.c_str(), this); - } - else { - ModuleBase_Operation* aCurOperation = myWorkshop->operationMgr()->currentOperation(); - FeaturePtr 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); - } - - if (!anOperation) { - anOperation = new ModuleBase_Operation(theCmdId.c_str(), this); - } - - // set operation description and list of widgets corresponding to the feature xml definition - std::string aFeatureKind = theFeatureKind.empty() ? theCmdId : theFeatureKind; - - std::string aPluginFileName = featureFile(aFeatureKind); - Config_WidgetReader aWdgReader = Config_WidgetReader(aPluginFileName); - aWdgReader.readAll(); - 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(FeaturePtr, int)), - this, SLOT(onFeatureConstructed(FeaturePtr, 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(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())); - } - } - - return anOperation; + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_OperationMgr* anOpMgr = aConnector->workshop()->operationMgr(); + anOpMgr->onKeyReleased(theEvent); } -void PartSet_Module::sendOperation(ModuleBase_Operation* theOperation) +void PartSet_Module::onEnterReleased() { - static Events_ID aModuleEvent = Events_Loop::eventByName(EVENT_OPERATION_LAUNCHED); - Config_PointerMessage aMessage(aModuleEvent, this); - aMessage.setPointer(theOperation); - Events_Loop::loop()->send(aMessage); + myRestartingMode = RM_EmptyFeatureUsed; } - -/*void PartSet_Module::visualizePreview(FeaturePtr theFeature, bool isDisplay, - const bool isUpdateViewer) +void PartSet_Module::onOperationActivatedByPreselection() { - ModuleBase_Operation* anOperation = myWorkshop->operationMgr()->currentOperation(); - if (!anOperation) + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (!aOperation) return; - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); - if (!aPreviewOp) - return; + // Set final definitions if they are necessary + //propertyPanelDefined(aOperation); - 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(); - } + /// Commit sketcher operations automatically + FeaturePtr aFeature = aOperation->feature(); + std::shared_ptr aSPFeature = + std::dynamic_pointer_cast(aFeature); + if (aSPFeature) { + aOperation->commit(); } - else - aDisplayer->erase(aResult, false); - - if (isUpdateViewer) - aDisplayer->updateViewer(); -}*/ +} -void PartSet_Module::activateFeature(ObjectPtr theFeature, const bool isUpdateViewer) +void PartSet_Module::onNoMoreWidgets() { - 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); + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (aOperation) { + /// Restart sketcher operations automatically + FeaturePtr aFeature = aOperation->feature(); + std::shared_ptr aSPFeature = + std::dynamic_pointer_cast(aFeature); + if (aSPFeature) { + if (myRestartingMode != RM_Forbided) + myRestartingMode = RM_LastFeatureUsed; + aOperation->commit(); + } } } -void PartSet_Module::updateCurrentPreview(const std::string& theCmdId) +void PartSet_Module::onVertexSelected() { - ModuleBase_Operation* anOperation = myWorkshop->operationMgr()->currentOperation(); - if (!anOperation) - return; - - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); - if (!aPreviewOp) - return; - - FeaturePtr aFeature = aPreviewOp->feature(); - if (!aFeature || aFeature->getKind() != theCmdId) - return; - - std::list aList = aPreviewOp->subFeatures(); - XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - std::list aModes = aPreviewOp->getSelectionModes(aPreviewOp->feature()); - - std::list::const_iterator anIt = aList.begin(), - aLast = aList.end(); - for (; anIt != aLast; anIt++) { - boost::shared_ptr aSPFeature = - boost::dynamic_pointer_cast(*anIt); - if (!aSPFeature) - continue; - //visualizePreview((*anIt), true, false); - aDisplayer->activateInLocalContext((*anIt), aModes, false); + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (aOperation->id().toStdString() == SketchPlugin_Line::ID()) { + /// If last line finished on vertex the lines creation sequence has to be break + ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + const QList& aWidgets = aPanel->modelWidgets(); + if (aWidgets.last() == aPanel->activeWidget()) { + myRestartingMode = RM_Forbided; + } } - aDisplayer->updateViewer(); } -void PartSet_Module::editFeature(FeaturePtr theFeature) +QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* theParent, + Config_WidgetAPI* theWidgetApi, std::string theParentId, + QList& theModelWidgets) { - if (!theFeature) - return; + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + if (theType == "sketch-start-label") { + PartSet_WidgetSketchLabel* aWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, theParentId); + aWgt->setWorkshop(aWorkshop); + connect(aWgt, SIGNAL(planeSelected(const std::shared_ptr&)), + mySketchMgr, SLOT(onPlaneSelected(const std::shared_ptr&))); + theModelWidgets.append(aWgt); + return aWgt->getControl(); -// if (theFeature->getKind() == SKETCH_KIND) { - //FeaturePtr aFeature = theFeature; - //if (XGUI_Tools::isModelObject(aFeature)) { - // ObjectPtr aObject = boost::dynamic_pointer_cast(aFeature); - // aFeature = aObject->featureRef(); - //} - - //if (aFeature) { - onLaunchOperation(theFeature->getKind(), theFeature); - updateCurrentPreview(theFeature->getKind()); - //} -// } -} + } else if (theType == "sketch-2dpoint_selector") { + PartSet_WidgetPoint2D* aWgt = new PartSet_WidgetPoint2D(theParent, theWidgetApi, theParentId); + aWgt->setWorkshop(aWorkshop); + aWgt->setSketch(mySketchMgr->activeSketch()); -void PartSet_Module::onStorePoint2D(FeaturePtr theFeature, const std::string& theAttribute) -{ - PartSet_OperationSketchBase* aPreviewOp = dynamic_cast( - myWorkshop->operationMgr()->currentOperation()); - if (!aPreviewOp) - return; + connect(aWgt, SIGNAL(vertexSelected()), this, SLOT(onVertexSelected())); + + theModelWidgets.append(aWgt); + return aWgt->getControl(); - boost::shared_ptr aPoint = - boost::dynamic_pointer_cast(theFeature->data()->attribute(theAttribute)); + } if (theType == "point2ddistance") { + PartSet_WidgetPoint2dDistance* aWgt = new PartSet_WidgetPoint2dDistance(theParent, theWidgetApi, theParentId); + aWgt->setWorkshop(aWorkshop); + aWgt->setSketch(mySketchMgr->activeSketch()); - PartSet_Tools::setConstraints(aPreviewOp->sketch(), theFeature, theAttribute, - aPoint->x(), aPoint->y()); -} + theModelWidgets.append(aWgt); + return aWgt->getControl(); -/*bool PartSet_Module::isFeatureEnabled(const QString& theCmdId) const -{ - XGUI_OperationMgr* aOpMgr = myWorkshop->operationMgr(); - XGUI_ActionsMgr* aActMgr = myWorkshop->actionsMgr(); + } if (theType == "sketch_shape_selector") { + PartSet_WidgetShapeSelector* aWgt = + new PartSet_WidgetShapeSelector(theParent, workshop(), theWidgetApi, theParentId); + aWgt->setSketcher(mySketchMgr->activeSketch()); - 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); -}*/ + theModelWidgets.append(aWgt); + return aWgt->getControl(); + + } if (theType == "sketch_constraint_shape_selector") { + PartSet_WidgetConstraintShapeSelector* aWgt = + new PartSet_WidgetConstraintShapeSelector(theParent, workshop(), theWidgetApi, theParentId); + aWgt->setSketcher(mySketchMgr->activeSketch()); -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()); theModelWidgets.append(aWgt); return aWgt->getControl(); + } else return 0; } +