X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=e1e18df38ca4d451e369bf84579e76e4278d637e;hb=7e85caf42f4f1b8f04444afc76a039036f27de9f;hp=e5b587fe658a315d9a11bdbf708b145eadd90315;hpb=c11c3bbeb38d103a882fc24c0f2cb933b20d4053;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index e5b587fe6..e1e18df38 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -1,53 +1,58 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + #include "PartSet_Module.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 -#include #include #include #include -#include +#include #include -#include -#include -#include +#include +//#include +//#include #include #include #include #include #include -#include +//#include #include +#include #include #include @@ -60,6 +65,8 @@ #include #include #include +#include +#include #include #include @@ -68,7 +75,6 @@ #include #endif - /*!Create and return new instance of XGUI_Module*/ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop) { @@ -77,27 +83,30 @@ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) : ModuleBase_IModule(theWshop), - myIsDragging(false), myRestartingMode(true), myDragDone(false) + myRestartingMode(RM_None) { //myWorkshop = dynamic_cast(theWshop); - ModuleBase_IViewer* aViewer = aViewer = theWshop->viewer(); - connect(aViewer, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)), - this, SLOT(onMousePressed(ModuleBase_IViewWindow*, QMouseEvent*))); + mySketchMgr = new PartSet_SketcherMgr(this); - connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)), - this, SLOT(onMouseReleased(ModuleBase_IViewWindow*, QMouseEvent*))); + XGUI_ModuleConnector* aConnector = dynamic_cast(theWshop); + XGUI_Workshop* aWorkshop = aConnector->workshop(); - connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), - this, SLOT(onMouseMoved(ModuleBase_IViewWindow*, QMouseEvent*))); + XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); + connect(anOpMgr, SIGNAL(keyEnterReleased()), this, SLOT(onEnterReleased())); + connect(anOpMgr, SIGNAL(operationActivatedByPreselection()), + this, SLOT(onOperationActivatedByPreselection())); + ModuleBase_IViewer* aViewer = theWshop->viewer(); + connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)), + this, SLOT(onKeyRelease(ModuleBase_IViewWindow*, QKeyEvent*))); + + createActions(); } PartSet_Module::~PartSet_Module() { if (!myDocumentShapeFilter.IsNull()) myDocumentShapeFilter.Nullify(); - if (!myPlaneFilter.IsNull()) - myPlaneFilter.Nullify(); } void PartSet_Module::registerValidators() @@ -110,124 +119,163 @@ void PartSet_Module::registerValidators() 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_DifferentObjects", new PartSet_DifferentObjectsValidator); + aFactory->registerValidator("PartSet_DifferentShapes", new ModelAPI_ShapeValidator); + aFactory->registerValidator("PartSet_SketchValidator", new PartSet_SketchValidator); +} + +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::onOperationComitted(ModuleBase_Operation* theOperation) +void PartSet_Module::operationCommitted(ModuleBase_Operation* theOperation) { if (theOperation->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(); + /// Restart sketcher operations automatically FeaturePtr aFeature = theOperation->feature(); std::shared_ptr aSPFeature = std::dynamic_pointer_cast(aFeature); - if (aSPFeature && myRestartingMode) { + if (aSPFeature && (myRestartingMode == RM_LastFeatureUsed || + myRestartingMode == RM_EmptyFeatureUsed)) { myLastOperationId = theOperation->id(); - myLastFeature = theOperation->feature(); + myLastFeature = myRestartingMode == RM_LastFeatureUsed ? theOperation->feature() : FeaturePtr(); + launchOperation(myLastOperationId); - } else { - breakOperationSequence(); } + breakOperationSequence(); } void PartSet_Module::breakOperationSequence() { myLastOperationId = ""; myLastFeature = FeaturePtr(); - myRestartingMode = false; - + myRestartingMode = RM_None; } -void PartSet_Module::onOperationAborted(ModuleBase_Operation* theOperation) +void PartSet_Module::operationAborted(ModuleBase_Operation* theOperation) { breakOperationSequence(); } -void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) +void PartSet_Module::operationStarted(ModuleBase_Operation* theOperation) { - myRestartingMode = true; - if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) { - // Display all sketcher sub-Objects - myCurrentSketch = std::dynamic_pointer_cast(theOperation->feature()); - XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); - XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); - - for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) { - FeaturePtr aFeature = myCurrentSketch->subFeature(i); - std::list aResults = aFeature->results(); - std::list::const_iterator aIt; - for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { - aDisplayer->display((*aIt), false); - } - aDisplayer->display(aFeature); - } - // Hide sketcher result - std::list aResults = myCurrentSketch->results(); - std::list::const_iterator aIt; - for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { - aDisplayer->erase((*aIt), false); - } - aDisplayer->erase(myCurrentSketch); - - - if (myPlaneFilter.IsNull()) - myPlaneFilter = new ModuleBase_ShapeInPlaneFilter(); - myWorkshop->viewer()->addSelectionFilter(myPlaneFilter); - if (theOperation->isEditOperation()) { - // If it is editing of sketch then it means that plane is already defined - std::shared_ptr aPln = PartSet_Tools::sketchPlane(myCurrentSketch); - myPlaneFilter->setPlane(aPln->impl()); - } + if (PartSet_SketcherMgr::isSketchOperation(theOperation)) { + mySketchMgr->startSketch(theOperation); + } + else if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { + mySketchMgr->startNestedSketch(theOperation); } + if (myDocumentShapeFilter.IsNull()) - myDocumentShapeFilter = new ModuleBase_ShapeDocumentFilter(myWorkshop); + myDocumentShapeFilter = new PartSet_GlobalFilter(myWorkshop); myWorkshop->viewer()->addSelectionFilter(myDocumentShapeFilter); } -void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) +void PartSet_Module::operationStopped(ModuleBase_Operation* theOperation) { - if (theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) { - DataPtr aData = myCurrentSketch->data(); - if ((!aData) || (!aData->isValid())) { - // The sketch was aborted - myCurrentSketch = CompositeFeaturePtr(); - return; - } - // Hide all sketcher sub-Objects - XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); - XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); - for (int i = 0; i < myCurrentSketch->numberOfSubs(); i++) { - FeaturePtr aFeature = myCurrentSketch->subFeature(i); - std::list aResults = aFeature->results(); - std::list::const_iterator aIt; - for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { - aDisplayer->erase((*aIt), false); - } - aDisplayer->erase(aFeature, false); - } - // Display sketcher result - std::list aResults = myCurrentSketch->results(); - std::list::const_iterator aIt; - for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { - aDisplayer->display((*aIt), false); - } - aDisplayer->display(myCurrentSketch); - - myCurrentSketch = CompositeFeaturePtr(); - myWorkshop->viewer()->removeSelectionFilter(myPlaneFilter); + if (PartSet_SketcherMgr::isSketchOperation(theOperation) || + PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { + mySketchMgr->stopSketch(theOperation); + } + else if (PartSet_SketcherMgr::isNestedSketchOperation(theOperation)) { + mySketchMgr->stopNestedSketch(theOperation); } myWorkshop->viewer()->removeSelectionFilter(myDocumentShapeFilter); } -void PartSet_Module::onPlaneSelected(const std::shared_ptr& thePln) +bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const { - myPlaneFilter->setPlane(thePln->impl()); + bool aCanDisplay = false; + if (!mySketchMgr->canDisplayObject(theObject)) + return aCanDisplay; + CompositeFeaturePtr aSketchFeature = mySketchMgr->activeSketch(); + if (aSketchFeature.get() != NULL) { + 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; + } + } + } + } + else { + aCanDisplay = ModuleBase_IModule::canDisplayObject(theObject); + } + return aCanDisplay; } +void PartSet_Module::addViewerItems(QMenu* theMenu) const +{ + if (!PartSet_SketcherMgr::isSketchOperation(myWorkshop->currentOperation()) && + !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")); + } +} void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) { ModuleBase_IPropertyPanel* aPanel = theOperation->propertyPanel(); + if (PartSet_SketcherMgr::isSketchOperation(theOperation) && (theOperation->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) { ModuleBase_ModelWidget* aWgt = aPanel->activeWidget(); @@ -240,30 +288,28 @@ 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(myCurrentSketch, theOperation->feature(), + PartSet_Tools::setConstraints(mySketchMgr->activeSketch(), theOperation->feature(), aWgt->attributeID(), aPoint->x(), aPoint->y()); - theOperation->propertyPanel()->activateNextWidget(aPnt2dWgt); + aPanel->activateNextWidget(aPnt2dWgt); } } } } else { // Start editing constraint if (theOperation->isEditOperation()) { + // TODO: #391 - to be removed std::string aId = theOperation->id().toStdString(); - if (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; } - } + } } } } @@ -272,206 +318,73 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) void PartSet_Module::onSelectionChanged() { - // Editing of constraints can be done on selection - ModuleBase_ISelection* aSelect = myWorkshop->selection(); - QList aSelected = aSelect->getSelected(); - if (aSelected.size() == 1) { - ModuleBase_ViewerPrs aPrs = aSelected.first(); - ObjectPtr aObject = aPrs.object(); - FeaturePtr aFeature = ModelAPI_Feature::feature(aObject); - if (aFeature) { - std::string aId = aFeature->getKind(); - if ((aId == SketchPlugin_ConstraintRadius::ID()) || - (aId == SketchPlugin_ConstraintLength::ID()) || - (aId == SketchPlugin_ConstraintDistance::ID())) { - editFeature(aFeature); - } - } - } -} - -void PartSet_Module::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) -{ - if (!(theEvent->buttons() & Qt::LeftButton)) - return; ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - // Use only for sketch operations - if (aOperation && myCurrentSketch) { - if (!PartSet_Tools::sketchPlane(myCurrentSketch)) - return; - - bool isSketcher = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()); - bool isSketchOpe = sketchOperationIdList().contains(aOperation->id()); - - // Avoid non-sketch operations - if ((!isSketchOpe) && (!isSketcher)) - return; - - bool isEditing = aOperation->isEditOperation(); - - // Ignore creation sketch operation - if ((!isSketcher) && (!isEditing)) - return; + if (!aOperation) + return; - // Remember highlighted objects for editing + bool isSketcherOp = false; + // An edit operation is enable only if the current opeation is the sketch operation + if (mySketchMgr->activeSketch()) { + if (PartSet_Tools::sketchPlane(mySketchMgr->activeSketch())) + isSketcherOp = PartSet_SketcherMgr::isSketchOperation(aOperation); + } + if (isSketcherOp) { + // Editing of constraints can be done on selection ModuleBase_ISelection* aSelect = myWorkshop->selection(); - QList aObjects = aSelect->getHighlighted(); - myEditingFeatures.clear(); - myEditingAttr.clear(); - if (aObjects.size() > 0) { - foreach(ModuleBase_ViewerPrs aPrs, aObjects) { - FeaturePtr aFeature = ModelAPI_Feature::feature(aObjects.first().object()); - if (aFeature) { - myEditingFeatures.append(aFeature); - TopoDS_Shape aShape = aPrs.shape(); - if (!aShape.IsNull()) { - if (aShape.ShapeType() == TopAbs_VERTEX) { - AttributePtr aAttr = PartSet_Tools::findAttributeBy2dPoint(myEditingFeatures.first(), - aShape, myCurrentSketch); - if (aAttr) - myEditingAttr.append(aAttr); - } - } + QList aSelected = aSelect->getSelected(); + if (aSelected.size() == 1) { + ModuleBase_ViewerPrs aPrs = aSelected.first(); + ObjectPtr aObject = aPrs.object(); + FeaturePtr aFeature = ModelAPI_Feature::feature(aObject); + if (aFeature) { + std::string aId = aFeature->getKind(); + if ((aId == SketchPlugin_ConstraintRadius::ID()) || + (aId == SketchPlugin_ConstraintLength::ID()) || + (aId == SketchPlugin_ConstraintDistance::ID())) { + editFeature(aFeature); } } - } - // If nothing highlighted - return - if (myEditingFeatures.size() == 0) - return; - - if (isSketcher) { - myIsDragging = true; - get2dPoint(theWnd, theEvent, myCurX, myCurY); - myDragDone = false; - myWorkshop->viewer()->enableSelection(false); - - launchEditing(); - - } else if (isSketchOpe && isEditing) { - // If selected another object - aOperation->abort(); - - myIsDragging = true; - get2dPoint(theWnd, theEvent, myCurX, myCurY); - myDragDone = false; - myWorkshop->viewer()->enableSelection(false); - - // This is necessary in order to finalize previous operation - QApplication::processEvents(); - launchEditing(); } - } + } } - -void PartSet_Module::get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent, - double& theX, double& theY) +void PartSet_Module::onKeyRelease(ModuleBase_IViewWindow* theWnd, QKeyEvent* theEvent) { - Handle(V3d_View) aView = theWnd->v3dView(); - gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView); - PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, theX, theY); + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_OperationMgr* anOpMgr = aConnector->workshop()->operationMgr(); + anOpMgr->onKeyReleased(theEvent); } - -void PartSet_Module::launchEditing() +void PartSet_Module::onEnterReleased() { - if (myEditingFeatures.size() == 1) { - FeaturePtr aFeature = myEditingFeatures.first(); - std::shared_ptr aSPFeature = - std::dynamic_pointer_cast(aFeature); - if (aSPFeature) { - editFeature(aSPFeature); - } - } + myRestartingMode = RM_EmptyFeatureUsed; } -/// Returns new instance of operation object (used in createOperation for customization) -ModuleBase_Operation* PartSet_Module::getNewOperation(const std::string& theFeatureId) +void PartSet_Module::onOperationActivatedByPreselection() { - if (theFeatureId == PartSet_OperationSketch::Type()) { - return new PartSet_OperationSketch(theFeatureId.c_str(), this); - } - return ModuleBase_IModule::getNewOperation(theFeatureId); -} - + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if(aOperation && isSketchFeatureOperationActive()) { + // Set final definitions if they are necessary + //propertyPanelDefined(aOperation); -void PartSet_Module::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) -{ - myWorkshop->viewer()->enableSelection(true); - if (myIsDragging) { - myIsDragging = false; - if (myDragDone) - myWorkshop->currentOperation()->commit(); + /// Commit sketcher operations automatically + aOperation->commit(); } } - -void PartSet_Module::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) +void PartSet_Module::onNoMoreWidgets() { - if (myIsDragging) { + if (isSketchFeatureOperationActive()) { ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - if (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()) - return; // No edit operation activated - - static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED); - Handle(V3d_View) aView = theWnd->v3dView(); - gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), aView); - double aX, aY; - PartSet_Tools::convertTo2D(aPoint, myCurrentSketch, aView, aX, aY); - double dX = aX - myCurX; - double dY = aY - myCurY; - - if ((aOperation->id().toStdString() == SketchPlugin_Line::ID()) && - (myEditingAttr.size() > 0) && - myEditingAttr.first()) { - // probably we have prehighlighted point - AttributePtr aAttr = myEditingAttr.first(); - std::string aAttrId = aAttr->id(); - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); - QList aWidgets = aPanel->modelWidgets(); - // Find corresponded widget to provide dragging - foreach (ModuleBase_ModelWidget* aWgt, aWidgets) { - if (aWgt->attributeID() == aAttrId) { - PartSet_WidgetPoint2D* aWgt2d = dynamic_cast(aWgt); - if (aWgt2d) { - aWgt2d->setPoint(aWgt2d->x() + dX, aWgt2d->y() + dY); - break; - } - } - } - } else { - std::shared_ptr aSketchFeature = - std::dynamic_pointer_cast(aOperation->feature()); - if (aSketchFeature) { - aSketchFeature->move(dX, dY); - ModelAPI_EventCreator::get()->sendUpdated(aSketchFeature, anEvent); - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); - } + if (aOperation) { + if (myRestartingMode != RM_Forbided) + myRestartingMode = RM_LastFeatureUsed; + aOperation->commit(); } - myDragDone = true; - myCurX = aX; - myCurY = aY; } } - -QStringList PartSet_Module::sketchOperationIdList() const -{ - QStringList aIds; - aIds << SketchPlugin_Line::ID().c_str(); - aIds << SketchPlugin_Point::ID().c_str(); - aIds << SketchPlugin_Arc::ID().c_str(); - aIds << SketchPlugin_Circle::ID().c_str(); - aIds << SketchPlugin_ConstraintLength::ID().c_str(); - aIds << SketchPlugin_ConstraintDistance::ID().c_str(); - aIds << SketchPlugin_ConstraintRigid::ID().c_str(); - aIds << SketchPlugin_ConstraintRadius::ID().c_str(); - aIds << SketchPlugin_ConstraintPerpendicular::ID().c_str(); - aIds << SketchPlugin_ConstraintParallel::ID().c_str(); - return aIds; -} - -void PartSet_Module::onVertexSelected(ObjectPtr theObject, const TopoDS_Shape& theShape) +void PartSet_Module::onVertexSelected() { ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); if (aOperation->id().toStdString() == SketchPlugin_Line::ID()) { @@ -479,7 +392,7 @@ void PartSet_Module::onVertexSelected(ObjectPtr theObject, const TopoDS_Shape& t ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); const QList& aWidgets = aPanel->modelWidgets(); if (aWidgets.last() == aPanel->activeWidget()) { - breakOperationSequence(); + myRestartingMode = RM_Forbided; } } } @@ -494,17 +407,16 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* PartSet_WidgetSketchLabel* aWgt = new PartSet_WidgetSketchLabel(theParent, theWidgetApi, theParentId); aWgt->setWorkshop(aWorkshop); connect(aWgt, SIGNAL(planeSelected(const std::shared_ptr&)), - this, SLOT(onPlaneSelected(const std::shared_ptr&))); + mySketchMgr, SLOT(onPlaneSelected(const std::shared_ptr&))); theModelWidgets.append(aWgt); return aWgt->getControl(); } else if (theType == "sketch-2dpoint_selector") { PartSet_WidgetPoint2D* aWgt = new PartSet_WidgetPoint2D(theParent, theWidgetApi, theParentId); aWgt->setWorkshop(aWorkshop); - aWgt->setSketch(myCurrentSketch); + aWgt->setSketch(mySketchMgr->activeSketch()); - connect(aWgt, SIGNAL(vertexSelected(ObjectPtr, const TopoDS_Shape&)), - this, SLOT(onVertexSelected(ObjectPtr, const TopoDS_Shape&))); + connect(aWgt, SIGNAL(vertexSelected()), this, SLOT(onVertexSelected())); theModelWidgets.append(aWgt); return aWgt->getControl(); @@ -512,7 +424,7 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* } if (theType == "point2ddistance") { PartSet_WidgetPoint2dDistance* aWgt = new PartSet_WidgetPoint2dDistance(theParent, theWidgetApi, theParentId); aWgt->setWorkshop(aWorkshop); - aWgt->setSketch(myCurrentSketch); + aWgt->setSketch(mySketchMgr->activeSketch()); theModelWidgets.append(aWgt); return aWgt->getControl(); @@ -520,7 +432,7 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* } if (theType == "sketch_shape_selector") { PartSet_WidgetShapeSelector* aWgt = new PartSet_WidgetShapeSelector(theParent, workshop(), theWidgetApi, theParentId); - aWgt->setSketcher(myCurrentSketch); + aWgt->setSketcher(mySketchMgr->activeSketch()); theModelWidgets.append(aWgt); return aWgt->getControl(); @@ -528,11 +440,150 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* } if (theType == "sketch_constraint_shape_selector") { PartSet_WidgetConstraintShapeSelector* aWgt = new PartSet_WidgetConstraintShapeSelector(theParent, workshop(), theWidgetApi, theParentId); - aWgt->setSketcher(myCurrentSketch); + aWgt->setSketcher(mySketchMgr->activeSketch()); theModelWidgets.append(aWgt); return aWgt->getControl(); - }else + } else return 0; } + +bool PartSet_Module::isSketchFeatureOperationActive() const +{ + 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; +} + +void PartSet_Module::createActions() +{ + QAction* aAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this); + addAction("DELETE_PARTSET_CMD", aAction); +} + +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 == "DELETE_PARTSET_CMD") { + deleteObjects(); + } +} + +void PartSet_Module::deleteObjects() +{ + bool isSketchOp = PartSet_SketcherMgr::isSketchOperation(myWorkshop->currentOperation()); + if (!isSketchOp && !isSketchFeatureOperationActive()) + return; + + XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); + XGUI_Workshop* aWorkshop = aConnector->workshop(); + + 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); + } + //} + } + + 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; + } + } + + 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); + } + + 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); + } + //} + } + aWorkshop->displayer()->updateViewer(); + //myDisplayer->updateViewer(); + aMgr->finishOperation(); +}