X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=09b8ef5d58c71373cb2e8b60fdbcd7e0b8e8c851;hb=9d1e3115a33fa4e36bfb193f110b31c5bc198068;hp=da5860f6ccebf198f1d2f87093f708acd1160416;hpb=7b40e745dd80b0af027783d1d064ba84f44e97bb;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index da5860f6c..09b8ef5d5 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -7,8 +7,10 @@ #include #include #include -#include -#include +#include +#include +#include "PartSet_SketcherMgr.h" +#include "PartSet_MenuMgr.h" #include #include @@ -16,17 +18,11 @@ #include #include #include -#include -#include -#include -#include -#include #include #include #include #include -#include #include #include @@ -50,17 +46,21 @@ #include #include #include -//#include -//#include +#include +#include +#include #include #include #include #include #include -//#include + +#include +#include #include #include +#include #include #include @@ -94,7 +94,6 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) : ModuleBase_IModule(theWshop), myRestartingMode(RM_None), myVisualLayerId(0) { - //myWorkshop = dynamic_cast(theWshop); mySketchMgr = new PartSet_SketcherMgr(this); XGUI_ModuleConnector* aConnector = dynamic_cast(theWshop); @@ -108,8 +107,10 @@ 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))); - createActions(); + myMenuMgr = new PartSet_MenuMgr(this); } PartSet_Module::~PartSet_Module() @@ -123,12 +124,17 @@ 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_DifferentObjects", new PartSet_DifferentObjectsValidator); aFactory->registerValidator("PartSet_DifferentShapes", new ModelAPI_ShapeValidator); @@ -152,15 +158,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)); - //Handle(SelectMgr_Filter) aSelectFilter = new PartSet_FilterSketchEntity(workshop()); - //aFactory->registerFilter("SketchEntityFilter", new ModuleBase_FilterCustom(aSelectFilter)); } void PartSet_Module::registerProperties() @@ -275,47 +272,19 @@ bool PartSet_Module::canRedo() const bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const { - // the display should be possible almost always, with exception of some specific cases + // the sketch manager put the restriction to the objects display + return mySketchMgr->canDisplayObject(theObject); +} - bool aCanDisplay = true; - if (mySketchMgr->activeSketch()) { - aCanDisplay = mySketchMgr->canDisplayObject(theObject); - } - return aCanDisplay; +bool PartSet_Module::addViewerItems(QMenu* theMenu, const QMap& theStdActions) const +{ + return myMenuMgr->addViewerItems(theMenu, theStdActions); } -void PartSet_Module::addViewerItems(QMenu* theMenu) const +bool PartSet_Module::isMouseOverWindow() { - ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); - if (!PartSet_SketcherMgr::isSketchOperation(anOperation) && - !PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) - return; - - 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 isAuxiliary; - if (mySketchMgr->canSetAuxiliary(isAuxiliary)) { - QAction* anAction = action("AUXILIARY_CMD"); - theMenu->addAction(anAction); - anAction->setChecked(isAuxiliary); - } + return mySketchMgr->isMouseOverWindow(); } void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) @@ -464,10 +433,13 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th XGUI_Workshop* aWorkshop = aConnector->workshop(); ModuleBase_ModelWidget* aWgt = NULL; if (theType == "sketch-start-label") { - PartSet_WidgetSketchLabel* aLabelWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, theParentId); + PartSet_WidgetSketchLabel* aLabelWgt = new PartSet_WidgetSketchLabel(theParent, + 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); @@ -485,153 +457,73 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th new PartSet_WidgetShapeSelector(theParent, workshop(), 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 (theType == "sketch_multi_selector") { + PartSet_WidgetMultiSelector* aShapeSelectorWgt = + new PartSet_WidgetMultiSelector(theParent, workshop(), theWidgetApi, theParentId); + aShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch()); + aWgt = aShapeSelectorWgt; } + if (theType == WDG_DOUBLEVALUE_EDITOR) { + aWgt = new PartSet_WidgetEditor(theParent, workshop(), theWidgetApi, theParentId); + } return aWgt; } -void PartSet_Module::createActions() -{ - QAction* anAction; - - anAction = new QAction(tr("Auxiliary"), this); - anAction->setCheckable(true); - addAction("AUXILIARY_CMD", anAction); -} - -QAction* PartSet_Module::action(const QString& theId) const -{ - if (myActions.contains(theId)) - return myActions[theId]; - return 0; -} - -void PartSet_Module::addAction(const QString& theId, QAction* theAction) -{ - 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; -} - -void PartSet_Module::onAction(bool isChecked) -{ - QAction* aAction = static_cast(sender()); - QString anId = aAction->data().toString(); - - if (anId == "AUXILIARY_CMD") { - mySketchMgr->setAuxiliary(isChecked); - } -} bool PartSet_Module::deleteObjects() { + // 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; - // sketch feature should be skipped, only sub-features can be removed - // when sketch operation is active - CompositeFeaturePtr aSketch = mySketchMgr->activeSketch(); - + // 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 = aConnector->selection(); + 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(); - 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); - } - //} - } - + // 3. start operation 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 (!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; - } - }*/ - 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); - } - //} - } + // 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(); - //myDisplayer->updateViewer(); aMgr->finishOperation(); return true; @@ -642,11 +534,48 @@ 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()) { - Handle(AIS_InteractiveContext) aCtx = anAIS->GetContext(); aCtx->SetZLayer(aDim, myVisualLayerId); + } else { + Handle(SketcherPrs_SymbolPrs) aCons = Handle(SketcherPrs_SymbolPrs)::DownCast(anAIS); + if (!aCons.IsNull()) + aCtx->SetZLayer(aCons, myVisualLayerId); } } } +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(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); + + SketcherPrs_Tools::setArrowSize(aLen); + 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 (isModified) + aDisplayer->updateViewer(); +}