X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=67f1bcf7a857a65ddb98e52e1014dca3bf21bc97;hb=f39b615e10f48ab13b8346c1e0b4c64500d44f51;hp=39520d8af82f766a3ffe29a98001cbc0a0d531ca;hpb=fb1766a3fb7d2b3e6862e040d528d96a5732f200;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 39520d8af..67f1bcf7a --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -1,33 +1,58 @@ // 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 "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 -#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 @@ -40,27 +65,37 @@ #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 @@ -69,10 +104,13 @@ #include #include #include +#include #include #include +#include + #ifdef _DEBUG #include #endif @@ -84,11 +122,15 @@ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* } PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) - : ModuleBase_IModule(theWshop), - myRestartingMode(RM_None) + : ModuleBase_IModule(theWshop), + myRestartingMode(RM_None), myVisualLayerId(0), myHasConstraintShown(true) { - //myWorkshop = dynamic_cast(theWshop); + new PartSet_IconFactory(); + mySketchMgr = new PartSet_SketcherMgr(this); +#ifdef ModuleDataModel + myDataModel = new PartSet_DocumentDataModel(this); +#endif XGUI_ModuleConnector* aConnector = dynamic_cast(theWshop); XGUI_Workshop* aWorkshop = aConnector->workshop(); @@ -101,14 +143,50 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) ModuleBase_IViewer* aViewer = theWshop->viewer(); connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)), 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 = new PartSet_CustomPrs(theWshop); - createActions(); + 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(); + } + delete myCustomPrs; +} + +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() @@ -116,15 +194,42 @@ void PartSet_Module::registerValidators() //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_DistanceSelection", new PartSet_DistanceSelection); + aFactory->registerValidator("PartSet_LengthSelection", new PartSet_LengthSelection); + aFactory->registerValidator("PartSet_PerpendicularSelection", new PartSet_PerpendicularSelection); + aFactory->registerValidator("PartSet_ParallelSelection", new PartSet_ParallelSelection); + aFactory->registerValidator("PartSet_RadiusSelection", new PartSet_RadiusSelection); + aFactory->registerValidator("PartSet_RigidSelection", new PartSet_RigidSelection); + aFactory->registerValidator("PartSet_CoincidentSelection", new PartSet_CoincidentSelection); + 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_SketchValidator", new PartSet_SketchValidator); + aFactory->registerValidator("PartSet_CoincidentAttr", new PartSet_CoincidentAttr); + + aFactory->registerValidator("GeomValidators_DifferentShapes", new GeomValidators_DifferentShapes); + aFactory->registerValidator("GeomValidators_ShapeType", new GeomValidators_ShapeType); + aFactory->registerValidator("GeomValidators_Face", new GeomValidators_Face); + aFactory->registerValidator("GeomValidators_Finite", new GeomValidators_Finite); + + 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); + + aFactory->registerValidator("GeomValidators_Different", + new GeomValidators_Different); + + aFactory->registerValidator("GeomValidators_PartitionArguments", + new GeomValidators_PartitionArguments); } void PartSet_Module::registerFilters() @@ -132,13 +237,6 @@ void PartSet_Module::registerFilters() //Registering of selection filters XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); ModuleBase_FilterFactory* aFactory = aConnector->selectionFilters(); - - 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)); } void PartSet_Module::registerProperties() @@ -149,31 +247,32 @@ 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); } - if (theOperation->isEditOperation()) + ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + if (!aFOperation || aFOperation->isEditOperation()) return; // 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(); + FeaturePtr aFeature = aFOperation->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); + myLastOperationId = aFOperation->id(); + myLastFeature = myRestartingMode == RM_LastFeatureUsed ? aFOperation->feature() : FeaturePtr(); + if (!sketchMgr()->sketchSolverError()) + launchOperation(myLastOperationId); } breakOperationSequence(); } @@ -185,12 +284,12 @@ 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) { if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->startSketch(theOperation); @@ -199,20 +298,44 @@ void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation) mySketchMgr->startNestedSketch(theOperation); } - if (myDocumentShapeFilter.IsNull()) - myDocumentShapeFilter = new PartSet_GlobalFilter(myWorkshop); - myWorkshop->viewer()->addSelectionFilter(myDocumentShapeFilter); + ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + if (aFOperation) + myCustomPrs->activate(aFOperation->feature(), true); } -void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation) +void PartSet_Module::onOperationResumed(ModuleBase_Operation* theOperation) { + ModuleBase_IModule::onOperationResumed(theOperation); + + ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + if (aFOperation) + myCustomPrs->activate(aFOperation->feature(), true); +} + +void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) +{ + bool isModified = myCustomPrs->deactivate(false); + if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { mySketchMgr->stopSketch(theOperation); } else if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { mySketchMgr->stopNestedSketch(theOperation); } - myWorkshop->viewer()->removeSelectionFilter(myDocumentShapeFilter); + + if (isModified) { + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); + aDisplayer->updateViewer(); + } + mySketchMgr->onShowConstraintsToggle(myHasConstraintShown); +} + +ModuleBase_Operation* PartSet_Module::currentOperation() const +{ + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_OperationMgr* anOpMgr = aConnector->workshop()->operationMgr(); + return anOpMgr->currentOperation(); } bool PartSet_Module::canUndo() const @@ -239,88 +362,128 @@ bool PartSet_Module::canRedo() const return aCanRedo; } -bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const +bool PartSet_Module::canApplyAction(const ObjectPtr& theObject, const QString& theActionId) const { - bool aCanDisplay = false; - if (!mySketchMgr->canDisplayObject()) - return aCanDisplay; - CompositeFeaturePtr aSketchFeature = mySketchMgr->activeSketch(); - if (aSketchFeature.get() != NULL) { + bool aValid = true; + if (theActionId == "DELETE_CMD" || theActionId == "MOVE_CMD") { FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); - - // 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; - } - } + if (aFeature) { + // part features are removed in the PartSet module only. + if (aFeature->getKind() == PartSetPlugin_Part::ID()) + aValid = false; } } - else { - aCanDisplay = ModuleBase_IModule::canDisplayObject(theObject); - } - return aCanDisplay; + return aValid; +} + +bool PartSet_Module::canCommitOperation() const +{ + return mySketchMgr->canCommitOperation(); +} + +bool PartSet_Module::canEraseObject(const ObjectPtr& theObject) const +{ + // the sketch manager put the restriction to the objects erase + return mySketchMgr->canEraseObject(theObject); } -void PartSet_Module::addViewerItems(QMenu* theMenu) const +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(); - if (!PartSet_SketcherMgr::isSketchOperation(anOperation) && - !PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) - return; + 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 + ModuleBase_OperationFeature* aFOperation = dynamic_cast(anOperation); + aCanActivate = aCanActivate || (aFOperation && aFOperation->isEditOperation()); + } + return aCanActivate; +} - ModuleBase_ISelection* aSelection = myWorkshop->selection(); - QObjectPtrList aObjects = aSelection->selectedPresentations(); - if (aObjects.size() > 0) { - bool hasFeature = false; - foreach(ObjectPtr aObject, aObjects) - { - FeaturePtr aFeature = ModelAPI_Feature::feature(aObject); - if (aFeature.get() != NULL) { - hasFeature = true; - } - } - if (hasFeature) { - XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); - XGUI_Workshop* aWorkshop = aConnector->workshop(); - QAction* anAction = aWorkshop->contextMenuMgr()->action("DELETE_CMD"); - theMenu->addAction(anAction); +bool PartSet_Module::addViewerMenu(QMenu* theMenu, const QMap& theStdActions) const +{ + return myMenuMgr->addViewerMenu(theMenu, theStdActions); +} + +void PartSet_Module::updateViewerMenu(const QMap& theStdActions) +{ + myMenuMgr->updateViewerMenu(theStdActions); +} + +QString PartSet_Module::getFeatureError(const FeaturePtr& theFeature) +{ + QString anError = ModuleBase_IModule::getFeatureError(theFeature); + + if (anError.isEmpty()) + anError = sketchMgr()->getFeatureError(theFeature); + + if (anError.isEmpty()) { + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_OperationMgr* anOpMgr = aConnector->workshop()->operationMgr(); + + if (anOpMgr->isValidationLocked()) { + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (anOpMgr->currentOperation()); + if (!aFOperation || theFeature == aFOperation->feature()) + anError = "Validation is locked by the current operation"; } } - bool isConstruction; - if (mySketchMgr->canChangeConstruction(isConstruction)) { - QAction* anAction = action("CONSTRUCTION_CMD"); - theMenu->addAction(anAction); - anAction->setChecked(isConstruction); - } + return anError; +} + +void PartSet_Module::activeSelectionModes(QIntList& theModes) +{ + theModes.clear(); + if (mySketchMgr->activeSketch().get()) + PartSet_SketcherMgr::sketchSelectionModes(theModes); +} + +bool PartSet_Module::isMouseOverWindow() +{ + return mySketchMgr->isMouseOverWindow(); +} + +void PartSet_Module::closeDocument() +{ + clearViewer(); +} + +void PartSet_Module::clearViewer() +{ + myCustomPrs->clearPrs(); + + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + XGUI_Displayer* aDisplayer = aWorkshop->displayer(); + aDisplayer->deactivateSelectionFilters(); } void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) { - ModuleBase_IPropertyPanel* aPanel = theOperation->propertyPanel(); - if (PartSet_SketcherMgr::isSketchOperation(theOperation) && (theOperation->isEditOperation())) { + ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + if (!aFOperation) + return; + + ModuleBase_IPropertyPanel* aPanel = aFOperation->propertyPanel(); + if (PartSet_SketcherMgr::isSketchOperation(aFOperation) && (aFOperation->isEditOperation())) { // we have to manually activate the sketch label in edit mode aPanel->activateWidget(aPanel->modelWidgets().first()); return; } // Restart last operation type - if ((theOperation->id() == myLastOperationId) && myLastFeature) { + if ((aFOperation->id() == myLastOperationId) && myLastFeature) { ModuleBase_ModelWidget* aWgt = aPanel->activeWidget(); - if (theOperation->id().toStdString() == SketchPlugin_Line::ID()) { + if (aFOperation->id().toStdString() == SketchPlugin_Line::ID()) { // Initialise new line with first point equal to end of previous PartSet_WidgetPoint2D* aPnt2dWgt = dynamic_cast(aWgt); if (aPnt2dWgt) { @@ -329,30 +492,12 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) 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(), + PartSet_Tools::setConstraints(mySketchMgr->activeSketch(), aFOperation->feature(), aWgt->attributeID(), aPoint->x(), aPoint->y()); aPanel->activateNextWidget(aPnt2dWgt); } } } - } 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; - } - } - } - } } } @@ -381,7 +526,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); } } @@ -416,11 +562,16 @@ void PartSet_Module::onOperationActivatedByPreselection() void PartSet_Module::onNoMoreWidgets() { ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); - if (PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) { - if (anOperation) { + if (anOperation) { + if (PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) { if (myRestartingMode != RM_Forbided) myRestartingMode = RM_LastFeatureUsed; - anOperation->commit(); + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); + // do nothing if the feature can not be applyed + if (anOpMgr->isApplyEnabled()) + anOperation->commit(); } } } @@ -431,195 +582,536 @@ void PartSet_Module::onVertexSelected() 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(); + ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget(); const QList& aWidgets = aPanel->modelWidgets(); - if (aWidgets.last() == aPanel->activeWidget()) { - myRestartingMode = RM_Forbided; + QList::const_iterator anIt = aWidgets.begin(), aLast = aWidgets.end(); + bool aFoundWidget = false; + bool aFoundObligatory = false; + for (; anIt != aLast && !aFoundObligatory; anIt++) { + if (!aFoundWidget) + aFoundWidget = *anIt == anActiveWidget; + else + aFoundObligatory = (*anIt)->isObligatory(); } + if (!aFoundObligatory) + myRestartingMode = RM_Forbided; } } -QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* theParent, - Config_WidgetAPI* theWidgetApi, std::string theParentId, - QList& theModelWidgets) +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, theWidgetApi, theParentId); - aLabelWgt->setWorkshop(aWorkshop); + PartSet_WidgetSketchLabel* aLabelWgt = new PartSet_WidgetSketchLabel(theParent, aWorkshop, + theWidgetApi, theParentId, mySketchMgr->isConstraintsShown()); 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; + } else if (theType == "sketch_multi_selector") { + PartSet_WidgetMultiSelector* aShapeSelectorWgt = + new PartSet_WidgetMultiSelector(theParent, aWorkshop, theWidgetApi, theParentId); aShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch()); aWgt = aShapeSelectorWgt; - } if (theType == "sketch_constraint_shape_selector") { - PartSet_WidgetConstraintShapeSelector* aConstraintShapeSelectorWgt = - new PartSet_WidgetConstraintShapeSelector(theParent, workshop(), theWidgetApi, theParentId); - aConstraintShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch()); - aWgt = aConstraintShapeSelectorWgt; - } - if(aWgt) - theModelWidgets.append(aWgt); + } 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); + } return aWgt; } -void PartSet_Module::createActions() + +bool PartSet_Module::deleteObjects() { - QAction* anAction; + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); - anAction = new QAction(tr("Construction"), this); - anAction->setCheckable(true); - addAction("CONSTRUCTION_CMD", anAction); + //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) { + // 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 + 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; + + // 3. start operation + QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); + ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction(aDescription, this); + + // the active nested sketch operation should be aborted unconditionally + // the Delete action should be additionally granted for the Sketch operation + // in order to do not abort/commit it + if (!anOpMgr->canStartOperation(anOpAction->id(), isSketchOp/*granted*/)) + return true; // the objects are processed but can not be deleted + + anOpMgr->startOperation(anOpAction); + + // 4. delete features + // sketch feature should be skipped, only sub-features can be removed + // when sketch operation is active + aWorkshop->deleteFeatures(aSketchObjects); + // 5. stop operation + anOpMgr->commitOperation(); + } + 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()) { + ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction + (PartSetPlugin_Remove::ID().c_str(), this); + if (!anOpMgr->canStartOperation(anOpAction->id())) + return true; // the objects are processed but can not be deleted + + anOpMgr->startOperation(anOpAction); + + FeaturePtr aFeature = aPartDoc->addFeature(PartSetPlugin_Remove::ID()); + aFeature->execute(); + + anOpMgr->commitOperation(); + isPartRemoved = true; + } + } + } + } + return isPartRemoved; + } + return true; } -QAction* PartSet_Module::action(const QString& theId) const +void PartSet_Module::onFeatureTriggered() { - if (myActions.contains(theId)) - return myActions[theId]; - return 0; + QAction* aCmd = dynamic_cast(sender()); + if (aCmd->isCheckable() && aCmd->isChecked()) { + // 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()) { + // 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::addAction(const QString& theId, QAction* theAction) +void PartSet_Module::launchOperation(const QString& theCmdId) { - if (myActions.contains(theId)) - qCritical("A command with Id = '%s' already defined!", qPrintable(theId)); - theAction->setData(theId); - connect(theAction, SIGNAL(triggered(bool)), this, SLOT(onAction(bool))); - myActions[theId] = theAction; + if (PartSet_SketcherMgr::constraintsIdList().contains(theCmdId)) { + // Show constraints if a constraint was anOperation + myHasConstraintShown = mySketchMgr->isConstraintsShown(); + mySketchMgr->onShowConstraintsToggle(true); + } + ModuleBase_IModule::launchOperation(theCmdId); } -void PartSet_Module::onAction(bool isChecked) -{ - QAction* aAction = static_cast(sender()); - QString anId = aAction->data().toString(); - if (anId == "CONSTRUCTION_CMD") { - mySketchMgr->setConstruction(isChecked); +void PartSet_Module::onObjectDisplayed(ObjectPtr theObject, AISObjectPtr theAIS) +{ + Handle(AIS_InteractiveObject) anAIS = theAIS->impl(); + if (!anAIS.IsNull()) { + Handle(AIS_InteractiveContext) aCtx = anAIS->GetContext(); + Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast(anAIS); + if (!aDim.IsNull()) { + aCtx->SetZLayer(aDim, myVisualLayerId); + } else { + Handle(SketcherPrs_SymbolPrs) aCons = Handle(SketcherPrs_SymbolPrs)::DownCast(anAIS); + if (!aCons.IsNull()) + aCtx->SetZLayer(aCons, myVisualLayerId); + } } } -bool PartSet_Module::deleteObjects() +void PartSet_Module::onBeforeObjectErase(ObjectPtr theObject, AISObjectPtr theAIS) { - ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); - bool isSketchOp = PartSet_SketcherMgr::isSketchOperation(anOperation), - isNestedOp = PartSet_SketcherMgr::isNestedSketchOperation(anOperation); - if (!isSketchOp && !isNestedOp) - return false; + // this is obsolete + // it should be recomputed in order to disappear in the viewer if the corresponded object + // is erased + //if (myCustomPrs->isActive()) + // myCustomPrs->redisplay(theObject, false); +} - // sketch feature should be skipped, only sub-features can be removed - // when sketch operation is active - CompositeFeaturePtr aSketch = mySketchMgr->activeSketch(); +void PartSet_Module::onViewTransformed(int theTrsfType) +{ + // Set length of arrows constant in pixel size + // if the operation is panning or rotate or panglobal then do nothing + if ((theTrsfType == 1) || (theTrsfType == 3) || (theTrsfType == 4)) + return; + ModuleBase_IViewer* aViewer = myWorkshop->viewer(); + Handle(AIS_InteractiveContext) aContext = aViewer->AISContext(); + if (aContext.IsNull()) + return; - // 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()); + //Handle(V3d_View) aView = aViewer->activeView(); + + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); XGUI_Workshop* aWorkshop = aConnector->workshop(); - ModuleBase_ISelection* aSel = aConnector->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; - - if (isNestedOp) - anOperation->abort(); - - // the active nested sketch operation should be aborted unconditionally - if (PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) - anOperation->abort(); - - std::set aRefFeatures; - foreach (ObjectPtr aObj, aSelectedObj) - { - //ResultPartPtr aPart = std::dynamic_pointer_cast(aObj); - //if (aPart) { - // TODO: check for what there is this condition. It is placed here historicaly because - // ther is this condition during remove features. - //} else { - FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); - if (aFeature.get() != NULL) { - aObj->document()->refsToFeature(aFeature, aRefFeatures, false); + XGUI_Displayer* aDisplayer = aWorkshop->displayer(); + 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; } - //} - } - - QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); - /** - // according to #355 feature, it is not necessary to inform about dependencies during - // sketch delete operation - // - if (!aRefFeatures.empty()) { - QStringList aRefNames; - std::set::const_iterator anIt = aRefFeatures.begin(), - aLast = aRefFeatures.end(); - for (; anIt != aLast; anIt++) { - FeaturePtr aFeature = (*anIt); - if (aFeature == aSketch) - continue; - aRefNames.append((*anIt)->name().c_str()); + } + 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) { + Handle(AIS_InteractiveObject) aAisObj = aAIS->impl(); + + Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast(aAisObj); + if (!aDim.IsNull()) { + aDim->DimensionAspect()->ArrowAspect()->SetLength(aLen); + aContext->Redisplay(aDim, false); + isModified = true; } - if (!aRefNames.empty()) { - QString aNames = aRefNames.join(", "); - aDescription += aNames.prepend(" "); - - QMainWindow* aDesktop = aWorkshop->desktop(); - QMessageBox::StandardButton aRes = QMessageBox::warning( - aDesktop, tr("Delete features"), - QString(tr("Selected features are used in the following features: %1.\ - These features will be deleted also. Would you like to continue?")).arg(aNames), - QMessageBox::No | QMessageBox::Yes, QMessageBox::No); - if (aRes != QMessageBox::Yes) - return; + } + if (isModified) + aDisplayer->updateViewer(); +} + +bool PartSet_Module::customizeObject(ObjectPtr theObject, const bool theUpdateViewer) +{ + bool isRedisplayed = false; + if (myCustomPrs->isActive()) + isRedisplayed = myCustomPrs->redisplay(theObject, theUpdateViewer); + + return isRedisplayed; +} + +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&))); +#ifdef ModuleDataModel + 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 +{ + QObjectPtrList aObjects = myWorkshop->selection()->selectedObjects(); + int aSelected = aObjects.size(); + SessionPtr aMgr = ModelAPI_Session::get(); + QAction* aActivatePartAction = myMenuMgr->action("ACTIVATE_PART_CMD"); + QAction* aActivatePartSetAction = myMenuMgr->action("ACTIVATE_PARTSET_CMD"); + if (aSelected == 1) { + bool hasResult = false; + bool hasFeature = false; + bool hasParameter = false; + bool hasSubFeature = false; + ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter, hasSubFeature); + + 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(); + + theMenu->addAction(aActivatePartAction); + aActivatePartAction->setEnabled((aMgr->activeDocument() != aPartDoc)); + + } else if (aObject->document() == aMgr->activeDocument()) { + 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) + theMenu->addAction(aActivatePartSetAction); + aActivatePartSetAction->setEnabled((aMgr->activeDocument() != aMgr->moduleDocument())); } - }*/ + } 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 + theMenu->addAction(aActivatePartSetAction); + aActivatePartSetAction->setEnabled((aMgr->activeDocument() != aMgr->moduleDocument())); + } + bool aNotDeactivate = (myWorkshop->currentOperation() == 0); + if (!aNotDeactivate) { + aActivatePartAction->setEnabled(false); + aActivatePartSetAction->setEnabled(false); + } +} + +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 + 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(); + XGUI_DataTree* aTreeView = aWorkshop->objectBrowser()->treeView(); + QLineEdit* aLabel = aWorkshop->objectBrowser()->activeDocLabel(); + QPalette aPalet = aLabel->palette(); + + SessionPtr aMgr = ModelAPI_Session::get(); + DocumentPtr aActiveDoc = aMgr->activeDocument(); +#ifdef ModuleDataModel + QModelIndex aOldIndex = myDataModel->activePartTree(); + DocumentPtr aDoc = aMgr->moduleDocument(); + 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; + } + } + } +#else + 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(); + + // Update displayed objects in order to update active color + XGUI_Displayer* aDisplayer = aWorkshop->displayer(); + QObjectPtrList aObjects = aDisplayer->displayedObjects(); + bool aHidden; + foreach(ObjectPtr aObj, aObjects) { + //TODO: replace by redisplay event. + aHidden = !aObj->data() || !aObj->data()->isValid() || + aObj->isDisabled() || (!aObj->isDisplayed()); + if (!aHidden) + 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(); - aMgr->startOperation(aDescription.toStdString()); - std::set::const_iterator anIt = aRefFeatures.begin(), - aLast = aRefFeatures.end(); - for (; anIt != aLast; anIt++) { - FeaturePtr aRefFeature = (*anIt); - if (aRefFeature == aSketch) - continue; - aRefFeature->document()->removeFeature(aRefFeature); - } - - foreach (ObjectPtr aObj, aSelectedObj) - { - DocumentPtr aDoc = aObj->document(); - //ResultPartPtr aPart = std::dynamic_pointer_cast(aObj); - //if (aPart) { - // if (aDoc == aMgr->activeDocument()) { - // aDoc->close(); - // } - //} else { - //FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); - FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); - if (aFeature.get() != NULL) { - aDoc->removeFeature(aFeature); + if (!theIndex.isValid()) { + aMgr->setActiveDocument(aMgr->moduleDocument()); + return; + } + if (theIndex.column() != 0) // Use only first column + return; +#ifdef ModuleDataModel + ObjectPtr aObj = myDataModel->object(theIndex); +#else + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + XGUI_DataModel* aDataModel = aWorkshop->objectBrowser()->dataModel(); + // De not use non editable Indexes + if ((aDataModel->flags(theIndex) & Qt::ItemIsSelectable) == 0) + return; + ObjectPtr aObj = aDataModel->object(theIndex); +#endif + + 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()) { + myMenuMgr->activatePartSet(); + } else { + aPart->activate(); } - //} } - aWorkshop->displayer()->updateViewer(); - //myDisplayer->updateViewer(); - aMgr->finishOperation(); +} - return true; + +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(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (aContext.IsNull()) + return; + + Handle(V3d_Viewer) aViewer = aContext->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); + } + // if there is an active operation with validated widget, + // the filters of this widget should be activated in the created view + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (aOperation) { + ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget(); + if (anActiveWidget) { + ModuleBase_WidgetValidated* aWidgetValidated = dynamic_cast + (anActiveWidget); + if (aWidgetValidated) + aWidgetValidated->activateFilters(true); + } + } }