X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=03b29dd75a50a4cc255b261bb270f8bd7b171b29;hb=013eda84dcea4a427d406c5c75ba7870f4124b7f;hp=e997f05cf97a1c967fb30473753308a9ae390008;hpb=9ddba1caf0817c1e95c55d4c5b8ae6de23cbe6d5;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp old mode 100644 new mode 100755 index e997f05cf..03b29dd75 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -14,19 +14,22 @@ #include "PartSet_WidgetSketchCreator.h" #include "PartSet_SketcherMgr.h" #include "PartSet_MenuMgr.h" -#include +#include "PartSet_CustomPrs.h" +#include "PartSet_IconFactory.h" #include "PartSet_Filters.h" #include "PartSet_FilterInfinite.h" #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -35,6 +38,7 @@ #include #include #include +#include #include @@ -43,6 +47,7 @@ #include #include #include +#include #include #include @@ -57,6 +62,7 @@ #include #include #include +#include #include #include @@ -64,6 +70,7 @@ #include #include #include +#include #include #include #include @@ -102,8 +109,6 @@ #include #endif - - /*!Create and return new instance of XGUI_Module*/ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop) { @@ -114,6 +119,8 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) : ModuleBase_IModule(theWshop), myRestartingMode(RM_None), myVisualLayerId(0) { + new PartSet_IconFactory(); + mySketchMgr = new PartSet_SketcherMgr(this); myDataModel = new PartSet_DocumentDataModel(this); @@ -130,9 +137,11 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*))); connect(aViewer, SIGNAL(viewTransformed(int)), SLOT(onViewTransformed(int))); + connect(aViewer, SIGNAL(viewCreated(ModuleBase_IViewWindow*)), + SLOT(onViewCreated(ModuleBase_IViewWindow*))); myMenuMgr = new PartSet_MenuMgr(this); - myCustomPrs = std::shared_ptr(new PartSet_CustomPrs(theWshop)); + myCustomPrs = new PartSet_CustomPrs(theWshop); Events_Loop* aLoop = Events_Loop::loop(); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED)); @@ -149,6 +158,7 @@ PartSet_Module::~PartSet_Module() if (!aFilter.IsNull()) aFilter.Nullify(); } + delete myCustomPrs; } void PartSet_Module::activateSelectionFilters() @@ -186,10 +196,13 @@ void PartSet_Module::registerValidators() aFactory->registerValidator("PartSet_HVDirSelection", new PartSet_HVDirSelection); aFactory->registerValidator("PartSet_TangentSelection", new PartSet_TangentSelection); aFactory->registerValidator("PartSet_FilletSelection", new PartSet_FilletSelection); + aFactory->registerValidator("PartSet_AngleSelection", new PartSet_AngleSelection); aFactory->registerValidator("PartSet_DifferentObjects", new PartSet_DifferentObjectsValidator); aFactory->registerValidator("PartSet_DifferentShapes", new ModelAPI_ShapeValidator); + aFactory->registerValidator("PartSet_CoincidentAttr", new PartSet_CoincidentAttr); + aFactory->registerValidator("GeomValidators_ShapeType", new GeomValidators_ShapeType); aFactory->registerValidator("GeomValidators_Face", new GeomValidators_Face); @@ -207,6 +220,9 @@ void PartSet_Module::registerValidators() aFactory->registerValidator("PartSet_SameTypeAttr", new PartSet_SameTypeAttrValidator); + + aFactory->registerValidator("GeomValidators_Different", + new GeomValidators_Different); } void PartSet_Module::registerFilters() @@ -267,11 +283,6 @@ void PartSet_Module::onOperationAborted(ModuleBase_Operation* theOperation) void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) { - // z layer is created for all started operations in order to visualize operation AIS presentation - // over the object - Handle(V3d_Viewer) aViewer = myWorkshop->viewer()->AISContext()->CurrentViewer(); - aViewer->AddZLayer(myVisualLayerId); - if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->startSketch(theOperation); } @@ -279,25 +290,19 @@ void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) mySketchMgr->startNestedSketch(theOperation); } - std::shared_ptr aCustomPrs = - std::dynamic_pointer_cast(myCustomPrs); - aCustomPrs->activate(theOperation->feature()); + myCustomPrs->activate(theOperation->feature()); } void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) { + myCustomPrs->deactivate(); + if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->stopSketch(theOperation); } else if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { mySketchMgr->stopNestedSketch(theOperation); } - Handle(V3d_Viewer) aViewer = myWorkshop->viewer()->AISContext()->CurrentViewer(); - aViewer->RemoveZLayer(myVisualLayerId); - myVisualLayerId = 0; - std::shared_ptr aCustomPrs = - std::dynamic_pointer_cast(myCustomPrs); - aCustomPrs->deactivate(); } ModuleBase_Operation* PartSet_Module::currentOperation() const @@ -331,6 +336,20 @@ bool PartSet_Module::canRedo() const return aCanRedo; } +bool PartSet_Module::canApplyAction(const ObjectPtr& theObject, const QString& theActionId) const +{ + bool aValid = true; + if (theActionId == "DELETE_CMD" || theActionId == "MOVE_CMD") { + FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + if (aFeature) { + // part features are removed in the PartSet module only. + if (aFeature->getKind() == PartSetPlugin_Part::ID()) + aValid = false; + } + } + return aValid; +} + bool PartSet_Module::canCommitOperation() const { return mySketchMgr->canCommitOperation(); @@ -362,6 +381,12 @@ bool PartSet_Module::addViewerMenu(QMenu* theMenu, const QMap return myMenuMgr->addViewerMenu(theMenu, theStdActions); } +void PartSet_Module::updateViewerMenu(const QMap& theStdActions) +{ + myMenuMgr->updateViewerMenu(theStdActions); +} + + void PartSet_Module::activeSelectionModes(QIntList& theModes) { theModes.clear(); @@ -429,7 +454,8 @@ void PartSet_Module::onSelectionChanged() std::string aId = aFeature->getKind(); if ((aId == SketchPlugin_ConstraintRadius::ID()) || (aId == SketchPlugin_ConstraintLength::ID()) || - (aId == SketchPlugin_ConstraintDistance::ID())) { + (aId == SketchPlugin_ConstraintDistance::ID()) || + (aId == SketchPlugin_ConstraintAngle::ID())) { editFeature(aFeature); } } @@ -503,9 +529,8 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th XGUI_Workshop* aXUIWorkshop = aConnector->workshop(); ModuleBase_ModelWidget* aWgt = NULL; if (theType == "sketch-start-label") { - PartSet_WidgetSketchLabel* aLabelWgt = new PartSet_WidgetSketchLabel(theParent, + PartSet_WidgetSketchLabel* aLabelWgt = new PartSet_WidgetSketchLabel(theParent, aWorkshop, theWidgetApi, theParentId, mySketchMgr->isConstraintsShown()); - aLabelWgt->setWorkshop(aXUIWorkshop); connect(aLabelWgt, SIGNAL(planeSelected(const std::shared_ptr&)), mySketchMgr, SLOT(onPlaneSelected(const std::shared_ptr&))); connect(aLabelWgt, SIGNAL(showConstraintToggled(bool)), @@ -598,10 +623,7 @@ bool PartSet_Module::deleteObjects() // 4. delete features // sketch feature should be skipped, only sub-features can be removed // when sketch operation is active - std::set anIgnoredFeatures; - anIgnoredFeatures.insert(mySketchMgr->activeSketch()); - aWorkshop->deleteFeatures(aSketchObjects, anIgnoredFeatures); - + aWorkshop->deleteFeatures(aSketchObjects); // 5. stop operation aWorkshop->displayer()->updateViewer(); aMgr->finishOperation(); @@ -676,6 +698,14 @@ void PartSet_Module::onObjectDisplayed(ObjectPtr theObject, AISObjectPtr theAIS) } } +void PartSet_Module::onBeforeObjectErase(ObjectPtr theObject, AISObjectPtr theAIS) +{ + // it should be recomputed in order to disappear in the viewer if the corresponded object + // is erased + if (myCustomPrs->isActive()) + myCustomPrs->customize(theObject); +} + void PartSet_Module::onViewTransformed(int theTrsfType) { // Set length of arrows constant in pixel size @@ -730,14 +760,10 @@ void PartSet_Module::onViewTransformed(int theTrsfType) aDisplayer->updateViewer(); } -bool PartSet_Module::customizeObject(ObjectPtr theObject) +void PartSet_Module::customizeObject(ObjectPtr theObject) { - std::shared_ptr aCustomPrs = - std::dynamic_pointer_cast(myCustomPrs); - bool isCustomized = false; - if (aCustomPrs->isActive()) - isCustomized = aCustomPrs->customize(theObject); - return isCustomized; + if (myCustomPrs->isActive()) + myCustomPrs->customize(theObject); } void PartSet_Module::customizeObjectBrowser(QWidget* theObjectBrowser) @@ -749,15 +775,36 @@ void PartSet_Module::customizeObjectBrowser(QWidget* theObjectBrowser) aPalet.setColor(QPalette::Text, QColor(0, 72, 140)); aLabel->setPalette(aPalet); aOB->treeView()->setExpandsOnDoubleClick(false); +#ifdef ModuleDataModel connect(aOB->treeView(), SIGNAL(doubleClicked(const QModelIndex&)), SLOT(onTreeViewDoubleClick(const QModelIndex&))); connect(aOB, SIGNAL(headerMouseDblClicked(const QModelIndex&)), SLOT(onTreeViewDoubleClick(const QModelIndex&))); connect(aOB->treeView(), SIGNAL(doubleClicked(const QModelIndex&)), myDataModel, SLOT(onMouseDoubleClick(const QModelIndex&))); +#endif } } +ObjectPtr PartSet_Module::findPresentedObject(const AISObjectPtr& theAIS) const +{ + ObjectPtr anObject; + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (aOperation) { + /// If last line finished on vertex the lines creation sequence has to be break + ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget(); + // if there is an active widget, find the presented object in it + if (!anActiveWidget) + anActiveWidget = aPanel->preselectionWidget(); + + ModuleBase_WidgetValidated* aWidgetValidated = dynamic_cast + (anActiveWidget); + if (aWidgetValidated) + anObject = aWidgetValidated->findPresentedObject(theAIS); + } + return anObject; +} void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const { @@ -768,7 +815,8 @@ void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const bool hasResult = false; bool hasFeature = false; bool hasParameter = false; - ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter); + bool hasSubFeature = false; + ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter, hasSubFeature); ObjectPtr aObject = aObjects.first(); if (aObject) { @@ -791,6 +839,12 @@ void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const if (hasParameter || hasFeature) theMenu->addAction(myMenuMgr->action("EDIT_CMD")); } + + ResultBodyPtr aResult = std::dynamic_pointer_cast(aObject); + if( aResult.get() ) + { + theMenu->addAction(myMenuMgr->action("SELECT_PARENT_CMD")); + } } else { // If feature is 0 the it means that selected root object (document) if (aMgr->activeDocument() != aMgr->moduleDocument()) theMenu->addAction(myMenuMgr->action("ACTIVATE_PARTSET_CMD")); @@ -812,7 +866,14 @@ void PartSet_Module::processEvent(const std::shared_ptr& theMess { if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENT_CHANGED)) { // Do not change activation of parts if an operation active - if (myWorkshop->currentOperation() && myWorkshop->currentOperation()->id().toStdString() != PartSetPlugin_Part::ID()) + static QStringList aAllowActivationList; + if (aAllowActivationList.isEmpty()) + aAllowActivationList << + QString(PartSetPlugin_Part::ID().c_str()) << + QString(PartSetPlugin_Duplicate::ID().c_str()) << + QString(PartSetPlugin_Remove::ID().c_str()); + if (myWorkshop->currentOperation() && + (!aAllowActivationList.contains(myWorkshop->currentOperation()->id()))) return; XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); XGUI_Workshop* aWorkshop = aConnector->workshop(); @@ -822,8 +883,9 @@ void PartSet_Module::processEvent(const std::shared_ptr& theMess SessionPtr aMgr = ModelAPI_Session::get(); DocumentPtr aActiveDoc = aMgr->activeDocument(); - DocumentPtr aDoc = aMgr->moduleDocument(); +#ifdef ModuleDataModel QModelIndex aOldIndex = myDataModel->activePartTree(); + DocumentPtr aDoc = aMgr->moduleDocument(); if (aActiveDoc == aDoc) { if (aOldIndex.isValid()) aTreeView->setExpanded(aOldIndex, false); @@ -845,6 +907,16 @@ void PartSet_Module::processEvent(const std::shared_ptr& theMess } } } +#else + // Problem with MPV: At first time on creation it doesn't work because Part feature + // creation event will be sent after + if (aActivePartIndex.isValid()) + aTreeView->setExpanded(aActivePartIndex, false); + XGUI_DataModel* aDataModel = aWorkshop->objectBrowser()->dataModel(); + aActivePartIndex = aDataModel->documentRootIndex(aActiveDoc); + if (aActivePartIndex.isValid()) + aTreeView->setExpanded(aActivePartIndex, true); +#endif aLabel->setPalette(aPalet); aWorkshop->updateCommandStatus(); @@ -884,3 +956,27 @@ void PartSet_Module::onTreeViewDoubleClick(const QModelIndex& theIndex) } } } + + +void PartSet_Module::onViewCreated(ModuleBase_IViewWindow*) +{ + // z layer is created for all started operations in order to visualize operation AIS presentation + // over the object + Handle(V3d_Viewer) aViewer = myWorkshop->viewer()->AISContext()->CurrentViewer(); + if (myVisualLayerId == 0) { + if (myVisualLayerId == 0) + aViewer->AddZLayer(myVisualLayerId); + } else { + TColStd_SequenceOfInteger aZList; + aViewer->GetAllZLayers(aZList); + bool aFound = false; + for (int i = 1; i <= aZList.Length(); i++) { + if (aZList(i) == myVisualLayerId) { + aFound = true; + break; + } + } + if (!aFound) + aViewer->AddZLayer(myVisualLayerId); + } +}