X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_SketcherReentrantMgr.cpp;h=90dee037af4340a47c60cd40e0e6f700fd525083;hb=4462c8acab55ab702986f63117666aa6dea3aa3c;hp=6fbeaa5d187c04b5aed49d0883851450036749d8;hpb=9cbde183bbdb90bb7986be1a32bee58bc232efe0;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_SketcherReentrantMgr.cpp b/src/PartSet/PartSet_SketcherReentrantMgr.cpp index 6fbeaa5d1..90dee037a 100644 --- a/src/PartSet/PartSet_SketcherReentrantMgr.cpp +++ b/src/PartSet/PartSet_SketcherReentrantMgr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2020 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "PartSet_SketcherReentrantMgr.h" @@ -32,6 +31,9 @@ #include "GeomDataAPI_Point2D.h" +#include "GeomAPI_Lin2d.h" +#include "GeomAPI_Dir2d.h" + #include #include #include @@ -44,7 +46,6 @@ #include #include "ModuleBase_ToolBox.h" #include "ModuleBase_ISelection.h" -#include "ModuleBase_ISelectionActivate.h" #include #include @@ -53,6 +54,8 @@ #include #include #include +#include +#include #include #include @@ -71,8 +74,9 @@ PartSet_SketcherReentrantMgr::PartSet_SketcherReentrantMgr(ModuleBase_IWorkshop* myRestartingMode(RM_None), myIsFlagsBlocked(false), myIsInternalEditOperation(false), - myInternalActiveWidget(0), - myNoMoreWidgetsAttribute("") + myNoMoreWidgetsAttribute(""), + myIsAutoConstraints(true), + myLastAutoConstraint(0) { } @@ -80,24 +84,6 @@ PartSet_SketcherReentrantMgr::~PartSet_SketcherReentrantMgr() { } -ModuleBase_ModelWidget* PartSet_SketcherReentrantMgr::internalActiveWidget() const -{ - ModuleBase_ModelWidget* aWidget = 0; - if (!isActiveMgr()) - return aWidget; - - ModuleBase_Operation* anOperation = myWorkshop->currentOperation(); - if (anOperation) { - ModuleBase_IPropertyPanel* aPanel = anOperation->propertyPanel(); - if (aPanel) { // check for case when the operation is started but property panel is not filled - ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget(); - if (myIsInternalEditOperation && (!anActiveWidget || !anActiveWidget->isViewerSelector())) - aWidget = myInternalActiveWidget; - } - } - return aWidget; -} - bool PartSet_SketcherReentrantMgr::isInternalEditActive() const { return myIsInternalEditOperation; @@ -203,8 +189,8 @@ bool PartSet_SketcherReentrantMgr::processMouseMoved(ModuleBase_IViewWindow* the } } else { // processing mouse move in active widget of restarted operation - ModuleBase_ModelWidget* anActiveWidget = module()->activeWidget(); - PartSet_MouseProcessor* aProcessor = dynamic_cast(anActiveWidget); + ModuleBase_ModelWidget* anActiveWdg = module()->activeWidget(); + PartSet_MouseProcessor* aProcessor = dynamic_cast(anActiveWdg); if (aProcessor) aProcessor->mouseMoved(theWnd, theEvent); } @@ -264,8 +250,9 @@ bool PartSet_SketcherReentrantMgr::processMouseReleased(ModuleBase_IViewWindow* if (aPointWidget) { GeomShapePtr aShape; aPointWidget->getGeomSelection_(aValue, mySelectedObject, aShape); - ObjectPtr anExternalObject = aPointWidget->getExternalObjectMgr()->getExternalObjectValidated(); - // if external object has been created before staring new operation and is used as a parameter, + ObjectPtr anExternalObject = + aPointWidget->getExternalObjectMgr()->getExternalObjectValidated(); + // if external object is during reentrant operation and is used as a parameter of feature // it should be removed after the operation is restarted. (Circle feature, Projection) if (anExternalObject.get()) anExternalCreatedFeature = ModelAPI_Feature::feature(anExternalObject); @@ -375,6 +362,11 @@ void PartSet_SketcherReentrantMgr::onNoMoreWidgets(const std::string& thePreviou ModuleBase_OperationFeature* aFOperation = dynamic_cast (myWorkshop->currentOperation()); + if (module()->sketchMgr()->isDragModeCreation()) { + if (aFOperation && myIsAutoConstraints) + addConstraints(aFOperation->feature()); + return; + } if (!myWorkshop->module()->getFeatureError(aFOperation->feature()).isEmpty()) return; @@ -390,8 +382,11 @@ void PartSet_SketcherReentrantMgr::onNoMoreWidgets(const std::string& thePreviou isStarted = startInternalEdit(thePreviousAttributeID); } } - if (!isStarted) + if (!isStarted) { + if (myIsAutoConstraints) + addConstraints(aFOperation->feature()); aFOperation->commit(); + } } } } @@ -417,7 +412,9 @@ bool PartSet_SketcherReentrantMgr::processEnter(const std::string& thePreviousAt if (!isSketchSolverError) { myRestartingMode = RM_EmptyFeatureUsed; - isDone = startInternalEdit(thePreviousAttributeID); + // It seems that the call is obsolete for Enter key processing + // It prevent finalysing of the current operation by Enter key + //isDone = startInternalEdit(thePreviousAttributeID); } return isDone; @@ -452,10 +449,7 @@ void PartSet_SketcherReentrantMgr::onVertexSelected() void PartSet_SketcherReentrantMgr::onAfterValuesChangedInPropertyPanel() { - if (isInternalEditActive()) { - ModuleBase_OperationFeature* aFOperation = dynamic_cast - (myWorkshop->currentOperation()); ModuleBase_ModelWidget* aWidget = (ModuleBase_ModelWidget*)sender(); if (!aWidget->isModifiedInEdit().empty()) restartOperation(); @@ -513,6 +507,9 @@ bool PartSet_SketcherReentrantMgr::startInternalEdit(const std::string& thePrevi // returning to the neutral point of the Sketcher or start internal edit workshop()->selector()->clearSelection(); + if (myIsAutoConstraints) + addConstraints(aFOperation->feature()); + aFOperation->setEditOperation(true/*, false*/); createInternalFeature(); @@ -535,9 +532,9 @@ bool PartSet_SketcherReentrantMgr::startInternalEdit(const std::string& thePrevi QList aWidgets = aPanel->modelWidgets(); for (int i = 0, aNb = aWidgets.size(); i < aNb && !aPreviousAttributeWidget; i++) { if (aWidgets[i]->attributeID() == thePreviousAttributeID) { - /// workaround for the same attributes used in different stacked widgets(attribute types) - if (ModuleBase_ToolBox::isOffToolBoxParent(aWidgets[i])) - continue; + // workaround for the same attributes used in different stacked widgets(attribute types) + if (ModuleBase_ToolBox::isOffToolBoxParent(aWidgets[i])) + continue; aPreviousAttributeWidget = aWidgets[i]; } } @@ -669,7 +666,7 @@ void PartSet_SketcherReentrantMgr::createInternalFeature() ModuleBase_ModelWidget* aFirstWidget = ModuleBase_IPropertyPanel::findFirstAcceptingValueWidget (aWidgets); if (aFirstWidget) - myInternalActiveWidget = aFirstWidget; + setInternalActiveWidget(aFirstWidget); } } @@ -679,8 +676,7 @@ void PartSet_SketcherReentrantMgr::deleteInternalFeature() std::cout << "PartSet_SketcherReentrantMgr::deleteInternalFeature: " << myInternalFeature->data()->name() << std::endl; #endif - if (myInternalActiveWidget) - myInternalActiveWidget = 0; + setInternalActiveWidget(0); delete myInternalWidget; myInternalWidget = 0; @@ -829,3 +825,69 @@ PartSet_Module* PartSet_SketcherReentrantMgr::module() const { return dynamic_cast(myWorkshop->module()); } + +void PartSet_SketcherReentrantMgr::setInternalActiveWidget(ModuleBase_ModelWidget* theWidget) +{ + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (myWorkshop->currentOperation()); + if (aFOperation) + { + XGUI_PropertyPanel* aPropertyPanel = dynamic_cast + (aFOperation->propertyPanel()); + if (aPropertyPanel) + aPropertyPanel->setInternalActiveWidget(theWidget); + } +} + +void PartSet_SketcherReentrantMgr::onAutoConstraints(bool isOn) +{ + myIsAutoConstraints = isOn; +} + +void PartSet_SketcherReentrantMgr::addConstraints(const FeaturePtr& theFeature) +{ + if (theFeature->getKind() != SketchPlugin_Line::ID()) + return; + + static GeomDir2dPtr myHorDir(new GeomAPI_Dir2d(1, 0)); + static GeomDir2dPtr myVertDir(new GeomAPI_Dir2d(0, 1)); + + std::shared_ptr aData = theFeature->data(); + std::shared_ptr aPoint1 = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Line::START_ID())); + std::shared_ptr aPoint2 = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Line::END_ID())); + if (aPoint1.get() && aPoint2.get()) { + GeomLine2dPtr aLine(new GeomAPI_Lin2d(aPoint1->pnt(), aPoint2->pnt())); + GeomDir2dPtr aDir = aLine->direction(); + double aHorAngle = fabs(myHorDir->angle(aDir)); + double aVertAngle = fabs(myVertDir->angle(aDir)); + if (aHorAngle > M_PI/2.) + aHorAngle = M_PI - aHorAngle; + if (aVertAngle > M_PI/2.) + aVertAngle = M_PI - aVertAngle; + + double aTolerance = Config_PropManager::real(SKETCH_TAB_NAME, "angular_tolerance"); + CompositeFeaturePtr aSketch = module()->sketchMgr()->activeSketch(); + FeaturePtr aFeature; + if (aHorAngle < aTolerance) { + // Add horizontal constraint + aFeature = aSketch->addFeature(SketchPlugin_ConstraintHorizontal::ID()); + } + else if (aVertAngle < aTolerance) { + // Add vertical constraint + aFeature = aSketch->addFeature(SketchPlugin_ConstraintVertical::ID()); + } + if (aFeature.get()) { + aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())->setObject( + theFeature->firstResult()); + myLastAutoConstraint = aFeature.get(); + } + } +} + + +bool PartSet_SketcherReentrantMgr::isLastAutoConstraint(const ObjectPtr& theObj) const +{ + return theObj.get() == myLastAutoConstraint; +}