Salome HOME
Issue #2149 Split does not highlight the selected edge
authornds <nds@opencascade.com>
Wed, 10 May 2017 14:29:21 +0000 (17:29 +0300)
committernds <nds@opencascade.com>
Wed, 10 May 2017 14:29:21 +0000 (17:29 +0300)
16 files changed:
src/PartSet/CMakeLists.txt
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_SketcherReentrantMgr.cpp
src/PartSet/PartSet_WidgetFeaturePointSelector.cpp
src/PartSet/PartSet_WidgetFeaturePointSelector.h
src/PartSet/PartSet_WidgetSubShapeSelector.cpp [deleted file]
src/PartSet/PartSet_WidgetSubShapeSelector.h [deleted file]
src/SketchAPI/SketchAPI_Sketch.cpp
src/SketchAPI/SketchAPI_Sketch.h
src/SketchPlugin/CMakeLists.txt
src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp [deleted file]
src/SketchPlugin/SketchPlugin_ConstraintSplit.h [deleted file]
src/SketchPlugin/SketchPlugin_Plugin.cpp
src/SketchPlugin/SketchPlugin_Trim.cpp
src/SketchPlugin/SketchPlugin_Trim.h
src/SketchPlugin/plugin-Sketch.xml

index 8dee08d11edbdb8089095c487af4e2c96491642b..1a997eaea836f999af06e2db6a593eb410675cb2 100644 (file)
@@ -38,7 +38,6 @@ SET(PROJECT_HEADERS
     PartSet_WidgetShapeSelector.h
     PartSet_WidgetSketchCreator.h
     PartSet_WidgetSketchLabel.h
-    PartSet_WidgetSubShapeSelector.h
 )
 
 SET(PROJECT_MOC_HEADERS
@@ -57,7 +56,6 @@ SET(PROJECT_MOC_HEADERS
     PartSet_WidgetShapeSelector.h
     PartSet_WidgetSketchCreator.h
     PartSet_WidgetSketchLabel.h
-    PartSet_WidgetSubShapeSelector.h
 )
 
 SET(PROJECT_SOURCES
@@ -85,7 +83,6 @@ SET(PROJECT_SOURCES
     PartSet_WidgetShapeSelector.cpp
     PartSet_WidgetSketchCreator.cpp
     PartSet_WidgetSketchLabel.cpp
-    PartSet_WidgetSubShapeSelector.cpp
 )
 
 SET(PROJECT_RESOURCES
index 717bfeed6a56640cd10c63943b90e0a57020e5dc..4ba63e7ca694ec2200c70a56fc2e332a822148cd 100755 (executable)
@@ -9,7 +9,6 @@
 #include "PartSet_WidgetPoint2DFlyout.h"
 #include "PartSet_WidgetShapeSelector.h"
 #include "PartSet_WidgetMultiSelector.h"
-#include "PartSet_WidgetSubShapeSelector.h"
 #include "PartSet_WidgetFeaturePointSelector.h"
 #include "PartSet_WidgetEditor.h"
 #include "PartSet_WidgetFileSelector.h"
@@ -752,12 +751,6 @@ ModuleBase_ModelWidget* PartSet_Module::createWidgetByType(const std::string& th
     aShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch());
     aWgt = aShapeSelectorWgt;
   }
-  else if (theType == "sketch_sub_shape_selector") {
-    PartSet_WidgetSubShapeSelector* aSubShapeSelectorWgt =
-                          new PartSet_WidgetSubShapeSelector(theParent, aWorkshop, theWidgetApi);
-    aSubShapeSelectorWgt->setSketcher(mySketchMgr->activeSketch());
-    aWgt = aSubShapeSelectorWgt;
-  }
   else if (theType == "sketch_feature_point_selector") {
     PartSet_WidgetFeaturePointSelector* aPointSelectorWgt =
             new PartSet_WidgetFeaturePointSelector(theParent, aWorkshop, theWidgetApi);
index 7006876a4dfd44aad1d85b479908334d8662c1a3..35fbf3e41c975d6e68ea328bfc30b5fc3d59027a 100644 (file)
@@ -8,6 +8,7 @@
 #include "ModelAPI_Session.h"
 #include "ModelAPI_AttributeString.h"
 #include "ModelAPI_AttributeRefAttr.h"
+#include "ModelAPI_AttributeReference.h"
 #include "ModelAPI_EventReentrantMessage.h"
 
 #include "GeomDataAPI_Point2D.h"
@@ -30,6 +31,7 @@
 #include <SketchPlugin_MacroCircle.h>
 #include <SketchPlugin_Point.h>
 #include <SketchPlugin_Trim.h>
+#include <SketchPlugin_Split.h>
 
 #include <XGUI_Workshop.h>
 #include <XGUI_ModuleConnector.h>
@@ -729,39 +731,26 @@ bool PartSet_SketcherReentrantMgr::copyReetntrantAttributes(const FeaturePtr& th
     //ModuleBase_Tools::flushUpdated(theNewFeature);
     //aChanged = true;
   }
-  else if (aFeatureKind == SketchPlugin_Trim::ID()) {
-    /*std::shared_ptr<ModelAPI_AttributeReference> aRefSelectedAttr =
-                      std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                      theSourceFeature->data()->attribute(SketchPlugin_Trim::SELECTED_OBJECT()));
-    std::shared_ptr<ModelAPI_AttributeReference> aNRefSelectedAttr =
-                      std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                      theNewFeature->data()->attribute(SketchPlugin_Trim::SELECTED_OBJECT()));
-    aNRefSelectedAttr->setValue(aRefSelectedAttr->value());*/
-
+  else if (aFeatureKind == SketchPlugin_Trim::ID() ||
+           aFeatureKind == SketchPlugin_Split::ID()) {
+    std::string aPreviewObjectAttribute = aFeatureKind == SketchPlugin_Trim::ID() ?
+                SketchPlugin_Trim::PREVIEW_OBJECT(): SketchPlugin_Split::PREVIEW_OBJECT();
+    std::string aPreviewPointAttribute = aFeatureKind == SketchPlugin_Trim::ID() ?
+                SketchPlugin_Trim::PREVIEW_POINT(): SketchPlugin_Split::PREVIEW_POINT();
     std::shared_ptr<ModelAPI_AttributeReference> aRefPreviewAttr =
                       std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                      theSourceFeature->data()->attribute(SketchPlugin_Trim::PREVIEW_OBJECT()));
+                      theSourceFeature->data()->attribute(aPreviewObjectAttribute));
     std::shared_ptr<ModelAPI_AttributeReference> aNRefPreviewAttr =
                         std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                        theNewFeature->data()->attribute(SketchPlugin_Trim::PREVIEW_OBJECT()));
+                        theNewFeature->data()->attribute(aPreviewObjectAttribute));
     aNRefPreviewAttr->setValue(aRefPreviewAttr->value());
-
-    /*std::shared_ptr<GeomDataAPI_Point2D> aPointSelectedAttr =
-                      std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                      theSourceFeature->data()->attribute(SketchPlugin_Trim::SELECTED_POINT()));
-    std::shared_ptr<GeomDataAPI_Point2D> aNPointSelectedAttr =
-                      std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                      theNewFeature->data()->attribute(SketchPlugin_Trim::SELECTED_POINT()));
-    aNPointSelectedAttr->setValue(aPointSelectedAttr->x(), aPointSelectedAttr->y());
-    */
     std::shared_ptr<GeomDataAPI_Point2D> aPointPreviewAttr =
                       std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                      theSourceFeature->data()->attribute(SketchPlugin_Trim::PREVIEW_POINT()));
+                      theSourceFeature->data()->attribute(aPreviewPointAttribute));
     std::shared_ptr<GeomDataAPI_Point2D> aNPointPreviewAttr =
                       std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                      theNewFeature->data()->attribute(SketchPlugin_Trim::PREVIEW_POINT()));
+                      theNewFeature->data()->attribute(aPreviewPointAttribute));
     aNPointPreviewAttr->setValue(aPointPreviewAttr->x(), aPointPreviewAttr->y());
-    //aChanged = true;
   }
   return aChanged;
 }
index f68e580d9713841684332f00b948fbbfe3b4c901..cd98c423c2d4201a774f4ff185d923b1ec7da1d4 100644 (file)
@@ -17,6 +17,7 @@
 #include <ModuleBase_ISelection.h>
 #include <ModuleBase_ViewerPrs.h>
 
+#include <ModelAPI_AttributeReference.h>
 #include <ModelAPI_Events.h>
 #include <ModelAPI_Feature.h>
 #include <ModelAPI_Tools.h>
 #include "PartSet_WidgetFeaturePointSelector.h"
 #include "PartSet_Tools.h"
 
-//#include <SketchPlugin_ConstraintCoincidence.h>
-//#include <SketchPlugin_Constraint.h>
 #include <SketchPlugin_Point.h>
-#include <SketchPlugin_Trim.h>
 
 #include <XGUI_Tools.h>
 #include <XGUI_Workshop.h>
@@ -52,6 +50,13 @@ PartSet_WidgetFeaturePointSelector::PartSet_WidgetFeaturePointSelector(QWidget*
                                                          const Config_WidgetAPI* theData)
 : ModuleBase_WidgetShapeSelector(theParent, theWorkshop, theData)
 {
+  std::string anAttributes = theData->getProperty("selection_attributes");
+  QStringList anAttributesList = QString(anAttributes.c_str()).split(' ', QString::SkipEmptyParts);
+
+  mySelectedObjectAttribute = anAttributesList[0].toStdString();
+  mySelectedPointAttribute = anAttributesList[1].toStdString();
+  myPreviewObjectAttribute = anAttributesList[2].toStdString();
+  myPreviewPointAttribute = anAttributesList[3].toStdString();
 }
 
 PartSet_WidgetFeaturePointSelector::~PartSet_WidgetFeaturePointSelector()
@@ -134,7 +139,7 @@ void PartSet_WidgetFeaturePointSelector::mouseReleased(ModuleBase_IViewWindow* t
 
   std::shared_ptr<ModelAPI_AttributeReference> aRefPreviewAttr =
                           std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                          feature()->data()->attribute(SketchPlugin_Trim::PREVIEW_OBJECT()));
+                          feature()->data()->attribute(myPreviewObjectAttribute));
   ObjectPtr aPreviewObject = aRefPreviewAttr->value();
   // do not move focus from the current widget if the object is not highlighted/selected
   if (!aPreviewObject.get())
@@ -143,15 +148,15 @@ void PartSet_WidgetFeaturePointSelector::mouseReleased(ModuleBase_IViewWindow* t
   // set parameters of preview into parameters of selection in the feature
   std::shared_ptr<ModelAPI_AttributeReference> aRefSelectedAttr =
                           std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                          feature()->data()->attribute(SketchPlugin_Trim::SELECTED_OBJECT()));
+                          feature()->data()->attribute(mySelectedObjectAttribute));
   aRefSelectedAttr->setValue(aRefPreviewAttr->value());
 
   std::shared_ptr<GeomDataAPI_Point2D> aPointSelectedAttr =
                           std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                          feature()->data()->attribute(SketchPlugin_Trim::SELECTED_POINT()));
+                          feature()->data()->attribute(mySelectedPointAttribute));
   std::shared_ptr<GeomDataAPI_Point2D> aPointPreviewAttr =
                           std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                          feature()->data()->attribute(SketchPlugin_Trim::PREVIEW_POINT()));
+                          feature()->data()->attribute(myPreviewPointAttribute));
   aPointSelectedAttr->setValue(aPointPreviewAttr->x(), aPointPreviewAttr->y());
 
   updateObject(feature());
@@ -174,12 +179,12 @@ bool PartSet_WidgetFeaturePointSelector::fillFeature(
 
   std::shared_ptr<ModelAPI_AttributeReference> aRef =
                           std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                          feature()->data()->attribute(SketchPlugin_Trim::PREVIEW_OBJECT()));
+                          feature()->data()->attribute(myPreviewObjectAttribute));
   aRef->setValue(anObject);
 
   std::shared_ptr<GeomDataAPI_Point2D> anAttributePoint =
                   std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                  feature()->data()->attribute(SketchPlugin_Trim::PREVIEW_POINT()));
+                  feature()->data()->attribute(myPreviewPointAttribute));
   std::shared_ptr<GeomAPI_Pnt2d> aPoint = PartSet_Tools::getPnt2d(theEvent, theWindow, mySketch);
   anAttributePoint->setValue(aPoint);
   // redisplay AIS presentation in viewer
index 96d559d0c6f4455d5cf9b325ea507aca1c071174..176638c5128b3dcee56768f0685896b1958b9c43 100644 (file)
@@ -18,6 +18,8 @@
 
 #include <QObject>
 
+#include <string>
+
 class ModuleBase_IWorkshop;
 class Config_WidgetAPI;
 class ModuleBase_IViewWindow;
@@ -113,6 +115,11 @@ protected:
   CompositeFeaturePtr mySketch;
   Quantity_Color myHighlightColor;
   Quantity_Color mySelectionColor;
+
+  std::string mySelectedObjectAttribute;
+  std::string mySelectedPointAttribute;
+  std::string myPreviewObjectAttribute;
+  std::string myPreviewPointAttribute;
 };
 
 #endif
\ No newline at end of file
diff --git a/src/PartSet/PartSet_WidgetSubShapeSelector.cpp b/src/PartSet/PartSet_WidgetSubShapeSelector.cpp
deleted file mode 100755 (executable)
index 24dd2ca..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-
-// File:        PartSet_WidgetSubShapeSelector.cpp
-// Created:     21 Jul 2016
-// Author:      Natalia ERMOLAEVA
-
-#include "PartSet_WidgetSubShapeSelector.h"
-#include "PartSet_Tools.h"
-
-#include <ModuleBase_ISelection.h>
-#include <ModuleBase_ViewerPrs.h>
-
-#include <ModelAPI_Feature.h>
-#include <ModelAPI_Tools.h>
-#include <GeomDataAPI_Point2D.h>
-
-#include <GeomDataAPI_Point.h>
-#include <GeomAPI_Edge.h>
-#include <GeomAPI_Pnt2d.h>
-
-#include <GeomAlgoAPI_ShapeTools.h>
-#include <ModelGeomAlgo_Point2D.h>
-#include <ModelGeomAlgo_Shape.h>
-
-#include <ModelGeomAlgo_Point2D.h>
-
-#include <SketchPlugin_ConstraintCoincidence.h>
-#include <SketchPlugin_Constraint.h>
-#include <SketchPlugin_Point.h>
-
-#include <ModuleBase_IViewWindow.h>
-#include <ModuleBase_IWorkshop.h>
-#include <ModuleBase_IModule.h>
-
-#include <Config_WidgetAPI.h>
-
-#include <XGUI_Tools.h>
-#include <XGUI_Workshop.h>
-#include <XGUI_Displayer.h>
-
-#include <QWidget>
-#include <QMouseEvent>
-
-PartSet_WidgetSubShapeSelector::PartSet_WidgetSubShapeSelector(QWidget* theParent,
-                                                         ModuleBase_IWorkshop* theWorkshop,
-                                                         const Config_WidgetAPI* theData)
-: ModuleBase_WidgetShapeSelector(theParent, theWorkshop, theData)
-{
-  myCurrentSubShape = std::shared_ptr<ModuleBase_ViewerPrs>(new ModuleBase_ViewerPrs());
-}
-
-PartSet_WidgetSubShapeSelector::~PartSet_WidgetSubShapeSelector()
-{
-  myCashedShapes.clear();
-}
-
-//********************************************************************
-void PartSet_WidgetSubShapeSelector::activateCustom()
-{
-  ModuleBase_WidgetShapeSelector::activateCustom();
-
-  myWorkshop->module()->activateCustomPrs(myFeature,
-                            ModuleBase_IModule::CustomizeHighlightedObjects, true);
-}
-
-//********************************************************************
-void PartSet_WidgetSubShapeSelector::deactivate()
-{
-  ModuleBase_WidgetShapeSelector::deactivate();
-
-  myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true);
-}
-
-//********************************************************************
-void PartSet_WidgetSubShapeSelector::mouseMoved(ModuleBase_IViewWindow* theWindow,
-                                                QMouseEvent* theEvent)
-{
-  ModuleBase_ISelection* aSelect = myWorkshop->selection();
-  QList<ModuleBase_ViewerPrsPtr> aHighlighted = aSelect->getHighlighted();
-
-  if (!aHighlighted.empty()) {
-    ModuleBase_ViewerPrsPtr aPrs = aHighlighted.first();
-    if (aPrs.get() && aPrs->object().get()) {
-      ObjectPtr anObject = aPrs->object();
-      if (myCashedShapes.find(anObject) == myCashedShapes.end())
-        fillObjectShapes(anObject);
-      const std::set<GeomShapePtr>& aShapes = myCashedShapes[anObject];
-      if (!aShapes.empty()) {
-        gp_Pnt aPnt = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWindow->v3dView());
-        double aX, anY;
-        Handle(V3d_View) aView = theWindow->v3dView();
-        PartSet_Tools::convertTo2D(aPnt, mySketch, aView, aX, anY);
-        std::shared_ptr<GeomAPI_Pnt> aPoint = PartSet_Tools::convertTo3D(aX, anY, mySketch);
-
-        std::set<GeomShapePtr>::const_iterator anIt = aShapes.begin(), aLast = aShapes.end();
-        for (; anIt != aLast; anIt++) {
-          GeomShapePtr aBaseShape = *anIt;
-          std::shared_ptr<GeomAPI_Pnt> aProjectedPoint;
-          if (ModelGeomAlgo_Point2D::isPointOnEdge(aBaseShape, aPoint, aProjectedPoint)) {
-            XGUI_Tools::workshop(myWorkshop)->displayer()->clearSelected(false);
-            if (myCurrentSubShape->object() != anObject ||
-                myCurrentSubShape->shape() != aBaseShape) {
-              myCurrentSubShape->setObject(anObject);
-              myCurrentSubShape->setShape(aBaseShape);
-
-              ModuleBase_IModule* aModule = myWorkshop->module();
-
-
-              if (!aModule->isCustomPrsActivated(ModuleBase_IModule::CustomizeHighlightedObjects))
-                aModule->activateCustomPrs(myFeature,
-                                           ModuleBase_IModule::CustomizeHighlightedObjects, true);
-              aModule->customizeObject(myFeature,
-                                       ModuleBase_IModule::CustomizeHighlightedObjects, true);
-            }
-            else
-              XGUI_Tools::workshop(myWorkshop)->displayer()->updateViewer();;
-            break;
-          }
-        }
-      }
-    }
-  }
-}
-
-//********************************************************************
-void PartSet_WidgetSubShapeSelector::getGeomSelection(const ModuleBase_ViewerPrsPtr& thePrs,
-                                                      ObjectPtr& theObject,
-                                                      GeomShapePtr& theShape)
-{
-  ModuleBase_ISelection* aSelection = myWorkshop->selection();
-  theObject = aSelection->getResult(thePrs);
-  if (!theObject.get() && myCurrentSubShape->object())
-    theObject = myCurrentSubShape->object();
-}
-
-//********************************************************************
-QList<ModuleBase_ViewerPrsPtr> PartSet_WidgetSubShapeSelector::getAttributeSelection() const
-{
-  return QList<ModuleBase_ViewerPrsPtr>();
-}
-
-
-//********************************************************************
-bool PartSet_WidgetSubShapeSelector::setSelection(
-                                          QList<std::shared_ptr<ModuleBase_ViewerPrs>>& theValues,
-                                          const bool theToValidate)
-{
-  ObjectPtr aBaseObject = myCurrentSubShape->object();
-  GeomShapePtr aBaseShape = myCurrentSubShape->shape();
-  bool aResult = aBaseObject.get() && aBaseShape.get();
-  // firstly set the selection to the attribute
-  if (aResult) {
-    QList<ModuleBase_ViewerPrsPtr> aValues;
-    aValues.append(myCurrentSubShape);
-    aResult = ModuleBase_WidgetShapeSelector::setSelection(aValues, theToValidate);
-  }
-  // secondly fill additional attributes
-  if (aResult) {
-    aResult = false;
-    if (aBaseShape->shapeType() == GeomAPI_Shape::EDGE) {
-      std::shared_ptr<GeomAPI_Edge> anEdge(new GeomAPI_Edge(aBaseShape));
-
-      std::shared_ptr<GeomAPI_Pnt> aFirstPnt = anEdge->firstPoint();
-      std::shared_ptr<GeomAPI_Pnt> aLastPnt = anEdge->lastPoint();
-
-      std::shared_ptr<GeomDataAPI_Point2D> aFirstPointAttr, aLastPointAttr;
-      /// find the points in feature attributes
-      FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObject);
-      std::list<AttributePtr> a2DPointAttributes = aBaseFeature->data()->attributes(
-                                                        GeomDataAPI_Point2D::typeId());
-      std::list<AttributePtr>::const_iterator anIt = a2DPointAttributes.begin(),
-                                              aLast = a2DPointAttributes.end();
-      for (; anIt != aLast; anIt++) {
-        std::shared_ptr<GeomDataAPI_Point2D> anAttributePoint =
-                                      std::dynamic_pointer_cast<GeomDataAPI_Point2D>(*anIt);
-        std::shared_ptr<GeomAPI_Pnt2d> aPoint2D = anAttributePoint->pnt();
-        std::shared_ptr<GeomAPI_Pnt> aPoint3D = PartSet_Tools::convertTo3D(aPoint2D->x(),
-                                                                   aPoint2D->y(), mySketch);
-        if (aFirstPnt->isEqual(aPoint3D))
-          aFirstPointAttr = anAttributePoint;
-        else if (aLastPnt->isEqual(aPoint3D))
-          aLastPointAttr = anAttributePoint;
-      }
-
-      /// find the points in coincident features
-      PntToAttributesMap aRefAttributes = myCashedReferences[aBaseObject];
-      PntToAttributesMap::const_iterator
-        aRIt = aRefAttributes.begin(), aRLast = aRefAttributes.end();
-      for (; aRIt != aRLast; aRIt++) {
-        std::shared_ptr<GeomDataAPI_Point2D> anAttribute = aRIt->first;
-        std::shared_ptr<GeomAPI_Pnt> aPoint = aRIt->second;
-        if (!aFirstPointAttr.get() && aFirstPnt->isEqual(aPoint))
-          aFirstPointAttr = anAttribute;
-        if (!aLastPointAttr.get() && aLastPnt->isEqual(aPoint))
-          aLastPointAttr = anAttribute;
-        if (aFirstPointAttr.get() && aLastPointAttr.get())
-          break;
-      }
-      if (!aFirstPointAttr.get() || !aLastPointAttr)
-        return false;
-
-      FeaturePtr aFeature = feature();
-      AttributeRefAttrPtr anAPointAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-                                          aFeature->attribute(SketchPlugin_Constraint::ENTITY_A()));
-      AttributeRefAttrPtr aBPointAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-                                          aFeature->attribute(SketchPlugin_Constraint::ENTITY_B()));
-      anAPointAttr->setAttr(aFirstPointAttr);
-      aBPointAttr->setAttr(aLastPointAttr);
-      aResult = true;
-    }
-  }
-
-  return aResult;
-}
-
-//********************************************************************
-void PartSet_WidgetSubShapeSelector::getHighlighted(
-                           QList<std::shared_ptr<ModuleBase_ViewerPrs>>& theValues)
-{
-  if (myCurrentSubShape.get() && myCurrentSubShape->object().get())
-    theValues.append(myCurrentSubShape);
-}
-
-//********************************************************************
-void PartSet_WidgetSubShapeSelector::fillObjectShapes(const ObjectPtr& theObject)
-{
-  std::set<std::shared_ptr<GeomAPI_Shape> > aShapes;
-  std::map<std::shared_ptr<GeomDataAPI_Point2D>, std::shared_ptr<GeomAPI_Pnt> > aPointToAttributes;
-  std::set<std::shared_ptr<GeomDataAPI_Point2D> > aRefAttributes;
-  // current feature
-  FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
-  // edges on feature
-  std::set<ResultPtr> anEdgeResults;
-  ModelGeomAlgo_Shape::shapesOfType(aFeature, GeomAPI_Shape::EDGE, anEdgeResults);
-  if (!anEdgeResults.empty()) {
-    GeomShapePtr aFeatureShape = (*anEdgeResults.begin())->shape();
-
-    // coincidences to the feature
-    ModelGeomAlgo_Point2D::getPointsOfReference(aFeature, SketchPlugin_ConstraintCoincidence::ID(),
-                         aRefAttributes, SketchPlugin_Point::ID(), SketchPlugin_Point::COORD_ID());
-    // layed on feature coincidences to divide it on several shapes
-    CompositeFeaturePtr aSketch = sketch();
-    std::shared_ptr<ModelAPI_Data> aData = aSketch->data();
-    std::shared_ptr<GeomDataAPI_Point> aC = std::dynamic_pointer_cast<GeomDataAPI_Point>(
-        aData->attribute(SketchPlugin_Sketch::ORIGIN_ID()));
-    std::shared_ptr<GeomDataAPI_Dir> aX = std::dynamic_pointer_cast<GeomDataAPI_Dir>(
-        aData->attribute(SketchPlugin_Sketch::DIRX_ID()));
-    std::shared_ptr<GeomDataAPI_Dir> aNorm = std::dynamic_pointer_cast<GeomDataAPI_Dir>(
-        aData->attribute(SketchPlugin_Sketch::NORM_ID()));
-    std::shared_ptr<GeomAPI_Dir> aY(new GeomAPI_Dir(aNorm->dir()->cross(aX->dir())));
-    std::list<std::shared_ptr<GeomAPI_Pnt> > aPoints;
-    ModelGeomAlgo_Point2D::getPointsInsideShape_p(aFeatureShape, aRefAttributes, aC->pnt(),
-                                                aX->dir(), aY, aPoints, aPointToAttributes);
-
-    GeomAlgoAPI_ShapeTools::splitShape_p(aFeatureShape, aPoints, aShapes);
-  }
-  myCashedShapes[theObject] = aShapes;
-  myCashedReferences[theObject] = aPointToAttributes;
-}
-
diff --git a/src/PartSet/PartSet_WidgetSubShapeSelector.h b/src/PartSet/PartSet_WidgetSubShapeSelector.h
deleted file mode 100644 (file)
index 376ffb1..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-
-// File:        PartSet_WidgetSubShapeSelector.h
-// Created:     21 Jul 2016
-// Author:      Natalia ERMOLAEVA
-
-
-#ifndef PartSet_WidgetSubShapeSelector_H
-#define PartSet_WidgetSubShapeSelector_H
-
-#include "PartSet.h"
-#include "PartSet_MouseProcessor.h"
-
-#include <ModuleBase_WidgetShapeSelector.h>
-
-#include <ModelAPI_CompositeFeature.h>
-
-#include <QObject>
-
-#include <set>
-#include <map>
-
-class ModuleBase_IWorkshop;
-class Config_WidgetAPI;
-class ModuleBase_IViewWindow;
-class ModuleBase_ViewerPrs;
-
-class GeomAPI_Pnt;
-class GeomDataAPI_Point2D;
-
-class QWidget;
-class QMouseEvent;
-
-/**
-* \ingroup Modules
-* Customosation of PartSet_WidgetSubShapeSelector in order to visualize sub-shape 
-* by mouse move over shape in the viewer. Split of the object is performed by
-* coincident points to the object. Segment between nearest coincidence is highlighted
-*/
-class PARTSET_EXPORT PartSet_WidgetSubShapeSelector: public ModuleBase_WidgetShapeSelector,
-                                                     public PartSet_MouseProcessor
-{
-Q_OBJECT
- public:
-  /// Constructor
-  /// \param theParent the parent object
-  /// \param theWorkshop instance of workshop interface
-  /// \param theData the widget configuation. The attribute of the model widget is obtained from
-  PartSet_WidgetSubShapeSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop,
-                                 const Config_WidgetAPI* theData);
-
-  virtual ~PartSet_WidgetSubShapeSelector();
-
-  /// Set sketcher
-  /// \param theSketch a sketcher object
-  void setSketcher(CompositeFeaturePtr theSketch) { mySketch = theSketch; }
-
-  /// Retrurns installed sketcher
-  CompositeFeaturePtr sketch() const { return mySketch; }
-
-  /// The methiod called when widget is deactivated
-  virtual void deactivate();
-
-  /// Processing the mouse move event in the viewer
-  /// \param theWindow a view window
-  /// \param theEvent a mouse event
-  virtual void mouseMoved(ModuleBase_IViewWindow* theWindow, QMouseEvent* theEvent);
-
-  /// Returns values which should be highlighted when the whidget is active
-  /// \param theValues a list of presentations
-  virtual void getHighlighted(QList<std::shared_ptr<ModuleBase_ViewerPrs>>& theValues);
-
-  /// Set the given wrapped value to the current widget
-  /// This value should be processed in the widget according to the needs
-  /// The method is called by the current operation to process the operation preselection.
-  /// It is redefined to fill attributes responsible for the sub selection
-  /// \param theValues the wrapped selection values
-  /// \param theToValidate a flag on validation of the values
-  virtual bool setSelection(QList<std::shared_ptr<ModuleBase_ViewerPrs>>& theValues,
-                            const bool theToValidate);
-
-protected:
-  /// Checks the widget validity. By default, it returns true.
-  /// \param thePrs a selected presentation in the view
-  /// \return a boolean value
-  //virtual bool isValidSelectionCustom(const std::shared_ptr<ModuleBase_ViewerPrs>& thePrs);
-
-  /// Return an object and geom shape by the viewer presentation
-  /// \param thePrs a selection
-  /// \param theObject an output object
-  /// \param theShape a shape of the selection
-  //virtual void getGeomSelection(const std::shared_ptr<ModuleBase_ViewerPrs>& thePrs,
-  //                              ObjectPtr& theObject,
-  //                              GeomShapePtr& theShape);
-  void fillObjectShapes(const ObjectPtr& theObject);
-
-  /// Return an object and geom shape by the viewer presentation
-  /// \param thePrs a selection
-  /// \param theObject an output object
-  /// \param theShape a shape of the selection
-  virtual void getGeomSelection(const std::shared_ptr<ModuleBase_ViewerPrs>& thePrs,
-                                ObjectPtr& theObject,
-                                GeomShapePtr& theShape);
-
-  /// Return the attribute values wrapped in a list of viewer presentations
-  /// \return a list of viewer presentations, which contains an attribute result and
-  /// a shape. If the attribute do not uses the shape, it is empty
-  virtual QList<std::shared_ptr<ModuleBase_ViewerPrs>> getAttributeSelection() const;
-
-protected:
-  /// The methiod called when widget is activated
-  virtual void activateCustom();
-
-protected:
-  std::shared_ptr<ModuleBase_ViewerPrs> myCurrentSubShape;
-  std::map<ObjectPtr, std::set<GeomShapePtr> > myCashedShapes;
-
-  typedef std::map<std::shared_ptr<GeomDataAPI_Point2D>,
-                   std::shared_ptr<GeomAPI_Pnt> > PntToAttributesMap;
-  std::map<ObjectPtr, PntToAttributesMap> myCashedReferences;
-
-  /// Pointer to a sketch
-  CompositeFeaturePtr mySketch;
-};
-
-#endif
\ No newline at end of file
index cc0ec81699027436d963779c7ea8fb2ce71eede3..f03e6b1ba599074a2727a928423205ebbc240f67 100644 (file)
@@ -23,8 +23,8 @@
 #include <SketchPlugin_ConstraintPerpendicular.h>
 #include <SketchPlugin_ConstraintRadius.h>
 #include <SketchPlugin_ConstraintRigid.h>
-#include <SketchPlugin_ConstraintSplit.h>
 #include <SketchPlugin_Trim.h>
+#include <SketchPlugin_Split.h>
 #include <SketchPlugin_ConstraintTangent.h>
 #include <SketchPlugin_ConstraintVertical.h>
 #include <SketcherPrs_Tools.h>
@@ -495,16 +495,19 @@ std::shared_ptr<SketchAPI_Rotation> SketchAPI_Sketch::addRotation(
 
 //--------------------------------------------------------------------------------------
 std::shared_ptr<ModelHighAPI_Interface> SketchAPI_Sketch::addSplit(
-                                                    const ModelHighAPI_Reference& theFeature,
-                                                    const ModelHighAPI_RefAttr& thePoint1,
-                                                    const ModelHighAPI_RefAttr& thePoint2)
+                                          const ModelHighAPI_Reference& theFeature,
+                                          const std::shared_ptr<GeomAPI_Pnt2d>& thePositionPoint)
 {
   std::shared_ptr<ModelAPI_Feature> aFeature =
-    compositeFeature()->addFeature(SketchPlugin_ConstraintSplit::ID());
-  fillAttribute(theFeature, aFeature->reference(SketchPlugin_Constraint::VALUE()));
-  fillAttribute(thePoint1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A()));
-  fillAttribute(thePoint2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B()));
-  //aFeature->execute();
+    compositeFeature()->addFeature(SketchPlugin_Split::ID());
+  fillAttribute(theFeature, aFeature->reference(SketchPlugin_Split::SELECTED_OBJECT()));
+
+  AttributePtr anAttribute = aFeature->attribute(SketchPlugin_Split::SELECTED_POINT());
+  if (anAttribute->attributeType() == GeomDataAPI_Point2D::typeId()) {
+    AttributePoint2DPtr aPointAttr = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(anAttribute);
+    fillAttribute(thePositionPoint, aPointAttr);
+  }
+
   return InterfacePtr(new ModelHighAPI_Interface(aFeature));
 }
 
index 15450976ff24dfbd705bb12de7b047aff132d70f..6d01f8c6e03d6a7cd0184ff2232bfb04c5af693b 100644 (file)
@@ -272,8 +272,7 @@ public:
   SKETCHAPI_EXPORT
   std::shared_ptr<ModelHighAPI_Interface> addSplit(
       const ModelHighAPI_Reference& theFeature,
-      const ModelHighAPI_RefAttr& thePoint1,
-      const ModelHighAPI_RefAttr& thePoint2);
+      const std::shared_ptr<GeomAPI_Pnt2d>& thePositionPoint);
 
   /// Add trim
   SKETCHAPI_EXPORT
index 1d18e369d568ec9870959279337c8ca678f3457c..cc47e90de9070bbef37d1677b907ae9a281b8037 100644 (file)
@@ -23,7 +23,6 @@ SET(PROJECT_HEADERS
     SketchPlugin_ConstraintPerpendicular.h
     SketchPlugin_ConstraintRadius.h
     SketchPlugin_ConstraintRigid.h
-    SketchPlugin_ConstraintSplit.h
     SketchPlugin_ConstraintTangent.h
     SketchPlugin_ConstraintVertical.h
     SketchPlugin_ExternalValidator.h
@@ -40,6 +39,7 @@ SET(PROJECT_HEADERS
     SketchPlugin_Projection.h
     SketchPlugin_Sketch.h
     SketchPlugin_SketchEntity.h
+    SketchPlugin_Split.h
     SketchPlugin_Tools.h
     SketchPlugin_Trim.h
     SketchPlugin_Validators.h
@@ -64,7 +64,6 @@ SET(PROJECT_SOURCES
     SketchPlugin_ConstraintPerpendicular.cpp
     SketchPlugin_ConstraintRadius.cpp
     SketchPlugin_ConstraintRigid.cpp
-    SketchPlugin_ConstraintSplit.cpp
     SketchPlugin_ConstraintTangent.cpp
     SketchPlugin_ConstraintVertical.cpp
     SketchPlugin_ExternalValidator.cpp
@@ -80,6 +79,7 @@ SET(PROJECT_SOURCES
     SketchPlugin_Projection.cpp
     SketchPlugin_Sketch.cpp
     SketchPlugin_SketchEntity.cpp
+    SketchPlugin_Split.cpp
     SketchPlugin_Tools.cpp
     SketchPlugin_Trim.cpp
     SketchPlugin_Validators.cpp
diff --git a/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp b/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp
deleted file mode 100755 (executable)
index e21de95..0000000
+++ /dev/null
@@ -1,1310 +0,0 @@
-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
-
-// File:    SketchPlugin_ConstraintSplit.cpp
-// Created: 25 Aug 2016
-// Author:  Natalia ERMOLAEVA
-
-#include "SketchPlugin_ConstraintSplit.h"
-
-#include <GeomAPI_Dir2d.h>
-#include <GeomAPI_Pnt2d.h>
-#include <GeomAPI_XY.h>
-#include <GeomDataAPI_Point2D.h>
-#include <GeomAlgoAPI_ShapeTools.h>
-
-#include <ModelAPI_AttributeReference.h>
-#include <ModelAPI_AttributeString.h>
-#include <ModelAPI_AttributeRefAttr.h>
-#include <ModelAPI_Tools.h>
-#include <ModelAPI_AttributeBoolean.h>
-
-#include <ModelAPI_Validator.h>
-#include <ModelAPI_Session.h>
-#include <ModelAPI_AttributeDouble.h>
-
-#include <SketchPlugin_Line.h>
-#include <SketchPlugin_Arc.h>
-#include <SketchPlugin_Circle.h>
-#include <SketchPlugin_ConstraintCoincidence.h>
-#include <SketchPlugin_ConstraintEqual.h>
-#include <SketchPlugin_ConstraintParallel.h>
-#include <SketchPlugin_ConstraintTangent.h>
-#include <SketchPlugin_ConstraintLength.h>
-#include <SketchPlugin_ConstraintMirror.h>
-#include <SketchPlugin_MultiRotation.h>
-#include <SketchPlugin_MultiTranslation.h>
-#include <SketchPlugin_ConstraintMiddle.h>
-
-#include <ModelAPI_Events.h>
-#include <SketchPlugin_Line.h>
-#include <SketchPlugin_Arc.h>
-#include <SketchPlugin_Circle.h>
-
-#include <ModelGeomAlgo_Point2D.h>
-#include <Events_Loop.h>
-
-#include <cmath>
-
-//#define CREATE_CONSTRAINTS
-
-//#define DEBUG_SPLIT
-#ifdef DEBUG_SPLIT
-#include <iostream>
-#endif
-
-static const double PI = 3.141592653589793238463;
-
-SketchPlugin_ConstraintSplit::SketchPlugin_ConstraintSplit()
-{
-}
-
-void SketchPlugin_ConstraintSplit::initAttributes()
-{
-  data()->addAttribute(SketchPlugin_Constraint::VALUE(), ModelAPI_AttributeReference::typeId());
-  data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
-  data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
-}
-
-void SketchPlugin_ConstraintSplit::execute()
-{
-  std::shared_ptr<ModelAPI_Data> aData = data();
-
-  // Check the base objects are initialized.
-  AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                                            aData->attribute(SketchPlugin_Constraint::VALUE()));
-  if(!aBaseObjectAttr->isInitialized()) {
-    setError("Error: Base object is not initialized.");
-    return;
-  }
-  AttributePoint2DPtr aFirstPointAttrOfSplit =
-    getPointOfRefAttr(aData->attribute(SketchPlugin_Constraint::ENTITY_A()));
-  AttributePoint2DPtr aSecondPointAttrOfSplit =
-    getPointOfRefAttr(aData->attribute(SketchPlugin_Constraint::ENTITY_B()));
-  if (!aFirstPointAttrOfSplit.get() || !aFirstPointAttrOfSplit->isInitialized() ||
-      !aSecondPointAttrOfSplit.get() || !aSecondPointAttrOfSplit->isInitialized()) {
-    setError("Error: Sub-shape is not initialized.");
-    return;
-  }
-
-  // Wait all constraints being created, then send update events
-  static Events_ID anUpdateEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED);
-  bool isUpdateFlushed = Events_Loop::loop()->isFlushed(anUpdateEvent);
-  if (isUpdateFlushed)
-    Events_Loop::loop()->setFlushed(anUpdateEvent, false);
-
-
-  // Find feature constraints
-  FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
-  ResultPtr aBaseFeatureResult = getFeatureResult(aBaseFeature);
-  std::set<FeaturePtr> aFeaturesToDelete, aFeaturesToUpdate;
-
-  //std::map<FeaturePtr, IdToPointPair> aTangentFeatures;
-  std::map<FeaturePtr, IdToPointPair> aCoincidenceToFeature;
-  getConstraints(aFeaturesToDelete, aFeaturesToUpdate, /*aTangentFeatures, */
-                 aCoincidenceToFeature);
-
-  std::map<AttributePtr, std::list<AttributePtr> > aBaseRefAttributes;
-  std::list<AttributePtr> aRefsToFeature;
-  getRefAttributes(aBaseFeature, aBaseRefAttributes, aRefsToFeature);
-
-  std::map<AttributePtr, AttributePtr> aBasePointModifiedAttributes;
-
-#ifdef DEBUG_SPLIT
-  std::cout << std::endl;
-  std::cout << "SketchPlugin_ConstraintSplit::execute()" << std::endl;
-  std::cout << std::endl;
-
-  SketchPlugin_Sketch* aSketch = sketch();
-  std::cout << "SKETCH FEATURES (before split) [" << aSketch->numberOfSubs() << "]:" << std::endl;
-  for (int i = 0, aNbSubs = aSketch->numberOfSubs(); i < aNbSubs; i++) {
-    std::cout << getFeatureInfo(aSketch->subFeature(i), false) << std::endl;
-  }
-
-  std::cout << std::endl;
-  std::cout << "---- IN PARAMETERS ----" << std::endl;
-  std::cout << "Base feature:" << getFeatureInfo(aBaseFeature) << std::endl;
-  std::cout << std::endl;
-
-  if (!aCoincidenceToFeature.empty()) {
-    std::cout << "Coincidences to base feature[" <<
-      aCoincidenceToFeature.size() << "]: " << std::endl;
-    std::map<FeaturePtr, IdToPointPair>::const_iterator anIt = aCoincidenceToFeature.begin(),
-                                                        aLast = aCoincidenceToFeature.end();
-    for (int i = 1; anIt != aLast; anIt++, i++) {
-      FeaturePtr aFeature = (*anIt).first;
-      std::string anAttributeId = (*anIt).second.first;
-      std::shared_ptr<GeomDataAPI_Point2D> aPointAttr = (*anIt).second.second;
-
-      std::cout << i << "-" << getFeatureInfo(aFeature) << std::endl;
-      std::cout <<     " -Attribute to correct:" << anAttributeId << std::endl;
-      std::cout <<     " -Point attribute:" <<
-        ModelGeomAlgo_Point2D::getPointAttributeInfo(aPointAttr) << std::endl;
-    }
-  }
-
-  std::map<AttributePtr, std::list<AttributePtr> >::const_iterator
-    aRefIt = aBaseRefAttributes.begin(), aRefLast = aBaseRefAttributes.end();
-  std::cout << std::endl << "References to attributes of base feature [" <<
-    aBaseRefAttributes.size() << "]" << std::endl;
-  for (; aRefIt != aRefLast; aRefIt++) {
-    AttributePtr aBaseAttr = aRefIt->first;
-    std::list<AttributePtr> aRefAttributes = aRefIt->second;
-    std::string aRefsInfo;
-    std::list<AttributePtr>::const_iterator aRefAttrIt = aRefAttributes.begin(),
-                                            aRefAttrLast = aRefAttributes.end();
-    for (; aRefAttrIt != aRefAttrLast; aRefAttrIt++) {
-      if (!aRefsInfo.empty())
-        aRefsInfo.append(",");
-      AttributePtr aRAttr = *aRefAttrIt;
-      aRefsInfo.append(aRAttr->id());
-      FeaturePtr aRFeature = ModelAPI_Feature::feature(aRAttr->owner());
-      aRefsInfo.append("(" + aRFeature->name() + ") ");
-    }
-    std::shared_ptr<GeomDataAPI_Point2D> aPointAttr =
-      std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aBaseAttr);
-    std::cout << aPointAttr->id().c_str() <<
-      ": " << "[" << aRefAttributes.size() << "] " << aRefsInfo << std::endl;
-  }
-  std::cout << std::endl;
-  std::cout << std::endl << "References to base feature [" <<
-    aRefsToFeature.size() << "]" << std::endl;
-  std::list<AttributePtr>::const_iterator aRefAttrIt = aRefsToFeature.begin(),
-                                          aRefAttrLast = aRefsToFeature.end();
-  std::string aRefsInfo;
-  for (; aRefAttrIt != aRefAttrLast; aRefAttrIt++) {
-    if (!aRefsInfo.empty())
-      aRefsInfo.append(",");
-    AttributePtr aRAttr = *aRefAttrIt;
-    aRefsInfo.append(aRAttr->id());
-    FeaturePtr aRFeature = ModelAPI_Feature::feature(aRAttr->owner());
-    aRefsInfo.append("(" + aRFeature->name() + ") ");
-  }
-  std::cout << "[" << aRefsToFeature.size() << "] " << aRefsInfo << std::endl;
-
-
-  std::cout << std::endl;
-  std::cout << "---- SPLIT ----" << std::endl;
-  std::cout << std::endl;
-#endif
-
-  std::string aFeatureKind = aBaseFeature->getKind();
-  FeaturePtr aSplitFeature, anAfterFeature;
-  std::set<AttributePoint2DPtr> aFurtherCoincidences;
-  std::set<FeaturePtr> aCreatedFeatures;
-  std::set<std::pair<AttributePtr, AttributePtr>> aModifiedAttributes;
-  if (aFeatureKind == SketchPlugin_Line::ID())
-    splitLine(aSplitFeature, aBaseFeature, anAfterFeature, aFurtherCoincidences, aCreatedFeatures,
-              aModifiedAttributes);
-  else if (aFeatureKind == SketchPlugin_Arc::ID())
-    splitArc(aSplitFeature, aBaseFeature, anAfterFeature, aFurtherCoincidences, aCreatedFeatures,
-             aModifiedAttributes);
-  if (aFeatureKind == SketchPlugin_Circle::ID()) {
-    FeaturePtr aCircleFeature = aBaseFeature;
-    splitCircle(aSplitFeature, aBaseFeature, anAfterFeature, aFurtherCoincidences,
-      aCreatedFeatures, aModifiedAttributes);
-
-    updateRefFeatureConstraints(getFeatureResult(aBaseFeature), aRefsToFeature);
-
-    AttributePtr aCenterAttr = aCircleFeature->attribute(SketchPlugin_Circle::CENTER_ID());
-    aFeaturesToDelete.insert(aCircleFeature);
-    // as circle is removed, temporary fill this attribute*/
-    aBaseObjectAttr->setObject(ResultPtr());
-  }
-
-#ifdef DEBUG_SPLIT
-  std::cout << "---- OUT PARAMETERS ----" << std::endl;
-  std::cout << "Base modified feature:" << getFeatureInfo(aBaseFeature) << std::endl;
-  std::cout << "Split feature:" << getFeatureInfo(aSplitFeature) << std::endl;
-  std::cout << "After feature:" << getFeatureInfo(anAfterFeature) << std::endl;
-  std::cout << std::endl;
-
-  std::cout << "Created features by split:[" << aCreatedFeatures.size() << "]" << std::endl;
-  std::set<FeaturePtr>::const_iterator aFIt = aCreatedFeatures.begin(),
-                                       aFLast = aCreatedFeatures.end();
-  for (; aFIt != aFLast; aFIt++) {
-    std::cout << getFeatureInfo(*aFIt) << std::endl;
-  }
-  std::cout << std::endl;
-
-  std::cout << "Attributes for further Coincidences:" << std::endl;
-  std::set<AttributePoint2DPtr>::const_iterator anIt = aFurtherCoincidences.begin(),
-                                                aLast = aFurtherCoincidences.end();
-  for (; anIt != aLast; anIt++) {
-    AttributePtr anAttribute = *anIt;
-    FeaturePtr aFeature = ModelAPI_Feature::feature(anAttribute->owner());
-    std::cout << ModelGeomAlgo_Point2D::getPointAttributeInfo(anAttribute)
-              << " [" << getFeatureInfo(aFeature, false) << "]" << std::endl;
-  }
-
-  std::cout << "Modifed attributes (constraints to attributes are moved here):" << std::endl;
-  std::set<std::pair<AttributePtr, AttributePtr> >::const_iterator
-    aPIt = aModifiedAttributes.begin(), aPLast = aModifiedAttributes.end();
-  std::string aResInfo;
-  for (; aPIt != aPLast; aPIt++) {
-    if (!aResInfo.empty())
-      aResInfo += "\n";
-
-    std::pair<AttributePtr, AttributePtr> aPair = *aPIt;
-
-    AttributePtr anAttr = aPair.first;
-    aResInfo.append(anAttr->id());
-    FeaturePtr aFeature = ModelAPI_Feature::feature(anAttr->owner());
-    aResInfo.append("(" + aFeature->name() + ") ");
-
-    aResInfo.append("  - is modified to -  ");
-
-    anAttr = aPair.second;
-    aResInfo.append(anAttr->id());
-    aFeature = ModelAPI_Feature::feature(anAttr->owner());
-    aResInfo.append("(" + aFeature->name() + ") ");
-  }
-  std::cout << aResInfo << std::endl;
-#endif
-
-  std::set<ResultPtr> aFeatureResults;
-  aFeatureResults.insert(getFeatureResult(aBaseFeature));
-  if (anAfterFeature.get() && anAfterFeature != aBaseFeature)
-    aFeatureResults.insert(getFeatureResult(anAfterFeature));
-
-  // coincidence to feature
-  updateCoincidenceConstraintsToFeature(aCoincidenceToFeature, aFurtherCoincidences,
-                                        aFeatureResults, aSplitFeature);
-
-  updateRefAttConstraints(aBaseRefAttributes, aModifiedAttributes);
-
-  // delete constraints
-#ifdef DEBUG_SPLIT
-  std::cout << "remove features and references:" << std::endl;
-  std::set<FeaturePtr>::const_iterator aDIt = aFeaturesToDelete.begin(),
-                                       aDLast = aFeaturesToDelete.end();
-  for (; aDIt != aDLast; aDIt++) {
-    std::cout << getFeatureInfo(*aDIt, false) << std::endl;
-    std::cout << std::endl;
-  }
-#endif
-  ModelAPI_Tools::removeFeaturesAndReferences(aFeaturesToDelete);
-  Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED));
-
-#ifdef DEBUG_SPLIT
-  std::cout << "update features after split:" << std::endl;
-  std::set<FeaturePtr>::const_iterator anUIt = aFeaturesToUpdate.begin(),
-                                       anULast = aFeaturesToUpdate.end();
-  for (; anUIt != anULast; anUIt++) {
-    std::cout << getFeatureInfo(*anUIt, false) << std::endl;
-    std::cout << std::endl;
-  }
-#endif
-  updateFeaturesAfterSplit(aFeaturesToUpdate);
-
-  // Send events to update the sub-features by the solver.
-  if(isUpdateFlushed) {
-    Events_Loop::loop()->setFlushed(anUpdateEvent, true);
-  }
-
-#ifdef DEBUG_SPLIT
-  std::cout << "SKETCH FEATURES (after split) [" << aSketch->numberOfSubs() << "]:" << std::endl;
-  for (int i = 0, aNbSubs = aSketch->numberOfSubs(); i < aNbSubs; i++) {
-    std::cout << getFeatureInfo(aSketch->subFeature(i), false) << std::endl;
-  }
-#endif
-}
-
-bool SketchPlugin_ConstraintSplit::isMacro() const
-{
-  return true;
-}
-
-AISObjectPtr SketchPlugin_ConstraintSplit::getAISObject(AISObjectPtr thePrevious)
-{
-  AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                                           data()->attribute(SketchPlugin_Constraint::VALUE()));
-  FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
-
-  AttributePoint2DPtr aFirstPointAttrOfSplit = getPointOfRefAttr(
-                                        data()->attribute(SketchPlugin_Constraint::ENTITY_A()));
-  AttributePoint2DPtr aSecondPointAttrOfSplit = getPointOfRefAttr(
-                                        data()->attribute(SketchPlugin_Constraint::ENTITY_B()));
-
-  if (aBaseObjectAttr->isInitialized() && aBaseFeature.get() &&
-      aFirstPointAttrOfSplit->isInitialized() &&
-      aSecondPointAttrOfSplit->isInitialized()) {
-
-    ResultPtr aResult = getFeatureResult(aBaseFeature);
-    GeomShapePtr aBaseShape = aResult->shape();
-    std::list<std::shared_ptr<GeomAPI_Pnt> > aPoints;
-
-    std::shared_ptr<GeomAPI_Pnt2d> aStartPnt2d = aFirstPointAttrOfSplit->pnt();
-    std::shared_ptr<GeomAPI_Pnt> aStartPoint = sketch()->to3D(aStartPnt2d->x(), aStartPnt2d->y());
-    aPoints.push_back(aStartPoint);
-
-    std::shared_ptr<GeomAPI_Pnt2d> aSecondPnt2d = aSecondPointAttrOfSplit->pnt();
-    std::shared_ptr<GeomAPI_Pnt> aSecondPoint =
-      sketch()->to3D(aSecondPnt2d->x(), aSecondPnt2d->y());
-    aPoints.push_back(aSecondPoint);
-
-    std::set<std::shared_ptr<GeomAPI_Shape> > aSplitShapes;
-
-    GeomAlgoAPI_ShapeTools::splitShape_p(aBaseShape, aPoints, aSplitShapes);
-    std::shared_ptr<GeomAPI_Shape> aShape =
-      GeomAlgoAPI_ShapeTools::findShape(aPoints, aSplitShapes);
-
-    AISObjectPtr anAIS = thePrevious;
-    if (aShape) {
-      if (!anAIS)
-        anAIS = AISObjectPtr(new GeomAPI_AISObject);
-      anAIS->createShape(aShape);
-      std::shared_ptr<ModelAPI_AttributeBoolean> anAuxiliaryAttr =
-             aBaseFeature->data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID());
-
-      bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value();
-
-      std::vector<int> aColor;
-      double aWidth = SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH();
-      int aLineStyle = SketchPlugin_SketchEntity::SKETCH_LINE_STYLE();
-      if (isConstruction) {
-        aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color");
-        aWidth = SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH_AUXILIARY();
-        aLineStyle = SketchPlugin_SketchEntity::SKETCH_LINE_STYLE_AUXILIARY();
-      }
-      else {
-        aColor = Config_PropManager::color("Visualization", "sketch_entity_color");
-      }
-      anAIS->setColor(aColor[0], aColor[1], aColor[2]);
-      anAIS->setWidth(aWidth + 1);
-      anAIS->setLineStyle(aLineStyle);
-    }
-    return anAIS;
-  }
-  return AISObjectPtr();
-}
-
-std::shared_ptr<GeomDataAPI_Point2D> SketchPlugin_ConstraintSplit::getPointOfRefAttr(
-                                                      const AttributePtr& theAttribute)
-{
-  AttributePoint2DPtr aPointAttribute;
-
-  if (theAttribute->attributeType() == ModelAPI_AttributeRefAttr::typeId()) {
-    AttributeRefAttrPtr aRefAttr =
-      std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
-    if (aRefAttr.get() && aRefAttr->isInitialized()) {
-      AttributePtr anAttribute = aRefAttr->attr();
-      if (anAttribute.get() && anAttribute->attributeType() == GeomDataAPI_Point2D::typeId())
-        aPointAttribute = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(anAttribute);
-    }
-  }
-  return aPointAttribute;
-}
-
-void SketchPlugin_ConstraintSplit::getFeaturePoints(const FeaturePtr& theFeature,
-                                                    AttributePoint2DPtr& theStartPointAttr,
-                                                    AttributePoint2DPtr& theEndPointAttr)
-{
-  std::string aFeatureKind = theFeature->getKind();
-  std::string aStartAttributeName, anEndAttributeName;
-  if (aFeatureKind == SketchPlugin_Line::ID()) {
-    aStartAttributeName = SketchPlugin_Line::START_ID();
-    anEndAttributeName = SketchPlugin_Line::END_ID();
-  }
-  else if (aFeatureKind == SketchPlugin_Arc::ID()) {
-    aStartAttributeName = SketchPlugin_Arc::START_ID();
-    anEndAttributeName = SketchPlugin_Arc::END_ID();
-  }
-  if (!aStartAttributeName.empty() && !anEndAttributeName.empty()) {
-    theStartPointAttr = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                                         theFeature->attribute(aStartAttributeName));
-    theEndPointAttr = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                                         theFeature->attribute(anEndAttributeName));
-  }
-}
-
-void SketchPlugin_ConstraintSplit::getConstraints(std::set<FeaturePtr>& theFeaturesToDelete,
-                                      std::set<FeaturePtr>& theFeaturesToUpdate,
-                                      std::map<FeaturePtr, IdToPointPair>& theCoincidenceToFeature)
-{
-  std::shared_ptr<ModelAPI_Data> aData = data();
-
-  // Check the base objects are initialized.
-  AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                                            aData->attribute(SketchPlugin_Constraint::VALUE()));
-  FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
-  ResultPtr aBaseFeatureResult = getFeatureResult(aBaseFeature);
-
-  std::set<AttributePtr> aRefsList = aBaseFeatureResult->data()->refsToMe();
-  std::set<AttributePtr> aFRefsList = aBaseFeature->data()->refsToMe();
-  aRefsList.insert(aFRefsList.begin(), aFRefsList.end());
-
-  std::set<AttributePtr>::const_iterator aIt;
-  for (aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) {
-    std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
-    FeaturePtr aRefFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
-    std::string aRefFeatureKind = aRefFeature->getKind();
-    if (aRefFeatureKind == SketchPlugin_ConstraintMirror::ID() ||
-        aRefFeatureKind == SketchPlugin_MultiRotation::ID() ||
-        aRefFeatureKind == SketchPlugin_MultiTranslation::ID() ||
-        aRefFeatureKind == SketchPlugin_ConstraintMiddle::ID())
-      theFeaturesToDelete.insert(aRefFeature);
-    else if (aRefFeatureKind == SketchPlugin_ConstraintLength::ID())
-      theFeaturesToUpdate.insert(aRefFeature);
-    else if (aRefFeatureKind == SketchPlugin_ConstraintCoincidence::ID()) {
-      std::string anAttributeToBeModified;
-      AttributePoint2DPtr aCoincidentPoint;
-      AttributeRefAttrPtr anAttrA = aRefFeature->refattr(SketchPlugin_Constraint::ENTITY_A());
-      AttributeRefAttrPtr anAttrB = aRefFeature->refattr(SketchPlugin_Constraint::ENTITY_B());
-      bool isToFeature = false;
-      if (anAttrA->isObject() || anAttrB->isObject()) { /// coincidence to base feature
-        FeaturePtr aFeature = anAttrA->isObject() ? ModelAPI_Feature::feature(anAttrA->object())
-                                                  : FeaturePtr();
-        isToFeature = aFeature.get() && aFeature == aBaseFeature;
-        anAttributeToBeModified = anAttrA->id();
-        if (!isToFeature) {
-          aFeature = anAttrB->isObject() ? ModelAPI_Feature::feature(anAttrB->object())
-                                         : FeaturePtr();
-          isToFeature = aFeature.get() && aFeature == aBaseFeature;
-          anAttributeToBeModified = anAttrB->id();
-        }
-        if (isToFeature)
-          aCoincidentPoint = SketchPlugin_ConstraintCoincidence::getPoint(aRefFeature);
-      }
-      if (!isToFeature) { /// coincidence to point on base feature
-        AttributePtr anAttribute;
-
-        if (!anAttrA->isObject()) {
-          AttributePtr aCurAttribute = anAttrA->attr();
-          if (aCurAttribute.get()) {
-            FeaturePtr aCurFeature = ModelAPI_Feature::feature(aCurAttribute->owner());
-            if (aCurFeature.get() && aCurFeature == aBaseFeature) {
-              anAttribute = anAttrB->attr();
-              anAttributeToBeModified = anAttrA->id();
-            }
-          }
-        }
-        if (!anAttribute.get() && !anAttrB->isObject()) {
-          AttributePtr aCurAttribute = anAttrB->attr();
-          if (aCurAttribute.get()) {
-            FeaturePtr aCurFeature = ModelAPI_Feature::feature(aCurAttribute->owner());
-            if (aCurFeature.get() && aCurFeature == aBaseFeature) {
-              anAttribute = anAttrA->attr();
-              anAttributeToBeModified = anAttrB->id();
-            }
-          }
-        }
-        if (anAttribute.get())
-          aCoincidentPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(anAttribute);
-      }
-      if (aCoincidentPoint.get() && isToFeature)
-        theCoincidenceToFeature[aRefFeature] = std::make_pair(anAttributeToBeModified,
-                                                              aCoincidentPoint);
-    }
-  }
-}
-
-void SketchPlugin_ConstraintSplit::getRefAttributes(const FeaturePtr& theFeature,
-                                    std::map<AttributePtr, std::list<AttributePtr> >& theRefs,
-                                    std::list<AttributePtr>& theRefsToFeature)
-{
-  theRefs.clear();
-
-  std::list<AttributePtr> aPointAttributes =
-    theFeature->data()->attributes(GeomDataAPI_Point2D::typeId());
-  std::set<AttributePtr> aPointAttributesSet;
-
-  std::list<AttributePtr>::const_iterator aPIt =
-    aPointAttributes.begin(), aPLast = aPointAttributes.end();
-  for (; aPIt != aPLast; aPIt++)
-    aPointAttributesSet.insert(*aPIt);
-
-  std::set<AttributePtr> aRefsAttributes = getFeatureResult(theFeature)->data()->refsToMe();
-  std::set<AttributePtr> aFRefsList = theFeature->data()->refsToMe();
-  aRefsAttributes.insert(aFRefsList.begin(), aFRefsList.end());
-
-  std::set<AttributePtr>::const_iterator aIt;
-  for (aIt = aRefsAttributes.cbegin(); aIt != aRefsAttributes.cend(); ++aIt) {
-    AttributePtr anAttr = (*aIt);
-    FeaturePtr anAttrFeature = ModelAPI_Feature::feature(anAttr->owner());
-    if (anAttrFeature.get() != this &&
-        anAttr.get() && anAttr->attributeType() == ModelAPI_AttributeRefAttr::typeId()) {
-      AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(anAttr);
-      if (!aRefAttr->isObject()) { /// find attributes referenced to feature point attributes
-        AttributePtr anAttrInRef = aRefAttr->attr();
-        if (anAttrInRef.get() &&
-            aPointAttributesSet.find(anAttrInRef) != aPointAttributesSet.end()) {
-          if (theRefs.find(anAttrInRef) != theRefs.end())
-            theRefs[anAttrInRef].push_back(aRefAttr);
-          else {
-            std::list<AttributePtr> anAttrList;
-            anAttrList.push_back(aRefAttr);
-            theRefs[anAttrInRef] = anAttrList;
-          }
-        }
-      }
-      else { /// find attributes referenced to feature itself
-        theRefsToFeature.push_back(anAttr);
-      }
-    }
-  }
-}
-
-void SketchPlugin_ConstraintSplit::updateCoincidenceConstraintsToFeature(
-      const std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theCoincidenceToFeature,
-      const std::set<std::shared_ptr<GeomDataAPI_Point2D> >& theFurtherCoincidences,
-      const std::set<ResultPtr>& theFeatureResults,
-      const FeaturePtr& theSplitFeature)
-{
-  if (theCoincidenceToFeature.empty())
-    return;
-
-  // we should build coincidence constraints to end of the split feature
-  std::set<std::shared_ptr<GeomDataAPI_Point2D> > aNewCoincidencesToSplitFeature;
-  AttributePoint2DPtr aStartPointAttr, anEndPointAttr;
-  getFeaturePoints(theSplitFeature, aStartPointAttr, anEndPointAttr);
-  if (theFurtherCoincidences.find(aStartPointAttr) == theFurtherCoincidences.end())
-    aNewCoincidencesToSplitFeature.insert(aStartPointAttr);
-  if (theFurtherCoincidences.find(anEndPointAttr) == theFurtherCoincidences.end())
-    aNewCoincidencesToSplitFeature.insert(anEndPointAttr);
-
-  std::map<FeaturePtr, IdToPointPair>::const_iterator aCIt = theCoincidenceToFeature.begin(),
-                                                            aCLast = theCoincidenceToFeature.end();
-#ifdef DEBUG_SPLIT
-  std::cout << std::endl;
-  std::cout << "Coincidences to feature(modified):"<< std::endl;
-#endif
-  for (; aCIt != aCLast; aCIt++) {
-    FeaturePtr aCoincFeature = aCIt->first;
-    std::string anAttributeId = aCIt->second.first;
-    AttributePoint2DPtr aCoincPoint = aCIt->second.second;
-    std::set<AttributePoint2DPtr>::const_iterator aFCIt = theFurtherCoincidences.begin(),
-                                                  aFCLast = theFurtherCoincidences.end();
-    std::shared_ptr<GeomAPI_Pnt2d> aCoincPnt = aCoincPoint->pnt();
-    AttributePoint2DPtr aFeaturePointAttribute;
-    for (; aFCIt != aFCLast && !aFeaturePointAttribute.get(); aFCIt++) {
-      AttributePoint2DPtr aFCAttribute = *aFCIt;
-      if (aCoincPnt->isEqual(aFCAttribute->pnt()))
-        aFeaturePointAttribute = aFCAttribute;
-    }
-    if (aFeaturePointAttribute.get()) {
-      aCoincFeature->refattr(anAttributeId)->setObject(ResultPtr());
-      aCoincFeature->refattr(anAttributeId)->setAttr(aFeaturePointAttribute);
-      // create new coincidences to split feature points
-      std::set<AttributePoint2DPtr>::const_iterator aSFIt = aNewCoincidencesToSplitFeature.begin(),
-                                                    aSFLast = aNewCoincidencesToSplitFeature.end();
-      for (; aSFIt != aSFLast; aSFIt++) {
-        AttributePoint2DPtr aSFAttribute = *aSFIt;
-        if (aCoincPnt->isEqual(aSFAttribute->pnt())) {
-          std::string aSecondAttribute = SketchPlugin_Constraint::ENTITY_A();
-          if (anAttributeId == SketchPlugin_Constraint::ENTITY_A())
-            aSecondAttribute = SketchPlugin_Constraint::ENTITY_B();
-          createConstraint(SketchPlugin_ConstraintCoincidence::ID(),
-                           aSFAttribute, aCoincFeature->refattr(aSecondAttribute)->attr());
-        }
-      }
-    }
-    else {
-      /// find feature by shape intersected the point
-      ResultPtr aResultForCoincidence = *(theFeatureResults.begin());
-
-      if (theFeatureResults.size() > 1) { // try to find point on additional feature
-        ResultPtr anAddtionalResult = *(theFeatureResults.begin()++);
-        GeomShapePtr aShape = anAddtionalResult->shape();
-
-        std::shared_ptr<GeomAPI_Pnt2d> aPnt2d = aCoincPoint->pnt();
-        std::shared_ptr<GeomAPI_Pnt> aPoint = sketch()->to3D(aPnt2d->x(), aPnt2d->y());
-
-        std::shared_ptr<GeomAPI_Pnt> aProjectedPoint;
-        if (ModelGeomAlgo_Point2D::isPointOnEdge(aShape, aPoint, aProjectedPoint))
-          aResultForCoincidence = anAddtionalResult;
-      }
-      aCoincFeature->refattr(anAttributeId)->setObject(aResultForCoincidence);
-    }
-#ifdef DEBUG_SPLIT
-  std::cout << " -" << getFeatureInfo(aCoincFeature) << std::endl;
-#endif
-  }
-}
-
-void SketchPlugin_ConstraintSplit::updateRefFeatureConstraints(
-                                                  const ResultPtr& theFeatureBaseResult,
-                                                  const std::list<AttributePtr>& theRefsToFeature)
-{
-  std::list<AttributePtr>::const_iterator anIt = theRefsToFeature.begin(),
-                                          aLast = theRefsToFeature.end();
-  for (; anIt != aLast; anIt++) {
-    AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(*anIt);
-    if (aRefAttr.get())
-      aRefAttr->setObject(theFeatureBaseResult);
-  }
-}
-
-void SketchPlugin_ConstraintSplit::updateRefAttConstraints(
-                    const std::map<AttributePtr, std::list<AttributePtr> >& theBaseRefAttributes,
-                    const std::set<std::pair<AttributePtr, AttributePtr> >& theModifiedAttributes)
-{
-#ifdef DEBUG_SPLIT
-  std::cout << "SketchPlugin_ConstraintSplit::updateRefAttConstraints" << std::endl;
-#endif
-
-  std::set<std::pair<AttributePtr, AttributePtr> >::const_iterator
-    anIt = theModifiedAttributes.begin(),  aLast = theModifiedAttributes.end();
-  for (; anIt != aLast; anIt++) {
-    AttributePtr anAttribute = anIt->first;
-
-    /// not found in references
-    if (theBaseRefAttributes.find(anAttribute) == theBaseRefAttributes.end())
-      continue;
-    std::list<AttributePtr> aRefAttributes = theBaseRefAttributes.at(anAttribute);
-    std::list<AttributePtr>::const_iterator aRefIt = aRefAttributes.begin(),
-                                            aRLast = aRefAttributes.end();
-
-    AttributePtr aNewAttribute = anIt->second;
-    for (; aRefIt != aRLast; aRefIt++) {
-      AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(*aRefIt);
-      if (aRefAttr.get()) {
-        aRefAttr->setAttr(aNewAttribute);
-#ifdef DEBUG_SPLIT
-        FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttr->owner());
-        std::cout << " -" << getFeatureInfo(aFeature) << std::endl;
-#endif
-      }
-    }
-  }
-}
-
-void SketchPlugin_ConstraintSplit::splitLine(FeaturePtr& theSplitFeature,
-                                             FeaturePtr& theBaseFeatureModified,
-                                             FeaturePtr& theAfterFeature,
-                                             std::set<AttributePoint2DPtr>& thePoints,
-                                             std::set<FeaturePtr>& theCreatedFeatures,
-                 std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes)
-{
-  std::set<FeaturePtr> aCreatedFeatures;
-  FeaturePtr aConstraintFeature;
-  theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature
-
-  SketchPlugin_Sketch* aSketch = sketch();
-  if (!aSketch)
-    return;
-
-  AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                                           data()->attribute(SketchPlugin_Constraint::VALUE()));
-  FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
-  std::string aFeatureKind = aBaseFeature->getKind();
-  if (aFeatureKind != SketchPlugin_Line::ID())
-    return;
-
-  AttributePoint2DPtr aFirstPointAttrOfSplit =
-    getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_A()));
-  AttributePoint2DPtr aSecondPointAttrOfSplit =
-    getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B()));
-  AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase;
-
-  getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase);
-  if (!aStartPointAttrOfBase.get() && !anEndPointAttrOfBase.get()) {
-    setError("Error: Feature has no start and end points.");
-    return;
-  }
-
-  arrangePointsOnLine(aStartPointAttrOfBase, anEndPointAttrOfBase,
-                      aFirstPointAttrOfSplit, aSecondPointAttrOfSplit);
-
-#ifdef DEBUG_SPLIT
-  std::cout << "Arranged points (to build split between 1st and 2nd points:" << std::endl;
-  std::cout << "Start point: " <<
-    ModelGeomAlgo_Point2D::getPointAttributeInfo(aStartPointAttrOfBase) << std::endl;
-  std::cout << "1st point:   " <<
-    ModelGeomAlgo_Point2D::getPointAttributeInfo(aFirstPointAttrOfSplit) << std::endl;
-  std::cout << "2nd point:   " <<
-    ModelGeomAlgo_Point2D::getPointAttributeInfo(aSecondPointAttrOfSplit) << std::endl;
-  std::cout << "End point:   " <<
-    ModelGeomAlgo_Point2D::getPointAttributeInfo(anEndPointAttrOfBase) << std::endl;
-#endif
-
-  /// create a split feature
-  theSplitFeature =
-    createLineFeature(aBaseFeature, aFirstPointAttrOfSplit, aSecondPointAttrOfSplit);
-  theCreatedFeatures.insert(theSplitFeature);
-
-  // before split feature
-  if (aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) {
-    theModifiedAttributes.insert(std::make_pair(aStartPointAttrOfBase,
-                                        theSplitFeature->attribute(SketchPlugin_Line::START_ID())));
-  }
-  else {
-    theBaseFeatureModified = aBaseFeature; ///< use base feature to store all constraints here
-    /// move end arc point to start of split
-  }
-
-  // after split feature
-  if (!aSecondPointAttrOfSplit->pnt()->isEqual(anEndPointAttrOfBase->pnt())) {
-    FeaturePtr aFeature;
-    if (!theBaseFeatureModified.get()) {
-      aFeature = aBaseFeature; ///< use base feature to store all constraints here
-      fillAttribute(aFeature->attribute(SketchPlugin_Line::START_ID()), aSecondPointAttrOfSplit);
-      aFeature->execute(); // to update result
-    }
-    else {
-      aFeature = createLineFeature(aBaseFeature, aSecondPointAttrOfSplit, anEndPointAttrOfBase);
-      theCreatedFeatures.insert(aFeature);
-      theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase,
-                                             aFeature->attribute(SketchPlugin_Line::END_ID())));
-    }
-    aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(),
-                     theSplitFeature->attribute(SketchPlugin_Line::END_ID()),
-                     aFeature->attribute(SketchPlugin_Line::START_ID()));
-    theCreatedFeatures.insert(aConstraintFeature);
-
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                                (aFeature->attribute(SketchPlugin_Line::START_ID())));
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                                (aFeature->attribute(SketchPlugin_Line::END_ID())));
-
-    if (!theBaseFeatureModified.get())
-      theBaseFeatureModified = aFeature;
-    else
-      theAfterFeature = aFeature;
-  }
-  else {
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                                  (theSplitFeature->attribute(SketchPlugin_Line::END_ID())));
-    theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase,
-                                   theSplitFeature->attribute(SketchPlugin_Line::END_ID())));
-  }
-  // base split, that is defined before split feature should be changed at end
-  // (after the after feature creation). Otherwise modified value will be used in after feature
-  // before split feature
-  if (!aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) {
-    /// move end arc point to start of split
-    fillAttribute(theBaseFeatureModified->attribute(SketchPlugin_Line::END_ID()),
-                                                    aFirstPointAttrOfSplit);
-    theBaseFeatureModified->execute(); // to update result
-    aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(),
-                     theBaseFeatureModified->attribute(SketchPlugin_Line::END_ID()),
-                     theSplitFeature->attribute(SketchPlugin_Line::START_ID()));
-    theCreatedFeatures.insert(aConstraintFeature);
-
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                             (theBaseFeatureModified->attribute(SketchPlugin_Line::START_ID())));
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                               (theBaseFeatureModified->attribute(SketchPlugin_Line::END_ID())));
-  }
-  else
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                                       (theSplitFeature->attribute(SketchPlugin_Line::START_ID())));
-
-#ifdef CREATE_CONSTRAINTS
-  // additional constraints between split and base features
-  aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintParallel::ID(),
-                                                       getFeatureResult(aBaseFeature),
-                                                       getFeatureResult(theSplitFeature));
-  theCreatedFeatures.insert(aConstraintFeature);
-  if (theAfterFeature.get()) {
-    aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintParallel::ID(),
-                                                    getFeatureResult(aBaseFeature),
-                                                    getFeatureResult(theAfterFeature));
-    theCreatedFeatures.insert(aConstraintFeature);
-  }
-#endif
-}
-
-void SketchPlugin_ConstraintSplit::splitArc(FeaturePtr& theSplitFeature,
-                                            FeaturePtr& theBaseFeatureModified,
-                                            FeaturePtr& theAfterFeature,
-                                            std::set<AttributePoint2DPtr>& thePoints,
-                                            std::set<FeaturePtr>& theCreatedFeatures,
-                 std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes)
-{
-  std::set<FeaturePtr> aCreatedFeatures;
-  FeaturePtr aConstraintFeature;
-  theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature
-
-  SketchPlugin_Sketch* aSketch = sketch();
-  if (!aSketch)
-    return;
-
-  AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                                           data()->attribute(SketchPlugin_Constraint::VALUE()));
-  FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
-  std::string aFeatureKind = aBaseFeature->getKind();
-  if (aFeatureKind != SketchPlugin_Arc::ID())
-    return;
-
-  AttributePoint2DPtr aFirstPointAttrOfSplit =
-    getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_A()));
-  AttributePoint2DPtr aSecondPointAttrOfSplit =
-    getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B()));
-  AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase;
-  getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase);
-  if (!aStartPointAttrOfBase.get() && !anEndPointAttrOfBase.get()) {
-    setError("Error: Feature has no start and end points.");
-    return;
-  }
-
-  arrangePointsOnArc(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase,
-                     aFirstPointAttrOfSplit, aSecondPointAttrOfSplit);
-#ifdef DEBUG_SPLIT
-  std::cout << "Arranged points (to build split between 1st and 2nd points:" << std::endl;
-  std::cout << "Start point: " <<
-    ModelGeomAlgo_Point2D::getPointAttributeInfo(aStartPointAttrOfBase) << std::endl;
-  std::cout << "1st point:   " <<
-    ModelGeomAlgo_Point2D::getPointAttributeInfo(aFirstPointAttrOfSplit) << std::endl;
-  std::cout << "2nd point:   " <<
-    ModelGeomAlgo_Point2D::getPointAttributeInfo(aSecondPointAttrOfSplit) << std::endl;
-  std::cout << "End point:   " <<
-    ModelGeomAlgo_Point2D::getPointAttributeInfo(anEndPointAttrOfBase) << std::endl;
-#endif
-
-  /// split feature
-  theSplitFeature = createArcFeature(aBaseFeature, aFirstPointAttrOfSplit, aSecondPointAttrOfSplit);
-  theCreatedFeatures.insert(theSplitFeature);
-
-  // before split feature
-  if (aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) {
-    theModifiedAttributes.insert(std::make_pair(aStartPointAttrOfBase,
-                                  theSplitFeature->attribute(SketchPlugin_Arc::START_ID())));
-  }
-  else {
-    theBaseFeatureModified = aBaseFeature; ///< use base feature to store all constraints here
-    /// move end arc point to start of split
-  }
-
-  // after split feature
-  if (!aSecondPointAttrOfSplit->pnt()->isEqual(anEndPointAttrOfBase->pnt())) {
-    FeaturePtr aFeature;
-    if (!theBaseFeatureModified.get()) {
-      aFeature = aBaseFeature; ///< use base feature to store all constraints here
-      fillAttribute(aFeature->attribute(SketchPlugin_Arc::START_ID()), aSecondPointAttrOfSplit);
-      aFeature->execute(); // to update result
-    }
-    else {
-      aFeature = createArcFeature(aBaseFeature, aSecondPointAttrOfSplit, anEndPointAttrOfBase);
-      theCreatedFeatures.insert(aFeature);
-      theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase,
-                                                  aFeature->attribute(SketchPlugin_Arc::END_ID())));
-    }
-    aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(),
-                     theSplitFeature->attribute(SketchPlugin_Arc::END_ID()),
-                     aFeature->attribute(SketchPlugin_Arc::START_ID()));
-    theCreatedFeatures.insert(aConstraintFeature);
-
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                                (aFeature->attribute(SketchPlugin_Arc::START_ID())));
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                                (aFeature->attribute(SketchPlugin_Arc::END_ID())));
-
-    if (!theBaseFeatureModified.get())
-      theBaseFeatureModified = aFeature;
-    else
-      theAfterFeature = aFeature;
-  }
-  else {
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                                  (theSplitFeature->attribute(SketchPlugin_Arc::END_ID())));
-    theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase,
-                                   theSplitFeature->attribute(SketchPlugin_Arc::END_ID())));
-  }
-  // base split, that is defined before split feature should be changed at end
-  // (after the after feature creation). Otherwise modified value will be used in after feature
-  // before split feature
-  if (!aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) {
-    /// move end arc point to start of split
-    fillAttribute(theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()),
-                                                    aFirstPointAttrOfSplit);
-    theBaseFeatureModified->execute(); // to update result
-    aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(),
-                     theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()),
-                     theSplitFeature->attribute(SketchPlugin_Arc::START_ID()));
-    theCreatedFeatures.insert(aConstraintFeature);
-
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                             (theBaseFeatureModified->attribute(SketchPlugin_Arc::START_ID())));
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                               (theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID())));
-  }
-  else
-    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                                       (theSplitFeature->attribute(SketchPlugin_Arc::START_ID())));
-
-  // additional constraints between split and base features
-#ifdef CREATE_CONSTRAINTS
-  aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintEqual::ID(),
-                                                       getFeatureResult(aBaseFeature),
-                                                       getFeatureResult(theSplitFeature));
-  theCreatedFeatures.insert(aConstraintFeature);
-  aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(),
-                                                       getFeatureResult(theSplitFeature),
-                                                       getFeatureResult(aBaseFeature));
-  theCreatedFeatures.insert(aConstraintFeature);
-  if (theAfterFeature.get()) {
-    aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintEqual::ID(),
-                                                    getFeatureResult(aBaseFeature),
-                                                    getFeatureResult(theAfterFeature));
-    theCreatedFeatures.insert(aConstraintFeature);
-    aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(),
-                                                    getFeatureResult(theSplitFeature),
-                                                    getFeatureResult(theAfterFeature));
-    theCreatedFeatures.insert(aConstraintFeature);
-  }
-#endif
-}
-
-void SketchPlugin_ConstraintSplit::splitCircle(FeaturePtr& theSplitFeature,
-                                               FeaturePtr& theBaseFeatureModified,
-                                               FeaturePtr& theAfterFeature,
-                                               std::set<AttributePoint2DPtr>& thePoints,
-                                               std::set<FeaturePtr>& theCreatedFeatures,
-                 std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes)
-{
-  std::set<FeaturePtr> aCreatedFeatures;
-  FeaturePtr aConstraintFeature;
-  theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature
-
-  SketchPlugin_Sketch* aSketch = sketch();
-  if (!aSketch)
-    return;
-
-  AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                                           data()->attribute(SketchPlugin_Constraint::VALUE()));
-  FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
-  std::string aFeatureKind = aBaseFeature->getKind();
-  if (aFeatureKind != SketchPlugin_Circle::ID())
-    return;
-
-  AttributePoint2DPtr aFirstPointAttrOfSplit =
-    getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_A()));
-  AttributePoint2DPtr aSecondPointAttrOfSplit =
-    getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B()));
-
-  /// split feature
-  theSplitFeature =
-    createArcFeature(aBaseFeature, aFirstPointAttrOfSplit, aSecondPointAttrOfSplit);
-  bool aSplitReversed = std::dynamic_pointer_cast<SketchPlugin_Arc>(theSplitFeature)->isReversed();
-  theCreatedFeatures.insert(theSplitFeature);
-
-  /// base feature is a left part of the circle
-  theBaseFeatureModified = createArcFeature(aBaseFeature,
-    aFirstPointAttrOfSplit, aSecondPointAttrOfSplit);
-  std::dynamic_pointer_cast<SketchPlugin_Arc>(
-    theBaseFeatureModified)->setReversed(!aSplitReversed);
-  theBaseFeatureModified->execute();
-
-  theModifiedAttributes.insert(
-    std::make_pair(aBaseFeature->attribute(SketchPlugin_Circle::CENTER_ID()),
-                  theBaseFeatureModified->attribute(SketchPlugin_Arc::CENTER_ID())));
-
-  theCreatedFeatures.insert(theBaseFeatureModified);
-
-  thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                             (theBaseFeatureModified->attribute(SketchPlugin_Arc::START_ID())));
-  thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-                             (theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID())));
-
-  // additional constraints between split and base features
-  aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(),
-                     theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()),
-                     theSplitFeature->attribute(SketchPlugin_Arc::END_ID()));
-  theCreatedFeatures.insert(aConstraintFeature);
-  aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(),
-                     theBaseFeatureModified->attribute(SketchPlugin_Arc::START_ID()),
-                     theSplitFeature->attribute(SketchPlugin_Arc::START_ID()));
-  theCreatedFeatures.insert(aConstraintFeature);
-
-#ifdef CREATE_CONSTRAINTS
-  aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(),
-                                                       getFeatureResult(theSplitFeature),
-                                                       getFeatureResult(theBaseFeatureModified));
-  theCreatedFeatures.insert(aConstraintFeature);
-#endif
-}
-
-void SketchPlugin_ConstraintSplit::arrangePointsOnLine(
-    const AttributePoint2DPtr& theStartPointAttr,
-    const AttributePoint2DPtr& theEndPointAttr,
-    AttributePoint2DPtr& theFirstPointAttr,
-    AttributePoint2DPtr& theLastPointAttr) const
-{
-  // if first point is closer to last point, swap first and last values
-  if (theStartPointAttr->pnt()->distance(theFirstPointAttr->pnt()) >
-      theStartPointAttr->pnt()->distance(theLastPointAttr->pnt())) {
-    AttributePoint2DPtr aTmpPoint = theFirstPointAttr;
-    theFirstPointAttr = theLastPointAttr;
-    theLastPointAttr = aTmpPoint;
-  }
-}
-
-void SketchPlugin_ConstraintSplit::arrangePointsOnArc(
-    const FeaturePtr& theArc,
-    const std::shared_ptr<GeomDataAPI_Point2D>& theStartPointAttr,
-    const std::shared_ptr<GeomDataAPI_Point2D>& theEndPointAttr,
-    std::shared_ptr<GeomDataAPI_Point2D>& theFirstPointAttr,
-    std::shared_ptr<GeomDataAPI_Point2D>& theSecondPointAttr) const
-{
-  static const double anAngleTol = 1.e-12;
-
-  std::shared_ptr<GeomAPI_Pnt2d> aCenter = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-      theArc->attribute(SketchPlugin_Arc::CENTER_ID()))->pnt();
-  bool isReversed = theArc->boolean(SketchPlugin_Arc::REVERSED_ID())->value();
-
-  // collect directions to each point
-  std::shared_ptr<GeomAPI_Dir2d> aStartDir(
-      new GeomAPI_Dir2d(theStartPointAttr->pnt()->xy()->decreased(aCenter->xy())));
-  std::shared_ptr<GeomAPI_Dir2d> aFirstPtDir(
-      new GeomAPI_Dir2d(theFirstPointAttr->pnt()->xy()->decreased(aCenter->xy())));
-  std::shared_ptr<GeomAPI_Dir2d> aSecondPtDir(
-      new GeomAPI_Dir2d(theSecondPointAttr->pnt()->xy()->decreased(aCenter->xy())));
-
-  // sort points by their angular values
-  double aFirstPtAngle = aStartDir->angle(aFirstPtDir);
-  double aSecondPtAngle = aStartDir->angle(aSecondPtDir);
-  double aPeriod = isReversed ? -2.0 * PI : 2.0 * PI;
-  if (fabs(aFirstPtAngle) > anAngleTol && isReversed == (aFirstPtAngle > 0.))
-    aFirstPtAngle += aPeriod;
-  if (fabs(aSecondPtAngle) > anAngleTol && isReversed == (aSecondPtAngle > 0.))
-    aSecondPtAngle += aPeriod;
-
-  if (fabs(aFirstPtAngle) > fabs(aSecondPtAngle)) {
-    AttributePoint2DPtr aTmpPoint = theFirstPointAttr;
-    theFirstPointAttr = theSecondPointAttr;
-    theSecondPointAttr = aTmpPoint;
-  }
-}
-
-void SketchPlugin_ConstraintSplit::fillAttribute(const AttributePtr& theModifiedAttribute,
-                                                 const AttributePtr& theSourceAttribute)
-{
-  std::string anAttributeType = theModifiedAttribute->attributeType();
-  if (anAttributeType == GeomDataAPI_Point2D::typeId()) {
-    AttributePoint2DPtr aModifiedAttribute = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                                              theModifiedAttribute);
-    AttributePoint2DPtr aSourceAttribute = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                                              theSourceAttribute);
-
-    if (aModifiedAttribute.get() && aSourceAttribute.get())
-      aModifiedAttribute->setValue(aSourceAttribute->pnt());
-  }
-  else if (anAttributeType == ModelAPI_AttributeBoolean::typeId()) {
-    AttributeBooleanPtr aModifiedAttribute = std::dynamic_pointer_cast<ModelAPI_AttributeBoolean>(
-                                              theModifiedAttribute);
-    AttributeBooleanPtr aSourceAttribute = std::dynamic_pointer_cast<ModelAPI_AttributeBoolean>(
-                                              theSourceAttribute);
-
-    if (aModifiedAttribute.get() && aSourceAttribute.get())
-      aModifiedAttribute->setValue(aSourceAttribute->value());
-  }
-}
-
-FeaturePtr SketchPlugin_ConstraintSplit::createLineFeature(const FeaturePtr& theBaseFeature,
-                                                           const AttributePtr& theFirstPointAttr,
-                                                           const AttributePtr& theSecondPointAttr)
-{
-  FeaturePtr aFeature;
-  SketchPlugin_Sketch* aSketch = sketch();
-  if (!aSketch || !theBaseFeature.get())
-    return aFeature;
-
-  aFeature = aSketch->addFeature(SketchPlugin_Line::ID());
-
-  fillAttribute(aFeature->attribute(SketchPlugin_Line::START_ID()), theFirstPointAttr);
-  fillAttribute(aFeature->attribute(SketchPlugin_Line::END_ID()), theSecondPointAttr);
-
-  fillAttribute(aFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()),
-                theBaseFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()));
-
-  aFeature->execute(); // to obtain result
-
-  return aFeature;
-}
-
-FeaturePtr SketchPlugin_ConstraintSplit::createArcFeature(const FeaturePtr& theBaseFeature,
-                                                          const AttributePtr& theFirstPointAttr,
-                                                          const AttributePtr& theSecondPointAttr)
-{
-  FeaturePtr aFeature;
-  SketchPlugin_Sketch* aSketch = sketch();
-  if (!aSketch || !theBaseFeature.get())
-    return aFeature;
-
-  std::string aCenterAttributeId;
-  if (theBaseFeature->getKind() == SketchPlugin_Arc::ID())
-    aCenterAttributeId = SketchPlugin_Arc::CENTER_ID();
-  else if (theBaseFeature->getKind() == SketchPlugin_Circle::ID())
-    aCenterAttributeId = SketchPlugin_Circle::CENTER_ID();
-
-  if (aCenterAttributeId.empty())
-    return aFeature;
-
-  aFeature = aSketch->addFeature(SketchPlugin_Arc::ID());
-  // update fillet arc: make the arc correct for sure, so, it is not needed to process
-  // the "attribute updated"
-  // by arc; moreover, it may cause cyclicity in hte mechanism of updater
-  bool aWasBlocked = aFeature->data()->blockSendAttributeUpdated(true);
-
-  fillAttribute(aFeature->attribute(SketchPlugin_Arc::CENTER_ID()),
-                theBaseFeature->attribute(aCenterAttributeId));
-  fillAttribute(aFeature->attribute(SketchPlugin_Arc::START_ID()), theFirstPointAttr);
-  fillAttribute(aFeature->attribute(SketchPlugin_Arc::END_ID()), theSecondPointAttr);
-
-  fillAttribute(aFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()),
-                theBaseFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()));
-
-  /// fill referersed state of created arc as it is on the base arc
-  if (theBaseFeature->getKind() == SketchPlugin_Arc::ID()) {
-    bool aReversed = theBaseFeature->boolean(SketchPlugin_Arc::REVERSED_ID())->value();
-    aFeature->boolean(SketchPlugin_Arc::REVERSED_ID())->setValue(aReversed);
-  }
-  aFeature->data()->blockSendAttributeUpdated(aWasBlocked);
-  aFeature->execute(); // to obtain result
-
-  return aFeature;
-}
-
-FeaturePtr SketchPlugin_ConstraintSplit::createConstraint(const std::string& theConstraintId,
-                                                    const AttributePtr& theFirstAttribute,
-                                                    const AttributePtr& theSecondAttribute)
-{
-  FeaturePtr aConstraint = sketch()->addFeature(theConstraintId);
-  AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-                                 aConstraint->attribute(SketchPlugin_Constraint::ENTITY_A()));
-  aRefAttr->setAttr(theFirstAttribute);
-
-  aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-                                 aConstraint->attribute(SketchPlugin_Constraint::ENTITY_B()));
-  aRefAttr->setAttr(theSecondAttribute);
-
-  return aConstraint;
-}
-
-FeaturePtr SketchPlugin_ConstraintSplit::createConstraintForObjects(
-                                                    const std::string& theConstraintId,
-                                                    const ObjectPtr& theFirstObject,
-                                                    const ObjectPtr& theSecondObject)
-{
-  FeaturePtr aConstraint = sketch()->addFeature(theConstraintId);
-  AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-                                 aConstraint->attribute(SketchPlugin_Constraint::ENTITY_A()));
-  aRefAttr->setObject(theFirstObject);
-
-  aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-                                 aConstraint->attribute(SketchPlugin_Constraint::ENTITY_B()));
-  aRefAttr->setObject(theSecondObject);
-
-  return aConstraint;
-}
-
-void SketchPlugin_ConstraintSplit::updateFeaturesAfterSplit(
-                                                   const std::set<FeaturePtr>& theFeaturesToUpdate)
-{
-  std::set<FeaturePtr>::const_iterator anIt = theFeaturesToUpdate.begin(),
-                                       aLast = theFeaturesToUpdate.end();
-  for (; anIt != aLast; anIt++) {
-    FeaturePtr aRefFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(*anIt);
-    std::string aRefFeatureKind = aRefFeature->getKind();
-    if (aRefFeatureKind == SketchPlugin_ConstraintLength::ID()) {
-      std::shared_ptr<SketchPlugin_ConstraintLength> aLenghtFeature =
-                              std::dynamic_pointer_cast<SketchPlugin_ConstraintLength>(*anIt);
-      if (aLenghtFeature.get()) {
-        std::shared_ptr<ModelAPI_AttributeDouble> aValueAttr = std::dynamic_pointer_cast<
-            ModelAPI_AttributeDouble>(aLenghtFeature->attribute(SketchPlugin_Constraint::VALUE()));
-        double aValue;
-        if (aLenghtFeature->computeLenghtValue(aValue) && aValueAttr.get())
-          aValueAttr->setValue(aValue);
-      }
-    }
-  }
-}
-
-std::shared_ptr<ModelAPI_Result> SketchPlugin_ConstraintSplit::getFeatureResult(
-                                    const std::shared_ptr<ModelAPI_Feature>& theFeature)
-{
-  std::shared_ptr<ModelAPI_Result> aResult;
-
-  std::string aFeatureKind = theFeature->getKind();
-  if (aFeatureKind == SketchPlugin_Line::ID())
-    aResult = theFeature->firstResult();
-  else if (aFeatureKind == SketchPlugin_Arc::ID())
-    aResult = theFeature->lastResult();
-  else if (aFeatureKind == SketchPlugin_Circle::ID())
-    aResult = theFeature->lastResult();
-
-  return aResult;
-}
-
-std::set<std::shared_ptr<ModelAPI_Attribute> > SketchPlugin_ConstraintSplit::getEdgeAttributes(
-                                           const std::shared_ptr<ModelAPI_Feature>& theFeature)
-{
-  std::set<std::shared_ptr<ModelAPI_Attribute> > anAttributes;
-
-  std::string aFeatureKind = theFeature->getKind();
-  if (aFeatureKind == SketchPlugin_Line::ID()) {
-    anAttributes.insert(theFeature->attribute(SketchPlugin_Line::START_ID()));
-    anAttributes.insert(theFeature->attribute(SketchPlugin_Line::END_ID()));
-  }
-  else if (aFeatureKind == SketchPlugin_Arc::ID()) {
-    anAttributes.insert(theFeature->attribute(SketchPlugin_Arc::START_ID()));
-    anAttributes.insert(theFeature->attribute(SketchPlugin_Arc::END_ID()));
-  }
-  else if (aFeatureKind == SketchPlugin_Circle::ID()) {
-  }
-
-  return anAttributes;
-}
-
-#ifdef _DEBUG
-std::string SketchPlugin_ConstraintSplit::getFeatureInfo(
-                                               const std::shared_ptr<ModelAPI_Feature>& theFeature,
-                                               const bool isUseAttributesInfo)
-{
-  std::string anInfo;
-  if (!theFeature.get()) {
-    return "none";
-  }
-
-  if (theFeature->data()->isValid())
-    anInfo.append(theFeature->data()->name().c_str());
-
-  if (isUseAttributesInfo) {
-    std::string aPointsInfo = ModelGeomAlgo_Point2D::getPontAttributesInfo(theFeature,
-                                                             getEdgeAttributes(theFeature));
-    /// processing of feature with point 2d attributes, like line, arc, circle
-    if (!aPointsInfo.empty()) {
-      anInfo += ": ";
-      anInfo += "\n";
-      anInfo += aPointsInfo;
-    }
-    else { /// process constraint coincidence, find points in ref attr attributes
-      std::list<AttributePtr> anAttrs = theFeature->data()->attributes(
-                                                       ModelAPI_AttributeRefAttr::typeId());
-      std::list<AttributePtr>::const_iterator anIt = anAttrs.begin(), aLast = anAttrs.end();
-      std::string anAttributesInfo;
-      for(; anIt != aLast; anIt++) {
-        if (!anAttributesInfo.empty()) {
-          anAttributesInfo.append(", ");
-          anAttributesInfo += "\n";
-        }
-        AttributePtr anAttr = *anIt;
-        std::string aValue = "not defined";
-        std::string aType = anAttr->attributeType();
-        if (aType == ModelAPI_AttributeRefAttr::typeId()) {
-          std::shared_ptr<ModelAPI_AttributeRefAttr> aRefAttr =
-                             std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(anAttr);
-          if (aRefAttr.get()) {
-            if (aRefAttr->isObject()) {
-              FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttr->object());
-              aValue = "<object:>" + getFeatureInfo(aFeature, false);
-            }
-            else {
-              AttributePtr anAttribute = aRefAttr->attr();
-              if (anAttribute.get()) {
-                FeaturePtr aFeature = ModelAPI_Feature::feature(anAttribute->owner());
-                aValue = "<attr:>" + ModelGeomAlgo_Point2D::getPointAttributeInfo(anAttribute) +
-                         " [" + getFeatureInfo(aFeature, false) + "]";
-              }
-            }
-          }
-        }
-        anAttributesInfo.append("    " + anAttr->id() + ": " + aValue);
-      }
-      if (!anAttributesInfo.empty())
-        anInfo = anInfo + "\n" + anAttributesInfo;
-    }
-  }
-  return anInfo;
-}
-#endif
diff --git a/src/SketchPlugin/SketchPlugin_ConstraintSplit.h b/src/SketchPlugin/SketchPlugin_ConstraintSplit.h
deleted file mode 100755 (executable)
index e4e1bc7..0000000
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
-
-// File:    SketchPlugin_ConstraintSplit.h
-// Created: 25 Aug 2016
-// Author:  Natalia ERMOLAEVA
-
-#ifndef SketchPlugin_ConstraintSplit_H_
-#define SketchPlugin_ConstraintSplit_H_
-
-#include "SketchPlugin.h"
-#include <SketchPlugin_Sketch.h>
-#include "SketchPlugin_ConstraintBase.h"
-
-class GeomDataAPI_Point2D;
-class ModelAPI_Feature;
-class ModelAPI_Result;
-
-typedef std::pair<std::string, std::shared_ptr<GeomDataAPI_Point2D> > IdToPointPair;
-
-/** \class SketchPlugin_ConstraintSplit
- *  \ingroup Plugins
- *  \brief Feature for creation of a new constraint splitting object. Entities for split:
- * - Linear segment by point(s) on this line
- * - Arc by point(s) on this arc
- * - Circle by at least 2 split-points on this circle
- *
- * The following constraints will be applied after split to keep the divided segments geometry:
- * - Coincident constraints for both parts of created segments in the point of splitting
- * - For linear segments parallel, for circles - tangent constraint, for arc - tangent and equal
- *   constraints. In case of three segments in result two couple of constraints are created
- *    - parallel and equal constraints: the first is between 1st and middle entity, the second is
- *      between 1st and 3rd.
- *    - tangency constraints: the first between 1st and 2nd, the second between 2nd and 3rd.
- * - Constraints assigned to the feature before split operation are assigned after using rules:
- *    - Coincident constraints are assigned to the segment where they belong to. Segment of split
- *      has only a coincidence to the neighbor segment. All constraints used in the splitting of
- *      this segment are moved to point of neighbor segment. If constraint was initially built
- *      to the point of splitting segment, it stays for this point.
- *    - Geometrical and dimensional constraints are assigned to one of result segment, not the
- *      selected for split. In case of 3 result segments, this will be the segment nearest to the
- *      start point of arc/line.
- *    - Replication constraint used split feature will be deleted in the same way as it is deleted
- *      by any of entity delete in sketch which is used in this constraint.
- *
- *  This constraint has three attributes:
- *  SketchPlugin_Constraint::VALUE() contains reference object to be splitted
- *  SketchPlugin_Constraint::ENTITY_A() and SketchPlugin_Constraint::ENTITY_B() for the points of split;
- *
- */
-class SketchPlugin_ConstraintSplit : public SketchPlugin_ConstraintBase
-{
- public:
-  /// Split constraint kind
-  inline static const std::string& ID()
-  {
-    static const std::string MY_CONSTRAINT_SPLIT_ID("SketchConstraintSplit");
-    return MY_CONSTRAINT_SPLIT_ID;
-  }
-  /// \brief Returns the kind of a feature
-  SKETCHPLUGIN_EXPORT virtual const std::string& getKind()
-  {
-    static std::string MY_KIND = SketchPlugin_ConstraintSplit::ID();
-    return MY_KIND;
-  }
-
-  /// \brief Creates a new part document if needed
-  SKETCHPLUGIN_EXPORT virtual void execute();
-
-  /// \brief Request for initialization of data model of the feature: adding all attributes
-  SKETCHPLUGIN_EXPORT virtual void initAttributes();
-
-  /// Reimplemented from ModelAPI_Feature::isMacro().
-  /// \returns true
-  SKETCHPLUGIN_EXPORT virtual bool isMacro() const;
-
-  /// Reimplemented from ModelAPI_Feature::isPreviewNeeded(). Returns false.
-  /// This is necessary to perform execute only by apply the feature
-  SKETCHPLUGIN_EXPORT virtual bool isPreviewNeeded() const { return false; }
-
-  /// \brief Use plugin manager for features creation
-  SketchPlugin_ConstraintSplit();
-
-  /// Returns the AIS preview
-  SKETCHPLUGIN_EXPORT virtual AISObjectPtr getAISObject(AISObjectPtr thePrevious);
-
-private:
-  /// Returns geom point attribute of the feature bounds. It processes line or arc.
-  /// For circle feature, the result attributes are null
-  /// \param theFeature a source feature
-  /// \param theStartPointAttr an out attribute to start point
-  /// \param theStartPointAttr an out attribute to end point
-  void getFeaturePoints(const FeaturePtr& theFeature,
-                        std::shared_ptr<GeomDataAPI_Point2D>& theStartPointAttr,
-                        std::shared_ptr<GeomDataAPI_Point2D>& theEndPointAttr);
-
-  /// Returns cast of attribute to geometrical point if the attribute is a ref attr attribute
-  /// \param theAttribute an attribute
-  /// \param geom point 2D or NULL
-  std::shared_ptr<GeomDataAPI_Point2D> getPointOfRefAttr(const AttributePtr& theAttribute);
-
-  /// Obtains those constraints of the feature that should be modified. output maps contain
-  /// point of coincidence and attribute id to be modified after split
-  /// \param theFeaturesToDelete [out] constrains that will be deleted after split
-  /// \param theFeaturesToUpdate [out] constrains that will be updated after split
-  /// \param theTangentFeatures  [out] tangent feature to be connected to new feature
-  /// \param theCoincidenceToFeature [out] coincidence to feature to be connected to new feature
-  /// \param theCoincidenceToPoint [out] coincidence to point be connected to new feature
-  void getConstraints(std::set<std::shared_ptr<ModelAPI_Feature>>& theFeaturesToDelete,
-              std::set<std::shared_ptr<ModelAPI_Feature>>& theFeaturesToUpdate,
-              std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theCoincidenceToFeature);
-
-  /// Obtains references to feature point attributes and to feature,
-  /// e.g. for feature line: 1st container is
-  ///             <1st line point, list<entity_a in distance, entity_b in parallel> >
-  ///             <2nd line point, list<> >
-  ///      for feature circle 2nd container is <entity_a in Radius, entity_b in equal, ...>
-  /// \param theFeature an investigated feature
-  /// \param theRefs a container of list of referenced attributes
-  void getRefAttributes(const FeaturePtr& theFeature,
-                        std::map<AttributePtr, std::list<AttributePtr> >& theRefs,
-                        std::list<AttributePtr>& theRefsToFeature);
-
-  /// Move coincidence constraint from feature to point if it is found
-  /// \param theCoincidenceToFeature coincidence to feature to be connected to new feature
-  /// \param theFurtherCoincidences a list of points where coincidences will be build
-  /// \param theFeatureResults created results after split where constaint might be connected
-  /// \param theSplitFeature feature created by split, new coincidences to points should be created
-  /// if theCoincidenceToFeature contains equal points
-  void updateCoincidenceConstraintsToFeature(
-      const std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theCoincidenceToFeature,
-      const std::set<std::shared_ptr<GeomDataAPI_Point2D> >& theFurtherCoincidences,
-      const std::set<ResultPtr>& theFeatureResults,
-      const FeaturePtr& theSplitFeature);
-
-  /// Move constraints from base feature to given feature
-  /// \param theFeature a base feature
-  /// \param theRefsToFeature list of attributes referenced to base feature
-  void updateRefFeatureConstraints(const std::shared_ptr<ModelAPI_Result>& theFeatureBaseResult,
-                                   const std::list<AttributePtr>& theRefsToFeature);
-
-  /// Move constraints from attribute of base feature to attribute after modification
-  /// \param theBaseRefAttributes container of references to the attributes of base feature
-  /// \param theModifiedAttributes container of attributes placed instead of base attributes
-  /// at the same place
-  void updateRefAttConstraints(
-               const std::map<AttributePtr, std::list<AttributePtr> >& theBaseRefAttributes,
-               const std::set<std::pair<AttributePtr, AttributePtr> >& theModifiedAttributes);
-
-  /// Make the base object is splitted by the point attributes
-  /// \param theSplitFeature a result split feature
-  /// \param theBeforeFeature a feature between start point and the 1st point of split feature
-  /// \param theAfterFeature a feature between last point of split feature and the end point
-  /// \param thePoints a list of points where coincidences will be build
-  /// \param theCreatedFeatures a container of created features
-  /// \param theModifiedAttributes a container of attribute on base
-  /// feature to attribute on new feature
-  void splitLine(std::shared_ptr<ModelAPI_Feature>& theSplitFeature,
-                 std::shared_ptr<ModelAPI_Feature>& theBeforeFeature,
-                 std::shared_ptr<ModelAPI_Feature>& theAfterFeature,
-                 std::set<std::shared_ptr<GeomDataAPI_Point2D> >& thePoints,
-                 std::set<std::shared_ptr<ModelAPI_Feature>>& theCreatedFeatures,
-                 std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes);
-
-  /// Make the base object is splitted by the point attributes
-  /// \param theSplitFeature a result split feature
-  /// \param theBeforeFeature a feature between start point and the 1st point of split feature
-  /// \param theAfterFeature a feature between last point of split feature and the end point
-  /// \param thePoints a list of points where coincidences will be build
-  /// \param theCreatedFeatures a container of created features
-  void splitArc(std::shared_ptr<ModelAPI_Feature>& theSplitFeature,
-                std::shared_ptr<ModelAPI_Feature>& theBeforeFeature,
-                std::shared_ptr<ModelAPI_Feature>& theAfterFeature,
-                std::set<std::shared_ptr<GeomDataAPI_Point2D> >& thePoints,
-                std::set<std::shared_ptr<ModelAPI_Feature>>& theCreatedFeatures,
-                std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes);
-
-  /// Make the base object is splitted by the point attributes
-  /// \param theSplitFeature a result split feature
-  /// \param theBeforeFeature a feature between start point and the 1st point of split feature
-  /// \param theAfterFeature a feature between last point of split feature and the end point
-  /// \param thePoints a list of points where coincidences will be build
-  /// \param theCreatedFeatures a container of created features
-  void splitCircle(std::shared_ptr<ModelAPI_Feature>& theSplitFeature,
-                   std::shared_ptr<ModelAPI_Feature>& theBeforeFeature,
-                   std::shared_ptr<ModelAPI_Feature>& theAfterFeature,
-                   std::set<std::shared_ptr<GeomDataAPI_Point2D> >& thePoints,
-                   std::set<std::shared_ptr<ModelAPI_Feature>>& theCreatedFeatures,
-                   std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes);
-
-  /// Correct the first and the second point to provide condition that the first is closer to
-  /// the start point and the second point - to the last end of current segment. To rearrange
-  /// them if this condition is not satisfied.
-  /// \param theStartPointAttr a start point of a segment
-  /// \param theEndPointAttr an end point of a segment
-  /// \param theFirstPointAttr a start point of a segment
-  /// \param theSecondPointAttr an end point of a segment
-  void arrangePointsOnLine(const std::shared_ptr<GeomDataAPI_Point2D>& theStartPointAttr,
-                           const std::shared_ptr<GeomDataAPI_Point2D>& theEndPointAttr,
-                           std::shared_ptr<GeomDataAPI_Point2D>& theFirstPointAttr,
-                           std::shared_ptr<GeomDataAPI_Point2D>& theSecondPointAttr) const;
-
-  /// Correct the first and the second point to provide condition that the first is closer to
-  /// the start point and the second point - to the last end of current segment. To rearrange
-  /// them if this condition is not satisfied.
-  /// \param theArc an arc to be split
-  /// \param theStartPointAttr a start point of a segment
-  /// \param theEndPointAttr an end point of a segment
-  /// \param theFirstPointAttr a start point of a segment
-  /// \param theSecondPointAttr an end point of a segment
-  void arrangePointsOnArc(const FeaturePtr& theArc,
-                          const std::shared_ptr<GeomDataAPI_Point2D>& theStartPointAttr,
-                          const std::shared_ptr<GeomDataAPI_Point2D>& theEndPointAttr,
-                          std::shared_ptr<GeomDataAPI_Point2D>& theFirstPointAttr,
-                          std::shared_ptr<GeomDataAPI_Point2D>& theSecondPointAttr) const;
-
-  /// Fill attribute by value of another attribute. It processes only Point 2D attributes.
-  /// \param theModifiedAttribute an attribute of GeomDataAPI_Point2D on feature to be modified
-  /// \param theSourceAttribute an attribute of GeomDataAPI_Point2D to obtain data
-  void fillAttribute(const AttributePtr& theModifiedAttribute,
-                     const AttributePtr& theSourceAttribute);
-
-  /// Creates a line feature filled by center of base feature and given points
-  /// \param theBaseFeature another arc feature
-  /// \param theFirstAttribute an attribute with coordinates for the start point
-  /// \param theSecondAttribute an attribute with coordinates for the end point
-  FeaturePtr createLineFeature(const FeaturePtr& theBaseFeature,
-                               const AttributePtr& theFirstPointAttr,
-                               const AttributePtr& theSecondPointAttr);
-
-  /// Creates an arc feature filled by center of base feature and given points
-  /// \param theBaseFeature another arc feature
-  /// \param theFirstAttribute an attribute with coordinates for the start point
-  /// \param theSecondAttribute an attribute with coordinates for the end point
-  FeaturePtr createArcFeature(const FeaturePtr& theBaseFeature,
-                              const AttributePtr& theFirstPointAttr,
-                              const AttributePtr& theSecondPointAttr);
-
-  /// Add feature coincidence constraint between given attributes
-  /// \param theConstraintId a constraint index
-  /// \param theFirstAttribute an attribute of further coincidence
-  /// \param theSecondAttribute an attribute of further coincidence
-  std::shared_ptr<ModelAPI_Feature> createConstraint(const std::string& theConstraintId,
-                        const std::shared_ptr<ModelAPI_Attribute>& theFirstAttribute,
-                        const std::shared_ptr<ModelAPI_Attribute>& theSecondAttribute);
-
-  /// Add feature coincidence constraint between given attributes
-  /// \param theConstraintId a constraint index
-  /// \param theFirstAttribute an attribute of further coincidence
-  /// \param theFirstAttribute an attribute of further coincidence
-  std::shared_ptr<ModelAPI_Feature> createConstraintForObjects(const std::string& theConstraintId,
-                        const std::shared_ptr<ModelAPI_Object>& theFirstObject,
-                        const std::shared_ptr<ModelAPI_Object>& theSecondObject);
-
-  /// Add feature coincidence constraint between given attributes
-  /// \param theFeaturesToUpdate a constraint index
-  void updateFeaturesAfterSplit(const std::set<FeaturePtr>& theFeaturesToUpdate);
-
-  /// Result result of the feature to build constraint with. For arc, circle it is an edge result.
-  /// \param theFeature a feature
-  /// \return result object
-  std::shared_ptr<ModelAPI_Result> getFeatureResult(
-                                    const std::shared_ptr<ModelAPI_Feature>& theFeature);
-
-  /// Returns attributes of the feature, used in edge build, for arc it is end and start points
-  /// \param theFeature a feature
-  /// \return container of attributes
-  std::set<std::shared_ptr<ModelAPI_Attribute> > getEdgeAttributes(
-                                    const std::shared_ptr<ModelAPI_Feature>& theFeature);
-
-#ifdef _DEBUG
-  /// Return feature name, kind, point attribute values united in a string
-  /// \param theFeature an investigated feature
-  /// \return string value
-  std::string getFeatureInfo(const std::shared_ptr<ModelAPI_Feature>& theFeature,
-                             const bool isUseAttributesInfo = true);
-#endif
-};
-
-#endif
index 65a5cf66212571e323f4fa077a05e0600495e8c8..ab6197e72001f6f61de0122a30e9d827ca6aca39 100644 (file)
@@ -14,7 +14,6 @@
 #include <SketchPlugin_ConstraintDistance.h>
 #include <SketchPlugin_ConstraintEqual.h>
 #include <SketchPlugin_Fillet.h>
-#include <SketchPlugin_ConstraintSplit.h>
 #include <SketchPlugin_ConstraintHorizontal.h>
 #include <SketchPlugin_ConstraintLength.h>
 #include <SketchPlugin_ConstraintMiddle.h>
@@ -30,6 +29,7 @@
 #include <SketchPlugin_MultiRotation.h>
 #include <SketchPlugin_MultiTranslation.h>
 #include <SketchPlugin_Trim.h>
+#include <SketchPlugin_Split.h>
 #include <SketchPlugin_Validators.h>
 #include <SketchPlugin_ExternalValidator.h>
 
@@ -193,14 +193,14 @@ FeaturePtr SketchPlugin_Plugin::createFeature(std::string theFeatureID)
     return FeaturePtr(new SketchPlugin_ConstraintMirror);
   } else if (theFeatureID == SketchPlugin_Fillet::ID()) {
     return FeaturePtr(new SketchPlugin_Fillet);
-  } else if (theFeatureID == SketchPlugin_ConstraintSplit::ID()) {
-    return FeaturePtr(new SketchPlugin_ConstraintSplit);
   } else if (theFeatureID == SketchPlugin_MultiTranslation::ID()) {
     return FeaturePtr(new SketchPlugin_MultiTranslation);
   } else if (theFeatureID == SketchPlugin_MultiRotation::ID()) {
     return FeaturePtr(new SketchPlugin_MultiRotation);
   } else if (theFeatureID == SketchPlugin_ConstraintAngle::ID()) {
     return FeaturePtr(new SketchPlugin_ConstraintAngle);
+  } else if (theFeatureID == SketchPlugin_Split::ID()) {
+    return FeaturePtr(new SketchPlugin_Split);
   } else if (theFeatureID == SketchPlugin_Trim::ID()) {
     return FeaturePtr(new SketchPlugin_Trim);
   } else if (theFeatureID == SketchPlugin_MacroArc::ID()) {
@@ -265,10 +265,10 @@ std::shared_ptr<ModelAPI_FeatureStateMessage> SketchPlugin_Plugin
       aMsg->setState(SketchPlugin_ConstraintMiddle::ID(), aHasSketchPlane);
       aMsg->setState(SketchPlugin_ConstraintMirror::ID(), aHasSketchPlane);
       aMsg->setState(SketchPlugin_Fillet::ID(), aHasSketchPlane);
-      aMsg->setState(SketchPlugin_ConstraintSplit::ID(), aHasSketchPlane);
       aMsg->setState(SketchPlugin_ConstraintAngle::ID(), aHasSketchPlane);
       aMsg->setState(SketchPlugin_MultiRotation::ID(), aHasSketchPlane);
       aMsg->setState(SketchPlugin_MultiTranslation::ID(), aHasSketchPlane);
+      aMsg->setState(SketchPlugin_Split::ID(), aHasSketchPlane);
       aMsg->setState(SketchPlugin_Trim::ID(), aHasSketchPlane);
       aMsg->setState(SketchPlugin_MacroArc::ID(), aHasSketchPlane);
       aMsg->setState(SketchPlugin_MacroCircle::ID(), aHasSketchPlane);
index 9ad6f0db9ecb71e6b63ee53c4f49d71abd29d794..747351bb331bb7d2763ace6181c229729e69776e 100644 (file)
@@ -75,8 +75,7 @@ SketchPlugin_Trim::SketchPlugin_Trim()
 
 void SketchPlugin_Trim::initAttributes()
 {
-  data()->addAttribute(SketchPlugin_Trim::SELECTED_OBJECT(),
-                       ModelAPI_AttributeReference::typeId());
+  data()->addAttribute(SELECTED_OBJECT(), ModelAPI_AttributeReference::typeId());
   data()->addAttribute(SELECTED_POINT(), GeomDataAPI_Point2D::typeId());
 
   data()->addAttribute(PREVIEW_POINT(), GeomDataAPI_Point2D::typeId());
@@ -427,23 +426,12 @@ void SketchPlugin_Trim::execute()
     if (aReplacingResult.get()) { // base object was removed
       aPreviewObject = aReplacingResult;
       //aMessage->setSelectedObject(aReplacingResult);
-
-      GeomShapePtr aSelectedShape = aReplacingResult->shape();
-      std::shared_ptr<GeomAPI_Pnt> aPreviewPnt = sketch()->to3D(aPreviewPnt2d->x(),
-                                                                aPreviewPnt2d->y());
-      std::shared_ptr<GeomAPI_Pnt> aProjectedPoint;
-      if (ModelGeomAlgo_Point2D::isPointOnEdge(aSelectedShape, aPreviewPnt, aProjectedPoint)) {
-        bool aValue = true;
-      }
-      //aBaseShape = aShape;
-
 #ifdef DEBUG_TRIM_METHODS
       if (!aSelectedShape.get())
         std::cout << "Set empty selected object" << std::endl;
       else
         std::cout << "Set shape with ShapeType: " << aSelectedShape->shapeTypeStr() << std::endl;
 #endif
-      bool aValue = true;
     }
     else {
       aPreviewObject = ObjectPtr();
@@ -594,11 +582,6 @@ bool SketchPlugin_Trim::replaceCoincidenceAttribute(const AttributePtr& theCoinc
   return isProcessed;
 }
 
-bool SketchPlugin_Trim::isMacro() const
-{
-  return true;
-}
-
 AISObjectPtr SketchPlugin_Trim::getAISObject(AISObjectPtr thePrevious)
 {
 #ifdef DEBUG_TRIM_METHODS
@@ -655,9 +638,9 @@ GeomShapePtr SketchPlugin_Trim::getSubShape(const std::string& theObjectAttribut
     return aBaseShape;
 
   // point on feature
-  AttributePoint2DPtr aPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+  AttributePoint2DPtr aPointAttr = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
                                            data()->attribute(thePointAttributeId));
-  std::shared_ptr<GeomAPI_Pnt2d> anAttributePnt2d = aPoint->pnt();
+  std::shared_ptr<GeomAPI_Pnt2d> anAttributePnt2d = aPointAttr->pnt();
   std::shared_ptr<GeomAPI_Pnt> anAttributePnt = sketch()->to3D(anAttributePnt2d->x(),
                                                                anAttributePnt2d->y());
 
index 610ae1e1c7800e3405496f93ffcc4a2a085fd0ba..6371dad6ca496621c36555a29f2d0a8aa5ceb3e8 100644 (file)
@@ -7,10 +7,10 @@
 #ifndef SketchPlugin_Trim_H_
 #define SketchPlugin_Trim_H_
 
-#include <ModelAPI_IReentrant.h>
-
 #include "SketchPlugin.h"
-#include "SketchPlugin_ConstraintBase.h"
+
+#include "GeomAPI_IPresentable.h"
+#include <ModelAPI_IReentrant.h>
 #include <SketchPlugin_Sketch.h>
 
 class GeomDataAPI_Point2D;
@@ -77,7 +77,7 @@ class SketchPlugin_Trim : public SketchPlugin_Feature, public GeomAPI_IPresentab
 
   /// Reimplemented from ModelAPI_Feature::isMacro()
   /// \returns true
-  SKETCHPLUGIN_EXPORT virtual bool isMacro() const;
+  SKETCHPLUGIN_EXPORT virtual bool isMacro() const { return true; }
 
   /// Reimplemented from ModelAPI_Feature::isPreviewNeeded(). Returns false.
   /// This is necessary to perform execute only by apply the feature
index 444209e88a8228554f7fa6b8af8a9e7235d41082..4d900de023463ce0d76c9c51a21cf1fd18907f9a 100644 (file)
@@ -13,7 +13,7 @@
                 SketchConstraintParallel SketchConstraintPerpendicular
                 SketchConstraintRigid SketchConstraintHorizontal SketchConstraintVertical
                 SketchConstraintEqual SketchConstraintTangent
-                SketchFillet SketchConstraintSplit SketchTrim
+                SketchFillet SketchSplit SketchTrim
                 SketchConstraintCoincidence
                 SketchConstraintMirror SketchConstraintAngle
                 SketchMultiRotation SketchMultiTranslation
         </sketch_shape_selector>
         <!--<validator id="PartSet_FilletSelection"/>-->
       </feature>
-      <!--  SketchConstraintSplit  -->
-      <feature id="SketchConstraintSplit" title="Split"
+      <!--  SketchSplit  -->
+      <feature id="SketchSplit" title="Split"
                tooltip="Cut selected segment arc or circle on existing coincident points"
                icon="icons/Sketch/split.png">
-        <sketch_sub_shape_selector
-            id="ConstraintValue"
+        <sketch_feature_point_selector
+            id="SelectedObject"
+            selection_attributes="SelectedObject SelectedPoint PreviewObject PreviewPoint"
             label="Segment"
             tooltip="Select segment for split"
             shape_types="edge"
-            use_external="false"
-            use_graphic_intersection="false">
+            use_external="false">
           <validator id="SketchPlugin_SplitValidator"/>
-        </sketch_sub_shape_selector>
+        </sketch_feature_point_selector>
         <validator id="PartSet_SplitSelection"/>
       </feature>
       <!--  SketchTrim  -->
                icon="icons/Sketch/trim.png">
         <sketch_feature_point_selector
             id="SelectedObject"
+            selection_attributes="SelectedObject SelectedPoint PreviewObject PreviewPoint"
             label="Segment"
             tooltip="Select segment for trim"
             shape_types="edge"
-            use_external="false"
-            use_graphic_intersection="true">
+            use_external="false">
           <validator id="SketchPlugin_TrimValidator"/>
         </sketch_feature_point_selector>
         <validator id="PartSet_SplitSelection"/>