X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=8ad7937e4460cfd94357c929b6216d7adb2b84f4;hb=840655e90a46754f2dd37aac6b888ec32eec69d3;hp=09b8ef5d58c71373cb2e8b60fdbcd7e0b8e8c851;hpb=9d9ff3badaec1d230a701582d588b1e75c0fc09c;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 09b8ef5d5..8ad7937e4 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -1,16 +1,26 @@ // Copyright (C) 2014-20xx CEA/DEN, EDF R&D #include "PartSet_Module.h" -#include -#include -#include -#include -#include -#include -#include -#include +#include "PartSet_WidgetSketchLabel.h" +#include "PartSet_Validators.h" +#include "PartSet_Tools.h" +#include "PartSet_WidgetPoint2d.h" +#include "PartSet_WidgetPoint2dDistance.h" +#include "PartSet_WidgetShapeSelector.h" +#include "PartSet_WidgetPoint2dAngle.h" +#include "PartSet_WidgetMultiSelector.h" +#include "PartSet_WidgetEditor.h" +#include "PartSet_WidgetFileSelector.h" +#include "PartSet_WidgetSketchCreator.h" #include "PartSet_SketcherMgr.h" #include "PartSet_MenuMgr.h" +#include + +#include "PartSet_Filters.h" +#include "PartSet_FilterInfinite.h" + +#include +#include #include #include @@ -18,10 +28,13 @@ #include #include #include -#include -#include +#include +#include + #include #include +#include +#include #include @@ -42,6 +55,8 @@ #include #include #include +#include +#include #include #include @@ -76,14 +91,19 @@ #include #include #include +#include #include #include +#include + #ifdef _DEBUG #include #endif + + /*!Create and return new instance of XGUI_Module*/ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop) { @@ -91,10 +111,11 @@ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* } PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) - : ModuleBase_IModule(theWshop), + : ModuleBase_IModule(theWshop), myRestartingMode(RM_None), myVisualLayerId(0) { mySketchMgr = new PartSet_SketcherMgr(this); + myDataModel = new PartSet_DocumentDataModel(this); XGUI_ModuleConnector* aConnector = dynamic_cast(theWshop); XGUI_Workshop* aWorkshop = aConnector->workshop(); @@ -111,12 +132,43 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) SLOT(onViewTransformed(int))); myMenuMgr = new PartSet_MenuMgr(this); + myCustomPrs = std::shared_ptr(new PartSet_CustomPrs(theWshop)); + + Events_Loop* aLoop = Events_Loop::loop(); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED)); + + mySelectionFilters.Append(new PartSet_GlobalFilter(myWorkshop)); + mySelectionFilters.Append(new PartSet_FilterInfinite(myWorkshop)); } PartSet_Module::~PartSet_Module() { - if (!myDocumentShapeFilter.IsNull()) - myDocumentShapeFilter.Nullify(); + SelectMgr_ListIteratorOfListOfFilter aIt(mySelectionFilters); + for (; aIt.More(); aIt.Next()) { + Handle(SelectMgr_Filter) aFilter = aIt.Value(); + if (!aFilter.IsNull()) + aFilter.Nullify(); + } +} + +void PartSet_Module::activateSelectionFilters() +{ + SelectMgr_ListIteratorOfListOfFilter aIt(mySelectionFilters); + for (; aIt.More(); aIt.Next()) { + Handle(SelectMgr_Filter) aFilter = aIt.Value(); + if (!aFilter.IsNull()) + myWorkshop->viewer()->addSelectionFilter(aFilter); + } +} + +void PartSet_Module::deactivateSelectionFilters() +{ + SelectMgr_ListIteratorOfListOfFilter aIt(mySelectionFilters); + for (; aIt.More(); aIt.Next()) { + Handle(SelectMgr_Filter) aFilter = aIt.Value(); + if (!aFilter.IsNull()) + myWorkshop->viewer()->removeSelectionFilter(aFilter); + } } void PartSet_Module::registerValidators() @@ -138,14 +190,18 @@ void PartSet_Module::registerValidators() aFactory->registerValidator("PartSet_DifferentObjects", new PartSet_DifferentObjectsValidator); aFactory->registerValidator("PartSet_DifferentShapes", new ModelAPI_ShapeValidator); - aFactory->registerValidator("GeomValidators_Edge", new GeomValidators_Edge); - aFactory->registerValidator("GeomValidators_EdgeOrVertex", - new GeomValidators_EdgeOrVertex); + aFactory->registerValidator("GeomValidators_ShapeType", new GeomValidators_ShapeType); aFactory->registerValidator("GeomValidators_Face", new GeomValidators_Face); aFactory->registerValidator("GeomValidators_ConstructionComposite", new GeomValidators_ConstructionComposite); + aFactory->registerValidator("GeomValidators_ZeroOffset", + new GeomValidators_ZeroOffset); + + aFactory->registerValidator("GeomValidators_BooleanArguments", + new GeomValidators_BooleanArguments); + aFactory->registerValidator("PartSet_SketchEntityValidator", new PartSet_SketchEntityValidator); @@ -168,7 +224,7 @@ void PartSet_Module::registerProperties() Config_Prop::Integer, SKETCH_WIDTH); } -void PartSet_Module::operationCommitted(ModuleBase_Operation* theOperation) +void PartSet_Module::onOperationCommitted(ModuleBase_Operation* theOperation) { if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { mySketchMgr->commitNestedSketch(theOperation); @@ -179,9 +235,9 @@ void PartSet_Module::operationCommitted(ModuleBase_Operation* theOperation) // 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(); + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + aWorkshop->selector()->clearSelection(); /// Restart sketcher operations automatically FeaturePtr aFeature = theOperation->feature(); @@ -204,39 +260,44 @@ void PartSet_Module::breakOperationSequence() myRestartingMode = RM_None; } -void PartSet_Module::operationAborted(ModuleBase_Operation* theOperation) +void PartSet_Module::onOperationAborted(ModuleBase_Operation* theOperation) { breakOperationSequence(); } -void PartSet_Module::operationStarted(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)) { - Handle(V3d_Viewer) aViewer = myWorkshop->viewer()->AISContext()->CurrentViewer(); - aViewer->AddZLayer(myVisualLayerId); mySketchMgr->startSketch(theOperation); } else if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { mySketchMgr->startNestedSketch(theOperation); } - if (myDocumentShapeFilter.IsNull()) - myDocumentShapeFilter = new PartSet_GlobalFilter(myWorkshop); - myWorkshop->viewer()->addSelectionFilter(myDocumentShapeFilter); + std::shared_ptr aCustomPrs = + std::dynamic_pointer_cast(myCustomPrs); + aCustomPrs->activate(theOperation->feature()); } -void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation) +void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) { if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->stopSketch(theOperation); - Handle(V3d_Viewer) aViewer = myWorkshop->viewer()->AISContext()->CurrentViewer(); - aViewer->RemoveZLayer(myVisualLayerId); - myVisualLayerId = 0; } else if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { mySketchMgr->stopNestedSketch(theOperation); } - myWorkshop->viewer()->removeSelectionFilter(myDocumentShapeFilter); + 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 @@ -270,16 +331,42 @@ bool PartSet_Module::canRedo() const return aCanRedo; } +bool PartSet_Module::canCommitOperation() const +{ + return mySketchMgr->canCommitOperation(); +} + bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const { // the sketch manager put the restriction to the objects display return mySketchMgr->canDisplayObject(theObject); } +bool PartSet_Module::canActivateSelection(const ObjectPtr& theObject) const +{ + bool aCanActivate = ModuleBase_IModule::canActivateSelection(theObject); + + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + bool isSketchOp = PartSet_SketcherMgr::isSketchOperation(anOperation), + isNestedOp = PartSet_SketcherMgr::isNestedSketchOperation(anOperation); + if (isSketchOp || isNestedOp) { + // in active sketch operation it is possible to activate operation object in selection + // in the edit operation, e.g. points of the line can be moved when the line is edited + aCanActivate = aCanActivate || anOperation->isEditOperation(); + } + return aCanActivate; +} + +bool PartSet_Module::addViewerMenu(QMenu* theMenu, const QMap& theStdActions) const +{ + return myMenuMgr->addViewerMenu(theMenu, theStdActions); +} -bool PartSet_Module::addViewerItems(QMenu* theMenu, const QMap& theStdActions) const +void PartSet_Module::activeSelectionModes(QIntList& theModes) { - return myMenuMgr->addViewerItems(theMenu, theStdActions); + theModes.clear(); + if (mySketchMgr->activeSketch().get()) + PartSet_SketcherMgr::sketchSelectionModes(theModes); } bool PartSet_Module::isMouseOverWindow() @@ -314,24 +401,6 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) } } } - } else { - // Start editing constraint - if (theOperation->isEditOperation()) { - // TODO: #391 - to be removed - std::string aId = theOperation->id().toStdString(); - if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation) && - PartSet_SketcherMgr::isDistanceOperation(theOperation)) { - // 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; - } - } - } - } } } @@ -429,106 +498,166 @@ void PartSet_Module::onVertexSelected() ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* theParent, Config_WidgetAPI* theWidgetApi, std::string theParentId) { - XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); - XGUI_Workshop* aWorkshop = aConnector->workshop(); + ModuleBase_IWorkshop* aWorkshop = workshop(); + XGUI_ModuleConnector* aConnector = dynamic_cast(aWorkshop); + 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(aWorkshop); connect(aLabelWgt, SIGNAL(planeSelected(const std::shared_ptr&)), mySketchMgr, SLOT(onPlaneSelected(const std::shared_ptr&))); connect(aLabelWgt, SIGNAL(showConstraintToggled(bool)), mySketchMgr, SLOT(onShowConstraintsToggle(bool))); aWgt = aLabelWgt; } else if (theType == "sketch-2dpoint_selector") { - PartSet_WidgetPoint2D* aPointWgt = new PartSet_WidgetPoint2D(theParent, theWidgetApi, theParentId); - aPointWgt->setWorkshop(aWorkshop); + PartSet_WidgetPoint2D* aPointWgt = new PartSet_WidgetPoint2D(theParent, aWorkshop, + theWidgetApi, theParentId); aPointWgt->setSketch(mySketchMgr->activeSketch()); connect(aPointWgt, SIGNAL(vertexSelected()), this, SLOT(onVertexSelected())); aWgt = aPointWgt; - } if (theType == "point2ddistance") { - PartSet_WidgetPoint2dDistance* aDistanceWgt = new PartSet_WidgetPoint2dDistance(theParent, theWidgetApi, theParentId); - aDistanceWgt->setWorkshop(aWorkshop); + } else if (theType == "point2ddistance") { + PartSet_WidgetPoint2dDistance* aDistanceWgt = new PartSet_WidgetPoint2dDistance(theParent, + aWorkshop, theWidgetApi, theParentId); aDistanceWgt->setSketch(mySketchMgr->activeSketch()); aWgt = aDistanceWgt; - } if (theType == "sketch_shape_selector") { + } else if(theType == "point2dangle") { + PartSet_WidgetPoint2dAngle* anAngleWgt = new PartSet_WidgetPoint2dAngle(theParent, + aWorkshop, theWidgetApi, theParentId); + anAngleWgt->setSketch(mySketchMgr->activeSketch()); + aWgt = anAngleWgt; + } else if (theType == "sketch_shape_selector") { PartSet_WidgetShapeSelector* aShapeSelectorWgt = - new PartSet_WidgetShapeSelector(theParent, workshop(), theWidgetApi, theParentId); + new PartSet_WidgetShapeSelector(theParent, aWorkshop, theWidgetApi, theParentId); aShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch()); aWgt = aShapeSelectorWgt; - } if (theType == "sketch_multi_selector") { + } else if (theType == "sketch_multi_selector") { PartSet_WidgetMultiSelector* aShapeSelectorWgt = - new PartSet_WidgetMultiSelector(theParent, workshop(), theWidgetApi, theParentId); + new PartSet_WidgetMultiSelector(theParent, aWorkshop, theWidgetApi, theParentId); aShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch()); aWgt = aShapeSelectorWgt; + } else if (theType == WDG_DOUBLEVALUE_EDITOR) { + aWgt = new PartSet_WidgetEditor(theParent, aWorkshop, theWidgetApi, theParentId); + } else if (theType == "export_file_selector") { + aWgt = new PartSet_WidgetFileSelector(theParent, aWorkshop, theWidgetApi, theParentId); + } else if (theType == "sketch_launcher") { + aWgt = new PartSet_WidgetSketchCreator(theParent, this, theWidgetApi, theParentId); } - if (theType == WDG_DOUBLEVALUE_EDITOR) { - aWgt = new PartSet_WidgetEditor(theParent, workshop(), theWidgetApi, theParentId); - } return aWgt; } bool PartSet_Module::deleteObjects() { + SessionPtr aMgr = ModelAPI_Session::get(); // 1. check whether the delete should be processed in the module ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); bool isSketchOp = PartSet_SketcherMgr::isSketchOperation(anOperation), isNestedOp = PartSet_SketcherMgr::isNestedSketchOperation(anOperation); - if (!isSketchOp && !isNestedOp) - return false; - - // 2. find selected presentations - // selected objects should be collected before the current operation abort because - // the abort leads to selection lost on constraint objects. It can be corrected after #386 issue - XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); - XGUI_Workshop* aWorkshop = aConnector->workshop(); - ModuleBase_ISelection* aSel = workshop()->selection(); - QObjectPtrList aSelectedObj = aSel->selectedPresentations(); - // if there are no selected objects in the viewer, that means that the selection in another - // place cased this method. It is necessary to return the false value to understande in above - // method that delete is not processed - if (aSelectedObj.count() == 0) - return false; - - // avoid delete of the objects, which are not belong to the current sketch - // in order to do not delete results of other sketches - QObjectPtrList aSketchObjects; - QObjectPtrList::const_iterator anIt = aSelectedObj.begin(), aLast = aSelectedObj.end(); - for ( ; anIt != aLast; anIt++) { - ObjectPtr anObject = *anIt; - if (mySketchMgr->isObjectOfSketch(anObject)) - aSketchObjects.append(anObject); - } - // if the selection contains only local selected presentations from other sketches, - // the Delete operation should not be done at all - if (aSketchObjects.size() == 0) - return true; - - // the active nested sketch operation should be aborted unconditionally - if (isNestedOp) - anOperation->abort(); - - // 3. start operation - QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); - SessionPtr aMgr = ModelAPI_Session::get(); - aMgr->startOperation(aDescription.toStdString()); - - // 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); + if (isSketchOp || isNestedOp) { + // 2. find selected presentations + // selected objects should be collected before the current operation abort because + // the abort leads to selection lost on constraint objects. It can be corrected after #386 issue + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + ModuleBase_ISelection* aSel = workshop()->selection(); + QObjectPtrList aSelectedObj = aSel->selectedPresentations(); + // if there are no selected objects in the viewer, that means that the selection in another + // place cased this method. It is necessary to return the false value to understande in above + // method that delete is not processed + if (aSelectedObj.count() == 0) + return false; + + // avoid delete of the objects, which are not belong to the current sketch + // in order to do not delete results of other sketches + QObjectPtrList aSketchObjects; + QObjectPtrList::const_iterator anIt = aSelectedObj.begin(), aLast = aSelectedObj.end(); + for ( ; anIt != aLast; anIt++) { + ObjectPtr anObject = *anIt; + if (mySketchMgr->isObjectOfSketch(anObject)) { + // sketch feature should be used in this list because workshop deletes features only + // results are skipped + FeaturePtr aSketchFeature = ModelAPI_Feature::feature(anObject); + aSketchObjects.append(aSketchFeature); + } + } + // if the selection contains only local selected presentations from other sketches, + // the Delete operation should not be done at all + if (aSketchObjects.size() == 0) + return true; + + // the active nested sketch operation should be aborted unconditionally + if (isNestedOp) + anOperation->abort(); + + // 3. start operation + QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); + aMgr->startOperation(aDescription.toStdString()); + + // 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); - // 5. stop operation - aWorkshop->displayer()->updateViewer(); - aMgr->finishOperation(); - + // 5. stop operation + aWorkshop->displayer()->updateViewer(); + aMgr->finishOperation(); + } else { + bool isPartRemoved = false; + // Delete part with help of PartSet plugin + // TODO: the deleted objects has to be processed by multiselection + QObjectPtrList aObjects = myWorkshop->selection()->selectedObjects(); + if (aObjects.size() == 1) { + ObjectPtr aObj = aObjects.first(); + FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); + if (aFeature.get() && (aFeature->getKind() == PartSetPlugin_Part::ID())) { + // Remove feature should be created in the document of the part results + ResultPtr aPartResult = aFeature->firstResult(); + if (aPartResult.get()) { + std::shared_ptr aPart = + std::dynamic_pointer_cast(aPartResult); + DocumentPtr aPartDoc = aPart->partDoc(); + if (aPartDoc.get()) { + aMgr->startOperation(PartSetPlugin_Remove::ID()); + FeaturePtr aFeature = aPartDoc->addFeature(PartSetPlugin_Remove::ID()); + aFeature->execute(); + aMgr->finishOperation(); + isPartRemoved = true; + } + } + } + } + return isPartRemoved; + } return true; } +void PartSet_Module::onFeatureTriggered() +{ + SessionPtr aMgr = ModelAPI_Session::get(); + // 1. check whether the delete should be processed in the module + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + bool isNestedOp = PartSet_SketcherMgr::isNestedCreateOperation(anOperation); + if (isNestedOp) { + // in case if in the viewer nothing is displayed, the create operation should not be + // comitted even if all values of the feature are initialized + if (!mySketchMgr->canDisplayCurrentCreatedFeature()) { + QAction* aCmd = dynamic_cast(sender()); + //Do nothing on uncheck + if (aCmd->isCheckable() && !aCmd->isChecked()) + return; + + // the action information should be saved before the operation is aborted + // because this abort leads to update command status, which unchecks this action + anOperation->abort(); + + launchOperation(aCmd->data().toString()); + } + } + ModuleBase_IModule::onFeatureTriggered(); +} void PartSet_Module::onObjectDisplayed(ObjectPtr theObject, AISObjectPtr theAIS) { @@ -554,16 +683,36 @@ void PartSet_Module::onViewTransformed(int theTrsfType) return; ModuleBase_IViewer* aViewer = myWorkshop->viewer(); - Handle(V3d_View) aView = aViewer->activeView(); + //Handle(V3d_View) aView = aViewer->activeView(); XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); XGUI_Workshop* aWorkshop = aConnector->workshop(); XGUI_Displayer* aDisplayer = aWorkshop->displayer(); - Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - - double aLen = aView->Convert(15); + Handle(AIS_InteractiveContext) aContext = aViewer->AISContext(); + + Handle(V3d_Viewer) aV3dViewer = aContext->CurrentViewer(); + Handle(V3d_View) aView; + double aScale = 0; + for (aV3dViewer->InitDefinedViews(); + aV3dViewer->MoreDefinedViews(); + aV3dViewer->NextDefinedViews()) { + Handle(V3d_View) aV = aV3dViewer->DefinedView(); + double aS = aV->Scale(); + if (aS > aScale) { + aScale = aS; + aView = aV; + } + } + if (aView.IsNull()) + return; + double aLen = aView->Convert(20); + double aPrevLen = SketcherPrs_Tools::getArrowSize(); SketcherPrs_Tools::setArrowSize(aLen); + const double aPrevScale = aViewer->Scale(aViewer->activeView()); + const double aCurScale = aViewer->activeView()->Camera()->Scale(); + aViewer->SetScale(aViewer->activeView(), aCurScale); + SketcherPrs_Tools::setTextHeight (aCurScale / aPrevScale * SketcherPrs_Tools::getTextHeight()); bool isModified = false; QList aPrsList = aDisplayer->displayedPresentations(); foreach (AISObjectPtr aAIS, aPrsList) { @@ -579,3 +728,158 @@ void PartSet_Module::onViewTransformed(int theTrsfType) if (isModified) aDisplayer->updateViewer(); } + +bool 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; +} + +void PartSet_Module::customizeObjectBrowser(QWidget* theObjectBrowser) +{ + XGUI_ObjectsBrowser* aOB = dynamic_cast(theObjectBrowser); + if (aOB) { + QLineEdit* aLabel = aOB->activeDocLabel(); + QPalette aPalet = aLabel->palette(); + aPalet.setColor(QPalette::Text, QColor(0, 72, 140)); + aLabel->setPalette(aPalet); + aOB->treeView()->setExpandsOnDoubleClick(false); + 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&))); + } +} + + +void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const +{ + QObjectPtrList aObjects = myWorkshop->selection()->selectedObjects(); + int aSelected = aObjects.size(); + SessionPtr aMgr = ModelAPI_Session::get(); + if (aSelected == 1) { + bool hasResult = false; + bool hasFeature = false; + bool hasParameter = false; + ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter); + + ObjectPtr aObject = aObjects.first(); + if (aObject) { + ResultPartPtr aPart = std::dynamic_pointer_cast(aObject); + FeaturePtr aPartFeature = std::dynamic_pointer_cast(aObject); + bool isPart = aPart.get() || + (aPartFeature.get() && (aPartFeature->getKind() == PartSetPlugin_Part::ID())); + if (isPart) { + DocumentPtr aPartDoc; + if (!aPart.get()) { + aPart = std::dynamic_pointer_cast(aPartFeature->firstResult()); + } + if (aPart.get()) // this may be null is Part feature is disabled + aPartDoc = aPart->partDoc(); + if (aMgr->activeDocument() == aPartDoc) + theMenu->addAction(myMenuMgr->action("DEACTIVATE_PART_CMD")); + else + theMenu->addAction(myMenuMgr->action("ACTIVATE_PART_CMD")); + } else if (aObject->document() == aMgr->activeDocument()) { + if (hasParameter || hasFeature) + theMenu->addAction(myMenuMgr->action("EDIT_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")); + } + } else if (aSelected == 0) { + // if there is no selection then it means that upper label is selected + QModelIndexList aIndexes = myWorkshop->selection()->selectedIndexes(); + if (aIndexes.size() == 0) // it means that selection happens in top label outside of tree view + if (aMgr->activeDocument() != aMgr->moduleDocument()) + theMenu->addAction(myMenuMgr->action("ACTIVATE_PARTSET_CMD")); + } + bool aCanDeactivate = (myWorkshop->currentOperation() == 0); + myMenuMgr->action("ACTIVATE_PARTSET_CMD")->setEnabled(aCanDeactivate); + myMenuMgr->action("DEACTIVATE_PART_CMD")->setEnabled(aCanDeactivate); + myMenuMgr->action("ACTIVATE_PART_CMD")->setEnabled(aCanDeactivate); +} + +void PartSet_Module::processEvent(const std::shared_ptr& theMessage) +{ + 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()) + return; + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + XGUI_DataTree* aTreeView = aWorkshop->objectBrowser()->treeView(); + QLineEdit* aLabel = aWorkshop->objectBrowser()->activeDocLabel(); + QPalette aPalet = aLabel->palette(); + + SessionPtr aMgr = ModelAPI_Session::get(); + DocumentPtr aActiveDoc = aMgr->activeDocument(); + DocumentPtr aDoc = aMgr->moduleDocument(); + QModelIndex aOldIndex = myDataModel->activePartTree(); + if (aActiveDoc == aDoc) { + if (aOldIndex.isValid()) + aTreeView->setExpanded(aOldIndex, false); + myDataModel->deactivatePart(); + aPalet.setColor(QPalette::Text, QColor(0, 72, 140)); + } else { + std::string aGrpName = ModelAPI_ResultPart::group(); + for (int i = 0; i < aDoc->size(aGrpName); i++) { + ResultPartPtr aPart = std::dynamic_pointer_cast(aDoc->object(aGrpName, i)); + if (aPart->partDoc() == aActiveDoc) { + QModelIndex aIndex = myDataModel->partIndex(aPart); + if (myDataModel->activatePart(aIndex)) { + if (aOldIndex.isValid()) + aTreeView->setExpanded(aOldIndex, false); + aTreeView->setExpanded(myDataModel->activePartTree(), true); + aPalet.setColor(QPalette::Text, Qt::black); + } + break; + } + } + } + aLabel->setPalette(aPalet); + aWorkshop->updateCommandStatus(); + + // Update displayed objects in order to update active color + XGUI_Displayer* aDisplayer = aWorkshop->displayer(); + QObjectPtrList aObjects = aDisplayer->displayedObjects(); + foreach(ObjectPtr aObj, aObjects) + aDisplayer->redisplay(aObj, false); + aDisplayer->updateViewer(); + } +} + +void PartSet_Module::onTreeViewDoubleClick(const QModelIndex& theIndex) +{ + if (myWorkshop->currentOperation()) // Do not change activation of parts if an operation active + return; + SessionPtr aMgr = ModelAPI_Session::get(); + if (!theIndex.isValid()) { + aMgr->setActiveDocument(aMgr->moduleDocument()); + return; + } + if (theIndex.column() != 0) // Use only first column + return; + ObjectPtr aObj = myDataModel->object(theIndex); + ResultPartPtr aPart = std::dynamic_pointer_cast(aObj); + if (!aPart.get()) { // Probably this is Feature + FeaturePtr aPartFeature = std::dynamic_pointer_cast(aObj); + if (aPartFeature.get() && (aPartFeature->getKind() == PartSetPlugin_Part::ID())) { + aPart = std::dynamic_pointer_cast(aPartFeature->firstResult()); + } + } + if (aPart.get()) { // if this is a part + if (aPart->partDoc() == aMgr->activeDocument()) { + aMgr->setActiveDocument(aMgr->moduleDocument()); + } else { + aPart->activate(); + } + } +}