From cdbbde4803e9c320204d537d22af4ac7ef024962 Mon Sep 17 00:00:00 2001 From: Alexey Kondratyev Date: Wed, 24 Nov 2021 09:10:08 +0300 Subject: [PATCH] bos #24513 Dealing with conflicting constraints * Add checkboxes to allow dealing with conflicting constraints and notify about changes with constraints. * Add class to resolve conflicting constrains. * Algorithm to check arcs in sketch on tangential conflict. * Move algorithm of vertical/horizontal auto constraint conflict in SketchPlugin_OverConstraintsResolver. --- doc/gui/General/Introduction.rst | 9 +- doc/gui/images/sketch_preferences.png | Bin 42129 -> 45631 bytes src/ModelAPI/ModelAPI_Events.cpp | 20 ++ src/ModelAPI/ModelAPI_Events.h | 24 +++ src/ModuleBase/ModuleBase_Preferences.cpp | 13 ++ src/ModuleBase/ModuleBase_Preferences.h | 3 + src/ModuleBase/ModuleBase_Tools.cpp | 28 +++ src/ModuleBase/ModuleBase_Tools.h | 5 + src/PartSet/PartSet_Module.cpp | 60 ++++-- src/PartSet/PartSet_Module.h | 3 +- .../PartSet_OverconstraintListener.cpp | 97 ++++++--- src/PartSet/PartSet_OverconstraintListener.h | 6 + src/SHAPERGUI/resources/LightApp.xml.in | 5 + src/SketchPlugin/CMakeLists.txt | 2 + .../SketchPlugin_OverConstraintsResolver.cpp | 187 ++++++++++++++++++ .../SketchPlugin_OverConstraintsResolver.h | 58 ++++++ src/XGUI/SHAPER.xml | 6 +- 17 files changed, 476 insertions(+), 50 deletions(-) create mode 100644 src/SketchPlugin/SketchPlugin_OverConstraintsResolver.cpp create mode 100644 src/SketchPlugin/SketchPlugin_OverConstraintsResolver.h diff --git a/doc/gui/General/Introduction.rst b/doc/gui/General/Introduction.rst index 3cb1c45b2..eea5fbf0f 100644 --- a/doc/gui/General/Introduction.rst +++ b/doc/gui/General/Introduction.rst @@ -618,11 +618,16 @@ Sketch tab defines properties of coordinate planes shown for selection of sketch - **Size** defines size of coordinate planes; - **Thickness** defines thickness of coordinate plane borders; -- **Rotate to plane when selected** check-box turns on/off automatic switch the viewer to the top view for the selected sketch plane. +- **Rotate to plane when selected** check-box turns on/off automatic switch the viewer to the top view for the selected sketch plane; - **Angular tolerance** defines defines an angular tolerance for automatic creation of horizontal and vertical constraints; - **Default spline weight** defines default weight for B-spline nodes during creation. The default value can be changed by editing of the spline; -- **Cursor for sketch operation** defines a cursor which indicates a launched sketcher sub-operation. +- **Cursor for sketch operation** defines a cursor which indicates a launched sketcher sub-operation; - **Create sketch entities by dragging** defines a style of sketch etities creation. It concerns creation of lines, rectangles, circles, arcs, ellipses, elliptic arcs. If it is switched ON then points of objects have to be defined by mouse press - mouse move - mouse release. Otherwise every point of an object has to be defined by mouse click; +- **Allow automatic constraint substitution/remove** allows automatic resolving of conflicting constraints. + The following conflicts could be processed: + - Horizontal/Vertical automatic constraints (this last constraint will be removed); + - Pair of arcs connected smoothly, which centers are coincident (Tangency between arcs will be removed); +- **Notify automatic constraint substitution/remove** defines a message box to be shown to the user, if the conflicting constraints situation is automatically resolved. .. _viewer_preferences: diff --git a/doc/gui/images/sketch_preferences.png b/doc/gui/images/sketch_preferences.png index 97044453421fc016cba30a4b6c4f5eef973b6563..0780580827815d693830cd163c158232b3b3dfa4 100755 GIT binary patch literal 45631 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 literal 42129 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Φix4{B_84*#92_TZiwB{2aU#5*oT5 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 z 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 ModelAPI_CheckConstraintsMessage::constraints() const +{ + return myConstraints; +} + +void ModelAPI_CheckConstraintsMessage::setConstraints(const std::set& theConstraints) +{ + myConstraints = theConstraints; +} + // ===== ModelAPI_FeaturesLicenseValidMessage ===== ModelAPI_FeaturesLicenseValidMessage::ModelAPI_FeaturesLicenseValidMessage( diff --git a/src/ModelAPI/ModelAPI_Events.h b/src/ModelAPI/ModelAPI_Events.h index 247f51bc3..efab2fae1 100644 --- a/src/ModelAPI/ModelAPI_Events.h +++ b/src/ModelAPI/ModelAPI_Events.h @@ -122,6 +122,10 @@ MAYBE_UNUSED static const char * EVENT_VISUAL_ATTRIBUTES = "UpdateVisualAttribut /// Event ID that 1D-fillet failed (comes with ModelAPI_ShapesFailedMessage) MAYBE_UNUSED static const char * EVENT_OPERATION_SHAPES_FAILED = "OperationShapesFailed"; +MAYBE_UNUSED static const char * EVENT_CHECK_CONSTRAINTS = "CheckConstrains"; + +MAYBE_UNUSED static const char * EVENT_REMOVE_CONSTRAINTS = "RemoveConstrains"; + /// Event ID that license of specified features is checked and valid MAYBE_UNUSED static const char * EVENT_FEATURE_LICENSE_VALID = "FeaturesLicenseValid"; @@ -659,6 +663,26 @@ private: std::list< std::shared_ptr > myShapes; }; +///Message that sends the constraints to check or remove +class ModelAPI_CheckConstraintsMessage : public Events_Message +{ +public: + /// Creates an empty message + MODELAPI_EXPORT ModelAPI_CheckConstraintsMessage(const Events_ID theID, const void* theSender = 0); + /// The virtual destructor + MODELAPI_EXPORT virtual ~ModelAPI_CheckConstraintsMessage(); + + ///Get list of constrains + MODELAPI_EXPORT const std::set& constraints() const; + + ///Set list of constrains + MODELAPI_EXPORT void setConstraints(const std::set& theConstraints); + +private: + std::set myConstraints; +}; + + /// Message that sends the features which license is checked and valid class ModelAPI_FeaturesLicenseValidMessage : public Events_Message { diff --git a/src/ModuleBase/ModuleBase_Preferences.cpp b/src/ModuleBase/ModuleBase_Preferences.cpp index 229603f83..d8d1c417a 100644 --- a/src/ModuleBase/ModuleBase_Preferences.cpp +++ b/src/ModuleBase/ModuleBase_Preferences.cpp @@ -118,6 +118,7 @@ void ModuleBase_Preferences::createEditContent(ModuleBase_IPrefMgr* thePref, int thePref->prefMgr()->setItemIcon(thePage, QIcon(":pictures/module.png")); createGeneralTab(thePref, thePage); createCustomPage(thePref, thePage); + updateSketchTab(thePref, thePage); } void ModuleBase_Preferences::resetResourcePreferences(SUIT_PreferenceMgr* thePref) @@ -210,6 +211,18 @@ void ModuleBase_Preferences::createGeneralTab(ModuleBase_IPrefMgr* thePref, int thePref->setItemProperty("indexes", visuIdList, visuId); } +void ModuleBase_Preferences::updateSketchTab(ModuleBase_IPrefMgr* thePref, int thePageId) +{ + int sketchTab = thePref->addPreference(QObject::tr("Sketch"), thePageId, + SUIT_PreferenceMgr::Auto, QString(), QString()); + int allowChange = thePref->addPreference( + QObject::tr("Allow automatic constraint substitution/remove"), + sketchTab, SUIT_PreferenceMgr::GroupBox, + "Sketch", "allow_change_constraint"); + thePref->addPreference(QObject::tr("Notify automatic constraint substitution/remove"), + allowChange, SUIT_PreferenceMgr::Bool, "Sketch", "notify_change_constraint"); +} + void ModuleBase_Preferences::createCustomPage(ModuleBase_IPrefMgr* thePref, int thePageId) { SUIT_ResourceMgr* aResMgr = ModuleBase_Preferences::resourceMgr(); diff --git a/src/ModuleBase/ModuleBase_Preferences.h b/src/ModuleBase/ModuleBase_Preferences.h index c35203768..787c4bb85 100644 --- a/src/ModuleBase/ModuleBase_Preferences.h +++ b/src/ModuleBase/ModuleBase_Preferences.h @@ -79,6 +79,9 @@ class MODULEBASE_EXPORT ModuleBase_Preferences /// Retrieve preferences of config prop to default state static void resetConfigPropPreferences(SUIT_PreferenceMgr* thePref); + /// Updates content of preferences for sketch tab + static void updateSketchTab(ModuleBase_IPrefMgr* thePref, int thePageId); + private: /// Updates SUIT_ResourceMgr values by Config_PropManager properties static void updateResourcesByConfig(); diff --git a/src/ModuleBase/ModuleBase_Tools.cpp b/src/ModuleBase/ModuleBase_Tools.cpp index bfe204d60..f1cf9f0d1 100644 --- a/src/ModuleBase/ModuleBase_Tools.cpp +++ b/src/ModuleBase/ModuleBase_Tools.cpp @@ -92,6 +92,7 @@ #include #include #include +#include #include #include @@ -1131,6 +1132,33 @@ bool askToDelete(const std::set theFeatures, return true; } +//************************************************************** +bool warningAboutConflict(QWidget* theParent, const std::string& theWarningText) +{ + QMessageBox aMessageBox(theParent); + aMessageBox.setWindowTitle(QObject::tr("Conflicts in constraint")); + aMessageBox.setIcon(QMessageBox::Warning); + aMessageBox.setText((theWarningText + "\nConstraints will be removed or substituted").c_str()); + + QCheckBox* aCheckBox = new QCheckBox; + + aCheckBox->setTristate(false); + aCheckBox->setText("switch off the notifications."); + + aMessageBox.setCheckBox(aCheckBox); + aMessageBox.setStandardButtons(QMessageBox::Ok); + + aMessageBox.exec(); + + if (aCheckBox->isChecked()) + { + ModuleBase_Preferences::resourceMgr()->setValue(SKETCH_TAB_NAME, + "notify_change_constraint", false); + } + + return true; +} + //************************************************************** void convertToFeatures(const QObjectPtrList& theObjects, std::set& theFeatures) { diff --git a/src/ModuleBase/ModuleBase_Tools.h b/src/ModuleBase/ModuleBase_Tools.h index cae27a1d9..23477a106 100644 --- a/src/ModuleBase/ModuleBase_Tools.h +++ b/src/ModuleBase/ModuleBase_Tools.h @@ -339,6 +339,11 @@ bool MODULEBASE_EXPORT askToDelete(const std::set aFeatures, std::set& theReferencesToDelete, const std::string& thePrefixInfo = ""); +/// Shows a message box about conflicting constraints. +/// \param theParent a parent widget for the message box +/// \param theWarningText text describing the cause of the conflict +bool MODULEBASE_EXPORT warningAboutConflict(QWidget* theParent, const std::string& theWarningText); + /// Converts a list of objects to set of corresponded features. If object is result, it is ignored /// because the feature only might be removed. But if result is in a parameter group, the feature /// of this parameter is to be removed diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index 70935fa37..f3e8ad1a5 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -69,6 +69,7 @@ #include #include #include +#include #include #include @@ -149,6 +150,7 @@ #include #include +#include #define FEATURE_ITEM_COLOR "0,0,225" @@ -1983,28 +1985,54 @@ void PartSet_Module::enableCustomModes() { } //****************************************************** -void PartSet_Module::onConflictingConstraints() +void PartSet_Module::onRemoveConflictingConstraints() { - const std::set& aConstraints = myOverconstraintListener->conflictingObjects(); - QObjectPtrList aObjectsList; - std::set::const_iterator aIt; - for (aIt = aConstraints.cbegin(); aIt != aConstraints.cend(); aIt++) { - if (mySketchReentrantMgr->isLastAutoConstraint(*aIt)) - aObjectsList.append(*aIt); + const std::set& aConstraints = myOverconstraintListener->objectsToRemove(); + std::set::const_iterator anIt; + + XGUI_Workshop* aWorkshop = getWorkshop(); + XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); + + bool isAllowToNotify = ModuleBase_Preferences::resourceMgr()->booleanValue(SKETCH_TAB_NAME, + "notify_change_constraint"); + + if (isAllowToNotify) { + anIt = aConstraints.begin(); + std::string aText("Conflict in constraints: \n"); + + for (; anIt != aConstraints.end(); anIt++) + { + ObjectPtr anObject = *anIt; + FeaturePtr aFeature = std::dynamic_pointer_cast(anObject); + TCollection_AsciiString aStr(aFeature->name().c_str()); + std::string aName(aStr.ToCString()); + aText += aName + "\n"; + } + + XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); + ModuleBase_Tools::warningAboutConflict(aConnector->desktop(), + aText); } - if (aObjectsList.size() > 0) { - XGUI_Workshop* aWorkshop = getWorkshop(); + + ModuleBase_Operation* anOp = anOpMgr->currentOperation(); + if (sketchMgr()->isNestedSketchOperation(anOp)) { + std::set aFeatures; + for (anIt = aConstraints.cbegin(); anIt != aConstraints.cend(); anIt++) + aFeatures.insert(ModelAPI_Feature::feature(*anIt)); + + ModelAPI_Tools::removeFeaturesAndReferences(aFeatures); + } + else { + QObjectPtrList anObjectsList; + for (anIt = aConstraints.cbegin(); anIt != aConstraints.cend(); anIt++) + anObjectsList.append(*anIt); + QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text(); ModuleBase_Operation* anOpAction = new ModuleBase_Operation(aDescription); - XGUI_OperationMgr* anOpMgr = aWorkshop->operationMgr(); - - ModuleBase_Operation* anOp = anOpMgr->currentOperation(); - if (sketchMgr()->isNestedSketchOperation(anOp)) - anOp->abort(); anOpMgr->startOperation(anOpAction); - aWorkshop->deleteFeatures(aObjectsList); + aWorkshop->deleteFeatures(anObjectsList); anOpMgr->commitOperation(); - ModuleBase_Tools::flushUpdated(sketchMgr()->activeSketch()); } + ModuleBase_Tools::flushUpdated(sketchMgr()->activeSketch()); } diff --git a/src/PartSet/PartSet_Module.h b/src/PartSet/PartSet_Module.h index 7a39b8998..377ac23b7 100644 --- a/src/PartSet/PartSet_Module.h +++ b/src/PartSet/PartSet_Module.h @@ -417,7 +417,8 @@ public slots: /// \param theTrsfType type of tranformation virtual void onViewTransformed(int theTrsfType = 2); - void onConflictingConstraints(); + /// Called on remove conflicting constraints + void onRemoveConflictingConstraints(); protected slots: /// Called when previous operation is finished diff --git a/src/PartSet/PartSet_OverconstraintListener.cpp b/src/PartSet/PartSet_OverconstraintListener.cpp index 656593d9b..5db78193f 100644 --- a/src/PartSet/PartSet_OverconstraintListener.cpp +++ b/src/PartSet/PartSet_OverconstraintListener.cpp @@ -20,6 +20,10 @@ #include #include +// Attention: keep the next include here, +// otherwise it causes compilation errors at least on Debian 8 +#include + #include "PartSet_OverconstraintListener.h" #include #include @@ -38,6 +42,8 @@ #include "SketchPlugin_ConstraintHorizontal.h" #include "SketchPlugin_ConstraintVertical.h" +#include + #include "Events_Loop.h" #include @@ -62,6 +68,7 @@ PartSet_OverconstraintListener::PartSet_OverconstraintListener(ModuleBase_IWorks aLoop->registerListener(this, ModelAPI_EventReentrantMessage::eventId()); aLoop->registerListener(this, SketchPlugin_MacroArcReentrantMessage::eventId()); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_REMOVE_CONSTRAINTS)); } void PartSet_OverconstraintListener::setActive(const bool& theActive) @@ -225,7 +232,34 @@ void PartSet_OverconstraintListener::processEvent(const std::shared_ptr aConstraintsMsg = + std::dynamic_pointer_cast(theMessage); + if (aConstraintsMsg.get()) { + myObjectsToRemove = aConstraintsMsg->constraints(); + + std::set::const_iterator + anIt = myObjectsToRemove.begin(), aLast = myObjectsToRemove.end(); + + PartSet_Module* aModule = dynamic_cast(myWorkshop->module()); + + for (; anIt != aLast; anIt++) + { + ObjectPtr anObject = *anIt; + FeaturePtr aFeature = std::dynamic_pointer_cast(anObject); + std::string aType = aFeature->getKind(); + if ((aType == SketchPlugin_ConstraintHorizontal::ID() || + aType == SketchPlugin_ConstraintVertical::ID()) && + !aModule->sketchReentranceMgr()->isLastAutoConstraint(*anIt)) + myObjectsToRemove.erase(*anIt); + } + + if (myObjectsToRemove.empty()) + return; + QTimer::singleShot(5, aModule, SLOT(onRemoveConflictingConstraints())); + } + } #ifdef DEBUG_FEATURE_OVERCONSTRAINT_LISTENER aCurrentInfoStr = getObjectsInfo(myConflictingObjects); qDebug(QString("RESULT: current objects count = %1:%2\n") @@ -236,40 +270,43 @@ void PartSet_OverconstraintListener::processEvent(const std::shared_ptr& theConflictingObjects) { - std::set aModifiedObjects; - - // set error state for new objects and append them in the internal map of objects - std::set::const_iterator - anIt = theConflictingObjects.begin(), aLast = theConflictingObjects.end(); - FeaturePtr aFeature; - bool isHVConstraint = false; - for (; anIt != aLast; anIt++) { - ObjectPtr anObject = *anIt; - if (myConflictingObjects.find(anObject) == myConflictingObjects.end()) { // it is not found - aModifiedObjects.insert(anObject); - myConflictingObjects.insert(anObject); - } - if (!isHVConstraint) { - aFeature = std::dynamic_pointer_cast(anObject); - if (aFeature) { - std::string aType = aFeature->getKind(); - isHVConstraint = (aType == SketchPlugin_ConstraintHorizontal::ID()) || - (aType == SketchPlugin_ConstraintVertical::ID()); + bool isAllowToChange = ModuleBase_Preferences::resourceMgr()->booleanValue(SKETCH_TAB_NAME, + "allow_change_constraint"); + if (isAllowToChange) { + std::set aModifiedObjects; + + // set error state for new objects and append them in the internal map of objects + std::set::const_iterator + anIt = theConflictingObjects.begin(), aLast = theConflictingObjects.end(); + + int aCountOfSimilarConstraints = 0; + for (; anIt != aLast; anIt++) { + ObjectPtr anObject = *anIt; + if (myConflictingObjects.find(anObject) == myConflictingObjects.end()) { // it is not found + aModifiedObjects.insert(anObject); + myConflictingObjects.insert(anObject); } + else + ++aCountOfSimilarConstraints; } - } - bool isUpdated = !aModifiedObjects.empty(); - if (isUpdated) - redisplayObjects(aModifiedObjects); - // If the conflicting object is an automatic constraint caused the conflict - // then it has to be deleted - if (isHVConstraint) { - PartSet_Module* aModule = dynamic_cast(myWorkshop->module()); - QTimer::singleShot(5, aModule, SLOT(onConflictingConstraints())); - } + if (theConflictingObjects.size() == aCountOfSimilarConstraints) + return false; - return isUpdated; + std::shared_ptr aMessage = + std::shared_ptr( + new ModelAPI_CheckConstraintsMessage( + Events_Loop::eventByName(EVENT_CHECK_CONSTRAINTS))); + aMessage->setConstraints(theConflictingObjects); + Events_Loop::loop()->send(aMessage); + + bool isUpdated = !aModifiedObjects.empty(); + if (isUpdated) + redisplayObjects(aModifiedObjects); + return isUpdated; + } + else + return false; } bool PartSet_OverconstraintListener::repairConflictingObjects( diff --git a/src/PartSet/PartSet_OverconstraintListener.h b/src/PartSet/PartSet_OverconstraintListener.h index a0f2fed6e..910527051 100644 --- a/src/PartSet/PartSet_OverconstraintListener.h +++ b/src/PartSet/PartSet_OverconstraintListener.h @@ -69,6 +69,11 @@ public: return myConflictingObjects; } + const std::set& objectsToRemove() const + { + return myObjectsToRemove; + } + bool isFullyConstrained() const { return myIsFullyConstrained; } protected: @@ -101,6 +106,7 @@ private: ModuleBase_IWorkshop* myWorkshop; bool myIsActive; /// state if sketch is active std::set myConflictingObjects; + std::set myObjectsToRemove; bool myIsFullyConstrained; /// state if Solver is fully constrained, DOF = 0 }; diff --git a/src/SHAPERGUI/resources/LightApp.xml.in b/src/SHAPERGUI/resources/LightApp.xml.in index 0a0028ab8..76fed3d33 100644 --- a/src/SHAPERGUI/resources/LightApp.xml.in +++ b/src/SHAPERGUI/resources/LightApp.xml.in @@ -28,6 +28,11 @@ +
+ + + +
diff --git a/src/SketchPlugin/CMakeLists.txt b/src/SketchPlugin/CMakeLists.txt index 2fd3420d0..98c0ead1e 100644 --- a/src/SketchPlugin/CMakeLists.txt +++ b/src/SketchPlugin/CMakeLists.txt @@ -65,6 +65,7 @@ SET(PROJECT_HEADERS SketchPlugin_MultiRotation.h SketchPlugin_MultiTranslation.h SketchPlugin_Offset.h + SketchPlugin_OverConstraintsResolver.h SketchPlugin_Plugin.h SketchPlugin_Point.h SketchPlugin_Projection.h @@ -120,6 +121,7 @@ SET(PROJECT_SOURCES SketchPlugin_MultiRotation.cpp SketchPlugin_MultiTranslation.cpp SketchPlugin_Offset.cpp + SketchPlugin_OverConstraintsResolver.cpp SketchPlugin_Plugin.cpp SketchPlugin_Point.cpp SketchPlugin_Projection.cpp diff --git a/src/SketchPlugin/SketchPlugin_OverConstraintsResolver.cpp b/src/SketchPlugin/SketchPlugin_OverConstraintsResolver.cpp new file mode 100644 index 000000000..e54da2688 --- /dev/null +++ b/src/SketchPlugin/SketchPlugin_OverConstraintsResolver.cpp @@ -0,0 +1,187 @@ +// Copyright (C) 2014-2021 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +static SketchPlugin_OverConstraintsResolver* myConstResolver = + new SketchPlugin_OverConstraintsResolver; + +SketchPlugin_OverConstraintsResolver::SketchPlugin_OverConstraintsResolver() +{ + Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_CHECK_CONSTRAINTS)); +} + +void SketchPlugin_OverConstraintsResolver::setConstraints( + const std::set& theConstraints) +{ + myConstraints = theConstraints; +} + +bool SketchPlugin_OverConstraintsResolver::perform() +{ + bool hasConflicts = false; + hasConflicts |= checkArcsAboutTangentialConflict(); + hasConflicts |= checkHorizontalOrVerticalConflict(); + return hasConflicts; +} + +bool SketchPlugin_OverConstraintsResolver::checkHorizontalOrVerticalConflict() +{ + std::set::const_iterator + anIt = myConstraints.begin(), aLast = myConstraints.end(); + bool isHVConstraint = false; + FeaturePtr aFeature; + for (; anIt != aLast; anIt++) { + ObjectPtr anObject = *anIt; + if (!isHVConstraint) { + aFeature = std::dynamic_pointer_cast(anObject); + if (aFeature) { + std::string aType = aFeature->getKind(); + if ((aType == SketchPlugin_ConstraintHorizontal::ID()) || + (aType == SketchPlugin_ConstraintVertical::ID())) + { + myConstraintsToRemove.insert(*anIt); + isHVConstraint = true; + } + } + } + } + return isHVConstraint; +} + +bool SketchPlugin_OverConstraintsResolver::checkArcsAboutTangentialConflict() +{ + bool isConflictsFound = false; + + std::set::const_iterator + anIt = myConstraints.begin(), aLast = myConstraints.end(); + for (; anIt != aLast; anIt++) { + ObjectPtr anObject = *anIt; + ConstraintPtr aConstain = + std::dynamic_pointer_cast(anObject); + if (aConstain.get()) { + std::shared_ptr aRefAttrA = aConstain->refattr( + aConstain->ENTITY_A()); + std::shared_ptr aRefAttrB = aConstain->refattr( + aConstain->ENTITY_B()); + if (!aRefAttrA || !aRefAttrB) + continue; + + FeaturePtr aFeatureA = ModelAPI_Feature::feature(aRefAttrA->object()); + FeaturePtr aFeatureB = ModelAPI_Feature::feature(aRefAttrB->object()); + + if (aFeatureA && aFeatureA->getKind() == SketchPlugin_Arc::ID() && + aFeatureB && aFeatureB->getKind() == SketchPlugin_Arc::ID()) { + + std::shared_ptr anAttrStrA = aFeatureA->attribute( + SketchPlugin_Arc::START_ID()); + std::shared_ptr anAttrEndA = aFeatureA->attribute( + SketchPlugin_Arc::END_ID()); + std::shared_ptr anAttrStrB = aFeatureB->attribute( + SketchPlugin_Arc::START_ID()); + std::shared_ptr anAttrEndB = aFeatureB->attribute( + SketchPlugin_Arc::END_ID()); + std::shared_ptr anAttrCenA = aFeatureA->attribute( + SketchPlugin_Arc::CENTER_ID()); + std::shared_ptr anAttrCenB = aFeatureB->attribute( + SketchPlugin_Arc::CENTER_ID()); + + bool isCoincident = false; + bool isCoincidentAtCenter = false; + std::set aTangentConstraints; + + std::set aFeatures; + std::map > aFeaturesMap; + aFeatures.insert(aFeatureA); + aFeatures.insert(aFeatureB); + ModelAPI_Tools::findAllReferences(aFeatures, aFeaturesMap); + + std::set aFeaturesA = aFeaturesMap[aFeatureA]; + std::set aFeaturesB = aFeaturesMap[aFeatureB]; + + for (auto aFeatIter = aFeaturesA.begin(); aFeatIter != aFeaturesA.end(); ++aFeatIter) { + if (aFeaturesB.find(aFeatIter.operator*()) != aFeaturesB.end()){ + const std::string& aType = (*aFeatIter)->getKind(); + if (aType == SketchPlugin_ConstraintCoincidence::ID()) { + ConstraintPtr aCoincidence = + std::dynamic_pointer_cast(*aFeatIter); + std::set anAttrSet; + anAttrSet.insert(aCoincidence->refattr(aCoincidence->ENTITY_A())->attr()); + anAttrSet.insert(aCoincidence->refattr(aCoincidence->ENTITY_B())->attr()); + isCoincident |= ((anAttrSet.find(anAttrStrA) != anAttrSet.end() || + anAttrSet.find(anAttrEndA) != anAttrSet.end()) && + (anAttrSet.find(anAttrStrB) != anAttrSet.end() || + anAttrSet.find(anAttrEndB) != anAttrSet.end())); + isCoincidentAtCenter |= (anAttrSet.find(anAttrCenA) != anAttrSet.end() && + anAttrSet.find(anAttrCenB) != anAttrSet.end()); + } + else if (aType == SketchPlugin_ConstraintTangent::ID()) { + aTangentConstraints.insert(*aFeatIter); + } + } + } + + if (isCoincident && isCoincidentAtCenter && !aTangentConstraints.empty()) { + isConflictsFound = true; + myConstraintsToRemove.insert(aTangentConstraints.begin(), aTangentConstraints.end()); + } + } + } + } + + return isConflictsFound; +} + +void SketchPlugin_OverConstraintsResolver::processEvent( + const std::shared_ptr& theMessage) +{ + Events_ID anEventID = theMessage->eventID(); + if (anEventID == Events_Loop::eventByName(EVENT_CHECK_CONSTRAINTS)) { + std::shared_ptr aConstraintsMsg = + std::dynamic_pointer_cast(theMessage); + if (aConstraintsMsg.get()) { + myConstraintsToRemove.clear(); + myConstraints = aConstraintsMsg->constraints(); + if (perform()) + { + std::shared_ptr aMessage = + std::shared_ptr( + new ModelAPI_CheckConstraintsMessage( + Events_Loop::eventByName(EVENT_REMOVE_CONSTRAINTS))); + aMessage->setConstraints(myConstraintsToRemove); + Events_Loop::loop()->send(aMessage); + } + } + } +} diff --git a/src/SketchPlugin/SketchPlugin_OverConstraintsResolver.h b/src/SketchPlugin/SketchPlugin_OverConstraintsResolver.h new file mode 100644 index 000000000..88eca4e0c --- /dev/null +++ b/src/SketchPlugin/SketchPlugin_OverConstraintsResolver.h @@ -0,0 +1,58 @@ +// Copyright (C) 2014-2021 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef SketchPlugin_OverConstraintsResolver_H_ +#define SketchPlugin_OverConstraintsResolver_H_ + +#include "SketchPlugin.h" + +#include + +#include + +#include + +class SketchPlugin_OverConstraintsResolver : public Events_Listener +{ +public: + SketchPlugin_OverConstraintsResolver(); + + /// Redefinition of Events_Listener method + void processEvent(const std::shared_ptr& theMessage); + + virtual bool groupMessages() { return true; } + +protected: + /// Perform algorithm + bool perform(); + + /// Set set of constraints to check + void setConstraints(const std::set& theConstraints); + + /// Check arcs in sketch about tangential conflict + bool checkArcsAboutTangentialConflict(); + + /// Check lines in sketch about horizontal or vertical conflict + bool checkHorizontalOrVerticalConflict(); + +private: + std::set myConstraints; + std::set myConstraintsToRemove; +}; +#endif diff --git a/src/XGUI/SHAPER.xml b/src/XGUI/SHAPER.xml index 94ff4fcc6..ed65fcec5 100644 --- a/src/XGUI/SHAPER.xml +++ b/src/XGUI/SHAPER.xml @@ -10,6 +10,11 @@
+
+ + + +
@@ -42,5 +47,4 @@
- -- 2.39.2