]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
[bos #31549] [EDF] (2023-T1) Sketch Visualization of constrains asozinov/CR35149 20/head
authorasozinov <alexey.sozinov@opencascade.com>
Mon, 10 Jul 2023 12:14:58 +0000 (13:14 +0100)
committerasozinov <alexey.sozinov@opencascade.com>
Wed, 15 Nov 2023 16:59:24 +0000 (16:59 +0000)
- Added browser which show all constraints in the active sketch.
- This browser provide functionality for Delete, Edit and Suppress constraints
- Suppressed constraints can be reactivated

- for constraints will be added new attribute ConstraintState. If True - constraint active, otherwise - suppressed.
This parameter can be used as optional for python script. Example of using:
  Sketch_1.setCoincident(SketchLine_4.endPoint(), SketchLine_1.startPoint(), is_active = False)

Documentationalso will be added

81 files changed:
src/ModuleBase/ModuleBase_IModule.h
src/ModuleBase/ModuleBase_ISelection.h
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_SketcherMgr.cpp
src/PartSet/PartSet_SketcherMgr.h
src/SketchAPI/SketchAPI_Constraint.cpp
src/SketchAPI/SketchAPI_ConstraintAngle.cpp
src/SketchAPI/SketchAPI_Sketch.cpp
src/SketchAPI/SketchAPI_Sketch.h
src/SketchPlugin/SketchPlugin_Constraint.h
src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp
src/SketchPlugin/SketchPlugin_ConstraintCoincidence.cpp
src/SketchPlugin/SketchPlugin_ConstraintCollinear.cpp
src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp
src/SketchPlugin/SketchPlugin_ConstraintDistanceAlongDir.cpp
src/SketchPlugin/SketchPlugin_ConstraintEqual.cpp
src/SketchPlugin/SketchPlugin_ConstraintHorizontal.cpp
src/SketchPlugin/SketchPlugin_ConstraintLength.cpp
src/SketchPlugin/SketchPlugin_ConstraintMiddle.cpp
src/SketchPlugin/SketchPlugin_ConstraintMirror.cpp
src/SketchPlugin/SketchPlugin_ConstraintParallel.cpp
src/SketchPlugin/SketchPlugin_ConstraintPerpendicular.cpp
src/SketchPlugin/SketchPlugin_ConstraintRadius.cpp
src/SketchPlugin/SketchPlugin_ConstraintRigid.cpp
src/SketchPlugin/SketchPlugin_ConstraintTangent.cpp
src/SketchPlugin/SketchPlugin_ConstraintVertical.cpp
src/SketchPlugin/SketchPlugin_MultiRotation.cpp
src/SketchPlugin/SketchPlugin_MultiTranslation.cpp
src/SketchPlugin/SketchPlugin_Offset.cpp
src/SketchPlugin/doc/SketchPlugin.rst
src/SketchPlugin/doc/images/ConstraintsBrowser.png [new file with mode: 0644]
src/SketchPlugin/doc/images/constraints_suppressed.png [new file with mode: 0644]
src/SketchPlugin/doc/images/constraints_suppressed_moved.png [new file with mode: 0644]
src/SketchPlugin/doc/sketchConstraintsBrowser.rst [new file with mode: 0644]
src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.cpp
src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.h
src/SketchSolver/SketchSolver_ConstraintDistance.cpp
src/SketchSolver/SketchSolver_Group.cpp
src/SketchSolver/SketchSolver_Storage.h
src/SketcherPrs/CMakeLists.txt
src/SketcherPrs/SketcherPrs_Angle.cpp
src/SketcherPrs/SketcherPrs_Collinear.h
src/SketcherPrs/SketcherPrs_DimensionStyle.cpp
src/SketcherPrs/SketcherPrs_DimensionStyle.h
src/SketcherPrs/SketcherPrs_Equal.h
src/SketcherPrs/SketcherPrs_HVDirection.h
src/SketcherPrs/SketcherPrs_LengthDimension.cpp
src/SketcherPrs/SketcherPrs_Middle.h
src/SketcherPrs/SketcherPrs_Mirror.h
src/SketcherPrs/SketcherPrs_Offset.h
src/SketcherPrs/SketcherPrs_Parallel.h
src/SketcherPrs/SketcherPrs_Perpendicular.h
src/SketcherPrs/SketcherPrs_Radius.cpp
src/SketcherPrs/SketcherPrs_Rigid.h
src/SketcherPrs/SketcherPrs_SymbolPrs.cpp
src/SketcherPrs/SketcherPrs_SymbolPrs.h
src/SketcherPrs/SketcherPrs_Tangent.h
src/SketcherPrs/SketcherPrs_Transformation.h
src/SketcherPrs/icons/anchor_deactivate.png [new file with mode: 0644]
src/SketcherPrs/icons/collinear_deactivate.png [new file with mode: 0644]
src/SketcherPrs/icons/equal_deactivate.png [new file with mode: 0644]
src/SketcherPrs/icons/horisontal_deactivate.png [new file with mode: 0644]
src/SketcherPrs/icons/middlepoint_deactivate.png [new file with mode: 0644]
src/SketcherPrs/icons/parallel_deactivate.png [new file with mode: 0644]
src/SketcherPrs/icons/perpendicular_deactivate.png [new file with mode: 0644]
src/SketcherPrs/icons/tangent_deactivate.png [new file with mode: 0644]
src/SketcherPrs/icons/vertical_deactivate.png [new file with mode: 0644]
src/XGUI/CMakeLists.txt
src/XGUI/XGUI_ActionsMgr.cpp
src/XGUI/XGUI_ContextMenuMgr.cpp
src/XGUI/XGUI_ContextMenuMgr.h
src/XGUI/XGUI_Displayer.cpp
src/XGUI/XGUI_Selection.cpp
src/XGUI/XGUI_Selection.h
src/XGUI/XGUI_SelectionMgr.cpp
src/XGUI/XGUI_SelectionMgr.h
src/XGUI/XGUI_SketchConstraintsBrowser.cpp [new file with mode: 0644]
src/XGUI/XGUI_SketchConstraintsBrowser.h [new file with mode: 0644]
src/XGUI/XGUI_Workshop.cpp
src/XGUI/XGUI_Workshop.h
src/XGUI/XGUI_msg_fr.ts

index e60281374f745ab299dc1c5c6c9e774bcd59b91b..ac1ebde44c5f3b62d1b69e63c07dcf9fc6858205 100644 (file)
@@ -149,6 +149,10 @@ class MODULEBASE_EXPORT ModuleBase_IModule : public QObject
   /// \param theMenu a popup menu to be shown in the object browser
   virtual void addObjectBrowserMenu(QMenu* theMenu) const {};
 
+  /// Add menu items for constraints browser into the given menu
+  /// \param theMenu a popup menu to be shown in the constraints browser
+  virtual void addConstraintBrowserMenu(QMenu* theMenu) const {};
+
   /// Creates custom widgets for property panel
   /// \param theType a type of widget
   /// \param theParent the parent object
index c662231f2fcb2f4bc625471710ab93d757c23f01..a33e8c70892c5fd3cd599fe3ed59f34411605b14 100644 (file)
@@ -44,7 +44,7 @@ class MODULEBASE_EXPORT ModuleBase_ISelection
 {
 public:
   /// Types of the selection place, where the selection is obtained
-  enum SelectionPlace { Browser, Viewer, AllControls };
+  enum SelectionPlace { Browser, Viewer, ConstraintsBorwser, AllControls };
 
   virtual ~ModuleBase_ISelection() {}
 
index 73113c0066ee5a3db32218dfd89d467381d73b2c..84b28e4d03e789510786de8ba743cc6a19c49c9d 100644 (file)
 #include <XGUI_OperationMgr.h>
 #include <XGUI_PropertyPanel.h>
 #include <XGUI_SelectionMgr.h>
+#include <XGUI_SketchConstraintsBrowser.h>
 #include <XGUI_Tools.h>
 #include <XGUI_Workshop.h>
 
@@ -998,6 +999,24 @@ bool PartSet_Module::deleteObjects()
     // the abort leads to selection lost on constraint objects. It can be corrected after #386 issue
     ModuleBase_ISelection* aSel = workshop()->selection();
     QObjectPtrList aSelectedObj = aSel->selectedPresentations();
+
+    QObjectPtrList aConstrSelectedObj = getWorkshop()->constraintsBrowser()->selectedConstraints();
+    // if list not empty, delete only constraints from list
+    if (!aConstrSelectedObj.isEmpty())
+    {
+      QString aDescription = aWorkshop->contextMenuMgr()->action("DELETE_CMD")->text();
+      ModuleBase_Operation* anOpAction = new ModuleBase_Operation(aDescription, this);
+
+      bool isCommitted;
+      if (!anOpMgr->canStartOperation(anOpAction->id(), isCommitted))
+        return true;
+
+      anOpMgr->startOperation(anOpAction);
+      aWorkshop->deleteFeatures(aConstrSelectedObj);
+      anOpMgr->commitOperation();
+      return true;
+    }
+
     // if there are no selected objects in the viewer, that means that the selection in another
     // place cased this method. It is necessary to return the false value to understande in above
     // method that delete is not processed
index d47d1ec75589c66af6aed3931e8c8cb605776c98..42075abad43c3cd819d5504881ec5445a99068d1 100644 (file)
@@ -31,6 +31,7 @@
 #include "PartSet_PreviewSketchPlane.h"
 
 #include <XGUI_ModuleConnector.h>
+#include <XGUI_SketchConstraintsBrowser.h>
 #include <XGUI_Displayer.h>
 #include <XGUI_Workshop.h>
 #include <XGUI_ContextMenuMgr.h>
 #include <ModelAPI_Events.h>
 #include <ModelAPI_Session.h>
 #include <ModelAPI_AttributeString.h>
+#include <ModelAPI_AttributeRefAttr.h>
+#include <ModelAPI_AttributeDouble.h>
 
 #include <ModelAPI_Validator.h>
 #include <ModelAPI_Tools.h>
@@ -219,6 +222,11 @@ PartSet_SketcherMgr::~PartSet_SketcherMgr()
   delete mySketchPlane;
 }
 
+XGUI_SketchConstraintsBrowser* PartSet_SketcherMgr::constraintsBrowser()
+{
+  return workshop()->constraintsBrowser();
+}
+
 void PartSet_SketcherMgr::onEnterViewPort()
 {
   // 1. if the mouse over window, update the next flag. Do not perform update visibility of
@@ -850,6 +858,105 @@ void PartSet_SketcherMgr::onAfterContextMenu()
   myIsPopupMenuActive = false;
 }
 
+void PartSet_SketcherMgr::onEditValues()
+{
+  auto aConstrBrowser = constraintsBrowser();
+
+  auto anOperMgr = workshop()->operationMgr();
+
+  ModuleBase_Operation* anOpAction = new ModuleBase_Operation("Edit Constraints value");
+
+  anOperMgr->startOperation(anOpAction);
+  int aRow = 0;
+  QTreeWidgetItemIterator anIter(aConstrBrowser->getViewTree());
+  while (*anIter) {
+    // Change value
+    auto aData = (*anIter)->data(3, 0);
+    if (!aData.isNull())
+    {
+      double aNewValue = aData.toDouble();
+      auto aName = (*anIter)->data(1, 0).toString();
+      FeaturePtr aConstr;
+      for (int i = 0; i < myCurrentSketch->numberOfSubs(); ++i)
+      {
+        auto aFFeat = myCurrentSketch->subFeature(i);
+        if (aName == QString::fromStdWString(aFFeat->name()))
+        {
+          aConstr = aFFeat;
+          break;
+        }
+      }
+
+      aConstr->real("ConstraintValue")->setValue(aNewValue);
+
+      if (aConstr->real("AngleValue"))
+        aConstr->real("AngleValue")->setValue(aNewValue);
+      else if (aConstr->real("DistanceValue"))
+        aConstr->real("DistanceValue")->setValue(aNewValue);
+      else
+        aConstr->real("ConstraintValue")->setValue(aNewValue);
+    }
+
+    ++aRow;
+    ++anIter;
+  }
+  anOperMgr->commitOperation();
+  workshop()->viewer()->update();
+}
+
+// Rename
+void PartSet_SketcherMgr::onUpdateConstraintsList()
+{
+  auto aConstrBrowser = constraintsBrowser();
+
+  std::vector<std::pair<FeaturePtr, std::vector<AttributePtr>>> aConstraints;
+
+  CompositeFeaturePtr aComposite =
+    std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(activeSketch());
+  int aNumSubs = aComposite->numberOfSubs();
+  for (int i = 0; i < aNumSubs; ++i)
+  {
+    auto aFeat = aComposite->subFeature(i);
+    if (aFeat->refattr(SketchPlugin_Constraint::ENTITY_A()) &&
+      (!aFeat->attribute(SketchPlugin_Constraint::ENTITY_B()) || aFeat->refattr(SketchPlugin_Constraint::ENTITY_B())))
+    {
+      std::pair<FeaturePtr, std::vector<AttributePtr>> anElemContr;
+      anElemContr.first = aFeat;
+
+      anElemContr.second.push_back(aFeat->refattr(SketchPlugin_Constraint::ENTITY_A()));
+      if (aFeat->attribute(SketchPlugin_Constraint::ENTITY_B()))
+        anElemContr.second.push_back(aFeat->refattr(SketchPlugin_Constraint::ENTITY_B()));
+
+      aConstraints.push_back(anElemContr);
+    }
+  }
+  aConstrBrowser->UpdateTree(aConstraints);
+}
+
+// Bad way, but it works
+void PartSet_SketcherMgr::onDeactivate(bool isNeedDeactivate, std::vector<FeaturePtr> theFeatures)
+{
+  std::list<ObjectPtr> anUpd;
+  auto anOperMgr = workshop()->operationMgr();
+
+  ModuleBase_OperationFeature* anOpAction = new ModuleBase_OperationFeature("Deactivate/Activate");
+  anOpAction->setFeature(myCurrentSketch);
+  startNestedSketch(anOpAction);
+  anOperMgr->startOperation(anOpAction);
+
+  for (int i = 0; i < theFeatures.size(); ++i)
+  {
+    theFeatures[i]->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(isNeedDeactivate);
+
+    static const Events_ID anEvent = Events_Loop::eventByName(EVENT_VISUAL_ATTRIBUTES);
+    ModelAPI_EventCreator::get()->sendUpdated(theFeatures[i], anEvent, false);
+  }
+
+  stopNestedSketch(anOpAction);
+  anOperMgr->commitOperation();
+  workshop()->viewer()->update();
+}
+
 void PartSet_SketcherMgr::get2dPoint(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent,
                                      Point& thePoint)
 {
@@ -1200,6 +1307,17 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation)
 
   PartSet_Fitter* aFitter = new PartSet_Fitter(this);
   myModule->workshop()->viewer()->setFitter(aFitter);
+
+  auto aDesktop = workshop()->desktop();
+  myConstraintsBrowser = workshop()->createConstraintsBrowser(aDesktop);
+
+  // For process edit/delete and deactivate/activate constraints
+  connect(constraintsBrowser(), SIGNAL(editValues()), this, SLOT(onEditValues()));
+  connect(constraintsBrowser(), SIGNAL(deleteCosnstraints()), this, SLOT(onUpdateConstraintsList()));
+  connect(constraintsBrowser(), SIGNAL(deactivate(bool, std::vector<FeaturePtr>)), this, SLOT(onDeactivate(bool, std::vector<FeaturePtr>)));
+  aDesktop->addDockWidget(Qt::RightDockWidgetArea, myConstraintsBrowser);
+
+  onUpdateConstraintsList();
 }
 
 void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation)
@@ -1274,6 +1392,17 @@ void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation)
   workshop()->selectionActivate()->updateSelectionFilters();
   workshop()->selectionActivate()->updateSelectionModes();
   workshop()->viewer()->set2dMode(false);
+
+  disconnect(constraintsBrowser(), SIGNAL(editValues()), this, SLOT(onEditValues()));
+  disconnect(constraintsBrowser(), SIGNAL(deleteCosnstraints()), this, SLOT(onUpdateConstraintsList()));
+  disconnect(constraintsBrowser(), SIGNAL(deactivate(bool, std::vector<FeaturePtr>)), this, SLOT(onDeactivate(bool, std::vector<FeaturePtr>)));
+
+  workshop()->desktop()->removeDockWidget(myConstraintsBrowser);
+  std::vector<std::pair<FeaturePtr, std::vector<AttributePtr>>> anEmpty;
+  constraintsBrowser()->UpdateTree(anEmpty);
+  workshop()->removeConstrBrowser();
+
+  myConstraintsBrowser->deleteLater();
 }
 
 void PartSet_SketcherMgr::startNestedSketch(ModuleBase_Operation* theOperation)
@@ -2266,11 +2395,15 @@ bool isIncludeToResult(const ObjectPtr& theObject)
 
 //**************************************************************************************
 std::vector<int> PartSet_SketcherMgr::colorOfObject(const ObjectPtr& theObject,
-  const FeaturePtr& theFeature, bool isConstruction) const
+  const FeaturePtr& theFeature, bool isConstruction, bool isSuppressedConstraint) const
 {
   PartSet_OverconstraintListener* aOCListener = myModule->overconstraintListener();
   std::string aKind = theFeature->getKind();
 
+  // may be Preference Config_PropManager::color("Visualization", "sketch_deactivated_color");
+  if (isSuppressedConstraint)
+    return { 128, 128, 128 };
+
   if (aOCListener->isConflictingObject(theObject)) {
     return Config_PropManager::color("Visualization", "sketch_overconstraint_color");
   }
@@ -2303,7 +2436,11 @@ void PartSet_SketcherMgr::customizeSketchPresentation(const ObjectPtr& theObject
     aFeature->data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID());
   bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value();
 
-  std::vector<int> aColor = colorOfObject(theObject, aFeature, isConstruction);
+  bool isSupressed = false;
+  if (aFeature->data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()))
+    isSupressed = !aFeature->data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value();
+
+  std::vector<int> aColor = colorOfObject(theObject, aFeature, isConstruction, isSupressed);
   if (!aColor.empty()) {
     // The code below causes redisplay again
     if (ModelAPI_Session::get()->isOperation()) {
index 14d88a1688e56f4ea9194efdd9f4dcba0e17f280..7092ed769b388f8b47c35c4107a1a575568e437c 100644 (file)
@@ -66,6 +66,7 @@ class ModuleBase_Operation;
 class XGUI_OperationMgr;
 class XGUI_Workshop;
 class XGUI_Displayer;
+class XGUI_SketchConstraintsBrowser;
 class PartSet_ExternalPointsMgr;
 
 class AIS_InteractiveObject;
@@ -387,6 +388,8 @@ public:
   /// Returns true if current mode of objects creation is by drag mouse
   bool isDragModeCreation() const;
 
+  // Get constraints browser
+  XGUI_SketchConstraintsBrowser* constraintsBrowser();
 
 public slots:
   /// Process sketch plane selected event
@@ -396,6 +399,10 @@ public slots:
   /// \param toShow a state of the check box
   void onShowPoints(bool toShow);
 
+  void onEditValues();
+  void onUpdateConstraintsList();
+  void onDeactivate(bool isNeedDeactivate, std::vector<FeaturePtr> theFeatures);
+
 private slots:
   /// Toggle show constraints
   void onShowConstraintsToggle(int theType, bool theState);
@@ -485,7 +492,7 @@ private:
   XGUI_OperationMgr* operationMgr() const;
 
   std::vector<int> colorOfObject(const ObjectPtr& theObject,
-    const FeaturePtr& aFeature, bool isConstruction) const;
+    const FeaturePtr& aFeature, bool isConstruction, bool isSuppressedConstraint) const;
 
 private:
   PartSet_Module* myModule;
@@ -518,6 +525,8 @@ private:
   bool myNoDragMoving;
 
   QPoint myMousePoint;
+
+  QDockWidget* myConstraintsBrowser;
 };
 
 
index 9149d2395b60afc98e15bd3461cabb62b2acfa35..fb4787f36107959ce706f3d741d56af0145bbd64 100644 (file)
@@ -228,5 +228,8 @@ void SketchAPI_Constraint::dump(ModelHighAPI_Dumper& theDumper) const
     theDumper << ", " << isSigned->value();
   }
 
+  bool isActive = aBase->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value();
+  theDumper << ", is_active = " << isActive;
+
   theDumper << ")" << std::endl;
 }
index edf90a5d3871abf1100171c34e446f967fc64be6..016bdb9b1762797d0a7273d8179c1bb40d3488a5 100644 (file)
@@ -148,5 +148,7 @@ void SketchAPI_ConstraintAngle::dump(ModelHighAPI_Dumper& theDumper) const
     theDumper << ", " << aValueAttr;
 
   std::string aType = angleTypeToString(aBase);
-  theDumper << ", type = \"" << aType << "\")" << std::endl;
+  theDumper << ", type = \"" << aType << "\"";
+  bool isActive = aBase->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value();
+  theDumper << ", is_active = " << isActive << ")" << std::endl;
 }
index 34503d972d49f04a3484a5eb3b588b722169c504..1e8aa8bf1bb86a94bf8859d11c09fe6affc9ccfd 100644 (file)
@@ -1010,7 +1010,8 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setAngle(
     const ModelHighAPI_RefAttr & theLine1,
     const ModelHighAPI_RefAttr & theLine2,
     const ModelHighAPI_Double & theValue,
-    const std::string& theType)
+    const std::string& theType,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintAngle::ID());
@@ -1028,6 +1029,7 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setAngle(
 
   fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
 
   if (aVersion == SketchPlugin_ConstraintAngle::THE_VERSION_1) {
     std::string aTypeLC = theType;
@@ -1049,7 +1051,8 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setAngle(
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setAngleComplementary(
     const ModelHighAPI_RefAttr & theLine1,
     const ModelHighAPI_RefAttr & theLine2,
-    const ModelHighAPI_Double & theValue)
+    const ModelHighAPI_Double & theValue,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintAngle::ID());
@@ -1060,6 +1063,7 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setAngleComplementary(
   fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID()));
   fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
@@ -1067,7 +1071,8 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setAngleComplementary(
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setAngleBackward(
     const ModelHighAPI_RefAttr & theLine1,
     const ModelHighAPI_RefAttr & theLine2,
-    const ModelHighAPI_Double & theValue)
+    const ModelHighAPI_Double & theValue,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintAngle::ID());
@@ -1078,30 +1083,35 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setAngleBackward(
   fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID()));
   fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setCoincident(
     const ModelHighAPI_RefAttr & thePoint1,
-    const ModelHighAPI_RefAttr & thePoint2)
+    const ModelHighAPI_RefAttr & thePoint2,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintCoincidence::ID());
   fillAttribute(thePoint1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(thePoint2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setCollinear(
     const ModelHighAPI_RefAttr & theLine1,
-    const ModelHighAPI_RefAttr & theLine2)
+    const ModelHighAPI_RefAttr & theLine2,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintCollinear::ID());
   fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
@@ -1110,7 +1120,8 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setDistance(
     const ModelHighAPI_RefAttr & thePoint,
     const ModelHighAPI_RefAttr & thePointOrLine,
     const ModelHighAPI_Double & theValue,
-    bool isSigned)
+    bool isSigned,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintDistance::ID());
@@ -1118,6 +1129,7 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setDistance(
   fillAttribute(thePointOrLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
   fillAttribute(theValue, aFeature->real(SketchPlugin_Constraint::VALUE()));
   fillAttribute(isSigned, aFeature->boolean(SketchPlugin_ConstraintDistance::SIGNED()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
@@ -1125,23 +1137,26 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setDistance(
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setSignedDistance(
     const ModelHighAPI_RefAttr & thePoint,
     const ModelHighAPI_RefAttr & thePointOrLine,
-    const ModelHighAPI_Double & theValue)
+    const ModelHighAPI_Double & theValue,
+    bool theIsActive)
 {
-  return setDistance(thePoint, thePointOrLine, theValue, true);
+  return setDistance(thePoint, thePointOrLine, theValue, true, theIsActive);
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setUnsignedDistance(
     const ModelHighAPI_RefAttr & thePoint,
     const ModelHighAPI_RefAttr & thePointOrLine,
-    const ModelHighAPI_Double & theValue)
+    const ModelHighAPI_Double & theValue,
+    bool theIsActive)
 {
-  return setDistance(thePoint, thePointOrLine, theValue, false);
+  return setDistance(thePoint, thePointOrLine, theValue, false, theIsActive);
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setHorizontalDistance(
     const ModelHighAPI_RefAttr & thePoint1,
     const ModelHighAPI_RefAttr & thePoint2,
-    const ModelHighAPI_Double & theValue)
+    const ModelHighAPI_Double & theValue,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintDistanceHorizontal::ID());
@@ -1149,6 +1164,7 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setHorizontalDistance(
   fillAttribute(thePoint2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
   fillAttribute(theValue,
       aFeature->real(SketchPlugin_ConstraintDistanceAlongDir::DISTANCE_VALUE_ID()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
@@ -1156,7 +1172,8 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setHorizontalDistance(
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setVerticalDistance(
     const ModelHighAPI_RefAttr & thePoint1,
     const ModelHighAPI_RefAttr & thePoint2,
-    const ModelHighAPI_Double & theValue)
+    const ModelHighAPI_Double & theValue,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintDistanceVertical::ID());
@@ -1164,18 +1181,21 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setVerticalDistance(
   fillAttribute(thePoint2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
   fillAttribute(theValue,
       aFeature->real(SketchPlugin_ConstraintDistanceAlongDir::DISTANCE_VALUE_ID()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setEqual(
     const ModelHighAPI_RefAttr & theObject1,
-    const ModelHighAPI_RefAttr & theObject2)
+    const ModelHighAPI_RefAttr & theObject2,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintEqual::ID());
   fillAttribute(theObject1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(theObject2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
@@ -1209,103 +1229,121 @@ std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setFilletWithRadius(
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setFixed(
-    const ModelHighAPI_RefAttr & theObject)
+    const ModelHighAPI_RefAttr & theObject,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintRigid::ID());
   fillAttribute(theObject, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setHorizontal(
-    const ModelHighAPI_RefAttr & theLine)
+    const ModelHighAPI_RefAttr & theLine,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintHorizontal::ID());
   fillAttribute(theLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setLength(
     const ModelHighAPI_RefAttr & theLine,
-    const ModelHighAPI_Double & theValue)
+    const ModelHighAPI_Double & theValue,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintLength::ID());
   fillAttribute(theLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(theValue, aFeature->real(SketchPlugin_Constraint::VALUE()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setMiddlePoint(
     const ModelHighAPI_RefAttr & thePoint,
-    const ModelHighAPI_RefAttr & theLine)
+    const ModelHighAPI_RefAttr & theLine,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintMiddle::ID());
   fillAttribute(thePoint, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(theLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setParallel(
     const ModelHighAPI_RefAttr & theLine1,
-    const ModelHighAPI_RefAttr & theLine2)
+    const ModelHighAPI_RefAttr & theLine2,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintParallel::ID());
   fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setPerpendicular(
     const ModelHighAPI_RefAttr & theLine1,
-    const ModelHighAPI_RefAttr & theLine2)
+    const ModelHighAPI_RefAttr & theLine2,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintPerpendicular::ID());
   fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setRadius(
     const ModelHighAPI_RefAttr & theCircleOrArc,
-    const ModelHighAPI_Double & theValue)
+    const ModelHighAPI_Double & theValue,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintRadius::ID());
   fillAttribute(theCircleOrArc, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(theValue, aFeature->real(SketchPlugin_Constraint::VALUE()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setTangent(
     const ModelHighAPI_RefAttr & theLine,
-    const ModelHighAPI_RefAttr & theCircle)
+    const ModelHighAPI_RefAttr & theCircle,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintTangent::ID());
   fillAttribute(theLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
   fillAttribute(theCircle, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::setVertical(
-    const ModelHighAPI_RefAttr & theLine)
+    const ModelHighAPI_RefAttr & theLine,
+    bool theIsActive)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
       compositeFeature()->addFeature(SketchPlugin_ConstraintVertical::ID());
   fillAttribute(theLine, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
+  fillAttribute(theIsActive, aFeature->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()));
   aFeature->execute();
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
index f9c8fdb794d06d4fa73491feadac9ca06837e995..0e8ffce49b94d3c6261dba717d8137bd35314822 100644 (file)
@@ -420,33 +420,38 @@ public:
       const ModelHighAPI_RefAttr & theLine1,
       const ModelHighAPI_RefAttr & theLine2,
       const ModelHighAPI_Double & theValue,
-      const std::string& type = std::string());
+      const std::string& type = std::string(),
+      bool is_active = true);
 
   /// Set complementary angle
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setAngleComplementary(
       const ModelHighAPI_RefAttr & theLine1,
       const ModelHighAPI_RefAttr & theLine2,
-      const ModelHighAPI_Double & theValue);
+      const ModelHighAPI_Double & theValue,
+      bool is_active = true);
 
   /// Set backward angle (= 360 - angle)
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setAngleBackward(
       const ModelHighAPI_RefAttr & theLine1,
       const ModelHighAPI_RefAttr & theLine2,
-      const ModelHighAPI_Double & theValue);
+      const ModelHighAPI_Double & theValue,
+      bool is_active = true);
 
   /// Set coincident
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setCoincident(
       const ModelHighAPI_RefAttr & thePoint1,
-      const ModelHighAPI_RefAttr & thePoint2);
+      const ModelHighAPI_RefAttr & thePoint2,
+      bool is_active = true);
 
   /// Set collinear
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setCollinear(
       const ModelHighAPI_RefAttr & theLine1,
-      const ModelHighAPI_RefAttr & theLine2);
+      const ModelHighAPI_RefAttr & theLine2,
+      bool is_active = true);
 
   /// Set distance
   SKETCHAPI_EXPORT
@@ -454,41 +459,47 @@ public:
       const ModelHighAPI_RefAttr & thePoint,
       const ModelHighAPI_RefAttr & thePointOrLine,
       const ModelHighAPI_Double & theValue,
-      bool isSigned = false);
+      bool isSigned = false,
+      bool is_active = true);
 
   /// Set signed distance
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setSignedDistance(
       const ModelHighAPI_RefAttr & thePoint,
       const ModelHighAPI_RefAttr & thePointOrLine,
-      const ModelHighAPI_Double & theValue);
+      const ModelHighAPI_Double & theValue,
+      bool is_active = true);
 
   /// Set unsigned distance
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setUnsignedDistance(
       const ModelHighAPI_RefAttr & thePoint,
       const ModelHighAPI_RefAttr & thePointOrLine,
-      const ModelHighAPI_Double & theValue);
+      const ModelHighAPI_Double & theValue,
+      bool is_active = true);
 
   /// Set horizontal distance
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setHorizontalDistance(
       const ModelHighAPI_RefAttr & thePoint1,
       const ModelHighAPI_RefAttr & thePoint2,
-      const ModelHighAPI_Double & theValue);
+      const ModelHighAPI_Double & theValue,
+      bool is_active = true);
 
   /// Set vertical distance
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setVerticalDistance(
       const ModelHighAPI_RefAttr & thePoint1,
       const ModelHighAPI_RefAttr & thePoint2,
-      const ModelHighAPI_Double & theValue);
+      const ModelHighAPI_Double & theValue,
+      bool is_active = true);
 
   /// Set equal
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setEqual(
       const ModelHighAPI_RefAttr & theObject1,
-      const ModelHighAPI_RefAttr & theObject2);
+      const ModelHighAPI_RefAttr & theObject2,
+      bool is_active = true);
 
   /// Set fillet
   SKETCHAPI_EXPORT
@@ -504,53 +515,62 @@ public:
   /// Set fixed
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setFixed(
-      const ModelHighAPI_RefAttr & theObject);
+      const ModelHighAPI_RefAttr & theObject,
+      bool is_active = true);
 
   /// Set horizontal
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setHorizontal(
-      const ModelHighAPI_RefAttr & theLine);
+      const ModelHighAPI_RefAttr & theLine,
+      bool is_active = true);
 
   /// Set length
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setLength(
       const ModelHighAPI_RefAttr & theLine,
-      const ModelHighAPI_Double & theValue);
+      const ModelHighAPI_Double & theValue,
+      bool is_active = true);
 
   /// Set middle
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setMiddlePoint(
       const ModelHighAPI_RefAttr & thePoint,
-      const ModelHighAPI_RefAttr & theLine);
+      const ModelHighAPI_RefAttr & theLine,
+      bool is_active = true);
 
   /// Set parallel
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setParallel(
       const ModelHighAPI_RefAttr & theLine1,
-      const ModelHighAPI_RefAttr & theLine2);
+      const ModelHighAPI_RefAttr & theLine2,
+      bool is_active = true);
 
   /// Set perpendicular
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setPerpendicular(
       const ModelHighAPI_RefAttr & theLine1,
-      const ModelHighAPI_RefAttr & theLine2);
+      const ModelHighAPI_RefAttr & theLine2,
+      bool is_active = true);
 
   /// Set radius
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setRadius(
       const ModelHighAPI_RefAttr & theCircleOrArc,
-      const ModelHighAPI_Double & theValue);
+      const ModelHighAPI_Double & theValue,
+      bool is_active = true);
 
   /// Set tangent
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setTangent(
       const ModelHighAPI_RefAttr & theLine,
-      const ModelHighAPI_RefAttr & theCircle);
+      const ModelHighAPI_RefAttr & theCircle,
+      bool is_active = true);
 
   /// Set vertical
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> setVertical(
-      const ModelHighAPI_RefAttr & theLine);
+      const ModelHighAPI_RefAttr & theLine,
+      bool is_active = true);
 
   /// Set constraint value
   SKETCHAPI_EXPORT
index 7b572387500fe7cecaf1178ffe70f08ee29e8ac2..8a2662257244eba7a076a23c29d898b5026a170f 100644 (file)
@@ -46,6 +46,12 @@ class SketchPlugin_Constraint : public SketchPlugin_Feature
     static const std::string MY_FLYOUT_VALUE_PNT("ConstraintFlyoutValuePnt");
     return MY_FLYOUT_VALUE_PNT;
   }
+  /// State of constraint - Active - true, Suppressed - false
+  inline static const std::string& CONSTRAINT_ACTIVE()
+  {
+    static const std::string MY_STATE("ConstraintState");
+    return MY_STATE;
+  }
   /// First entity for the constraint
   inline static const std::string& ENTITY_A()
   {
index cdb3309ecf47c08e50ea813d3c2e0ec5ce2730a6..4b8f8f85f84626efa6273be4c1e8c2ac9a1eb270 100644 (file)
@@ -79,6 +79,10 @@ void SketchPlugin_ConstraintAngle::initAttributes()
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT(), GeomDataAPI_Point2D::typeId());
 
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
+
   data()->addAttribute(ANGLE_VALUE_ID(), ModelAPI_AttributeDouble::typeId());
   data()->addAttribute(TYPE_ID(), ModelAPI_AttributeInteger::typeId());
 
index 795eee98dc9474dff7f0d7998b852515dec190e8..e1e9fd87ae2bdd66fec4aee4a26238da3f5b39d8 100644 (file)
@@ -40,6 +40,10 @@ void SketchPlugin_ConstraintCoincidence::initAttributes()
 {
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
+
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
 }
 
 void SketchPlugin_ConstraintCoincidence::execute()
index e689458e862e76a0660c430ca73ed2628382d3b1..75dd96b2cbdbc9a48e057bbb0d045c934728d185 100644 (file)
@@ -29,6 +29,10 @@ void SketchPlugin_ConstraintCollinear::initAttributes()
 {
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
+
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
 }
 
 void SketchPlugin_ConstraintCollinear::execute()
index 2f2c59b0a85721c43c5ccf9c164d11e678146864..3e8cf3b84590e900aacf0f0a44571d4548cba9a0 100644 (file)
@@ -60,6 +60,10 @@ void SketchPlugin_ConstraintDistance::initAttributes()
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(SIGNED(), ModelAPI_AttributeBoolean::typeId());
 
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
+
   data()->addAttribute(SketchPlugin_ConstraintDistance::LOCATION_TYPE_ID(),
                        ModelAPI_AttributeInteger::typeId());
   ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), LOCATION_TYPE_ID());
index e15b4402ced28972b9851e3f17169c53707ba3d1..ff52043132113b5e4d82db9702706761a67f0a7e 100644 (file)
@@ -56,6 +56,10 @@ void SketchPlugin_ConstraintDistanceAlongDir::initAttributes()
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
 
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
+
   data()->addAttribute(LOCATION_TYPE_ID(), ModelAPI_AttributeInteger::typeId());
   ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), LOCATION_TYPE_ID());
 
index e3637a73e8f3a3c51fa89a68b0626e41d3c31f84..9dceebd3142c6ce0043b3dcf4c93c458258538f9 100644 (file)
@@ -38,6 +38,10 @@ void SketchPlugin_ConstraintEqual::initAttributes()
 {
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
+
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
 }
 
 void SketchPlugin_ConstraintEqual::execute()
index dae341a661f990c278737be433a817dd35778ab7..e8d988e3314154cd3e219f72b3617bf7d190bea1 100644 (file)
@@ -38,6 +38,10 @@ SketchPlugin_ConstraintHorizontal::SketchPlugin_ConstraintHorizontal()
 void SketchPlugin_ConstraintHorizontal::initAttributes()
 {
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
+
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
 }
 
 void SketchPlugin_ConstraintHorizontal::execute()
index cfe1da52f31c811bdfdf8be32dbf34b47a3d0115..6b706bcba9a072f2f59615cb0ac3d3229d8f9d78 100644 (file)
@@ -57,6 +57,10 @@ void SketchPlugin_ConstraintLength::initAttributes()
   data()->addAttribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT(), GeomDataAPI_Point2D::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
 
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
+
   data()->addAttribute(SketchPlugin_ConstraintLength::LOCATION_TYPE_ID(),
                        ModelAPI_AttributeInteger::typeId());
   ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), LOCATION_TYPE_ID());
index ad9ab375593c4ed2476952e8ca3c5d1cd2d80fac..209d325a8d8ac147aa98cc2569e33a6436029c3e 100644 (file)
@@ -29,6 +29,10 @@ void SketchPlugin_ConstraintMiddle::initAttributes()
 {
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
+
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
 }
 
 void SketchPlugin_ConstraintMiddle::execute()
index fbbb8044aafd90de9b8f4ba88fc3deafa48dc0bf..07d6c887d11b5cbdc0b9bc149ebb66551493a689 100644 (file)
@@ -50,6 +50,10 @@ void SketchPlugin_ConstraintMirror::initAttributes()
     registerNotObligatory(getKind(), SketchPlugin_Constraint::ENTITY_B());
   ModelAPI_Session::get()->validators()->
     registerNotObligatory(getKind(), SketchPlugin_Constraint::ENTITY_C());
+
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
 }
 
 void SketchPlugin_ConstraintMirror::execute()
index 2c5977867a7d0314e1883b7392bc11b81b46e582..b4e588302fcabaa233fa533696466a11275c5a7b 100644 (file)
@@ -44,6 +44,10 @@ void SketchPlugin_ConstraintParallel::initAttributes()
 {
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
+
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
 }
 
 void SketchPlugin_ConstraintParallel::execute()
index 108ee2a16137e46fc6047b056bee4ca848e970e0..6b269adea26dbb59bdbc3303c934f7483a91bb45 100644 (file)
@@ -43,6 +43,10 @@ void SketchPlugin_ConstraintPerpendicular::initAttributes()
 {
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
+
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
 }
 
 void SketchPlugin_ConstraintPerpendicular::execute()
index 6dc1bd1dfd8d1225d9ecd1aca9b92aa3638001ba..5cb56ca3d804f48eef6071ed44374587697164a1 100644 (file)
@@ -57,6 +57,10 @@ void SketchPlugin_ConstraintRadius::initAttributes()
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT(), GeomDataAPI_Point2D::typeId());
 
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
+
   data()->addAttribute(SketchPlugin_ConstraintRadius::LOCATION_TYPE_ID(),
                        ModelAPI_AttributeInteger::typeId());
   ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), LOCATION_TYPE_ID());
index e70c77b37d8a1cb67b559c14ddf6cb7577622a1c..1c7b9de444d3bc5200946fa40d1a6a64640cdae9 100644 (file)
@@ -36,6 +36,10 @@ SketchPlugin_ConstraintRigid::SketchPlugin_ConstraintRigid()
 void SketchPlugin_ConstraintRigid::initAttributes()
 {
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
+
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
 }
 
 void SketchPlugin_ConstraintRigid::execute()
index 224ac900ad997c00c2af0db7e32fc56add01b482..0124690f4591d9c2fd3027bab9ab2bc2dae5b8e8 100644 (file)
@@ -38,6 +38,10 @@ void SketchPlugin_ConstraintTangent::initAttributes()
 {
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
+
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
 }
 
 void SketchPlugin_ConstraintTangent::execute()
index e921e84049ca485537a9ac663465dcf5b44778aa..f76363e684d43bed7cc3cdf8f44a5b9704add7aa 100644 (file)
@@ -37,6 +37,10 @@ SketchPlugin_ConstraintVertical::SketchPlugin_ConstraintVertical()
 void SketchPlugin_ConstraintVertical::initAttributes()
 {
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
+
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
 }
 
 void SketchPlugin_ConstraintVertical::execute()
index 4e862e11987ee89d71964af248e1f395af997de4..3bcec646f4b48400d4f52ad1bf53efaaf21dda0e 100644 (file)
@@ -64,6 +64,10 @@ void SketchPlugin_MultiRotation::initAttributes()
   data()->addAttribute(ROTATION_LIST_ID(), ModelAPI_AttributeRefList::typeId());
   data()->addAttribute(REVERSED_ID(), ModelAPI_AttributeBoolean::typeId());
 
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
+
   ModelAPI_Session::get()->validators()->
     registerNotObligatory(getKind(), SketchPlugin_Constraint::ENTITY_A());
   ModelAPI_Session::get()->validators()->
index 8a543fcaf26885ca3a7e02c6a67893634681f5ee..aad9212660dc54d3bf767429e8dfdc213f9dfd29 100644 (file)
@@ -48,6 +48,10 @@ void SketchPlugin_MultiTranslation::initAttributes()
   data()->addAttribute(START_POINT_ID(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(END_POINT_ID(), ModelAPI_AttributeRefAttr::typeId());
 
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
+
   data()->addAttribute(NUMBER_OF_OBJECTS_ID(), ModelAPI_AttributeInteger::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefList::typeId());
   data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefList::typeId());
index aabe5babf323d012e53506460274b187302edcb1..90101c95d992e9a8b42f374faf0a4ae797bbeee8 100644 (file)
@@ -79,6 +79,10 @@ void SketchPlugin_Offset::initAttributes()
   data()->addAttribute(VALUE_ID(), ModelAPI_AttributeDouble::typeId());
   data()->addAttribute(REVERSED_ID(), ModelAPI_AttributeBoolean::typeId());
 
+  // By default set true;
+  data()->addAttribute(SketchPlugin_Constraint::CONSTRAINT_ACTIVE(), ModelAPI_AttributeBoolean::typeId());
+  data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->setValue(true);
+
   // Always initialize approximation to false by default for backward compatibility
   AttributeBooleanPtr approxAttr = std::dynamic_pointer_cast<ModelAPI_AttributeBoolean>(
     data()->addAttribute(APPROX_ID(), ModelAPI_AttributeBoolean::typeId()));
index d1c47eb22e9a7de66ca19fb79c34f3bd14543a47..e98c502a9a0179fb501cec375a055605d5cf17dc 100644 (file)
@@ -53,6 +53,15 @@ After the plane for sketch is selected, the following property panel will be ope
 - **Change sketch plane** button - allows to change working plane of the current sketch.
 - **Show remaining DoFs** button - highlights all sketch edges which are not fully constrained.
 
+Also will be opened window with created constraints:
+
+.. figure:: images/ConstraintsBrowser.png
+   :align: center
+
+   Sketch constraints browser
+
+**See** :ref:`sketchConstraintsBrowsers`
+
 Now it is possible to:
 
 - create :ref:`sketch objects <sketch_objects>`
diff --git a/src/SketchPlugin/doc/images/ConstraintsBrowser.png b/src/SketchPlugin/doc/images/ConstraintsBrowser.png
new file mode 100644 (file)
index 0000000..47f40ab
Binary files /dev/null and b/src/SketchPlugin/doc/images/ConstraintsBrowser.png differ
diff --git a/src/SketchPlugin/doc/images/constraints_suppressed.png b/src/SketchPlugin/doc/images/constraints_suppressed.png
new file mode 100644 (file)
index 0000000..66ea1de
Binary files /dev/null and b/src/SketchPlugin/doc/images/constraints_suppressed.png differ
diff --git a/src/SketchPlugin/doc/images/constraints_suppressed_moved.png b/src/SketchPlugin/doc/images/constraints_suppressed_moved.png
new file mode 100644 (file)
index 0000000..1809ede
Binary files /dev/null and b/src/SketchPlugin/doc/images/constraints_suppressed_moved.png differ
diff --git a/src/SketchPlugin/doc/sketchConstraintsBrowser.rst b/src/SketchPlugin/doc/sketchConstraintsBrowser.rst
new file mode 100644 (file)
index 0000000..3a5e72b
--- /dev/null
@@ -0,0 +1,45 @@
+
+.. _sketchConstraintsBrowsers:
+
+Sketch Constraints Browser
+================
+.. figure:: images/ConstraintsBrowser.png
+   :align: center
+
+   Sketch constraints browser
+
+- **Extended Information** check box - allows showing/hiding **Primitives** and **Parameter** columns
+
+Right click by any constraint provide following funtionality:
+
+- **Edit...** - allows edit dimensional value if it exist
+- **Delete** - allows delete constraints
+- **Deactivate/Activate** - allows deactivate/activate constraints
+
+Edit
+================
+
+For dimension constraints (Angle, Length, Radius e.t.c.) you can change value. Ways for change:
+1. Select all constraints, which you can modify. Right Click -> Edit... -> Input new values. After press Apply button;
+2. In empty place Right click -> Edit... - will be modified all constraints.
+3. Double click by constrints value - modify only selected constraint value 
+
+Delete
+================
+
+Select constraints for delete -> Rightg Click -> Delete. All selected constraints will be deleted
+
+Deactivate
+================
+
+.. figure:: images/constraints_suppressed.png
+   :align: center
+
+   Suppresed constraints
+   
+.. figure:: images/constraints_suppressed_moved.png
+   :align: center
+
+   Suppresed constraints moved
+   
+This allows you to deactivate and activate already applied constraints. Suppressed constraint allows you keep constraint and check another  arrangement of the existing geometry.
index deefed48c7ee7b0d93d75ff4c57d91b9dfd08c72..eee60125a449943e37b6154ef605b0c3a7570a98 100644 (file)
@@ -66,7 +66,8 @@ void PlaneGCSSolver_Storage::addConstraint(
 {
   SketchSolver_Storage::addConstraint(theConstraint, theSolverConstraint);
 
-  theSolverConstraint->setId(++myConstraintLastID);
+  if (theSolverConstraint->id() == 0)
+    theSolverConstraint->setId(++myConstraintLastID);
   constraintsToSolver(theSolverConstraint, mySketchSolver);
 }
 
@@ -515,6 +516,62 @@ bool PlaneGCSSolver_Storage::removeConstraint(ConstraintPtr theConstraint)
   return true;
 }
 
+bool PlaneGCSSolver_Storage::changeActiveStatus(ConstraintPtr theConstraint, bool theNewState)
+{
+  if (theNewState)
+  {
+    // activate
+    auto aPair = myDeactivatedConstraintMap.find(theConstraint);
+    if (aPair == myDeactivatedConstraintMap.end())
+      return false;
+
+    addConstraint(theConstraint, aPair->second);
+    myDeactivatedConstraintMap.erase(theConstraint);
+  }
+  else
+  {
+    // suppress
+    auto aPair = myConstraintMap.find(theConstraint);
+    if (aPair == myConstraintMap.end())
+      return false;
+    myDeactivatedConstraintMap.insert((*aPair));
+
+    ConstraintWrapperPtr aCW = aPair->second;
+    ConstraintID anID = aCW->id();
+    mySketchSolver->removeConstraint(anID);
+    myConstraintMap.erase(theConstraint);
+  }
+  myNeedToResolve = true;
+  notify(theConstraint);
+
+  return true;
+}
+
+bool PlaneGCSSolver_Storage::UpdateDeactivateList()
+{
+  std::list<ConstraintPtr> toRemove;
+  for (auto& aDeactMap : myDeactivatedConstraintMap)
+  {
+    if (!aDeactMap.first->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()))
+    {
+      toRemove.push_back(aDeactMap.first);
+    }
+  }
+  for (auto& aRemove : toRemove)
+  {
+    myDeactivatedConstraintMap.erase(aRemove);
+  }
+
+  for (auto& aDeactMap : myDeactivatedConstraintMap)
+  {
+    if (aDeactMap.first->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value())
+    {
+      changeActiveStatus(aDeactMap.first, true);
+    }
+  }
+  return true;
+}
+
 void PlaneGCSSolver_Storage::removeInvalidEntities()
 {
   PlaneGCSSolver_EntityDestroyer aDestroyer;
index 6623376a5778e2bec4fcd0f620ee00de0cff65eb..81e4d4b00483e54dcb89a0dd81efad328ca5566e 100644 (file)
@@ -70,6 +70,11 @@ public:
   /// \return \c true if the constraint and all its parameters are removed successfully
   virtual bool removeConstraint(ConstraintPtr theConstraint);
 
+  // Change status of constraints.
+  virtual bool changeActiveStatus(ConstraintPtr theConstraint, bool theNewState);
+
+  virtual bool UpdateDeactivateList();
+
   /// \brief Verify, the sketch contains degenerated geometry
   ///        after resolving the set of constraints
   /// \return STATUS_OK if the geometry is valid, STATUS_DEGENERATED otherwise.
index 590681a8681d3341f7e59d50c45541c01ce33c6e..06b248c9d6e19c3d8b9ba8fe99c2d218ff9b3a3b 100644 (file)
@@ -215,6 +215,10 @@ void SketchSolver_ConstraintDistance::adjustConstraint()
 void SketchSolver_ConstraintDistance::update()
 {
   ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint);
+
+  if (!aConstraint)
+    return;
+
   myPrevValue = aConstraint->value();
 
   bool isDistanceAlognDir =
index 232c8525ece08d701693e8bbdadceae8b46a9b48..558101c194f602b2c4351b5a064b178aa9911d84 100644 (file)
@@ -231,6 +231,21 @@ bool SketchSolver_Group::movePoint(AttributePtr theAttribute,
 // ============================================================================
 bool SketchSolver_Group::resolveConstraints()
 {
+  auto aNb = mySketch->numberOfSubs();
+  std::list<ConstraintPtr> aList;
+  for (int i = 0; i < aNb; ++i)
+    if (mySketch->subFeature(i)->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE()) && !mySketch->subFeature(i)->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value())
+      aList.push_back(std::dynamic_pointer_cast<SketchPlugin_Constraint>(mySketch->subFeature(i)));
+
+  while (aList.size() > 0)
+  {
+    auto aConstr = aList.front();
+    aList.pop_front();
+    myStorage->changeActiveStatus(aConstr, false);
+  }
+
+  myStorage->UpdateDeactivateList();
+
   static const int MAX_STACK_SIZE = 5;
   // check the "Multi" constraints do not drop sketch into infinite loop
   if (myMultiConstraintUpdateStack > MAX_STACK_SIZE) {
index 2819132579238eddfe5ff85874f323a4d9be0e03..eef815aece271d3fab254a333953f7b9a45aee0c 100644 (file)
@@ -103,6 +103,11 @@ public:
   /// \brief Removes constraint from the storage
   /// \return \c true if the constraint and all its parameters are removed successfully
   virtual bool removeConstraint(ConstraintPtr theConstraint) = 0;
+
+  virtual bool changeActiveStatus(ConstraintPtr theConstraint, bool theNewState) = 0;
+
+  virtual bool UpdateDeactivateList() = 0;
+
   /// \brief Removes feature from the storage
   void removeFeature(FeaturePtr theFeature);
   /// \brief Removes attribute from the storage
@@ -177,6 +182,7 @@ protected:
   std::map<AttributePtr, EntityWrapperPtr>      myAttributeMap;
 
   UpdaterPtr myUpdaters;
+  std::map<ConstraintPtr, ConstraintWrapperPtr> myDeactivatedConstraintMap;
 };
 
 typedef std::shared_ptr<SketchSolver_Storage> StoragePtr;
index 5315b9c54a662f62119c1d158c067a6b86d1defa..c0328f64b19512526d66b02e400abd472f201388 100644 (file)
@@ -94,14 +94,23 @@ ENDIF()
 
 SET(PROJECT_PICTURES
     icons/collinear.png
+    icons/collinear_deactivate.png
     icons/parallel.png
+    icons/parallel_deactivate.png
     icons/perpendicular.png
+    icons/perpendicular_deactivate.png
     icons/anchor.png
+    icons/anchor_deactivate.png
     icons/horisontal.png
+    icons/horisontal_deactivate.png
     icons/vertical.png
+    icons/vertical_deactivate.png
     icons/equal.png
+    icons/equal_deactivate.png
     icons/tangent.png
+    icons/tangent_deactivate.png
     icons/middlepoint.png
+    icons/middlepoint_deactivate.png
     icons/mirror.png
     icons/rotate.png
     icons/translate.png
index 88d57dd1ad221a45737fbe9d091e878a1cb7e8bd..3b0f2ecef3c80da0040c0c2e313a51ae15b54a40 100644 (file)
@@ -48,6 +48,7 @@
 /// \param theDimAspect an aspect to be changed
 /// \param theDimValue an arrow value
 /// \param theTextSize an arrow value
+/// \param theIsActivated state of constraint
 extern void updateArrows(Handle(Prs3d_DimensionAspect) theDimAspect,
   double theDimValue, double theTextSize, SketcherPrs_Tools::LocationType theLocationType);
 
@@ -247,7 +248,7 @@ void SketcherPrs_Angle::Compute(const Handle(PrsMgr_PresentationManager3d)& theP
   SetFlyout(aDist);
 
   // Update text visualization: parameter value or parameter text
-  myStyleListener->updateDimensions(this, myValue);
+  myStyleListener->updateDimensions(this, myValue, !aData->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value());
 
   double aTextSize = 0.0;
   GetValueString(aTextSize);
index 8cd9a8f344532259c7bb8099fc19d82847f290f2..4e55f83b7f3fa564e8834f725e44b85eccc29ddc 100644 (file)
@@ -49,7 +49,7 @@ public:
                                const std::shared_ptr<GeomAPI_Ax3>& thePlane);
 protected:
 
-  virtual const char* iconName() const { return "collinear.png"; }
+  virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "collinear.png" : "collinear_deactivate.png"; }
 
   virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const;
 
index 6679e78851c9881864ca068c022a46591a05c031..775217b4bec02f765b1c17e084936a3414dd16ea 100644 (file)
@@ -64,18 +64,18 @@ SketcherPrs_DimensionStyle::~SketcherPrs_DimensionStyle()
 }
 
 void SketcherPrs_DimensionStyle::updateDimensions(PrsDim_Dimension* theDimension,
-          const SketcherPrs_DimensionStyle::DimensionValue& theDimensionValue)
+          const SketcherPrs_DimensionStyle::DimensionValue& theDimensionValue, bool theIsSuppress)
 {
   if (!theDimension)
     return;
   updateDimensions(theDimension, theDimensionValue.myHasParameters,
-                   theDimensionValue.myTextValue, theDimensionValue.myDoubleValue);
+                   theDimensionValue.myTextValue, theDimensionValue.myDoubleValue, theIsSuppress);
 }
 
 void SketcherPrs_DimensionStyle::updateDimensions(PrsDim_Dimension* theDimension,
                                                   const bool theHasParameters,
                                                   const std::string& theTextValue,
-                                                  const double theDoubleValue)
+                                                  const double theDoubleValue, bool theIsSuppress)
 {
   if (!theDimension)
     return;
@@ -90,13 +90,31 @@ void SketcherPrs_DimensionStyle::updateDimensions(PrsDim_Dimension* theDimension
 #endif
 
   TCollection_ExtendedString aCustomValue;
-  if (theHasParameters) {
-    //bool isParameterTextStyle = myStyle == SketcherPrs_ParameterStyleMessage::ParameterText;
-    bool isParameterTextStyle =
-      SketcherPrs_Tools::parameterStyle() == SketcherPrs_Tools::ParameterText;
-
-    if (isParameterTextStyle)
-      aCustomValue = theTextValue.c_str();
+  if (theIsSuppress)
+  {
+    // for suppressed constraints not need show value
+    aCustomValue = TCollection_ExtendedString(MyEmptySymbol);
+  }
+  else
+  {
+    if (theHasParameters) {
+      //bool isParameterTextStyle = myStyle == SketcherPrs_ParameterStyleMessage::ParameterText;
+      bool isParameterTextStyle =
+        SketcherPrs_Tools::parameterStyle() == SketcherPrs_Tools::ParameterText;
+
+      if (isParameterTextStyle)
+        aCustomValue = theTextValue.c_str();
+      else {
+        // format value string using "sprintf"
+        TCollection_AsciiString aFormatStr =
+          theDimension->Attributes()->DimensionAspect()->ValueStringFormat();
+        char aFmtBuffer[256];
+        sprintf(aFmtBuffer, aFormatStr.ToCString(), theDoubleValue);
+        aCustomValue = TCollection_ExtendedString(aFmtBuffer);
+
+        aCustomValue.Insert(1, MySigmaSymbol);
+      }
+    }
     else {
       // format value string using "sprintf"
       TCollection_AsciiString aFormatStr =
@@ -104,18 +122,8 @@ void SketcherPrs_DimensionStyle::updateDimensions(PrsDim_Dimension* theDimension
       char aFmtBuffer[256];
       sprintf (aFmtBuffer, aFormatStr.ToCString(), theDoubleValue);
       aCustomValue = TCollection_ExtendedString (aFmtBuffer);
-
-      aCustomValue.Insert (1, MySigmaSymbol);
     }
   }
-  else {
-    // format value string using "sprintf"
-    TCollection_AsciiString aFormatStr =
-      theDimension->Attributes()->DimensionAspect()->ValueStringFormat();
-    char aFmtBuffer[256];
-    sprintf (aFmtBuffer, aFormatStr.ToCString(), theDoubleValue);
-    aCustomValue = TCollection_ExtendedString (aFmtBuffer);
-  }
 #ifdef COMPILATION_CORRECTION
   theDimension->SetCustomValue(theDoubleValue);
 #else
index 32e4590217660cf0774e0817aa77dbf5ba577f6a..30a8439f87a57075f4b3fb1a2a5028ee2d77a410 100644 (file)
@@ -64,7 +64,7 @@ public:
   /// \param theDimension a modified dimension
   /// \param theDimensionValue container filled by the model double attribute
   Standard_EXPORT void updateDimensions(PrsDim_Dimension* theDimension,
-                                        const DimensionValue& theDimensionValue);
+                                        const DimensionValue& theDimensionValue, bool theIsSuppress/* = false*/);
 
 private:
   /// Visualizes the dimension text or dimension value depending on the has parameters state
@@ -72,10 +72,11 @@ private:
   /// \param theHasParameters if true, the text is shown, else digit
   /// \param theTextValue a dimension text value
   /// \param theDoubleValue a dimension digit value
+  /// \param theIsSuppress a state of constraint (active or not)
   void updateDimensions(PrsDim_Dimension* theDimension,
                         const bool theHasParameters,
                         const std::string& theTextValue,
-                        const double theDoubleValue);
+                        const double theDoubleValue, bool theIsSuppress/* = false*/);
 };
 
 #endif
\ No newline at end of file
index bb1983b9a3fedfadbbfd3de7c60e2e2c38034726..867a6d100a363b8839aa4b985fbc1a9e1df453dc 100644 (file)
@@ -48,7 +48,7 @@ public:
                                const std::shared_ptr<GeomAPI_Ax3>& thePlane);
 protected:
 
-  virtual const char* iconName() const { return "equal.png"; }
+  virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "equal.png" : "equal_deactivate.png"; }
 
   virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const;
 
index 5ce5ceb2397c24fcca568762d89c93aaec820b5a..91deaed0d4ddf1639ad740b28e01d79bf267834f 100644 (file)
@@ -51,7 +51,12 @@ public:
                                const std::shared_ptr<GeomAPI_Ax3>& thePlane);
 
 protected:
-  virtual const char* iconName() const { return myIsHorisontal? "horisontal.png" : "vertical.png"; }
+  virtual const char* iconName(bool isActiveIcon = true) const {
+    if (isActiveIcon)
+      return myIsHorisontal? "horisontal.png" : "vertical.png";
+    else
+      return myIsHorisontal ? "horisontal_deactivate.png" : "vertical_deactivate.png";
+  }
 
   /// Redefine this function in order to add additiona lines of constraint base
   /// \param thePrs a presentation
index f81fe13c244851c82ad2a2f4e4926b6285eaf630..87ed9bff69bb94ee1a88782091a1757ca4c9137a 100644 (file)
@@ -225,7 +225,7 @@ void SketcherPrs_LengthDimension::Compute(
   updateArrows(DimensionAspect(), GetValue(), aTextSize, aLocationType);
 
   // Update text visualization: parameter value or parameter text
-  myStyleListener->updateDimensions(this, myValue);
+  myStyleListener->updateDimensions(this, myValue, !myConstraint->data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value());
 
   PrsDim_LengthDimension::Compute(thePresentationManager, thePresentation, theMode);
 
index 92820adffa3297e41e0a9544f3921265e84d95cf..204706799dd9a9882990f8e41cecbd931726f422 100644 (file)
@@ -48,7 +48,7 @@ public:
                                const std::shared_ptr<GeomAPI_Ax3>& thePlane);
 protected:
 
-  virtual const char* iconName() const { return "middlepoint.png"; }
+  virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "middlepoint.png" : "middlepoint_deactivate.png"; }
 
   virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const;
 
index e4b0217139623efc999b5a8341fecb52ae933a12..0bb6d2880757044fc99acd4e137cd9c26d4c0478 100644 (file)
@@ -47,7 +47,7 @@ public:
   static bool IsReadyToDisplay(ModelAPI_Feature* theConstraint,
                                const std::shared_ptr<GeomAPI_Ax3>& thePlane);
 protected:
-  virtual const char* iconName() const { return "mirror.png"; }
+  virtual const char* iconName(bool /*isActiveIcon*/) const { return "mirror.png"; }
 
   virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const;
 
index 8a479c6fa082cd459265c09a0045a4a454c31024..e327f8df1d5ffb1c3b3d750c9ab2a59ac41d2470 100644 (file)
@@ -49,7 +49,7 @@ public:
       const std::shared_ptr<GeomAPI_Ax3>& thePlane);
 protected:
 
-  virtual const char* iconName() const { return "offset.png"; }
+  virtual const char* iconName(bool /*isActiveIcon*/) const { return "offset.png"; }
 
   virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const;
 
index c85cbfa994022251d9cc315188f326e3bf1f1be9..a65ab484970f51cee8964eeaf9373efad95a917a 100644 (file)
@@ -48,7 +48,7 @@ public:
                                const std::shared_ptr<GeomAPI_Ax3>& thePlane);
 
 protected:
-  virtual const char* iconName() const { return "parallel.png"; }
+  virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "parallel.png" : "parallel_deactivate.png"; }
 
   virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const;
 
index f214c98fed8b21c8561621bab1c748a4828f7294..209b32aa1ef25640bf30adce78613866468276df 100644 (file)
@@ -50,7 +50,7 @@ public:
   static bool IsReadyToDisplay(ModelAPI_Feature* theConstraint,
                                const std::shared_ptr<GeomAPI_Ax3>& thePlane);
 protected:
-  virtual const char* iconName() const { return "perpendicular.png"; }
+  virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "perpendicular.png" : "perpendicular_deactivate.png"; }
 
   /// Redefine this function in order to add additiona lines of constraint base
   /// \param thePrs a presentation
index e656da498df4a10476eafd90a2a4f0b6305352fc..ca48ac5fb09e1b375a7d1fe77660cd784d2793cf 100644 (file)
@@ -160,7 +160,7 @@ void SketcherPrs_Radius::Compute(
   }
 
   SetMeasuredGeometry(myCircle, myAnchorPoint);
-  myStyleListener->updateDimensions(this, myValue);
+  myStyleListener->updateDimensions(this, myValue, !myConstraint->data()->boolean(SketchPlugin_Constraint::CONSTRAINT_ACTIVE())->value());
 
   // Update variable aspect parameters (depending on viewer scale)
   double aTextSize = 0.0;
index 81b9330605574fccd27d7b475de067eca7788590..c5bc43696adb9db9639a335bd3c28fb70027435c 100644 (file)
@@ -51,7 +51,7 @@ public:
   static bool IsReadyToDisplay(ModelAPI_Feature* theConstraint,
                                const std::shared_ptr<GeomAPI_Ax3>& thePlane);
 protected:
-  virtual const char* iconName() const { return "anchor.png"; }
+  virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "anchor.png" : "anchor_deactivate.png"; }
 
   /// Redefine this function in order to add additiona lines of constraint base
   /// \param thePrs a presentation
index 0d156d22b856eba92ce150bc36fd11a5b1e08362..f85d679a482a4657aaff8bb6cfbe65f2b8fbfb20 100644 (file)
@@ -159,8 +159,9 @@ SketcherPrs_SymbolPrs::~SketcherPrs_SymbolPrs()
 //*********************************************************************************
 Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon()
 {
-  if (myIconsMap.count(iconName()) == 1) {
-    return myIconsMap[iconName()];
+  auto isIconType = myConstraint->boolean("ConstraintState")->value();
+  if (myIconsMap.count(iconName(isIconType)) == 1) {
+    return myIconsMap[iconName(isIconType)];
   }
   // Load icon for the presentation
   std::string aFile;
@@ -175,7 +176,7 @@ Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon()
   }
 
   aFile += FSEP;
-  aFile += iconName();
+  aFile += iconName(isIconType);
   Handle(Image_AlienPixMap) aPixMap = new Image_AlienPixMap();
   if (aPixMap->Load(aFile.c_str())) {
     int aRatio = SketcherPrs_Tools::pixelRatio();
@@ -192,14 +193,14 @@ Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon()
       }
       aPixMap = aSizedMap;
     }
-    myIconsMap[iconName()] = aPixMap;
+    myIconsMap[iconName(isIconType)] = aPixMap;
     return aPixMap;
   }
   // The icon for constraint is not found
   static const char aMsg[] = "Error! constraint images are not found";
   std::cout<<aMsg<<std::endl;
   Events_InfoMessage("SketcherPrs_SymbolPrs", aMsg).send();
-  myIconsMap[iconName()] = Handle(Image_AlienPixMap)();
+  myIconsMap[iconName(isIconType)] = Handle(Image_AlienPixMap)();
   return Handle(Image_AlienPixMap)();
 }
 
@@ -207,15 +208,11 @@ Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon()
 void SketcherPrs_SymbolPrs::prepareAspect()
 {
   // Create an aspect with the icon
-  if (myAspect.IsNull()) {
-    Handle(Image_AlienPixMap) aIcon = icon();
-    if (aIcon.IsNull())
-      myAspect = new Graphic3d_AspectMarker3d();
-    else
-      myAspect = new Graphic3d_AspectMarker3d(aIcon);
-
-    myAspect->SetColor(myCustomColor);
-  }
+  Handle(Image_AlienPixMap) aIcon = icon();
+  if (aIcon.IsNull())
+    myAspect = new Graphic3d_AspectMarker3d();
+  else
+    myAspect = new Graphic3d_AspectMarker3d(aIcon);
 }
 
 //*********************************************************************************
index d83d931a87bacf1c62c35aa1050ff3a6aca56bb3..5e51b5f54f192d0389f2754f09e602de2a2490b8 100644 (file)
@@ -109,7 +109,7 @@ protected:
     const Standard_Integer aMode);
 
   /// Returns an icon file name. Has to be redefined in successors
-  virtual const char* iconName() const = 0;
+  virtual const char* iconName(bool isActiveIcon = true) const = 0;
 
   /// Check and creates if it is necessary myAspect member.
   /// It has to be called before the object computation
index 1f61dbecb6eeaf6c7f391d279c157e6455a5df04..547ab1c7398ac99bb16d1daea5efd22bd3bb6140 100644 (file)
@@ -50,7 +50,7 @@ public:
                                const std::shared_ptr<GeomAPI_Ax3>& thePlane);
 protected:
 
-  virtual const char* iconName() const { return "tangent.png"; }
+  virtual const char* iconName(bool isActiveIcon = true) const { return isActiveIcon ? "tangent.png" : "tangent_deactivate.png"; }
 
   virtual void drawLines(const Handle(Prs3d_Presentation)& thePrs, Quantity_Color theColor) const;
 
index 387ab2bf239a8b2ceab6a25e126b853c1ff89a81..97f12838a019b0bf797f900cac931834879bab28 100644 (file)
@@ -50,7 +50,7 @@ public:
   static bool IsReadyToDisplay(ModelAPI_Feature* theConstraint,
                                const std::shared_ptr<GeomAPI_Ax3>& thePlane);
 protected:
-  virtual const char* iconName() const { return myIsTranslation? "translate.png" : "rotate.png"; }
+  virtual const char* iconName(bool /*isActiveIcon*/ ) const { return myIsTranslation ? "translate.png" : "rotate.png"; }
 
   /// Redefine this function in order to add additiona lines of constraint base
   /// \param thePrs a presentation
diff --git a/src/SketcherPrs/icons/anchor_deactivate.png b/src/SketcherPrs/icons/anchor_deactivate.png
new file mode 100644 (file)
index 0000000..c03591e
Binary files /dev/null and b/src/SketcherPrs/icons/anchor_deactivate.png differ
diff --git a/src/SketcherPrs/icons/collinear_deactivate.png b/src/SketcherPrs/icons/collinear_deactivate.png
new file mode 100644 (file)
index 0000000..19c4013
Binary files /dev/null and b/src/SketcherPrs/icons/collinear_deactivate.png differ
diff --git a/src/SketcherPrs/icons/equal_deactivate.png b/src/SketcherPrs/icons/equal_deactivate.png
new file mode 100644 (file)
index 0000000..f865127
Binary files /dev/null and b/src/SketcherPrs/icons/equal_deactivate.png differ
diff --git a/src/SketcherPrs/icons/horisontal_deactivate.png b/src/SketcherPrs/icons/horisontal_deactivate.png
new file mode 100644 (file)
index 0000000..c11988a
Binary files /dev/null and b/src/SketcherPrs/icons/horisontal_deactivate.png differ
diff --git a/src/SketcherPrs/icons/middlepoint_deactivate.png b/src/SketcherPrs/icons/middlepoint_deactivate.png
new file mode 100644 (file)
index 0000000..bd0ef35
Binary files /dev/null and b/src/SketcherPrs/icons/middlepoint_deactivate.png differ
diff --git a/src/SketcherPrs/icons/parallel_deactivate.png b/src/SketcherPrs/icons/parallel_deactivate.png
new file mode 100644 (file)
index 0000000..49cb518
Binary files /dev/null and b/src/SketcherPrs/icons/parallel_deactivate.png differ
diff --git a/src/SketcherPrs/icons/perpendicular_deactivate.png b/src/SketcherPrs/icons/perpendicular_deactivate.png
new file mode 100644 (file)
index 0000000..31c1f6d
Binary files /dev/null and b/src/SketcherPrs/icons/perpendicular_deactivate.png differ
diff --git a/src/SketcherPrs/icons/tangent_deactivate.png b/src/SketcherPrs/icons/tangent_deactivate.png
new file mode 100644 (file)
index 0000000..90bffe4
Binary files /dev/null and b/src/SketcherPrs/icons/tangent_deactivate.png differ
diff --git a/src/SketcherPrs/icons/vertical_deactivate.png b/src/SketcherPrs/icons/vertical_deactivate.png
new file mode 100644 (file)
index 0000000..201f281
Binary files /dev/null and b/src/SketcherPrs/icons/vertical_deactivate.png differ
index 25a57a53027ba53431fd29354d79429d7d357091..bb76c8c0cf70de61d1997d89175cebcb7bfb06de 100644 (file)
@@ -58,13 +58,14 @@ SET(PROJECT_HEADERS
     XGUI_Selection.h
     XGUI_SelectionActivate.h
     XGUI_SelectionMgr.h
+    XGUI_SketchConstraintsBrowser.h
     XGUI_Tools.h
     XGUI_TransparencyWidget.h
     XGUI_ViewerProxy.h
     XGUI_Workshop.h
     XGUI_WorkshopListener.h
-       XGUI_InspectionPanel.h
-       XGUI_CompressFiles.h
+    XGUI_InspectionPanel.h
+    XGUI_CompressFiles.h
 )
 
 SET(PROJECT_MOC_HEADERS
@@ -88,11 +89,12 @@ SET(PROJECT_MOC_HEADERS
     XGUI_PropertyPanel.h
     XGUI_PropertyPanelSelector.h
     XGUI_SelectionMgr.h
+    XGUI_SketchConstraintsBrowser.h
     XGUI_TransparencyWidget.h
     XGUI_ViewerProxy.h
     XGUI_Workshop.h
     XGUI_WorkshopListener.h
-       XGUI_InspectionPanel.h
+    XGUI_InspectionPanel.h
 )
 
 # sources / moc wrappings
@@ -125,13 +127,14 @@ SET(PROJECT_SOURCES
     XGUI_Selection.cpp
     XGUI_SelectionActivate.cpp
     XGUI_SelectionMgr.cpp
+    XGUI_SketchConstraintsBrowser.cpp
     XGUI_Tools.cpp
     XGUI_TransparencyWidget.cpp
     XGUI_ViewerProxy.cpp
     XGUI_Workshop.cpp
     XGUI_WorkshopListener.cpp
-       XGUI_InspectionPanel.cpp
-       XGUI_CompressFiles.cpp
+    XGUI_InspectionPanel.cpp
+    XGUI_CompressFiles.cpp
 )
 
 SET(PROJECT_RESOURCES
index e803522b40d4206414617cc49ea2097c971ba6f3..f6500a80156de8f13310ea85ca0574cd0d533f2a 100644 (file)
@@ -121,7 +121,9 @@ void XGUI_ActionsMgr::updateCommandsStatus()
 {
   setAllEnabled();
   XGUI_Selection* aSelection = myWorkshop->selector()->selection();
-  if (aSelection->getSelected(ModuleBase_ISelection::AllControls).size() > 0)
+  // If ::ConstraintsBrowser and has Coincodence deleted - fail!!!
+  if (aSelection->getSelected(ModuleBase_ISelection::AllControls).size() > 0
+    && aSelection->getSelected(ModuleBase_ISelection::ConstraintsBorwser).size() == 0)
     updateOnViewSelection();
 
   FeaturePtr anActiveFeature = FeaturePtr();
index 9550326bd0f1f6b7b0ad1c2db76d066724cd9142..cf3904bd28137240c8d55d1de4b63e2d7e5730b1 100644 (file)
@@ -20,6 +20,7 @@
 #include "XGUI_ContextMenuMgr.h"
 #include "XGUI_Workshop.h"
 #include "XGUI_ObjectsBrowser.h"
+#include "XGUI_SketchConstraintsBrowser.h"
 #include "XGUI_SelectionMgr.h"
 #include "XGUI_Displayer.h"
 #include "XGUI_ViewerProxy.h"
@@ -101,6 +102,10 @@ void XGUI_ContextMenuMgr::createActions()
   anAction->setShortcut(Qt::Key_F2);
   addAction("RENAME_CMD", anAction);
 
+  anAction = ModuleBase_Tools::createAction(QIcon(":pictures/part_ico.png"), tr("Deactivate/Activate"),
+                                            aDesktop, this);
+  addAction("DEACTIVATE_CONSTRAINT_CMD", anAction);
+
 #ifdef HAVE_SALOME
   anAction = ModuleBase_Tools::createAction(QIcon(":pictures/move_to_end.png"),
                                            XGUI_Workshop::MOVE_TO_END_COMMAND, this);
@@ -166,6 +171,10 @@ void XGUI_ContextMenuMgr::createActions()
                                            aDesktop);
   addAction("ISOLINES_CMD", anAction);
 
+  anAction = ModuleBase_Tools::createAction(QIcon(":pictures/rename_edit.png"), tr("Edit..."),
+    aDesktop);
+  addAction("EDIT_CONSTR_CMD", anAction);
+
   anAction = ModuleBase_Tools::createAction(QIcon(), tr("Show Isos"), aDesktop);
   anAction->setCheckable(true);
   addAction("SHOW_ISOLINES_CMD", anAction);
@@ -251,6 +260,7 @@ void XGUI_ContextMenuMgr::createActions()
   addAction("SET_VIEW_NORMAL_CMD", anAction);
 
   buildObjBrowserMenu();
+  buildConstrBrowserMenu();
   buildViewerMenu();
 }
 
@@ -304,6 +314,8 @@ void XGUI_ContextMenuMgr::onContextMenuRequest(QContextMenuEvent* theEvent)
   } else if (sender() == myWorkshop->viewer()) {
     updateViewerMenu();
     addViewerMenu(aMenu);
+  } else if (sender() == myWorkshop->constraintsBrowser()) {
+    addConstrBrowserMenu(aMenu);
   }
 
   if (aMenu && (aMenu->actions().size() > 0)) {
@@ -699,6 +711,11 @@ void XGUI_ContextMenuMgr::connectViewer()
           SLOT(onContextMenuRequest(QContextMenuEvent*)));
 }
 
+void XGUI_ContextMenuMgr::connectConstraintsBrowser()
+{
+  connect(myWorkshop->constraintsBrowser(), SIGNAL(contextMenuRequested(QContextMenuEvent*)), this,
+    SLOT(onContextMenuRequest(QContextMenuEvent*)));
+}
 
 void XGUI_ContextMenuMgr::buildObjBrowserMenu()
 {
@@ -820,6 +837,18 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu()
   myObjBrowserMenus[ModelAPI_ResultField::ModelAPI_FieldStep::group()] = aList;
 }
 
+void XGUI_ContextMenuMgr::buildConstrBrowserMenu()
+{
+  QAction* aSeparator = ModuleBase_Tools::createAction(QIcon(), "", myWorkshop->desktop());
+  aSeparator->setSeparator(true);
+
+  QActionsList aList;
+
+  aList.append(action("HIDE_CMD"));
+  aList.append(action("DELETE_CMD"));
+  aList.append(action("DEACTIVATE_CONSTRAINT_CMD"));
+}
+
 void XGUI_ContextMenuMgr::buildViewerMenu()
 {
   QActionsList aList;
@@ -886,6 +915,56 @@ void XGUI_ContextMenuMgr::buildViewerMenu()
   myViewerMenu[ModelAPI_ResultField::ModelAPI_FieldStep::group()] = aList;
 }
 
+void XGUI_ContextMenuMgr::addConstrBrowserMenu(QMenu* theMenu) const
+{
+  QActionsList anActions;
+  QObjectPtrList aObjects = myWorkshop->constraintsBrowser()->selectedObjects();
+
+  // Check that state foreach constraint.
+  // If at least 1 is Activa - show Deactivate
+  // otherwise - show Activate
+  //
+  if (aObjects.size() > 0)
+  {
+    // It's update START
+
+    // Enable edit only if exist at least 1 dimensional constraint
+    bool isEditEnabled = false;
+    foreach(ObjectPtr anObject, aObjects)
+    {
+      if (auto aFeat = ModelAPI_Feature::feature(anObject))
+      {
+        if (aFeat->real("ConstraintValue"))
+        {
+          isEditEnabled = true;
+          break;
+        }
+      }
+    }
+
+    action("EDIT_CONSTR_CMD")->setEnabled(isEditEnabled);
+    action("DELETE_CMD")->setEnabled(true);
+    action("DEACTIVATE_CONSTRAINT_CMD")->setEnabled(true);
+    // It's update END
+
+    anActions.append(action("EDIT_CONSTR_CMD"));
+    anActions.append(action("DELETE_CMD"));
+    anActions.append(action("DEACTIVATE_CONSTRAINT_CMD"));
+  }
+  else
+  {
+    // It's update START
+    action("EDIT_CONSTR_CMD")->setEnabled(true);
+    // It's update END
+
+    anActions.append(action("EDIT_CONSTR_CMD"));
+  }
+
+
+  theMenu->addActions(anActions);
+  addFeatures(theMenu);
+
+}
 
 void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const
 {
index 3f1112a323cfd47a786ada54653d093cbe086261..fb41ccbf304ce227f542018c0a44fe7a254fb44e 100644 (file)
@@ -67,9 +67,15 @@ Q_OBJECT
   /// Connect to viewer from workshop. Has to called at creation of viewer.
   void connectViewer();
 
+  /// Connect to viewer from workshop. Has to called at creation of viewer.
+  void connectConstraintsBrowser();
+
   /// Add menu items for Object browser pop-up
   void addObjBrowserMenu(QMenu*) const;
 
+  /// Add menu items for Object browser pop-up
+  void addConstrBrowserMenu(QMenu*) const;
+
   /// Add menu items for Viewer pop-up
   void addViewerMenu(QMenu*) const;
 
@@ -126,6 +132,9 @@ signals:
   /// Creates menu for object browser
   void buildObjBrowserMenu();
 
+  /// Creates menu for object browser
+  void buildConstrBrowserMenu();
+
   /// Creates menu for viewer
   void buildViewerMenu();
 
index 6ee3b9348ca6d06762f143a943fd7929d856ed6f..32b6df969fc74a1d07bd72147737dedf1056a68d 100644 (file)
@@ -509,6 +509,23 @@ void XGUI_Displayer::setSelected(const  QList<ModuleBase_ViewerPrsPtr>& theValue
           #endif
         }
       }
+      else
+      {
+        auto aConstrFeature = ModelAPI_Feature::feature(anObject);
+        if (!aConstrFeature)
+          continue;
+
+        AISObjectPtr aAisPtr = myWorkshop->displayer()->getAISObject(aConstrFeature);
+        if (!aAisPtr)
+        {
+          aAisPtr = myResult2AISObjectMap.value(aConstrFeature->lastResult());
+          if (!aAisPtr)
+            continue;
+        }
+        Handle(AIS_InteractiveObject) aAisObj = aAisPtr->impl<Handle(AIS_InteractiveObject)>();
+
+        aContext->AddOrRemoveSelected(aAisObj, false);
+      }
     }
   }
   if (!aShapesToBeSelected.IsEmpty())
index fab475e492c43e9772d8c30c4103b5db487f098c..74c909829d8e81684db36bd6139e805dda2324aa 100644 (file)
@@ -22,6 +22,7 @@
 #include "XGUI_Displayer.h"
 #include "XGUI_ViewerProxy.h"
 #include "XGUI_ObjectsBrowser.h"
+#include "XGUI_SketchConstraintsBrowser.h"
 
 #ifndef HAVE_SALOME
 #include <AIS_ViewCube.hxx>
@@ -79,6 +80,10 @@ QList<ModuleBase_ViewerPrsPtr> XGUI_Selection::getSelected(const SelectionPlace&
     case Viewer:
       getSelectedInViewer(aPresentations);
     break;
+    case ConstraintsBorwser:
+      getSelectedInSketchConstraintsBrowser(aPresentations);
+    break;
+
   case AllControls:
     // Get selection from object browser
     getSelectedInBrowser(aPresentations);
@@ -201,6 +206,33 @@ void XGUI_Selection::getSelectedInBrowser(QList<ModuleBase_ViewerPrsPtr>& thePre
   }
 }
 
+void XGUI_Selection::getSelectedInSketchConstraintsBrowser(QList<std::shared_ptr<ModuleBase_ViewerPrs>>& thePresentations) const
+{
+  QObjectPtrList anObjects;
+  if (myWorkshop->constraintsBrowser())
+    anObjects = myWorkshop->constraintsBrowser()->selectedObjects();
+
+  if (anObjects.isEmpty())
+    return;
+
+  QObjectPtrList::const_iterator anIt = anObjects.begin(), aLast = anObjects.end();
+  for (; anIt != aLast; anIt++) {
+    ObjectPtr anObject = *anIt;
+    if (anObject.get() != NULL) {
+      auto aConstrFeature = ModelAPI_Feature::feature(anObject);
+      thePresentations.append(std::shared_ptr<ModuleBase_ViewerPrs>(
+        new ModuleBase_ViewerPrs(anObject, GeomShapePtr(), NULL)));
+     /* AISObjectPtr aAisPtr = myWorkshop->displayer()->getAISObject(aConstrFeature);
+      if (!aAisPtr)
+        continue;
+      Handle(AIS_InteractiveObject) aAisObj = aAisPtr->impl<Handle(AIS_InteractiveObject)>();
+      auto aPrs = std::shared_ptr<ModuleBase_ViewerPrs>(
+        new ModuleBase_ViewerPrs(anObject, GeomShapePtr(), NULL));
+      aPrs->setInteractive(aAisObj);
+      thePresentations.append(aPrs);*/
+    }
+  }
+}
 void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrsPtr& thePrs,
                                       const Handle(SelectMgr_EntityOwner)& theOwner) const
 {
@@ -381,6 +413,8 @@ QObjectPtrList XGUI_Selection::selectedObjects() const
 {
   if (myWorkshop->objectBrowser())
     return myWorkshop->objectBrowser()->selectedObjects();
+  if (myWorkshop->constraintsBrowser())
+    return myWorkshop->constraintsBrowser()->selectedObjects();
   return QObjectPtrList();
 }
 
index 58b257998da4bf68e6bd2728f9a6da921409ff6d..65d5b5f36b19d788a950460da90bbc5047306780 100644 (file)
@@ -103,6 +103,13 @@ protected:
   /// \param thePresentations an output list of presentation
   void getSelectedInBrowser(QList<std::shared_ptr<ModuleBase_ViewerPrs>>& thePresentations) const;
 
+  /// Fills the list of presentations by objects selected in the object browser.
+  /// ViewerPrs contains only object parameter not empty.
+  /// If the given list of presentations already has a viewer presentation with the same object
+  /// as selected in the browser, a new item is not appended to the list of presentations.
+  /// \param thePresentations an output list of presentation
+  void getSelectedInSketchConstraintsBrowser(QList<std::shared_ptr<ModuleBase_ViewerPrs>>& thePresentations) const;
+
   /// Generates a vertex or edge by the give IO if it is an AIS created on trihedron
   /// \param theIO a selected object
   /// \return created shape or empty shape
index 80f1d15929425e3845a7466b9ffb60181e25153f..63188daaa03f4108dd59e7c45e782994d8f688c3 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "XGUI_Workshop.h"
 #include "XGUI_ObjectsBrowser.h"
+#include "XGUI_SketchConstraintsBrowser.h"
 #include "XGUI_SalomeConnector.h"
 #include "XGUI_ViewerProxy.h"
 #include "XGUI_Displayer.h"
@@ -83,6 +84,8 @@ void XGUI_SelectionMgr::connectViewers()
 
   //Connect to other viewers
   connect(myWorkshop->viewer(), SIGNAL(selectionChanged()), this, SLOT(onViewerSelection()));
+  connect(myWorkshop->constraintsBrowser(), SIGNAL(selectionChanged()), this,
+    SLOT(onSketchConstraintsBrowserSelection()));
 }
 
 //**************************************************************
@@ -140,6 +143,39 @@ void XGUI_SelectionMgr::onObjectBrowserSelection()
   emit selectionChanged();
 }
 
+//**************************************************************
+void XGUI_SelectionMgr::onSketchConstraintsBrowserSelection()
+{
+  myLastSelectionPlace = ModuleBase_ISelection::ConstraintsBorwser;
+  QList<ModuleBase_ViewerPrsPtr> aSelectedPrs =
+    myWorkshop->selector()->selection()->getSelected(ModuleBase_ISelection::ConstraintsBorwser);
+  XGUI_Displayer* aDisplayer = myWorkshop->displayer();
+  if (!myWorkshop->operationMgr()->hasOperation()) {
+
+    ObjectPtr aObject;
+    FeaturePtr aFeature;
+    // Select all results of a selected feature in viewer
+    foreach(ModuleBase_ViewerPrsPtr aPrs, aSelectedPrs) {
+      aObject = aPrs->object();
+      if (aObject.get()) {
+        aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
+        if (aFeature.get()) {
+          std::list<ResultPtr> allRes;
+          ModelAPI_Tools::allResults(aFeature, allRes);
+          std::list<ResultPtr>::iterator aRes;
+          for (aRes = allRes.begin(); aRes != allRes.end(); aRes++) {
+            aSelectedPrs.append(std::shared_ptr<ModuleBase_ViewerPrs>(
+              new ModuleBase_ViewerPrs(*aRes, GeomShapePtr(), NULL)));
+          }
+        }
+      }
+    }
+  }
+  aDisplayer->setSelected(aSelectedPrs);
+  myWorkshop->updateColorScaleVisibility();
+  emit selectionChanged();
+}
+
 //**************************************************************
 void XGUI_SelectionMgr::onViewerSelection()
 {
index 6765efe056265775034cb056f9534f1600994a17..db1f31f7e94db2ac6a5c0844ac3e618e238e5fa8 100644 (file)
@@ -94,9 +94,12 @@ signals:
   void selectionChanged();
 
  public slots:
-   /// Reaction on selectio0n in Object browser
+   /// Reaction on selection in Object browser
   void onObjectBrowserSelection();
 
+  /// Reaction on selection in Constraints Browser
+  void onSketchConstraintsBrowserSelection();
+
    /// Reaction on selectio0n in Viewer
   void onViewerSelection();
 
diff --git a/src/XGUI/XGUI_SketchConstraintsBrowser.cpp b/src/XGUI/XGUI_SketchConstraintsBrowser.cpp
new file mode 100644 (file)
index 0000000..6a7d4f4
--- /dev/null
@@ -0,0 +1,755 @@
+// Copyright (C) 2014-2022  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 "XGUI_SketchConstraintsBrowser.h"
+#include "XGUI_Tools.h"
+#include "XGUI_DataModel.h"
+
+#include <ModelAPI_Data.h>
+#include <ModelAPI_Session.h>
+#include <ModelAPI_Document.h>
+#include <ModelAPI_Tools.h>
+#include <ModelAPI_ResultField.h>
+
+#include <ModuleBase_Tools.h>
+#include <ModuleBase_ITreeNode.h>
+#include <ModuleBase_Operation.h>
+#include <ModuleBase_IModule.h>
+#include <XGUI_OperationMgr.h>
+#include <XGUI_Workshop.h>
+#include <ModuleBase_WidgetFactory.h>
+#include <XGUI_Displayer.h>
+
+#include <QLayout>
+#include <QLineEdit>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QPixmap>
+#include <QEvent>
+#include <QMouseEvent>
+#include <QAction>
+#include <QStyledItemDelegate>
+#include <QMessageBox>
+#include <QApplication>
+#include <QGroupBox>
+#include <QPainter>
+
+#include <ModelAPI_CompositeFeature.h>
+#include <ModelAPI_AttributeRefAttr.h>
+#include <ModelAPI_AttributeDouble.h>
+#include <ModelAPI_AttributeBoolean.h>
+
+#ifdef DEBUG_INDXES
+#include <QToolTip>
+#endif
+
+
+#ifdef WIN32
+# define FSEP "\\"
+#else
+# define FSEP "/"
+#endif
+
+// Type of columns
+enum ColumnType {
+  Col_Icon,
+  Col_Constraint,
+  Col_Primitive,
+  Col_Value
+};
+
+namespace
+{
+  QModelIndex GetIndex(QModelIndex theChildIndex)
+  {
+    auto aParent = theChildIndex.parent();
+    if (aParent.isValid())
+      return aParent.model()->index(aParent.row(), 1);
+    else
+      return QModelIndex();
+  }
+
+  // Retrurn name for constraint attribute
+  QString GetName(const AttributePtr& theAttribute)
+  {
+    QString aName;
+
+    if (theAttribute->attributeType() != ModelAPI_AttributeRefAttr::typeId())
+      return aName;
+
+    AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
+
+    auto anObj = aRefAttr->object();
+    auto anAttr = aRefAttr->attr();
+    if (anAttr)
+    {
+      FeaturePtr anAttrA = ModelAPI_Feature::feature(anAttr->owner());
+      aName += QString::fromStdWString(anAttrA->name());
+      aName += "/";
+      aName += QString::fromStdString(anAttr->id());
+    }
+    else if (anObj)
+    {
+      FeaturePtr anAttrA = ModelAPI_Feature::feature(anObj);
+      aName += QString::fromStdWString(anAttrA->name());
+    }
+
+    return aName;
+  }
+
+  std::pair<std::string, std::string> FromSketchKindToName(const std::string& theKind)
+  {
+    const std::string& aType = theKind;
+    if (aType == "SketchConstraintCoincidence" ||
+      aType == "SketchConstraintCoincidenceInternal")
+      return { "Coincidence", "coincedence.png" };
+    else if (aType == "SketchConstraintRigid")
+      return { "Fixed", "fixed.png" };
+    else if (aType == "SketchConstraintHorizontal")
+      return { "Horizontal", "horisontal.png" };
+    else if (aType == "SketchConstraintVertical")
+      return { "Vertical", "vertical.png" };
+    else if (aType == "SketchConstraintAngle")
+      return { "Angle", "angle_constr.png" };
+    else if (aType == "SketchConstraintDistance")
+      return { "Distance", "distance.png" };
+    else if (aType == "SketchConstraintDistanceHorizontal")
+      return { "Horizontal distance", "distance_h.png" };
+    else if (aType == "SketchConstraintDistanceVertical")
+      return { "Vertical distance", "distance_v.png" };
+    else if (aType == "SketchConstraintEqual")
+      return { "Equal", "equal.png" };
+    else if (aType == "SketchConstraintLength")
+      return { "Length", "length.png" };
+    else if (aType == "SketchConstraintMiddle")
+      return { "Middle point", "middlepoint.png" };
+    else if (aType == "SketchConstraintMirror")
+      return { "Mirror objects", "mirror.png" };
+    else if (aType == "SketchConstraintParallel")
+      return { "Parallel", "parallel.png" };
+    else if (aType == "SketchConstraintPerpendicular")
+      return { "Perpendicular", "perpendicular.png" };
+    else if (aType == "SketchConstraintRadius")
+      return { "Radius", "radius_constr.png" };
+    else if (aType == "SketchConstraintCollinear")
+      return { "Collinear", "collinear.png" };
+    else if (aType == "SketchConstraintTangent")
+      return { "Tangent", "tangent.png" };
+    return { "", "" };
+  }
+
+  std::string GetIconPath(const std::string& theKind)
+  {
+    std::string aFile;
+    char* anEnv = getenv("SHAPER_ROOT_DIR");
+    if (anEnv) {
+      aFile = std::string(anEnv) +
+        FSEP + "share" + FSEP + "salome" + FSEP + "resources" + FSEP + "shaper" + FSEP + "icons" + FSEP + "Sketch";
+    }
+    else {
+      anEnv = getenv("CADBUILDER_ROOT_DIR");
+      if (anEnv)
+        aFile = std::string(anEnv) + FSEP + "plugins" + FSEP + "icons" + FSEP + "Sketch";
+    }
+
+    aFile += FSEP;
+    aFile += FromSketchKindToName(theKind).second;
+    return aFile;
+  }
+}
+
+/*!
+ * \ingroup GUI
+ * ItemDelegate object in order to redefine items behavior
+ */
+class XGUI_ConstraintsItemDelegate : public QStyledItemDelegate
+{
+public:
+  /// Constructor
+  /// \param thaParent a parent
+  XGUI_ConstraintsItemDelegate(QObject* thaParent) :
+    QStyledItemDelegate(thaParent) {}
+
+  /// Redefinition of virtual method
+  /// \param parent a parent widget
+  /// \param option the item options
+  /// \param index the current index
+  virtual QWidget* createEditor(QWidget* parent,
+    const QStyleOptionViewItem& option,
+    const QModelIndex& index) const;
+
+  /// Returns True if the given index is editable item
+  /// \param theIndex an item index
+  bool isEditable(const QModelIndex& theIndex) const;
+
+  // Return current state for TreeItem
+  bool GetIsActive(const QModelIndex& index) const;
+
+  // Modify state item
+  void SetIsActive(QModelIndex& theIndex, bool theIsActive);
+
+  /// Returns currently editing index
+  QModelIndex editIndex() const { return myEditingIdx; }
+
+  /// Redefinition of virtual method
+  /// \param painter a painter object
+  /// \param option the item options
+  /// \param index the current index
+  virtual void paint(QPainter* painter,
+    const QStyleOptionViewItem& option,
+    const QModelIndex& index) const;
+
+protected:
+  /// Redefinition of virtual method
+  /// \param option the item options
+  /// \param index the current index
+  virtual void initStyleOption(QStyleOptionViewItem* option,
+                               const QModelIndex& index) const;
+
+private:
+  mutable QModelIndex myEditingIdx;
+};
+
+// Implement
+
+bool XGUI_ConstraintsItemDelegate::GetIsActive(const QModelIndex& index) const
+{
+  if (!index.parent().isValid())
+    return true;
+
+  auto aModel = index.model();
+  auto anIndexForCheck = aModel->index(index.row(), 1);
+  bool myIsActive = index.parent().child(index.row(), 1).data(Qt::UserRole + 1).toBool();
+  return myIsActive;
+}
+
+void XGUI_ConstraintsItemDelegate::initStyleOption(QStyleOptionViewItem* option, const QModelIndex& index) const
+{
+  if (index.parent().isValid())
+  {
+    bool myIsActive = GetIsActive(index);
+    option->palette.setBrush(QPalette::ColorRole::Text, myIsActive ? Qt::black : Qt::darkGray);
+  }
+
+  QStyledItemDelegate::initStyleOption(option, index);
+}
+
+void XGUI_ConstraintsItemDelegate::paint(QPainter* painter,
+  const QStyleOptionViewItem& option,
+  const QModelIndex& index) const
+{
+  QBrush aBrush = painter->brush();
+  QPen aPen = painter->pen();
+
+  Qt::GlobalColor aColor = index.parent().isValid() ? Qt::white : Qt::lightGray;
+  painter->setBrush(aColor);
+  painter->setPen(aColor);
+
+  painter->drawRect(option.rect);
+  painter->setPen(aPen);
+
+  QStyledItemDelegate::paint(painter, option, index);
+  painter->setBrush(aBrush);
+}
+
+void XGUI_ConstraintsItemDelegate::SetIsActive(QModelIndex& theIndex, bool theIsActive)
+{
+  bool aBool = theIndex.model()->data(theIndex, Qt::UserRole + 1).toBool();
+  theIndex.model()->data(theIndex, Qt::UserRole + 1).setValue(!aBool);
+}
+
+QWidget* XGUI_ConstraintsItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
+{
+  myEditingIdx = index;
+  return QStyledItemDelegate::createEditor(parent, option, index);
+}
+
+bool XGUI_ConstraintsItemDelegate::isEditable(const QModelIndex& theIndex) const
+{
+  QModelIndex aParent = theIndex.parent();
+  if (aParent.isValid() && !theIndex.data(0).isNull() && theIndex.column() == 3)
+    return true;
+
+  return false;
+}
+
+void XGUI_ConstraintsViewTree::closeEditor(QWidget* theEditor,
+                                           QAbstractItemDelegate::EndEditHint theHint)
+{
+  if (theHint == QAbstractItemDelegate::EditNextItem) {
+    QModelIndex aCurrent = currentIndex();
+    QModelIndex aParent = model()->index(0, 0);
+    int aNbRows = model()->rowCount(aParent);
+    QModelIndex aIdx;
+    if (aCurrent.column() == 3) {
+      QTreeWidget::closeEditor(theEditor, theHint);
+      return;
+    }
+    if (aIdx.isValid()) {
+      QTreeWidget::closeEditor(theEditor, QAbstractItemDelegate::NoHint);
+      setCurrentIndex(aIdx);
+      edit(aIdx);
+      return;
+    }
+  }
+  QTreeWidget::closeEditor(theEditor, theHint);
+}
+
+//********************************************************************
+XGUI_SketchConstraintsBrowser::XGUI_SketchConstraintsBrowser(QWidget* theParent, XGUI_Workshop* theWorkshop)
+    : QWidget(theParent), myWorkshop(theWorkshop)
+{
+  // Attempt create Tree View
+  myViewTree = new XGUI_ConstraintsViewTree(this);
+  myViewTree->setColumnCount(4);
+  QStringList aHeaders;
+  aHeaders << "" << tr("Constraint") << tr("Primitives")
+    << tr("Parameter");
+
+  myViewTree->setHeaderLabels(aHeaders);
+  myViewTree->setColumnWidth(Col_Icon, 40);
+  myViewTree->setColumnWidth(Col_Constraint, 160);
+  myViewTree->setColumnWidth(Col_Primitive, 140);
+  myViewTree->setColumnWidth(Col_Value, 40);
+
+  myViewTree->setEditTriggers(QAbstractItemView::NoEditTriggers);
+  myViewTree->setSelectionBehavior(QAbstractItemView::SelectRows);
+  myViewTree->setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+  connect(myViewTree, SIGNAL(doubleClicked(const QModelIndex&)),
+    SLOT(onDoubleClick(const QModelIndex&)));
+  connect(myViewTree, SIGNAL(itemSelectionChanged()), SLOT(onSelectionChanged()));
+
+  myDelegate = new XGUI_ConstraintsItemDelegate(myViewTree);
+
+  myViewTree->setItemDelegate(myDelegate);
+
+  QPalette aTreePalet = myViewTree->palette();
+  QColor aTreeBack = aTreePalet.color(QPalette::Base);
+
+  QPalette aPalet;
+  aPalet.setColor(QPalette::Base, aTreeBack);
+  aPalet.setColor(QPalette::Window, aTreeBack);
+  myViewTree->setPalette(aTreePalet);
+
+  connect(myViewTree, SIGNAL(contextMenuRequested(QContextMenuEvent*)), this,
+    SLOT(onContextMenuRequested(QContextMenuEvent*)));
+
+  myExtInfo = new QCheckBox(tr("Extended Information"));
+  myExtInfo->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+  myExtInfo->setChecked(true);
+
+  // Connect for show/hide extended information
+  connect(myExtInfo, SIGNAL(toggled(bool)), this, SLOT(SelectStateChanged(bool)));
+  ModuleBase_Tools::adjustMargins(myExtInfo);
+
+  myLayout = new QVBoxLayout(this);
+  ModuleBase_Tools::zeroMargins(myLayout);
+  myLayout->setSpacing(0);
+
+  myLayout->addWidget(myExtInfo);
+  myLayout->addWidget(myViewTree);
+
+  Events_Loop* aLoop = Events_Loop::loop();
+  aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED));
+  aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
+}
+
+XGUI_SketchConstraintsBrowser::~XGUI_SketchConstraintsBrowser()
+{
+  // For avoid crashes after reopen sketch
+  Events_Loop* aLoop = Events_Loop::loop();
+  aLoop->removeListener(this);
+}
+
+void XGUI_SketchConstraintsBrowser::SelectStateChanged(bool /*theState*/)
+{
+  // Add process for show columns in edit mode
+  bool isShowExtInfo = !myExtInfo->isChecked();
+  myViewTree->setColumnHidden(Col_Primitive, isShowExtInfo);
+  myViewTree->setColumnHidden(Col_Value, isShowExtInfo);
+}
+
+// bad first param! Make more easy
+bool XGUI_SketchConstraintsBrowser::UpdateTree(const std::vector<std::pair<FeaturePtr, std::vector<AttributePtr>>>& theList, bool isAddToExist)
+{
+  if (!isAddToExist)
+  {
+    myViewTree->clear();
+    myConstrs.clear();
+  }
+
+  // Prepare all groups of constraints
+  for (const auto& anElemConstr : theList)
+  {
+    myConstrs[FromSketchKindToName(anElemConstr.first->getKind()).first].push_back({ anElemConstr.first, anElemConstr.second });
+  }
+
+  int aRow = 0;
+  for (const auto& line : myConstrs)
+  {
+    //Get icon for group
+    std::string aFile = GetIconPath(line.second.front().Feature->getKind());
+
+    if (line.second[0].Attributes.size() == 0)
+      continue;
+
+    QTreeWidgetItem* anElem = new QTreeWidgetItem(myViewTree);
+    anElem->setFlags(Qt::ItemIsEnabled);
+    anElem->setText(Col_Constraint, QString::fromStdString(line.first));
+    anElem->setIcon(Col_Icon, QIcon(QString::fromStdString(aFile)));
+    anElem->setExpanded(true);
+    auto aStart = line.second.begin();
+    for (; aStart != line.second.end(); ++aStart)
+    {
+      FeatStruct aFeatStruct;
+      //
+      for (const auto& anElemConstr : theList)
+      {
+        if (anElemConstr.first == (*aStart).Feature)
+        {
+          aFeatStruct.Feature = anElemConstr.first;
+          aFeatStruct.Attributes = anElemConstr.second;
+          ++aRow;
+          break;
+        }
+      }
+      //
+      QTreeWidgetItem* aSubElem = new QTreeWidgetItem(anElem);
+      aSubElem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
+      aSubElem->setText(Col_Constraint, QString::fromStdWString((*aStart).Feature->name()));
+      aSubElem->setData(Col_Constraint, Qt::UserRole + 1, (*aStart).Feature->boolean("ConstraintState")->value()); // Store state of constraints true - activated, false - supressed
+
+      QString aPrimitives;
+      aPrimitives = GetName(aFeatStruct.Attributes[0]);
+      if (aFeatStruct.Attributes.size() == 2)
+      {
+        aPrimitives += "\n";
+        aPrimitives += GetName(aFeatStruct.Attributes[1]);
+      }
+
+      aSubElem->setText(Col_Primitive, aPrimitives);
+      if ((*aStart).Feature->real("ConstraintValue"))
+      {
+        if ((*aStart).Feature->real("AngleValue"))
+          aSubElem->setData(Col_Value, Qt::EditRole, (*aStart).Feature->real("AngleValue")->value());
+        else if ((*aStart).Feature->real("DistanceValue"))
+          aSubElem->setData(Col_Value, Qt::EditRole, (*aStart).Feature->real("DistanceValue")->value());
+        else
+          aSubElem->setData(Col_Value, Qt::EditRole, (*aStart).Feature->real("ConstraintValue")->value());
+      }
+      anElem->addChild(aSubElem);
+    }
+
+    myViewTree->addTopLevelItem(anElem);
+  }
+  return true;
+}
+
+//******************************************************
+void XGUI_SketchConstraintsBrowser::processEvent(const std::shared_ptr<Events_Message>& theMessage)
+{
+  if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)
+    || theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED))
+  {
+    std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
+      std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+    std::set<ObjectPtr> aObjects = aUpdMsg->objects();
+
+    foreach(ObjectPtr anObjectC, aObjects)
+    {
+      auto aCreatedFeature = ModelAPI_Feature::feature(anObjectC);
+      if (aCreatedFeature && aCreatedFeature->getKind() == "Sketch")
+      {
+        // It's for update constraints after creating or updating
+        emit deleteCosnstraints();
+        break;
+      }
+    }
+  }
+}
+
+//***************************************************
+void XGUI_SketchConstraintsBrowser::initialize(ModuleBase_ITreeNode* theRoot)
+{
+  QItemSelectionModel* aSelMod = myViewTree->selectionModel();
+  connect(aSelMod, SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
+          this, SLOT(onSelectionChanged(const QItemSelection&, const QItemSelection&)));
+}
+
+//***************************************************
+void XGUI_SketchConstraintsBrowser::onContextMenuRequested(QContextMenuEvent* theEvent)
+{
+  QModelIndexList aIndexes;
+  QObjectPtrList aSelectedData = selectedObjects(&aIndexes);
+  bool toEnable = true;
+
+  foreach(QAction* aCmd, actions()) {
+    aCmd->setEnabled(toEnable);
+  }
+  emit contextMenuRequested(theEvent);
+}
+
+//***************************************************
+void XGUI_SketchConstraintsBrowser::onEditItem()
+{
+  // Create buttons for edit mode - Move to separat fucntion
+  myButtons = new QHBoxLayout(this);
+  QPushButton* anApplyBut =
+    new QPushButton(QIcon(":pictures/plane_view.png"), tr("Apply"));
+  connect(anApplyBut, SIGNAL(clicked(bool)), this, SLOT(onCloseEditor()));
+  QPushButton* aCloseBut =
+    new QPushButton(QIcon(":pictures/plane_view.png"), tr("Cancel"));
+  connect(aCloseBut, SIGNAL(clicked(bool)), this, SLOT(onCloseEditor()));
+  myButtons->addWidget(anApplyBut);
+  myButtons->addWidget(aCloseBut);
+  myLayout->addLayout(myButtons);
+
+  myLastState = myExtInfo->isChecked();
+  myExtInfo->setChecked(true);
+
+  QObjectPtrList aSelectedData = selectedObjects();
+  if (aSelectedData.size() > 0) {
+    ObjectPtr anObject = aSelectedData.first();
+    if (anObject.get()) {  // Selection happens in TreeView
+      // check whether the object can be renamed. There should not be parts which are not loaded
+      std::set<FeaturePtr> aFeatures;
+      aFeatures.insert(ModelAPI_Feature::feature(anObject));
+      if (!XGUI_Tools::canRemoveOrRename((QWidget*)parent(), aFeatures))
+        return;
+
+      // Find index which corresponds the feature
+      QModelIndex aIndex;
+      foreach(QModelIndex aIdx, selectedIndexes()) {
+        if (aIdx.column() == Col_Value) {
+            aIndex = aIdx;
+            if (aIndex.isValid()) {
+              myViewTree->setCurrentIndex(aIndex);
+              auto aData = aIndex.data(0);
+              if (!aData.isNull())
+                myViewTree->openPersistentEditor(myViewTree->currentItem(), Col_Value);
+            }
+        }
+      }
+    }
+  }
+  else
+  {
+    QTreeWidgetItemIterator anIter(myViewTree);
+    while (*anIter) {
+      auto aData = (*anIter)->data(Col_Value, 0);
+      if (!aData.isNull())
+        myViewTree->openPersistentEditor((*anIter), Col_Value);
+      ++anIter;
+    }
+  }
+}
+
+void XGUI_SketchConstraintsBrowser::onDeactivateItems()
+{
+  bool isActivate = true;
+  std::vector<FeaturePtr> aFeaturesMod;
+  // This Check need on request COntext Menu step!
+  foreach(QModelIndex aIdx, selectedIndexes())
+  {
+    if (aIdx.isValid() && aIdx.column() == Col_Constraint) {
+      auto aBool = aIdx.data(Qt::UserRole + 1).toBool();
+      if (aBool)
+      {
+        isActivate = false;
+        break;
+      }
+    }
+  }
+
+  QObjectPtrList aSelectedData = selectedObjects();
+  if (aSelectedData.size() > 0) {
+    ObjectPtr anObject = aSelectedData.first();
+    if (anObject.get()) {  // Selection happens in TreeView
+      // check whether the object can be renamed. There should not be parts which are not loaded
+      std::set<FeaturePtr> aFeatures;
+      aFeatures.insert(ModelAPI_Feature::feature(anObject));
+      if (!XGUI_Tools::canRemoveOrRename((QWidget*)parent(), aFeatures))
+        return;
+
+      // Find index which corresponds the feature
+      foreach(QModelIndex aIdx, selectedIndexes()) {
+          auto aParent = GetIndex(aIdx);
+          if (aParent.isValid() && aIdx.isValid() && aIdx.column() == Col_Constraint) {
+            myViewTree->setCurrentIndex(aIdx);
+            myViewTree->currentItem()->setData(Col_Constraint, Qt::UserRole + 1, isActivate);
+
+            auto aFeat = myConstrs[aParent.data().toString().toStdString()].at(aIdx.row()).Feature;
+            aFeaturesMod.push_back(aFeat);
+          }
+      }
+    }
+  }
+
+  emit deactivate(isActivate, aFeaturesMod);
+}
+
+void XGUI_SketchConstraintsBrowser::onCloseEditor()
+{
+  // Close editor
+  QTreeWidgetItemIterator anIter(myViewTree);
+  while (*anIter) {
+    myViewTree->closePersistentEditor((*anIter), Col_Value);
+    ++anIter;
+  }
+  myExtInfo->setChecked(myLastState);
+
+  // Send signals for apply uopdates
+  emit editValues();
+
+  myButtons->takeAt(1)->widget()->deleteLater();
+  myButtons->takeAt(0)->widget()->deleteLater();
+
+  myButtons->deleteLater();
+}
+
+void XGUI_SketchConstraintsBrowser::onCloseEditor(QWidget* theEditor, QAbstractItemDelegate::EndEditHint theHint)
+{
+}
+
+//***************************************************
+void XGUI_SketchConstraintsBrowser::setObjectsSelected(const QObjectPtrList& theObjects)
+{
+  QItemSelectionModel* aSelectModel = myViewTree->selectionModel();
+  QModelIndexList aIndexes = aSelectModel->selectedIndexes();
+  if (theObjects.size() == 0) {
+    bool aIsBlock = aSelectModel->blockSignals(true);
+    aSelectModel->clear();
+    aSelectModel->blockSignals(aIsBlock);
+    foreach(QModelIndex aIdx, aIndexes) {
+      myViewTree->update(aIdx);
+    }
+    return;
+  }
+}
+
+//***************************************************
+void XGUI_SketchConstraintsBrowser::onSelectionChanged(const QItemSelection& theSelected,
+                                             const QItemSelection& theDeselected)
+{
+  onSelectionChanged();
+}
+
+//***************************************************
+void XGUI_SketchConstraintsBrowser::onSelectionChanged()
+{
+  emit selectionChanged();
+}
+
+//***************************************************
+QObjectPtrList XGUI_SketchConstraintsBrowser::selectedObjects(QModelIndexList* theIndexes) const
+{
+  QObjectPtrList aList;
+  QModelIndexList aIndexes = selectedIndexes();
+
+  foreach(QModelIndex aIdx, aIndexes) {
+    if (aIdx.column() == Col_Constraint) {
+      QModelIndex aParentData = GetIndex(aIdx);
+      if (!aParentData.isValid())
+        continue;
+
+      std::string aData = aParentData.data().toString().toStdString();
+      ObjectPtr aObject = myConstrs.at(aData).at(aIdx.row()).Feature;
+
+      auto anAttrs = myConstrs.at(aParentData.data().toString().toStdString()).at(aIdx.row()).Attributes;
+      if (aObject) {
+        if (!aList.contains(aObject))
+        {
+          aList.append(aObject);
+
+          // Add related primitives to list
+          for (int anIndex = 0; anIndex < anAttrs.size(); ++anIndex)
+          {
+            if (anAttrs[anIndex]->attributeType() == ModelAPI_AttributeRefAttr::typeId())
+            {
+              AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(anAttrs[anIndex]);
+              if (!aRefAttr->attr())
+              {
+                auto aFObj = aRefAttr->object();
+
+                if (!aList.contains(aFObj))
+                {
+                  aList.append(aFObj);
+                }
+              }
+              else
+              {
+                aList.append(aRefAttr->attr()->owner());
+              }
+            }
+          }
+
+          if (theIndexes)
+            theIndexes->append(aIdx);
+        }
+      }
+    }
+  }
+  return aList;
+}
+
+//***************************************************
+QObjectPtrList XGUI_SketchConstraintsBrowser::selectedConstraints(QModelIndexList* theIndexes) const
+{
+  QObjectPtrList aList;
+  QModelIndexList aIndexes = selectedIndexes();
+
+  foreach(QModelIndex aIdx, aIndexes) {
+    if (aIdx.column() == Col_Constraint) {
+      QModelIndex aParentData = GetIndex(aIdx);
+      if (!aParentData.isValid())
+        continue;
+
+      std::string aData = aParentData.data().toString().toStdString();
+      ObjectPtr aObject = myConstrs.at(aData).at(aIdx.row()).Feature;
+      if (aObject) {
+        if (!aList.contains(aObject))
+        {
+          aList.append(aObject);
+
+          if (theIndexes)
+            theIndexes->append(aIdx);
+        }
+      }
+    }
+  }
+  return aList;
+}
+
+//***************************************************
+void XGUI_SketchConstraintsBrowser::onDoubleClick(const QModelIndex& theIndex)
+{
+  if (myDelegate->isEditable(theIndex)) {
+    myViewTree->setCurrentIndex(theIndex);
+    myViewTree->openPersistentEditor(myViewTree->currentItem(), Col_Value);
+    // Create buttons apply/Close!
+    onEditItem();
+  }
+}
+
+void XGUI_SketchConstraintsBrowser::resizeEvent(QResizeEvent* theEvent)
+{
+  QWidget::resizeEvent(theEvent);
+  emit sizeChanged();
+}
diff --git a/src/XGUI/XGUI_SketchConstraintsBrowser.h b/src/XGUI/XGUI_SketchConstraintsBrowser.h
new file mode 100644 (file)
index 0000000..01b7946
--- /dev/null
@@ -0,0 +1,204 @@
+// Copyright (C) 2014-2022  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 XGUI_SketchConstraintsBrowser_H
+#define XGUI_SketchConstraintsBrowser_H
+
+#include "XGUI.h"
+#include <ModuleBase_Definitions.h>
+#include <ModelAPI_Object.h>
+#include <ModelAPI_ResultPart.h>
+#include <ModelAPI_Events.h>
+#include <ModelAPI_Folder.h>
+#include <XGUI_DataModel.h>
+#include <ModelAPI_Attribute.h>
+
+#include <QWidget>
+#include <QTreeView>
+#include <QLabel>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QMap>
+#include <QCheckBox>
+#include <QScrollArea>
+#include <QTreeWidget>
+
+class ModuleBase_IDocumentDataModel;
+class XGUI_DataModel;
+class Config_DataModelReader;
+class XGUI_Workshop;
+class XGUI_ConstraintsItemDelegate;
+class ModuleBase_ITreeNode;
+
+//#define DEBUG_INDXES
+
+struct FeatStruct
+{
+  FeaturePtr Feature;
+  std::vector<AttributePtr> Attributes;
+};
+
+
+class XGUI_EXPORT XGUI_ConstraintsViewTree : public QTreeWidget
+{
+  Q_OBJECT
+public:
+  /// Constructor
+  /// \param theParent a parent widget
+  XGUI_ConstraintsViewTree(QWidget* theParent = 0) : QTreeWidget(theParent) {}
+
+  /// Returns current data model
+  XGUI_DataModel* dataModel() const
+  {
+    return static_cast<XGUI_DataModel*>(model());
+  }
+
+signals:
+  //! Emited on context menu request
+  void contextMenuRequested(QContextMenuEvent* theEvent);
+
+protected slots:
+  /// Redefinition of virtual method
+  virtual void contextMenuEvent(QContextMenuEvent* theEvent)
+  {
+    emit contextMenuRequested(theEvent);
+  }
+
+  void closeEditor(QWidget* theEditor, QAbstractItemDelegate::EndEditHint theHint);
+
+};
+
+/**\class XGUI_SketchConstraintsBrowser
+ * \ingroup GUI
+ * \brief Object browser window object. Represents data tree of current data structure
+ */
+class XGUI_EXPORT XGUI_SketchConstraintsBrowser : public QWidget, public Events_Listener
+{
+Q_OBJECT
+ public:
+
+   // Temporary for more simple modification
+   XGUI_ConstraintsViewTree* getViewTree() { return myViewTree; }
+
+   // Make more good option
+   bool UpdateTree(const std::vector<std::pair<FeaturePtr, std::vector<AttributePtr>>>& theList, bool isAddToExist = false);
+
+   /// Constructor
+   /// \param theParent a parent widget
+  XGUI_SketchConstraintsBrowser(QWidget* theParent, XGUI_Workshop* theWorkshop);
+  virtual ~XGUI_SketchConstraintsBrowser();
+
+  /// Event Listener method
+  /// \param theMessage an event message
+  virtual void processEvent(const std::shared_ptr<Events_Message>& theMessage);
+
+  //! Returns list of currently selected constraints and geometries
+  //! \param theIndexes - output list of corresponded indexes (can be NULL)
+  QObjectPtrList selectedObjects(QModelIndexList* theIndexes = 0) const;
+
+  //! Returns list of currently selected constraints in browser
+  //! \param theIndexes - output list of corresponded indexes (can be NULL)
+  QObjectPtrList selectedConstraints(QModelIndexList* theIndexes = 0) const;
+
+  /// Set selected list of objects
+  /// \param theObjects list of objects to select
+  void setObjectsSelected(const QObjectPtrList& theObjects);
+
+  //! Returns currently selected indexes
+  QModelIndexList selectedIndexes() const
+  {
+    if (myViewTree->selectionModel())
+      return myViewTree->selectionModel()->selectedIndexes();
+    else
+      return QModelIndexList();
+  }
+
+  /// Initialize the Object browser
+  void initialize(ModuleBase_ITreeNode* theRoot);
+
+  /// Returns current workshop
+  XGUI_Workshop* workshop() const { return myWorkshop; }
+
+  void onSelectionChanged();
+
+public slots:
+  //! Called on Edit command request
+  void onEditItem();
+
+  //! Change state of constraints
+  void onDeactivateItems();
+
+private slots:
+  void SelectStateChanged(bool theState);
+
+signals:
+  //! Emited when selection is changed
+  void selectionChanged();
+
+  //! Emited on context menu request
+  void contextMenuRequested(QContextMenuEvent* theEvent);
+
+  //! Segnal is emitted when user cliks by mouse in header label of object browser
+  void headerMouseDblClicked(const QModelIndex&);
+
+  //! An signal emitted on resize of the Object Browser
+  void sizeChanged();
+
+  void editValues();
+  void deleteCosnstraints();
+  void deactivate(bool, std::vector<FeaturePtr>);
+
+protected:
+  //! redefinition of a virtual method
+  void resizeEvent(QResizeEvent* theEvent);
+
+ private slots:
+  /// Show context menu
+  /// \param theEvent a context menu event
+  void onContextMenuRequested(QContextMenuEvent* theEvent);
+
+  //! Called when selection in Data Tree is changed
+  void onSelectionChanged(const QItemSelection& theSelected, const QItemSelection& theDeselected);
+
+  /// Slot for reaction on double click in the table (start editing)
+/// \param theIndex the clicked index
+  void onDoubleClick(const QModelIndex& theIndex);
+
+  /// Slot for reaction on end of cell editing
+  /// \param theEditor the editor widget
+  /// \param theHint end of edit type
+  void onCloseEditor(QWidget* theEditor, QAbstractItemDelegate::EndEditHint theHint);
+
+  void onCloseEditor();
+
+ private:
+  XGUI_Workshop* myWorkshop;
+
+  XGUI_ConstraintsViewTree* myViewTree;
+  QVBoxLayout* myLayout;
+  QHBoxLayout* myButtons;
+
+  bool myLastState; //Store state of Extended Information CheckBox (need for correct reset after edit constraints)
+  QCheckBox* myExtInfo;
+  XGUI_ConstraintsItemDelegate* myDelegate;
+
+  std::map<std::string, std::vector<FeatStruct>> myConstrs; // string - name of group, vector - constraints from group
+};
+
+#endif
index 6ae78b95d4bd588ba7199f934272c0fb3a1c06b0..b32ccd8fdc9d1f31e5648ddf3c075905d5470d24 100644 (file)
@@ -51,6 +51,8 @@
 #include <XGUI_InspectionPanel.h>
 #include <XGUI_CompressFiles.h>
 
+#include <XGUI_SketchConstraintsBrowser.h>
+
 #ifdef HAVE_SALOME
 #include <SUIT_Application.h>
 #include <SUIT_Session.h>
@@ -207,6 +209,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
     : QObject(),
       myModule(NULL),
       myObjectBrowser(0),
+      mySkConstBrwsr(0),
       myPropertyPanel(0),
       myFacesPanel(0),
       myDisplayer(0),
@@ -1624,6 +1627,29 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent)
   return aObjDock;
 }
 
+//******************************************************
+QDockWidget* XGUI_Workshop::createConstraintsBrowser(QWidget* theParent)
+{
+  QDockWidget* aSkDock = new QDockWidget(theParent);
+  aSkDock->setAllowedAreas(Qt::LeftDockWidgetArea |
+                           Qt::RightDockWidgetArea);
+  aSkDock->setWindowTitle(tr("Sketch Constraints Browser"));
+  aSkDock->setStyleSheet(
+    "::title { position: relative; padding-left: 5px; text-align: left center }");
+
+  mySkConstBrwsr = new XGUI_SketchConstraintsBrowser(aSkDock, this);
+  mySkConstBrwsr->initialize(myModule->rootNode());
+  //myModule->customizeObjectBrowser(mySkConstBrwsr);
+  aSkDock->setWidget(mySkConstBrwsr);
+  aSkDock->setObjectName("Constraints browser");
+
+  connect(mySkConstBrwsr, SIGNAL(sizeChanged()), SLOT(onDockSizeChanged()));
+
+  mySelector->connectViewers();
+  myContextMenuMgr->connectConstraintsBrowser();
+  return aSkDock;
+}
+
 //******************************************************
 /*
  * Creates dock widgets, places them in corresponding area
@@ -1769,6 +1795,20 @@ void XGUI_Workshop::hideObjectBrowser()
     myObjectBrowser->parentWidget()->hide();
 }
 
+//******************************************************
+void XGUI_Workshop::showConstraintsBrowser()
+{
+  if (!isSalomeMode())
+    mySkConstBrwsr->parentWidget()->show();
+}
+
+//******************************************************
+void XGUI_Workshop::hideConstraintsBrowser()
+{
+  if (!isSalomeMode())
+    mySkConstBrwsr->parentWidget()->hide();
+}
+
 //******************************************************
 void XGUI_Workshop::salomeViewerSelectionChanged()
 {
@@ -1789,6 +1829,10 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked)
     deleteObjects();
   else if (theId == "CLEAN_HISTORY_CMD")
     cleanHistory();
+  else if (theId == "EDIT_CONSTR_CMD")
+    editConstraints();
+  else if (theId == "DEACTIVATE_CONSTRAINT_CMD")
+    deactivateCosntraint();
   else if (theId == "MOVE_CMD" || theId == "MOVE_SPLIT_CMD")
     moveObjects(theId == "MOVE_SPLIT_CMD");
   else if (theId == "RECOVER_CMD")
@@ -2121,6 +2165,23 @@ void XGUI_Workshop::deleteObjects()
   myDisplayer->updateViewer();
 }
 
+void XGUI_Workshop::deactivateCosntraint()
+{
+  QObjectPtrList anObjects = constraintsBrowser()->selectedObjects();
+
+  constraintsBrowser()->setObjectsSelected(anObjects);
+  constraintsBrowser()->onDeactivateItems();
+}
+
+void XGUI_Workshop::editConstraints()
+{
+  QObjectPtrList anObjects = constraintsBrowser()->selectedObjects();
+
+  // restore selection in case if dialog box was shown
+  constraintsBrowser()->setObjectsSelected(anObjects);
+  constraintsBrowser()->onEditItem();
+}
+
 //**************************************************************
 void addRefsToFeature(const FeaturePtr& theFeature,
                       const std::map<FeaturePtr, std::set<FeaturePtr> >& theMainList,
index b6e25c670dee278a950fca4b030ba4cd3c2d5a56..7bc4ecc690ba2c442cbd4deecc422e5a8b0045f7 100644 (file)
@@ -65,6 +65,7 @@ class XGUI_SelectionMgr;
 class XGUI_ViewerProxy;
 class XGUI_WorkshopListener;
 class XGUI_InspectionPanel;
+class XGUI_SketchConstraintsBrowser;
 
 class ModuleBase_IModule;
 class ModuleBase_IViewer;
@@ -88,6 +89,12 @@ Q_OBJECT
   XGUI_Workshop(XGUI_SalomeConnector* theConnector = 0);
   virtual ~XGUI_Workshop();
 
+  /// Create Sketch constraints browser widget
+  /// \param theParent a parent of widget
+  QDockWidget* createConstraintsBrowser(QWidget* theParent);
+
+  void removeConstrBrowser() { mySkConstBrwsr = NULL; }
+
   /// Starting of the application
   void startApplication();
 
@@ -153,6 +160,9 @@ Q_OBJECT
   /// Returns Object browser
   XGUI_ObjectsBrowser* objectBrowser() const { return myObjectBrowser; }
 
+  /// Returns Sketch constraints browser
+  XGUI_SketchConstraintsBrowser* constraintsBrowser() const { return mySkConstBrwsr; }
+
   /// This method is called by Salome module when selection is changed
   void salomeViewerSelectionChanged();
 
@@ -176,6 +186,11 @@ Q_OBJECT
   /// Delete features
   void deleteObjects();
 
+  /// Eit constraints
+  void editConstraints();
+
+  void deactivateCosntraint();
+
   /// Searches for selected features unused in other (not selected) features. If one or several
   /// selected features are found, a warning message proposes to delete them. It contains
   /// the list of features to be deleted.
@@ -412,6 +427,12 @@ signals:
   /// Hide object Browser
   void hideObjectBrowser();
 
+  /// Show Sketch constraints Browser
+  void showConstraintsBrowser();
+
+  /// Hide Sketch constraints Browser
+  void hideConstraintsBrowser();
+
   /// Close document
   void closeDocument();
 
@@ -569,6 +590,7 @@ private:
   AppElements_MainWindow* myMainWindow; ///< desktop window
 #endif
 
+  XGUI_SketchConstraintsBrowser* mySkConstBrwsr; // ~~!!!!~~
   ModuleBase_IModule* myModule; ///< current module
   XGUI_ErrorMgr* myErrorMgr; ///< updator of error message
   XGUI_ObjectsBrowser* myObjectBrowser; ///< data tree widget
index 9d89050d2aa3121ffd3d50b36e79987094369d23..db4f19255794f190ddd1d8948245400d97543c16 100644 (file)
         <translation>Panneau de propriété</translation>
     </message>
 </context>
+<context>
+    <name>XGUI_SketchConstraintsBrowser</name>
+    <message>
+        <source>Extended Information</source>
+        <translation>Informations étendues</translation>
+    </message>
+</context>
 <context>
     <name>XGUI_TransparencyWidget</name>
     <message>