X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Module.cpp;h=ca49036a681acb908ee57bfb1882608634bbc0c9;hb=5b0f6aead6453cfb3bc339c0b30bfcd622b905ef;hp=7204c0e12b084f9d82b6f6b804bebe99a4c0b861;hpb=976244bad37e04fcebaf8866d7d7a02efd2b7d35;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 7204c0e12..ca49036a6 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -1,22 +1,16 @@ #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_Operation.h" +#include +#include +#include +#include +#include +#include +#include #include #include #include #include -//#include -//#include #include #include @@ -46,25 +40,26 @@ #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 @@ -74,6 +69,22 @@ #endif +/// Returns list of unique objects by sum of objects from List1 and List2 +QList getSumList(const QList& theList1, + const QList& theList2) +{ + QList aRes; + foreach (ModuleBase_ViewerPrs aPrs, theList1) { + if (!aRes.contains(aPrs.object())) + aRes.append(aPrs.object()); + } + foreach (ModuleBase_ViewerPrs aPrs, theList2) { + if (!aRes.contains(aPrs.object())) + aRes.append(aPrs.object()); + } + return aRes; +} + /*!Create and return new instance of XGUI_Module*/ extern "C" PARTSET_EXPORT ModuleBase_IModule* createModule(ModuleBase_IWorkshop* theWshop) { @@ -95,23 +106,14 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) 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_Workshop* aXWshop = xWorkshop(); - //XGUI_ContextMenuMgr* aContextMenuMgr = aXWshop->contextMenuMgr(); - //connect(aContextMenuMgr, SIGNAL(actionTriggered(const QString&, bool)), this, - // SLOT(onContextMenuCommand(const QString&, bool))); - } PartSet_Module::~PartSet_Module() { + if (!myDocumentShapeFilter.IsNull()) + myDocumentShapeFilter.Nullify(); + if (!myPlaneFilter.IsNull()) + myPlaneFilter.Nullify(); } void PartSet_Module::registerValidators() @@ -182,16 +184,34 @@ void PartSet_Module::onOperationStarted(ModuleBase_Operation* theOperation) 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 (myDocumentShapeFilter.IsNull()) + myDocumentShapeFilter = new ModuleBase_ShapeDocumentFilter(myWorkshop); + myWorkshop->viewer()->addSelectionFilter(myDocumentShapeFilter); } void PartSet_Module::onOperationStopped(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(); @@ -210,16 +230,25 @@ void PartSet_Module::onOperationStopped(ModuleBase_Operation* theOperation) aDisplayer->display(myCurrentSketch); myCurrentSketch = CompositeFeaturePtr(); + myWorkshop->viewer()->removeSelectionFilter(myPlaneFilter); } + myWorkshop->viewer()->removeSelectionFilter(myDocumentShapeFilter); } +void PartSet_Module::onPlaneSelected(const std::shared_ptr& thePln) +{ + myPlaneFilter->setPlane(thePln->impl()); +} void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) { + ModuleBase_IPropertyPanel* aPanel = theOperation->propertyPanel(); + // 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(); @@ -228,53 +257,60 @@ void PartSet_Module::propertyPanelDefined(ModuleBase_Operation* theOperation) if (aPoint) { aPnt2dWgt->setPoint(aPoint->x(), aPoint->y()); PartSet_Tools::setConstraints(myCurrentSketch, theOperation->feature(), - SketchPlugin_Line::START_ID(), aPoint->x(), aPoint->y()); + aWgt->attributeID(), aPoint->x(), aPoint->y()); theOperation->propertyPanel()->activateNextWidget(aPnt2dWgt); } } } + } else { + // Start editing constraint + if (theOperation->isEditOperation()) { + 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; + } + } + } + } + } } } 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); - // } - // } - //} + // 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); + } + } + } } -//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) +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) { @@ -285,7 +321,7 @@ void PartSet_Module::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* bool isSketchOpe = sketchOperationIdList().contains(aOperation->id()); // Avoid non-sketch operations - if (!isSketchOpe) + if ((!isSketchOpe) && (!isSketcher)) return; bool isEditing = aOperation->isEditOperation(); @@ -294,28 +330,59 @@ void PartSet_Module::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* if ((!isSketcher) && (!isEditing)) return; + if (theEvent->modifiers()) { + // If user performs multiselection + if (isSketchOpe && (!isSketcher)) + if (!aOperation->commit()) + aOperation->abort(); + return; + } // Remember highlighted objects for editing 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) + QList aHighlighted = aSelect->getHighlighted(); + QList aSelected = aSelect->getSelected(); + myEditingFeatures.clear(); + myEditingAttr.clear(); + if ((aHighlighted.size() == 0) && (aSelected.size() == 0)) { + if (isSketchOpe && (!isSketcher)) + // commit previous operation + if (!aOperation->commit()) + aOperation->abort(); + return; + } + + if ((aHighlighted.size() == 1) && (aSelected.size() == 0)) { + // Move by selected shape (vertex). Can be used only for single selection + foreach(ModuleBase_ViewerPrs aPrs, aHighlighted) { + FeaturePtr aFeature = ModelAPI_Feature::feature(aHighlighted.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); + } + } + } + } + } else { + // Provide multi-selection. Can be used only for features + QList aObjects = getSumList(aHighlighted, aSelected); + foreach (ObjectPtr aObj, aObjects) { + FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); + if (aFeature && (!myEditingFeatures.contains(aFeature))) myEditingFeatures.append(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; @@ -324,15 +391,17 @@ void PartSet_Module::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* launchEditing(); } else if (isSketchOpe && isEditing) { + // If selected another object aOperation->abort(); - //myCurrentSketch = aOperation->parentFeature(); myIsDragging = true; get2dPoint(theWnd, theEvent, myCurX, myCurY); myDragDone = false; myWorkshop->viewer()->enableSelection(false); - QTimer::singleShot(10, this, SLOT(launchEditing())); + // This is necessary in order to finalize previous operation + QApplication::processEvents(); + launchEditing(); } } } @@ -349,7 +418,7 @@ void PartSet_Module::get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* the void PartSet_Module::launchEditing() { - if (myEditingFeatures.size() == 1) { + if (myEditingFeatures.size() > 0) { FeaturePtr aFeature = myEditingFeatures.first(); std::shared_ptr aSPFeature = std::dynamic_pointer_cast(aFeature); @@ -359,13 +428,26 @@ void PartSet_Module::launchEditing() } } +/// Returns new instance of operation object (used in createOperation for customization) +ModuleBase_Operation* PartSet_Module::getNewOperation(const std::string& theFeatureId) +{ + if (theFeatureId == PartSet_OperationSketch::Type()) { + return new PartSet_OperationSketch(theFeatureId.c_str(), this); + } + return ModuleBase_IModule::getNewOperation(theFeatureId); +} + + void PartSet_Module::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { + myWorkshop->viewer()->enableSelection(true); if (myIsDragging) { myIsDragging = false; - myWorkshop->viewer()->enableSelection(true); - if (myDragDone) + if (myDragDone) { myWorkshop->currentOperation()->commit(); + myEditingFeatures.clear(); + myEditingAttr.clear(); + } } } @@ -373,21 +455,47 @@ void PartSet_Module::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent void PartSet_Module::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { if (myIsDragging) { + 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 = 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); + double dX = aX - myCurX; + double dY = aY - myCurY; + + if ((aOperation->id().toStdString() == SketchPlugin_Line::ID()) && + (myEditingAttr.size() == 1) && + 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 { + foreach(FeaturePtr aFeature, myEditingFeatures) { + std::shared_ptr aSketchFeature = + std::dynamic_pointer_cast(aFeature); + if (aSketchFeature) { + aSketchFeature->move(dX, dY); + ModelAPI_EventCreator::get()->sendUpdated(aSketchFeature, anEvent); + } } + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_MOVED)); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); } myDragDone = true; myCurX = aX; @@ -399,11 +507,16 @@ void PartSet_Module::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* t QStringList PartSet_Module::sketchOperationIdList() const { QStringList aIds; - aIds << SketchPlugin_Sketch::ID().c_str(); 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; } @@ -416,437 +529,10 @@ void PartSet_Module::onVertexSelected(ObjectPtr theObject, const TopoDS_Shape& t 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()); } } } - -//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) @@ -856,8 +542,11 @@ 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&)), + this, 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); @@ -868,6 +557,7 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* theModelWidgets.append(aWgt); return aWgt->getControl(); + } if (theType == "point2ddistance") { PartSet_WidgetPoint2dDistance* aWgt = new PartSet_WidgetPoint2dDistance(theParent, theWidgetApi, theParentId); aWgt->setWorkshop(aWorkshop); @@ -875,72 +565,23 @@ QWidget* PartSet_Module::createWidgetByType(const std::string& theType, QWidget* theModelWidgets.append(aWgt); return aWgt->getControl(); + + } if (theType == "sketch_shape_selector") { + PartSet_WidgetShapeSelector* aWgt = + new PartSet_WidgetShapeSelector(theParent, workshop(), theWidgetApi, theParentId); + aWgt->setSketcher(myCurrentSketch); + + theModelWidgets.append(aWgt); + return aWgt->getControl(); + + } if (theType == "sketch_constraint_shape_selector") { + PartSet_WidgetConstraintShapeSelector* aWgt = + new PartSet_WidgetConstraintShapeSelector(theParent, workshop(), theWidgetApi, theParentId); + aWgt->setSketcher(myCurrentSketch); + + 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); -// } -// } -//}