X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=a38f41b65a24baa598eafd38c2526b9f120fbaae;hb=0eee839530dc4220014d03e30887e9a3c7773e33;hp=7fe2956f1a9d516ff55781c83c23dde2b344fd96;hpb=37bc296c8550959d2da0f6009fe1126b15009e66;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 7fe2956f1..a38f41b65 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -7,7 +7,9 @@ #include #include #include -#include +#include +#include "PartSet_SketcherMgr.h" +#include "PartSet_MenuMgr.h" #include #include @@ -15,17 +17,18 @@ #include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include + #include #include #include #include #include +#include #include #include @@ -36,27 +39,34 @@ #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 @@ -81,9 +91,8 @@ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) : ModuleBase_IModule(theWshop), - myRestartingMode(RM_None) + myRestartingMode(RM_None), myVisualLayerId(0) { - //myWorkshop = dynamic_cast(theWshop); mySketchMgr = new PartSet_SketcherMgr(this); XGUI_ModuleConnector* aConnector = dynamic_cast(theWshop); @@ -97,8 +106,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() @@ -112,14 +123,33 @@ 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_SketchValidator", new PartSet_SketchValidator); + aFactory->registerValidator("PartSet_DifferentShapes", new ModelAPI_ShapeValidator); + + aFactory->registerValidator("GeomValidators_Edge", new GeomValidators_Edge); + aFactory->registerValidator("GeomValidators_EdgeOrVertex", + new GeomValidators_EdgeOrVertex); + aFactory->registerValidator("GeomValidators_Face", new GeomValidators_Face); + + aFactory->registerValidator("GeomValidators_ConstructionComposite", + new GeomValidators_ConstructionComposite); + + aFactory->registerValidator("PartSet_SketchEntityValidator", + new PartSet_SketchEntityValidator); + + aFactory->registerValidator("PartSet_SameTypeAttr", + new PartSet_SameTypeAttrValidator); } void PartSet_Module::registerFilters() @@ -127,17 +157,22 @@ 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() +{ + Config_PropManager::registerProp("Sketch planes", "planes_size", "Size", Config_Prop::Double, + PLANE_SIZE); + Config_PropManager::registerProp("Sketch planes", "planes_thickness", "Thickness", + Config_Prop::Integer, SKETCH_WIDTH); } void PartSet_Module::operationCommitted(ModuleBase_Operation* theOperation) { + if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { + mySketchMgr->commitNestedSketch(theOperation); + } + if (theOperation->isEditOperation()) return; // the selection is cleared after commit the create operation @@ -175,9 +210,15 @@ void PartSet_Module::operationAborted(ModuleBase_Operation* theOperation) void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation) { - if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) { + 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); @@ -185,58 +226,70 @@ void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation) void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation) { - if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) { + 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); } -bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const +ModuleBase_Operation* PartSet_Module::currentOperation() const { - bool aCanDisplay = false; - if (mySketchMgr->activeSketch()) { - FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_OperationMgr* anOpMgr = aConnector->workshop()->operationMgr(); + return anOpMgr->currentOperation(); +} - if (aFeature.get() != NULL) { - if (aFeature == mySketchMgr->activeSketch()) { - aCanDisplay = false; - } - else { - aCanDisplay = mySketchMgr->sketchOperationIdList().contains(aFeature->getKind().c_str()); - } - } - } - else { - aCanDisplay = ModuleBase_IModule::canDisplayObject(theObject); +bool PartSet_Module::canUndo() const +{ + bool aCanUndo = false; + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->hasModuleDocument() && aMgr->canUndo()) { + aCanUndo = !aMgr->isOperation(); + if (!aCanUndo) // check the enable state additionally by sketch manager + aCanUndo = aMgr->canUndo(); } - return aCanDisplay; + return aCanUndo; } -void PartSet_Module::addViewerItems(QMenu* theMenu) const +bool PartSet_Module::canRedo() const { - if (!isSketchOperationActive() && !isSketchFeatureOperationActive()) - 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) - theMenu->addAction(action("DELETE_PARTSET_CMD")); + bool aCanRedo = false; + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->hasModuleDocument() && aMgr->canRedo()) { + aCanRedo = !aMgr->isOperation(); + if (!aCanRedo) // check the enable state additionally by sketch manager + aCanRedo = aMgr->canRedo(); } + return aCanRedo; +} + +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::addViewerItems(QMenu* theMenu, const QMap& theStdActions) const +{ + return myMenuMgr->addViewerItems(theMenu, theStdActions); +} + +bool PartSet_Module::isMouseOverWindow() +{ + return mySketchMgr->isMouseOverWindow(); } void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) { ModuleBase_IPropertyPanel* aPanel = theOperation->propertyPanel(); - if ((theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) && - (theOperation->isEditOperation())) { + if (PartSet_SketcherMgr::isSketchOperation(theOperation) && (theOperation->isEditOperation())) { // we have to manually activate the sketch label in edit mode aPanel->activateWidget(aPanel->modelWidgets().first()); return; @@ -265,20 +318,17 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) if (theOperation->isEditOperation()) { // TODO: #391 - to be removed std::string aId = theOperation->id().toStdString(); - if (PartSet_SketcherMgr::sketchOperationIdList().contains(QString(aId.c_str()))) { - if ((aId == SketchPlugin_ConstraintRadius::ID()) || - (aId == SketchPlugin_ConstraintLength::ID()) || - (aId == SketchPlugin_ConstraintDistance::ID())) { - // 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; - } + 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; } - } + } } } } @@ -295,7 +345,7 @@ void PartSet_Module::onSelectionChanged() // An edit operation is enable only if the current opeation is the sketch operation if (mySketchMgr->activeSketch()) { if (PartSet_Tools::sketchPlane(mySketchMgr->activeSketch())) - isSketcherOp = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()); + isSketcherOp = PartSet_SketcherMgr::isSketchOperation(aOperation); } if (isSketcherOp) { // Editing of constraints can be done on selection @@ -331,24 +381,24 @@ void PartSet_Module::onEnterReleased() void PartSet_Module::onOperationActivatedByPreselection() { - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - if(aOperation && isSketchFeatureOperationActive()) { + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + if(anOperation && PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) { // Set final definitions if they are necessary //propertyPanelDefined(aOperation); /// Commit sketcher operations automatically - aOperation->commit(); + anOperation->commit(); } } void PartSet_Module::onNoMoreWidgets() { - if (isSketchFeatureOperationActive()) { - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - if (aOperation) { + ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); + if (anOperation) { + if (PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) { if (myRestartingMode != RM_Forbided) myRestartingMode = RM_LastFeatureUsed; - aOperation->commit(); + anOperation->commit(); } } } @@ -359,208 +409,152 @@ 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_ModelWidget* aWgt = NULL; if (theType == "sketch-start-label") { - PartSet_WidgetSketchLabel* aWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, theParentId); - aWgt->setWorkshop(aWorkshop); - connect(aWgt, SIGNAL(planeSelected(const std::shared_ptr&)), + 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&))); - theModelWidgets.append(aWgt); - return aWgt->getControl(); - + connect(aLabelWgt, SIGNAL(showConstraintToggled(bool)), + mySketchMgr, SLOT(onShowConstraintsToggle(bool))); + aWgt = aLabelWgt; } else if (theType == "sketch-2dpoint_selector") { - PartSet_WidgetPoint2D* aWgt = new PartSet_WidgetPoint2D(theParent, theWidgetApi, theParentId); - aWgt->setWorkshop(aWorkshop); - aWgt->setSketch(mySketchMgr->activeSketch()); - - connect(aWgt, SIGNAL(vertexSelected()), this, SLOT(onVertexSelected())); - - theModelWidgets.append(aWgt); - return aWgt->getControl(); - + PartSet_WidgetPoint2D* aPointWgt = new PartSet_WidgetPoint2D(theParent, theWidgetApi, theParentId); + aPointWgt->setWorkshop(aWorkshop); + aPointWgt->setSketch(mySketchMgr->activeSketch()); + connect(aPointWgt, SIGNAL(vertexSelected()), this, SLOT(onVertexSelected())); + aWgt = aPointWgt; } if (theType == "point2ddistance") { - PartSet_WidgetPoint2dDistance* aWgt = new PartSet_WidgetPoint2dDistance(theParent, theWidgetApi, theParentId); - aWgt->setWorkshop(aWorkshop); - aWgt->setSketch(mySketchMgr->activeSketch()); - - theModelWidgets.append(aWgt); - return aWgt->getControl(); - + PartSet_WidgetPoint2dDistance* aDistanceWgt = new PartSet_WidgetPoint2dDistance(theParent, theWidgetApi, theParentId); + aDistanceWgt->setWorkshop(aWorkshop); + aDistanceWgt->setSketch(mySketchMgr->activeSketch()); + aWgt = aDistanceWgt; } if (theType == "sketch_shape_selector") { - PartSet_WidgetShapeSelector* aWgt = + PartSet_WidgetShapeSelector* aShapeSelectorWgt = new PartSet_WidgetShapeSelector(theParent, workshop(), theWidgetApi, theParentId); - aWgt->setSketcher(mySketchMgr->activeSketch()); - - theModelWidgets.append(aWgt); - return aWgt->getControl(); - - } if (theType == "sketch_constraint_shape_selector") { - PartSet_WidgetConstraintShapeSelector* aWgt = - new PartSet_WidgetConstraintShapeSelector(theParent, workshop(), theWidgetApi, theParentId); - aWgt->setSketcher(mySketchMgr->activeSketch()); - - theModelWidgets.append(aWgt); - return aWgt->getControl(); - - } else - return 0; + aShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch()); + aWgt = aShapeSelectorWgt; + } if (theType == WDG_DOUBLEVALUE_EDITOR) { + aWgt = new PartSet_WidgetEditor(theParent, workshop(), theWidgetApi, theParentId); + } + return aWgt; } -bool PartSet_Module::isSketchOperationActive() const -{ - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - - bool isSketchOp = aOperation && aOperation->id().toStdString() == SketchPlugin_Sketch::ID(); - return isSketchOp; -} -bool PartSet_Module::isSketchFeatureOperationActive() const +bool PartSet_Module::deleteObjects() { - bool isCurrentSketchOp = false; - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - if (aOperation) { - FeaturePtr aFeature = aOperation->feature(); - std::shared_ptr aSPFeature = - std::dynamic_pointer_cast(aFeature); - isCurrentSketchOp = aSPFeature.get() != NULL; - } - return isCurrentSketchOp; -} + // 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; + + // 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()); -void PartSet_Module::createActions() -{ - QAction* aAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this); - addAction("DELETE_PARTSET_CMD", aAction); -} + // 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(aSelectedObj, anIgnoredFeatures); + + // 5. stop operation + aWorkshop->displayer()->updateViewer(); + aMgr->finishOperation(); -QAction* PartSet_Module::action(const QString& theId) const -{ - if (myActions.contains(theId)) - return myActions[theId]; - return 0; + return true; } -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) +void PartSet_Module::onObjectDisplayed(ObjectPtr theObject, AISObjectPtr theAIS) { - QAction* aAction = static_cast(sender()); - QString anId = aAction->data().toString(); - - if (anId == "DELETE_PARTSET_CMD") { - deleteObjects(); + 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); + } } } -void PartSet_Module::deleteObjects() +void PartSet_Module::onViewTransformed(int theTrsfType) { - bool isSketchOp = isSketchOperationActive(); - if (!isSketchOp && !isSketchFeatureOperationActive()) + // 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; - XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); - XGUI_Workshop* aWorkshop = aConnector->workshop(); + ModuleBase_IViewer* aViewer = myWorkshop->viewer(); + Handle(V3d_View) aView = aViewer->activeView(); - XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); - if (!isSketchOp && anOpMgr->canStopOperation()) { - ModuleBase_Operation* aCurrentOp = anOpMgr->currentOperation(); - if (aCurrentOp) { - aCurrentOp->abort(); - } - } - // sketch feature should be skipped, only sub-features can be removed - // when sketch operation is active - CompositeFeaturePtr aSketch = mySketchMgr->activeSketch(); - - ModuleBase_ISelection* aSel = aConnector->selection(); - QObjectPtrList aSelectedObj = aSel->selectedPresentations(); - - 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_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + XGUI_Displayer* aDisplayer = aWorkshop->displayer(); + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); - 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(", "); - - 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; - } - } + double aLen = aView->Convert(15); - SessionPtr aMgr = ModelAPI_Session::get(); - aMgr->startOperation("DeletePartSet"); - 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); - } + SketcherPrs_Tools::setArrowSize(aLen); + bool isModified = false; + QList aPrsList = aDisplayer->displayedPresentations(); + foreach (AISObjectPtr aAIS, aPrsList) { + Handle(AIS_InteractiveObject) aAisObj = aAIS->impl(); - 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); + Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast(aAisObj); + if (!aDim.IsNull()) { + aDim->DimensionAspect()->ArrowAspect()->SetLength(aLen); + aContext->Redisplay(aDim, false); + isModified = true; } - //} } - aWorkshop->displayer()->updateViewer(); - //myDisplayer->updateViewer(); - aMgr->finishOperation(); + if (isModified) + aDisplayer->updateViewer(); }