X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=2b92c351a5ec2fdf8a88d31fd0c77168050d70cb;hb=6f84fd29d85b783864cdbb3ac9fdd6a3ad3cbb7c;hp=f811715c6488407ec82cb1853e272ea6a2f9771d;hpb=74af198032ad400be876ee4d5dc955a18f7d2f18;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index f811715c6..2b92c351a 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -1,76 +1,70 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + #include "PartSet_Module.h" -//#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 +#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 -//#include - -//#include -//#include -//#include -//#include +#include +#include #include +#include +#include +#include +#include #include #include #include #include +#include #include #include @@ -79,7 +73,6 @@ #include #endif - /*!Create and return new instance of XGUI_Module*/ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop) { @@ -88,36 +81,28 @@ 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*))); - - connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)), - this, SLOT(onMouseReleased(ModuleBase_IViewWindow*, QMouseEvent*))); + mySketchMgr = new PartSet_SketcherMgr(this); - connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), - this, SLOT(onMouseMoved(ModuleBase_IViewWindow*, QMouseEvent*))); - - //myListener = new PartSet_Listener(this); - -// connect(myWorkshop, SIGNAL(operationStarted(ModuleBase_Operation*)), -// this, SLOT(onOperationStarted(ModuleBase_Operation*))); - -// connect(myWorkshop, SIGNAL(operationStopped(ModuleBase_Operation*)), this, -// SLOT(onOperationStopped(ModuleBase_Operation*))); + XGUI_ModuleConnector* aConnector = dynamic_cast(theWshop); + XGUI_Workshop* aWorkshop = aConnector->workshop(); - //XGUI_Workshop* aXWshop = xWorkshop(); - //XGUI_ContextMenuMgr* aContextMenuMgr = aXWshop->contextMenuMgr(); - //connect(aContextMenuMgr, SIGNAL(actionTriggered(const QString&, bool)), this, - // SLOT(onContextMenuCommand(const QString&, bool))); + 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*))); } PartSet_Module::~PartSet_Module() { + if (!myDocumentShapeFilter.IsNull()) + myDocumentShapeFilter.Nullify(); } void PartSet_Module::registerValidators() @@ -130,102 +115,138 @@ 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); + mySketchMgr->startSketch(theOperation); } + if (myDocumentShapeFilter.IsNull()) + 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()) { - // 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); + mySketchMgr->stopSketch(theOperation); + } + myWorkshop->viewer()->removeSelectionFilter(myDocumentShapeFilter); +} + +bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const +{ + bool aCanDisplay = false; + 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; + } } - 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(); } + else { + aCanDisplay = ModuleBase_IModule::canDisplayObject(theObject); + } + return aCanDisplay; } - - void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) { + ModuleBase_IPropertyPanel* aPanel = theOperation->propertyPanel(); + if ((theOperation->id().toStdString() == SketchPlugin_Sketch::ID()) && + (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 = theOperation->propertyPanel()->activeWidget(); + ModuleBase_ModelWidget* aWgt = aPanel->activeWidget(); if (theOperation->id().toStdString() == SketchPlugin_Line::ID()) { + // Initialise new line with first point equal to end of previous PartSet_WidgetPoint2D* aPnt2dWgt = dynamic_cast(aWgt); if (aPnt2dWgt) { std::shared_ptr aData = myLastFeature->data(); @@ -233,192 +254,116 @@ 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(), - SketchPlugin_Line::START_ID(), aPoint->x(), aPoint->y()); - theOperation->propertyPanel()->activateNextWidget(aPnt2dWgt); + PartSet_Tools::setConstraints(mySketchMgr->activeSketch(), theOperation->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::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; + } + } + } + } + } } } void PartSet_Module::onSelectionChanged() { - // Activate edit operation for sketcher objects - //ModuleBase_ISelection* aSelect = myWorkshop->selection(); - //QObjectPtrList aObjects = aSelect->selectedPresentations(); - //if (aObjects.size() == 1) { - // FeaturePtr aFeature = ModelAPI_Feature::feature(aObjects.first()); - // if (aFeature) { - // std::shared_ptr aSPFeature = - // std::dynamic_pointer_cast(aFeature); - // if (aSPFeature) { - // editFeature(aSPFeature); - // } - // } - //} -} - -//ModuleBase_Operation* PartSet_Module::getNewOperation(const std::string& theFeatureId) -//{ -// ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); -// if (aOperation) { -// // If the current operation is sketcher sub-operation then we have to create -// // Costomized operation -// if (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()) { -// PartSet_Operation* aPSOp = new PartSet_Operation(theFeatureId.c_str(), this); -// aPSOp->setWorkshop(myWorkshop); -// connect(myWorkshop, SIGNAL(selectionChanged()), aPSOp, SLOT(onSelectionChanged())); -// return aPSOp; -// } -// } -// return ModuleBase_IModule::getNewOperation(theFeatureId); -//} - - -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 = (aOperation->id().toStdString() == SketchPlugin_Sketch::ID()); + } + if (isSketcherOp) { + // Editing of constraints can be done on selection ModuleBase_ISelection* aSelect = myWorkshop->selection(); - QList aObjects = aSelect->getHighlighted(); - myEditingFeatures.clear(); - if (aObjects.size() > 0) { - foreach(ModuleBase_ViewerPrs aPrs, aObjects) { - FeaturePtr aFeature = ModelAPI_Feature::feature(aObjects.first().object()); - if (aFeature) - myEditingFeatures.append(aFeature); + 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) { - CompositeFeaturePtr aSketch = - std::dynamic_pointer_cast(aOperation->feature()); - if (!PartSet_Tools::sketchPlane(aSketch)) - return; - - //myCurrentSketch = aOperation->feature(); - myIsDragging = true; - get2dPoint(theWnd, theEvent, myCurX, myCurY); - myDragDone = false; - myWorkshop->viewer()->enableSelection(false); - - launchEditing(); - - } else if (isSketchOpe && isEditing) { - aOperation->abort(); - - //myCurrentSketch = aOperation->parentFeature(); - myIsDragging = true; - get2dPoint(theWnd, theEvent, myCurX, myCurY); - myDragDone = false; - myWorkshop->viewer()->enableSelection(false); - - QTimer::singleShot(10, this, SLOT(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; } -void PartSet_Module::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) +void PartSet_Module::onOperationActivatedByPreselection() { - if (myIsDragging) { - myIsDragging = false; - myWorkshop->viewer()->enableSelection(true); - if (myDragDone) - myWorkshop->currentOperation()->commit(); - } -} + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (!aOperation) + return; + // Set final definitions if they are necessary + //propertyPanelDefined(aOperation); -void PartSet_Module::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) -{ - if (myIsDragging) { - 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 = myCurX - aX; - double dY = myCurY - aY; - - ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); - QList aWidgets = aPanel->modelWidgets(); - foreach(ModuleBase_ModelWidget* aWgt, aWidgets) { - PartSet_WidgetPoint2D* aWgt2d = dynamic_cast(aWgt); - if (aWgt2d) { - aWgt2d->setPoint(aWgt2d->x() - dX, aWgt2d->y() - dY); - } - } - myDragDone = true; - myCurX = aX; - myCurY = aY; + /// Commit sketcher operations automatically + FeaturePtr aFeature = aOperation->feature(); + std::shared_ptr aSPFeature = + std::dynamic_pointer_cast(aFeature); + if (aSPFeature) { + aOperation->commit(); } } - -QStringList PartSet_Module::sketchOperationIdList() const +void PartSet_Module::onNoMoreWidgets() { - 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; + ModuleBase_Operation* aOperation = myWorkshop->currentOperation(); + if (aOperation) { + /// Restart sketcher operations automatically + FeaturePtr aFeature = aOperation->feature(); + std::shared_ptr aSPFeature = + std::dynamic_pointer_cast(aFeature); + if (aSPFeature) { + if (myRestartingMode != RM_Forbided) + myRestartingMode = RM_LastFeatureUsed; + aOperation->commit(); + } + } } -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()) { @@ -426,438 +371,11 @@ 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(); - PartSet_WidgetPoint2D* aPnt2dWgt = dynamic_cast(aPanel->activeWidget()); - PartSet_Tools::setConstraints(myCurrentSketch, aOperation->feature(), - SketchPlugin_Line::END_ID(), aPnt2dWgt->x(), aPnt2dWgt->y()); + myRestartingMode = RM_Forbided; } } } - -//void PartSet_Module::featureCreated(QAction* theFeature) -//{ -// connect(theFeature, SIGNAL(triggered(bool)), this, SLOT(onFeatureTriggered())); -//} - -//std::string PartSet_Module::featureFile(const std::string& theFeatureId) -//{ -// return myFeaturesInFiles[theFeatureId]; -//} - -/* - * - */ -//void PartSet_Module::onFeatureTriggered() -//{ -// QAction* aCmd = dynamic_cast(sender()); -// //Do nothing on uncheck -// if (aCmd->isCheckable() && !aCmd->isChecked()) -// return; -// launchOperation(aCmd->data().toString()); -//} - - -//void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) -//{ -// XGUI_Workshop* aXWshp = xWorkshop(); -// XGUI_Displayer* aDisplayer = aXWshp->displayer(); -// PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(theOperation); -// if (aPreviewOp) { -// XGUI_PropertyPanel* aPropPanel = aXWshp->propertyPanel(); -// connect(aPropPanel, SIGNAL(storedPoint2D(ObjectPtr, const std::string&)), this, -// SLOT(onStorePoint2D(ObjectPtr, const std::string&)), Qt::UniqueConnection); -// -// //aDisplayer->deactivateObjectsOutOfContext(); -// PartSet_OperationSketch* aSketchOp = dynamic_cast(aPreviewOp); -// if (aSketchOp) { -// if (aSketchOp->isEditOperation()) { -// setSketchingMode(getSketchPlane(aSketchOp->feature())); -// } else { -// aDisplayer->openLocalContext(); -// aDisplayer->activateObjectsOutOfContext(QIntList()); -// myPlaneFilter = new StdSelect_FaceFilter(StdSelect_Plane); -// aDisplayer->addSelectionFilter(myPlaneFilter); -// QIntList aModes = sketchSelectionModes(aPreviewOp->feature()); -// aDisplayer->setSelectionModes(aModes); -// } -// } -// } -//} - -//void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) -//{ -// if (!theOperation) -// return; -// XGUI_Workshop* aXWshp = xWorkshop(); -// XGUI_Displayer* aDisplayer = aXWshp->displayer(); -// PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(theOperation); -// if (aPreviewOp) { -// XGUI_PropertyPanel* aPropPanel = aXWshp->propertyPanel(); -// -// PartSet_OperationSketch* aSketchOp = dynamic_cast(aPreviewOp); -// if (aSketchOp) { -// aDisplayer->closeLocalContexts(); -// } else { -// PartSet_OperationFeatureCreate* aCreationOp = -// dynamic_cast(aPreviewOp); -// if (aCreationOp) { -// // Activate just created object for selection -// FeaturePtr aFeature = aCreationOp->feature(); -// QIntList aModes = sketchSelectionModes(aFeature); -// const std::list& aResults = aFeature->results(); -// std::list::const_iterator anIt, aLast = aResults.end(); -// for (anIt = aResults.begin(); anIt != aLast; anIt++) { -// aDisplayer->activate(*anIt, aModes); -// } -// aDisplayer->activate(aFeature, aModes); -// aDisplayer->clearSelected(); -// } -// } -// }// else { -// // Activate results of current feature for selection -// //FeaturePtr aFeature = theOperation->feature(); -// //XGUI_Displayer* aDisplayer = aXWshp->displayer(); -// //std::list aResults = aFeature->results(); -// //std::list::const_iterator aIt; -// //for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { -// // aDisplayer->activate(*aIt); -// //} -// //} -//} - -//void PartSet_Module::onContextMenuCommand(const QString& theId, bool isChecked) -//{ -// QList aFeatures = workshop()->selection()->selectedObjects(); -// if (theId == "EDIT_CMD" && (aFeatures.size() > 0)) { -// FeaturePtr aFeature = std::dynamic_pointer_cast(aFeatures.first()); -// if (aFeature) -// editFeature(aFeature); -// } -//} - -//void PartSet_Module::onMousePressed(QMouseEvent* theEvent) -//{ -// XGUI_Workshop* aXWshp = xWorkshop(); -// PartSet_OperationSketchBase* aPreviewOp = -// dynamic_cast(workshop()->currentOperation()); -// if (aPreviewOp) { -// ModuleBase_ISelection* aSelection = workshop()->selection(); -// aPreviewOp->mousePressed(theEvent, myWorkshop->viewer(), aSelection); -// } -//} - -//void PartSet_Module::onMouseReleased(QMouseEvent* theEvent) -//{ -// PartSet_OperationSketchBase* aPreviewOp = -// dynamic_cast(myWorkshop->currentOperation()); -// if (aPreviewOp) { -// ModuleBase_ISelection* aSelection = workshop()->selection(); -// // Initialise operation with preliminary selection -// aPreviewOp->mouseReleased(theEvent, myWorkshop->viewer(), aSelection); -// } -//} - -//void PartSet_Module::onMouseMoved(QMouseEvent* theEvent) -//{ -// PartSet_OperationSketchBase* aPreviewOp = -// dynamic_cast(myWorkshop->currentOperation()); -// if (aPreviewOp) -// aPreviewOp->mouseMoved(theEvent, myWorkshop->viewer()); -//} - -//void PartSet_Module::onKeyRelease(QKeyEvent* theEvent) -//{ -// ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); -// PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); -// if (aPreviewOp) { -// aPreviewOp->keyReleased(theEvent->key()); -// } -//} - -//void PartSet_Module::onMouseDoubleClick(QMouseEvent* theEvent) -//{ -// PartSet_OperationSketchBase* aPreviewOp = -// dynamic_cast(myWorkshop->currentOperation()); -// Handle(V3d_View) aView = myWorkshop->viewer()->activeView(); -// if (aPreviewOp && (!aView.IsNull())) { -// ModuleBase_ISelection* aSelection = workshop()->selection(); -// // Initialise operation with preliminary selection -// aPreviewOp->mouseDoubleClick(theEvent, aView, aSelection); -// } -//} - -//void PartSet_Module::onPlaneSelected(double theX, double theY, double theZ) -//{ -// myWorkshop->viewer()->setViewProjection(theX, theY, theZ); -//} - -//void PartSet_Module::onSketchLaunched() -//{ -// xWorkshop()->actionsMgr()->update(); -// // Set working plane -// ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); -// FeaturePtr aSketch = anOperation->feature(); -// setSketchingMode(getSketchPlane(aSketch)); -//} - -//void PartSet_Module::onFitAllView() -//{ -// myWorkshop->viewer()->fitAll(); -//} - -//void PartSet_Module::onRestartOperation(std::string theName, ObjectPtr theObject) -//{ -// FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); -// -// std::string aKind = aFeature ? aFeature->getKind() : ""; -// ModuleBase_Operation* anOperation = createOperation(theName, aKind); -// -// PartSet_OperationSketchBase* aSketchOp = dynamic_cast(anOperation); -// if (aSketchOp) { -// PartSet_OperationFeatureCreate* aCreateOp = dynamic_cast(anOperation); -// if (aCreateOp) -// aCreateOp->initFeature(aFeature); -// else { -// anOperation->setFeature(aFeature); -// } -// ModuleBase_ISelection* aSelection = workshop()->selection(); -// // Initialise operation with preliminary selection -// aSketchOp->initSelection(aSelection, myWorkshop->viewer()); -// } else if (aFeature) { // In case of edit operation: set the previously created feature to the operation -// anOperation->setFeature(aFeature); -// ////Deactivate result of current feature in order to avoid its selection -// XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); -// std::list aResults = aFeature->results(); -// std::list::const_iterator aIt; -// for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { -// aDisplayer->deactivate(*aIt); -// } -// } -// sendOperation(anOperation); -// xWorkshop()->actionsMgr()->updateCheckState(); -//} - -//void PartSet_Module::onMultiSelectionEnabled(bool theEnabled) -//{ -// ModuleBase_IViewer* aViewer = myWorkshop->viewer(); -// aViewer->enableMultiselection(theEnabled); -//} - -//void PartSet_Module::onStopSelection(const QList& theFeatures, const bool isStop) -//{ -// XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); -// //if (!isStop) { -// // foreach(ObjectPtr aObject, theFeatures) { -// // activateFeature(aObject); -// // } -// //} -// aDisplayer->stopSelection(theFeatures, isStop, false); -// -// ModuleBase_IViewer* aViewer = myWorkshop->viewer(); -// aViewer->enableSelection(!isStop); -// -// aDisplayer->updateViewer(); -//} - -//void PartSet_Module::onSetSelection(const QList& theFeatures) -//{ -// XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); -// aDisplayer->setSelected(theFeatures, false); -// aDisplayer->updateViewer(); -//} - -//void PartSet_Module::setSketchingMode(const gp_Pln& thePln) -//{ -// XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); -// if (!myPlaneFilter.IsNull()) { -// aDisplayer->removeSelectionFilter(myPlaneFilter); -// myPlaneFilter.Nullify(); -// } -// QIntList aModes; -// // Clear standard selection modes -// aDisplayer->setSelectionModes(aModes); -// aDisplayer->openLocalContext(); -// -// // Set filter -// mySketchFilter = new ModuleBase_ShapeInPlaneFilter(thePln); -// aDisplayer->addSelectionFilter(mySketchFilter); -// -// // Get default selection modes -// aModes = sketchSelectionModes(ObjectPtr()); -// aDisplayer->activateObjectsOutOfContext(aModes); -//} - -//void PartSet_Module::onFeatureConstructed(ObjectPtr theFeature, int theMode) -//{ -// bool isDisplay = theMode != PartSet_OperationSketchBase::FM_Hide; -// ModuleBase_Operation* aCurOperation = myWorkshop->currentOperation(); -// PartSet_OperationSketchBase* aPrevOp = dynamic_cast(aCurOperation); -// if (aPrevOp) { -// std::list aList = aPrevOp->subFeatures(); -// XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); -// QIntList aModes = sketchSelectionModes(aPrevOp->feature()); -// std::list::iterator aSFIt; -// for (aSFIt = aList.begin(); aSFIt != aList.end(); ++aSFIt) { -// std::list aResults = (*aSFIt)->results(); -// std::list::iterator aIt; -// for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { -// if (!isDisplay) -// aDisplayer->erase((*aIt), false); -// } -// if (!isDisplay) -// aDisplayer->erase((*aSFIt), false); -// } -// //aDisplayer->deactivateObjectsOutOfContext(); -// } -// if (isDisplay) -// ModelAPI_EventCreator::get()->sendUpdated( -// theFeature, Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)); -//} - -//ModuleBase_Operation* PartSet_Module::createOperation(const std::string& theCmdId, -// const std::string& theFeatureKind) -//{ -// // create the operation -// ModuleBase_Operation* anOperation = 0; -// if (theCmdId == PartSet_OperationSketch::Type()) { -// anOperation = new PartSet_OperationSketch(theCmdId.c_str(), this); -// } else { -// ModuleBase_Operation* aCurOperation = myWorkshop->currentOperation(); -// CompositeFeaturePtr aSketch; -// PartSet_OperationSketchBase* aPrevOp = dynamic_cast(aCurOperation); -// if (aPrevOp) { -// aSketch = aPrevOp->sketch(); -// } -// if (PartSet_OperationFeatureCreate::canProcessKind(theCmdId)) { -// anOperation = new PartSet_OperationFeatureCreate(theCmdId.c_str(), this, aSketch); -// } else if (theCmdId == PartSet_OperationFeatureEdit::Type()) { -// anOperation = new PartSet_OperationFeatureEdit(theCmdId.c_str(), this, aSketch); -// } -// } -// -// if (!anOperation) { -// anOperation = new ModuleBase_Operation(theCmdId.c_str(), this); -// } -// -// // set operation description and list of widgets corresponding to the feature xml definition -// std::string aFeatureKind = theFeatureKind.empty() ? theCmdId : theFeatureKind; -// -// std::string aPluginFileName = featureFile(aFeatureKind); -// Config_WidgetReader aWdgReader = Config_WidgetReader(aPluginFileName); -// aWdgReader.readAll(); -// std::string aXmlCfg = aWdgReader.featureWidgetCfg(aFeatureKind); -// std::string aDescription = aWdgReader.featureDescription(aFeatureKind); -// -// anOperation->getDescription()->setDescription(QString::fromStdString(aDescription)); -// anOperation->getDescription()->setXmlRepresentation(QString::fromStdString(aXmlCfg)); -// -// // connect the operation -// PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); -// if (aPreviewOp) { -// connect(aPreviewOp, SIGNAL(featureConstructed(ObjectPtr, int)), this, -// SLOT(onFeatureConstructed(ObjectPtr, int))); -// connect(aPreviewOp, SIGNAL(restartRequired(std::string, ObjectPtr)), this, -// SLOT(onRestartOperation(std::string, ObjectPtr))); -// // If manage multi selection the it will be impossible to select more then one -// // object under operation Edit -//// connect(aPreviewOp, SIGNAL(multiSelectionEnabled(bool)), this, -//// SLOT(onMultiSelectionEnabled(bool))); -// -// connect(aPreviewOp, SIGNAL(stopSelection(const QList&, const bool)), this, -// SLOT(onStopSelection(const QList&, const bool))); -// connect(aPreviewOp, SIGNAL(setSelection(const QList&)), this, -// SLOT(onSetSelection(const QList&))); -// -// PartSet_OperationSketch* aSketchOp = dynamic_cast(aPreviewOp); -// if (aSketchOp) { -// connect(aSketchOp, SIGNAL(planeSelected(double, double, double)), this, -// SLOT(onPlaneSelected(double, double, double))); -// connect(aSketchOp, SIGNAL(fitAllView()), this, SLOT(onFitAllView())); -// connect(aSketchOp, SIGNAL(launchSketch()), this, SLOT(onSketchLaunched())); -// } -// } -// -// return anOperation; -//} - - -//void PartSet_Module::updateCurrentPreview(const std::string& theCmdId) -//{ -// ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); -// if (!anOperation) -// return; -// -// PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); -// if (!aPreviewOp) -// return; -// -// FeaturePtr aFeature = aPreviewOp->feature(); -// if (!aFeature || aFeature->getKind() != theCmdId) -// return; -// -// XGUI_Displayer* aDisplayer = xWorkshop()->displayer(); -// // Hide result of sketch -// std::list aResults = aFeature->results(); -// std::list::const_iterator aIt; -// for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) -// aDisplayer->erase(*aIt, false); -// -// std::list aList = aPreviewOp->subFeatures(); -// -// std::list::const_iterator anIt = aList.begin(), aLast = aList.end(); -// for (; anIt != aLast; anIt++) { -// std::shared_ptr aSPFeature = std::dynamic_pointer_cast< -// SketchPlugin_Feature>(*anIt); -// if (!aSPFeature) -// continue; -// std::list aResults = aSPFeature->results(); -// std::list::const_iterator aRIt; -// for (aRIt = aResults.cbegin(); aRIt != aResults.cend(); ++aRIt) { -// aDisplayer->display((*aRIt), false); -// aDisplayer->activate((*aRIt), sketchSelectionModes((*aRIt))); -// } -// aDisplayer->display(aSPFeature, false); -// aDisplayer->activate(aSPFeature, sketchSelectionModes(aSPFeature)); -// } -// aDisplayer->updateViewer(); -//} - -//void PartSet_Module::editFeature(FeaturePtr theFeature) -//{ -// if (!theFeature) -// return; - -// if (theFeature->getKind() == SKETCH_KIND) { - //FeaturePtr aFeature = theFeature; - //if (XGUI_Tools::isModelObject(aFeature)) { - // ObjectPtr aObject = std::dynamic_pointer_cast(aFeature); - // aFeature = aObject->featureRef(); - //} - - //if (aFeature) { -// onRestartOperation(theFeature->getKind(), theFeature); -// updateCurrentPreview(theFeature->getKind()); - //} -// } -//} - -//void PartSet_Module::onStorePoint2D(ObjectPtr theFeature, const std::string& theAttribute) -//{ -// FeaturePtr aFeature = std::dynamic_pointer_cast(theFeature); -// -// PartSet_OperationSketchBase* aPreviewOp = -// dynamic_cast(myWorkshop->currentOperation()); -// if (!aPreviewOp) -// return; -// -// std::shared_ptr aPoint = std::dynamic_pointer_cast( -// aFeature->data()->attribute(theAttribute)); -// -// PartSet_Tools::setConstraints(aPreviewOp->sketch(), aFeature, theAttribute, aPoint->x(), -// aPoint->y()); -//} - QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* theParent, Config_WidgetAPI* theWidgetApi, std::string theParentId, QList& theModelWidgets) @@ -867,16 +385,17 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* 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&)), + 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(); @@ -884,7 +403,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(); @@ -892,77 +411,20 @@ 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(); - }else + } 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; } - -//XGUI_Workshop* PartSet_Module::xWorkshop() const -//{ -// XGUI_ModuleConnector* aConnector = dynamic_cast(workshop()); -// if (aConnector) { -// return aConnector->workshop(); -// } -// return 0; -//} - - -//QIntList PartSet_Module::sketchSelectionModes(ObjectPtr theFeature) -//{ -// QIntList aModes; -// FeaturePtr aFeature = std::dynamic_pointer_cast(theFeature); -// if (aFeature) { -// if (aFeature->getKind() == SketchPlugin_Sketch::ID()) { -// aModes.append(TopAbs_FACE); -// return aModes; -// } else if (PartSet_Tools::isConstraintFeature(aFeature->getKind())) { -// aModes.append(AIS_DSM_Text); -// aModes.append(AIS_DSM_Line); -// return aModes; -// } -// } -// aModes.append(AIS_Shape::SelectionMode((TopAbs_ShapeEnum) TopAbs_VERTEX)); -// aModes.append(AIS_Shape::SelectionMode((TopAbs_ShapeEnum) TopAbs_EDGE)); -// return aModes; -//} - - -//gp_Pln PartSet_Module::getSketchPlane(FeaturePtr theSketch) const -//{ -// DataPtr aData = theSketch->data(); -// std::shared_ptr anOrigin = std::dynamic_pointer_cast( -// aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); -// std::shared_ptr aNorm = std::dynamic_pointer_cast( -// aData->attribute(SketchPlugin_Sketch::NORM_ID())); -// gp_Pnt aOrig(anOrigin->x(), anOrigin->y(), anOrigin->z()); -// gp_Dir aDir(aNorm->x(), aNorm->y(), aNorm->z()); -// return gp_Pln(aOrig, aDir); -//} - - -//void PartSet_Module::onSelectionChanged() -//{ -// ModuleBase_ISelection* aSelect = myWorkshop->selection(); -// QList aSelected = aSelect->getSelected(); -// // We need to stop edit operation if selection is cleared -// if (aSelected.size() == 0) { -// // do not perform commit of the current edit operation here, because -// // this functionality is realized inside this operation -// /*PartSet_OperationFeatureEdit* anEditOp = -// dynamic_cast(myWorkshop->currentOperation()); -// if (!anEditOp) -// return; -// anEditOp->commit();*/ -// } else { -// PartSet_OperationSketchBase* aSketchOp = -// dynamic_cast(myWorkshop->currentOperation()); -// if (aSketchOp) { -// aSketchOp->selectionChanged(aSelect); -// } -// } -//}