X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_IModule.cpp;h=c73bf3c1c5081a803b07d15181918d283418eaae;hb=0d9a107853208317a6352bb7f8c77eb54d5efbe1;hp=36e09437e72d38564105a63087319edb9d56c07b;hpb=5b841e9801c659d762d708378df8c4d85565fda0;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_IModule.cpp b/src/ModuleBase/ModuleBase_IModule.cpp index 36e09437e..c73bf3c1c 100644 --- a/src/ModuleBase/ModuleBase_IModule.cpp +++ b/src/ModuleBase/ModuleBase_IModule.cpp @@ -1,49 +1,260 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + #include "ModuleBase_IModule.h" #include "ModuleBase_IViewer.h" #include "ModuleBase_ViewerPrs.h" #include "ModuleBase_Operation.h" #include "ModuleBase_ISelection.h" +#include "ModuleBase_OperationDescription.h" +#include "ModuleBase_OperationFeature.h" +#include #include +#include #include +#include +#include #include +#include +#include +#include ModuleBase_IModule::ModuleBase_IModule(ModuleBase_IWorkshop* theParent) : QObject(theParent), myWorkshop(theParent) { connect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); - 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*))); -} + //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*))); +} + void ModuleBase_IModule::launchOperation(const QString& theCmdId) { - ModuleBase_Operation* anOperation = createOperation(theCmdId.toStdString()); - ModuleBase_ISelection* aSelection = myWorkshop->selection(); - // Initialise operation with preliminary selection - anOperation->initSelection(aSelection, myWorkshop->viewer()); - sendOperation(anOperation); + if (!myWorkshop->canStartOperation(theCmdId)) + return; + + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (createOperation(theCmdId.toStdString())); + if (aFOperation) { + ModuleBase_ISelection* aSelection = myWorkshop->selection(); + // Initialise operation with preliminary selection + aFOperation->initSelection(aSelection, myWorkshop->viewer()); + sendOperation(aFOperation); + } } void ModuleBase_IModule::sendOperation(ModuleBase_Operation* theOperation) { static Events_ID aModuleEvent = Events_Loop::eventByName(EVENT_OPERATION_LAUNCHED); - boost::shared_ptr aMessage = - boost::shared_ptr(new Config_PointerMessage(aModuleEvent, this)); + std::shared_ptr aMessage = + std::shared_ptr(new Config_PointerMessage(aModuleEvent, this)); aMessage->setPointer(theOperation); Events_Loop::loop()->send(aMessage); } + +const char* toString(ModelAPI_ExecState theExecState) +{ +#define TO_STRING(__NAME__) case __NAME__: return #__NAME__; + switch (theExecState) { + TO_STRING(ModelAPI_StateDone) + TO_STRING(ModelAPI_StateMustBeUpdated) + TO_STRING(ModelAPI_StateExecFailed) + TO_STRING(ModelAPI_StateInvalidArgument) + TO_STRING(ModelAPI_StateNothing) + default: return "Unknown ExecState."; + } +#undef TO_STRING +} + +QString ModuleBase_IModule::getFeatureError(const FeaturePtr& theFeature) +{ + QString anError; + if (!theFeature.get() || !theFeature->data()->isValid() || theFeature->isAction()) + return anError; + + // to be removed later, this error should be got from the feature + if (theFeature->data()->execState() == ModelAPI_StateDone || + theFeature->data()->execState() == ModelAPI_StateMustBeUpdated) + return anError; + + // set error indication + anError = QString::fromStdString(theFeature->error()); + if (anError.isEmpty()) { + bool isDone = ( theFeature->data()->execState() == ModelAPI_StateDone + || theFeature->data()->execState() == ModelAPI_StateMustBeUpdated ); + if (!isDone) + anError = toString(theFeature->data()->execState()); + } + + return anError; +} + +QString ModuleBase_IModule::getWidgetError(ModuleBase_ModelWidget* theWidget) +{ + QString anError; + + if (!theWidget || !theWidget->feature().get()) + return anError; + + std::string anAttributeID = theWidget->attributeID(); + AttributePtr anAttribute = theWidget->feature()->attribute(anAttributeID); + if (!anAttribute.get()) + return anError; + + std::string aValidatorID; + std::string anErrorMsg; + + static ModelAPI_ValidatorsFactory* aValidators = ModelAPI_Session::get()->validators(); + if (!aValidators->validate(anAttribute, aValidatorID, anErrorMsg)) { + if (anErrorMsg.empty()) + anErrorMsg = "unknown error."; + anErrorMsg = anAttributeID + " - " + aValidatorID + ": " + anErrorMsg; + } + + anError = QString::fromStdString(anErrorMsg); + if (anError.isEmpty()) + anError = theWidget->getValueStateError(); + + return anError; +} + +void ModuleBase_IModule::grantedOperationIds(ModuleBase_Operation* theOperation, + QStringList& theIds) const +{ +} + +ModuleBase_Operation* ModuleBase_IModule::getNewOperation(const std::string& theFeatureId) +{ + return new ModuleBase_OperationFeature(theFeatureId.c_str(), this); +} + +bool ModuleBase_IModule::customizeObject(ObjectPtr theObject, const bool theUpdateViewer) +{ + return false; +} + +ModuleBase_Operation* ModuleBase_IModule::createOperation(const std::string& theFeatureId) +{ + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (getNewOperation(theFeatureId)); + // If the operation is launched as sub-operation of another then we have to initialize + // parent feature + ModuleBase_OperationFeature* aCurOperation = dynamic_cast + (myWorkshop->currentOperation()); + if (aCurOperation) { + FeaturePtr aFeature = aCurOperation->feature(); + CompositeFeaturePtr aCompFeature = + std::dynamic_pointer_cast(aFeature); + if (aCompFeature) { + aFOperation->setParentFeature(aCompFeature); + } + } + + std::string aPluginFileName = myFeaturesInFiles[theFeatureId]; + Config_WidgetReader aWdgReader = Config_WidgetReader(aPluginFileName); + aWdgReader.readAll(); + std::string aXmlCfg = aWdgReader.featureWidgetCfg(theFeatureId); + std::string aDescription = aWdgReader.featureDescription(theFeatureId); + + aFOperation->getDescription()->setDescription(QString::fromStdString(aDescription)); + aFOperation->getDescription()->setXmlRepresentation(QString::fromStdString(aXmlCfg)); + + return aFOperation; +} + +void ModuleBase_IModule::createFeatures() +{ + registerValidators(); + registerFilters(); + registerProperties(); + + Config_ModuleReader aXMLReader = Config_ModuleReader(); + aXMLReader.readAll(); + myFeaturesInFiles = aXMLReader.featuresInFiles(); +} + + +void ModuleBase_IModule::actionCreated(QAction* theFeature) +{ + connect(theFeature, SIGNAL(triggered(bool)), this, SLOT(onFeatureTriggered())); +} + +bool ModuleBase_IModule::canEraseObject(const ObjectPtr& theObject) const +{ + return true; +} + +bool ModuleBase_IModule::canDisplayObject(const ObjectPtr& theObject) const +{ + return true; +} + +bool ModuleBase_IModule::canUndo() const +{ + SessionPtr aMgr = ModelAPI_Session::get(); + return aMgr->hasModuleDocument() && aMgr->canUndo() && !aMgr->isOperation(); +} + +bool ModuleBase_IModule::canRedo() const +{ + SessionPtr aMgr = ModelAPI_Session::get(); + return aMgr->hasModuleDocument() && aMgr->canRedo() && !aMgr->isOperation(); +} + +void ModuleBase_IModule::onFeatureTriggered() +{ + QAction* aCmd = dynamic_cast(sender()); + //Do nothing on uncheck + if (aCmd->isCheckable() && !aCmd->isChecked()) { + ModuleBase_Operation* anOperation = myWorkshop->findStartedOperation(aCmd->data().toString()); + if (myWorkshop->canStopOperation(anOperation)) + myWorkshop->abortOperation(anOperation); + else { + aCmd->setChecked(true); + } + } + else { + launchOperation(aCmd->data().toString()); + emit operationLaunched(); + } +} + +void ModuleBase_IModule::editFeature(FeaturePtr theFeature) +{ + std::string aFeatureId = theFeature->getKind(); + if (!myWorkshop->canStartOperation(aFeatureId.c_str())) + return; + + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (createOperation(aFeatureId)); + if (aFOperation) { + aFOperation->setFeature(theFeature); + sendOperation(aFOperation); + } +} + +bool ModuleBase_IModule::canActivateSelection(const ObjectPtr& theObject) const +{ + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (myWorkshop->currentOperation()); + return !aFOperation || !aFOperation->hasObject(theObject); +} + +void ModuleBase_IModule::operationResumed(ModuleBase_Operation* theOperation) +{ + emit resumed(theOperation); +}