]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #2027 Sketcher Trim Feature: split shapes by highlighted point is moved from... BR_Sketcher_Trim_Feature
authornds <nds@opencascade.com>
Thu, 9 Mar 2017 12:21:23 +0000 (15:21 +0300)
committernds <nds@opencascade.com>
Thu, 9 Mar 2017 12:21:23 +0000 (15:21 +0300)
Trim Line/Arc features.

src/SketchPlugin/SketchPlugin_Trim.cpp
src/SketchPlugin/SketchPlugin_Trim.h
src/SketchPlugin/plugin-Sketch.xml

index df4b238c1ba503c5f63e3b1c6d2380ee694bfafa..ac0630cfd2d0cb4289340ed521df752cba5d8390 100644 (file)
 #include <SketchPlugin_Circle.h>
 #include <SketchPlugin_ConstraintCoincidence.h>
 #include <SketchPlugin_ConstraintEqual.h>
-#include <SketchPlugin_ConstraintParallel.h>
+//#include <SketchPlugin_ConstraintParallel.h>
 #include <SketchPlugin_ConstraintTangent.h>
 #include <SketchPlugin_ConstraintLength.h>
 #include <SketchPlugin_ConstraintMirror.h>
+#include <SketchPlugin_ConstraintCollinear.h>
 #include <SketchPlugin_Line.h>
 #include <SketchPlugin_MultiRotation.h>
 #include <SketchPlugin_MultiTranslation.h>
 #include <iostream>
 #endif
 
-//#define DEBUG_SPLIT
-#ifdef DEBUG_SPLIT
-#include <iostream>
-#endif
-
-//static const double PI = 3.141592653589793238463;
+static const double PI = 3.141592653589793238463;
 
 static const std::string OPERATION_HIGHLIGHT_COLOR() { return "128, 0, 0"; }
 
@@ -68,23 +64,9 @@ SketchPlugin_Trim::SketchPlugin_Trim()
 void SketchPlugin_Trim::initAttributes()
 {
   data()->addAttribute(SketchPlugin_Trim::BASE_OBJECT(), ModelAPI_AttributeReference::typeId());
-  //data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
-  //data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
   data()->addAttribute(ENTITY_POINT(), GeomDataAPI_Point2D::typeId());
-  //data()->addAttribute(ENTITY_B_POINT(), GeomDataAPI_Point2D::typeId());
 }
 
-//FeaturePtr SketchPlugin_Trim::createCoincidenceConstraint(const AttributePtr& theFirstAttribute,
-//                                                          const AttributePtr& theSecondAttribute)
-//{
-//  FeaturePtr aConstraint = sketch()->addFeature(SketchPlugin_ConstraintCoincidence::ID());
-//
-//  fillAttribute(aConstraint->attribute(SketchPlugin_Constraint::ENTITY_A()), theFirstAttribute);
-//  fillAttribute(aConstraint->attribute(SketchPlugin_Constraint::ENTITY_B()), theSecondAttribute);
-//
-//  return aConstraint;
-//}
-
 void SketchPlugin_Trim::findShapePoints(std::shared_ptr<GeomAPI_Pnt>& aStartPoint,
                                         std::shared_ptr<GeomAPI_Pnt>& aLastPoint)
 {
@@ -135,7 +117,6 @@ std::shared_ptr<GeomAPI_Pnt2d> SketchPlugin_Trim::convertPoint(
   AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
                                             data()->attribute(SketchPlugin_Trim::BASE_OBJECT()));
   ObjectPtr aBaseObject = aBaseObjectAttr->value();
-  //std::map<ObjectPtr, PointToRefsMap> myObjectToPoints;
   if (myObjectToPoints.find(aBaseObject) == myObjectToPoints.end())
     return aPoint;
 
@@ -158,27 +139,17 @@ std::shared_ptr<GeomAPI_Pnt2d> SketchPlugin_Trim::convertPoint(
       }
     }
   }
-  if (!aFound)
-    return aPoint;
-  //if (aRefsMap.find(thePoint) == aRefsMap.end())
-  //  return aPoint;
-
-  //const std::pair<std::list<AttributePoint2DPtr >,
-  //         std::list<ObjectPtr > >& anInfo = aRefsMap.at(thePoint);
-
-  //const std::list<AttributePoint2DPtr >& anAttributes = anInfo.first;
-  //if (!anAttributes.empty())
-  //  aPoint = anAttributes.front()->pnt();
-  //else {
-  //  std::shared_ptr<GeomAPI_Pln> aPlane = sketch()->plane();
-  //  aPoint = thePoint->to2D(aPlane);
-  //}
+  if (!aFound) {
+    // returns an end of the shape to define direction of split if feature's attribute participates
+    std::shared_ptr<GeomAPI_Pln> aPlane = sketch()->plane();
+    aPoint = thePoint->to2D(aPlane);
+  }
   return aPoint;
 }
 
 void SketchPlugin_Trim::execute()
 {
-#ifdef DEBUG_SPLIT
+#ifdef DEBUG_TRIM
   std::cout << "SketchPlugin_Trim::execute" << std::endl;
 #endif
 
@@ -198,31 +169,15 @@ void SketchPlugin_Trim::execute()
     return;
   FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
 
-//#ifdef DEBUG_TRIM
-//  const PointToRefsMap& aRefsMap = myObjectToPoints.at(aBaseObject);
-//#endif
   /// points of trim
-  //std::map<std::shared_ptr<GeomAPI_Pnt2d>, std::shared_ptr<GeomAPI_Pnt> > aPntMap;
-
   std::shared_ptr<GeomAPI_Pnt> aStartShapePoint, aLastShapePoint;
   findShapePoints(aStartShapePoint, aLastShapePoint);
   std::shared_ptr<GeomAPI_Pnt2d> aStartShapePoint2d = convertPoint(aStartShapePoint);
-  //aPntMap[aStartShapePoint2d] = aStartShapePoint;
 
   std::shared_ptr<GeomAPI_Pnt2d> aLastShapePoint2d = convertPoint(aLastShapePoint);
-  //aPntMap[aLastShapePoint2d] = aLastShapePoint;
-
-  /*AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase;
-  getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase);
-  if (!aStartPointAttrOfBase.get() && !anEndPointAttrOfBase.get()) {
-    setError("Error: Feature has no start and end points.");
-    return;
-  }*/
 
   std::set<FeaturePtr> aFeaturesToDelete, aFeaturesToUpdate;
-  //std::map<FeaturePtr, IdToPointPair> aTangentFeatures;
-  //std::map<FeaturePtr, IdToPointPair> aCoincidenceToFeature;
-  getConstraints(aFeaturesToDelete, aFeaturesToUpdate);//, aTangentFeatures, aCoincidenceToFeature);
+  getConstraints(aFeaturesToDelete, aFeaturesToUpdate);
 
   std::map<AttributePtr, std::list<AttributePtr> > aBaseRefAttributes;
   std::list<AttributePtr> aRefsToFeature;
@@ -237,14 +192,17 @@ void SketchPlugin_Trim::execute()
                aFurtherCoincidences, aCreatedFeatures, aModifiedAttributes);
     updateRefFeatureConstraints(getFeatureResult(aBaseFeature), aRefsToFeature);
 
-    //AttributePtr aCenterAttr = aBaseFeature->attribute(SketchPlugin_Circle::CENTER_ID());
     aFeaturesToDelete.insert(aBaseFeature);
     // as circle is removed, temporary fill this attribute
     aBaseObjectAttr->setObject(ResultPtr());
   }
   else if (aKind == SketchPlugin_Line::ID()) {
+    trimLine(aStartShapePoint2d, aLastShapePoint2d,
+             aFurtherCoincidences, aCreatedFeatures, aModifiedAttributes);
   }
   else if (aKind == SketchPlugin_Arc::ID()) {
+    trimArc(aStartShapePoint2d, aLastShapePoint2d,
+            aFurtherCoincidences, aCreatedFeatures, aModifiedAttributes);
   }
 
   // coincidence to result points
@@ -256,11 +214,12 @@ void SketchPlugin_Trim::execute()
     std::shared_ptr<GeomAPI_Pnt2d> aPoint2d = aPointAttribute->pnt();
 
     std::shared_ptr<GeomAPI_Pnt> aPoint;
-    if (aPoint2d->isEqual(aStartShapePoint2d))
+    if (aStartShapePoint2d.get() && aPoint2d->isEqual(aStartShapePoint2d))
       aPoint = aStartShapePoint;
-    else if (aPoint2d->isEqual(aLastShapePoint2d))
+    else if (aLastShapePoint2d.get() && aPoint2d->isEqual(aLastShapePoint2d))
       aPoint = aLastShapePoint;
-    else
+
+    if (!aPoint.get())
       continue;
 
     std::pair<std::list<AttributePoint2DPtr >, std::list<ObjectPtr > > anInfo;
@@ -285,299 +244,33 @@ void SketchPlugin_Trim::execute()
     }
   }
 
-  /*AttributePoint2DPtr anAPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-          aData->attribute(ENTITY_A_POINT()));
-  std::shared_ptr<GeomAPI_Pnt2d> anAttributeStartPnt2d = anAPoint->pnt();
-
-  AttributePoint2DPtr aBPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-          aData->attribute(ENTITY_B_POINT()));
-  std::shared_ptr<GeomAPI_Pnt2d> anAttributeEndPnt2d = aBPoint->pnt();
-
-
-  AttributeRefAttrPtr anARefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-                        aData->attribute(SketchPlugin_Constraint::ENTITY_A()));
-  AttributeRefAttrPtr aBRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-                        aData->attribute(SketchPlugin_Constraint::ENTITY_B()));*/
-
-  //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());
-
-  std::set<AttributePoint2DPtr > aNewCoincidencesToSplitFeature;
-  AttributePoint2DPtr aFeatureStartPointAttr, aFeatureEndPointAttr;
-  getFeaturePoints(aBaseFeature, aFeatureStartPointAttr, aFeatureEndPointAttr);
-
-  if (aFeatureStartPointAttr.get() && aFeatureStartPointAttr.get()) { // line or arc
-    AttributePoint2DPtr aStartPointAttribute =
-                               std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                               aFeatureStartPointAttr);
-    std::shared_ptr<GeomAPI_Pnt2d> aFeatureStartPnt2d = aStartPointAttribute->pnt();
-    AttributePoint2DPtr anEndPointAttribute =
-                               std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                               aFeatureEndPointAttr);
-    std::shared_ptr<GeomAPI_Pnt2d> aFeatureEndPnt2d = anEndPointAttribute->pnt();
-    if (anAttributeStartPnt2d->isEqual(aFeatureStartPnt2d)) {
-      double anX = aFeatureStartPnt2d->x();
-      double anY = aFeatureStartPnt2d->y();
-      double anEndX = anAttributeEndPnt2d->x();
-      double anEndY = anAttributeEndPnt2d->y();
-      aStartPointAttribute->setValue(anAttributeEndPnt2d->x(), anAttributeEndPnt2d->y());
-
-      createCoincidenceConstraint(aStartPointAttribute, aBRefAttr);
-    }
-  }
-  else { // circle
-
-  }*/
-
-  //  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_Trim::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;
-//      AttributePoint2DPtr 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;
-//    }
-//  }
-//
-//  if (!aTangentFeatures.empty()) {
-//    std::cout << std::endl;
-//    std::cout << "Tangencies to base feature[" << aTangentFeatures.size() << "]: " << std::endl;
-//    std::map<FeaturePtr, IdToPointPair>::const_iterator anIt = aTangentFeatures.begin(),
-//                                                        aLast = aTangentFeatures.end();
-//    for (int i = 1; anIt != aLast; anIt++, i++) {
-//      FeaturePtr aFeature = (*anIt).first;
-//      std::string anAttributeId = (*anIt).second.first;
-//      AttributePoint2DPtr 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() + ") ");
-//    }
-//    AttributePoint2DPtr 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);
-//  // tangency
-//  updateTangentConstraintsToFeature(aTangentFeatures, aFurtherCoincidences);
-//
-  updateRefAttConstraints(aBaseRefAttributes, aModifiedAttributes);
+  updateRefAttConstraints(aBaseRefAttributes, aModifiedAttributes, aFeaturesToDelete);
 
   // delete constraints
-#ifdef DEBUG_SPLIT
+#ifdef DEBUG_TRIM
   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;
+    //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
-
-#ifdef DEBUG_SPLIT
+#ifdef DEBUG_TRIM
   std::cout << "SketchPlugin_Trim::done" << std::endl;
 #endif
 }
@@ -630,109 +323,22 @@ AISObjectPtr SketchPlugin_Trim::getAISObject(AISObjectPtr thePrevious)
           double aWidth = SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH();
           int aLineStyle = SketchPlugin_SketchEntity::SKETCH_LINE_STYLE();
           if (isConstruction) {
-            //aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color",
-            //                                   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",
-          //                                      SKETCH_ENTITY_COLOR);
-          //}
           anAIS->setColor(aColor[0], aColor[1], aColor[2]);
+           // modification of width should be replaced to value 1 after highlight problem is fixed
           anAIS->setWidth(aWidth + 2);//1);
           anAIS->setLineStyle(aLineStyle);
           break;
         }
-        //XGUI_Tools::workshop(myWorkshop)->displayer()->clearSelected(false);
-        //if (myCurrentSubShape->object() != anObject ||
-        //    myCurrentSubShape->shape() != aBaseShape) {
-        //  myCurrentSubShape->setObject(anObject);
-        //  myCurrentSubShape->setShape(aBaseShape);
-        //}
       }
     }
   }
 
-  /*
-  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(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",
-                                           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",
-                                            SKETCH_ENTITY_COLOR);
-      }
-      anAIS->setColor(aColor[0], aColor[1], aColor[2]);
-      anAIS->setWidth(aWidth + 1);
-      anAIS->setLineStyle(aLineStyle);
-    }
-    return anAIS;
-  }*/
   return anAIS;
 }
 
-//AttributePoint2DPtr SketchPlugin_Trim::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_Trim::getFeaturePoints(const FeaturePtr& theFeature,
                                          AttributePoint2DPtr& theStartPointAttr,
                                          AttributePoint2DPtr& theEndPointAttr)
@@ -756,10 +362,7 @@ void SketchPlugin_Trim::getFeaturePoints(const FeaturePtr& theFeature,
 }
 
 void SketchPlugin_Trim::getConstraints(std::set<FeaturePtr>& theFeaturesToDelete,
-                                      std::set<FeaturePtr>& theFeaturesToUpdate//,
-                                      //std::map<FeaturePtr, IdToPointPair>& theTangentFeatures,
-                                      //std::map<FeaturePtr, IdToPointPair>& theCoincidenceToFeature
-                                      )
+                                      std::set<FeaturePtr>& theFeaturesToUpdate)
 {
   std::shared_ptr<ModelAPI_Data> aData = data();
 
@@ -824,56 +427,6 @@ void SketchPlugin_Trim::getConstraints(std::set<FeaturePtr>& theFeaturesToDelete
           theFeaturesToDelete.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);
-    }*/
   }
 }
 
@@ -923,121 +476,6 @@ void SketchPlugin_Trim::getRefAttributes(const FeaturePtr& theFeature,
   }
 }
 
-//void SketchPlugin_Trim::updateCoincidenceConstraintsToFeature(
-//      const std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theCoincidenceToFeature,
-//      const std::set<AttributePoint2DPtr >& 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<AttributePoint2DPtr > 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_Trim::updateTangentConstraintsToFeature(
-//      const std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theTangentFeatures,
-//      const std::set<AttributePoint2DPtr >& theFurtherCoincidences)
-//{
-//  if (theTangentFeatures.empty())
-//    return;
-//
-//  std::map<FeaturePtr, IdToPointPair>::const_iterator aTIt = theTangentFeatures.begin(),
-//                                                      aTLast = theTangentFeatures.end();
-//#ifdef DEBUG_SPLIT
-//  std::cout << std::endl;
-//  std::cout << "Tangencies to feature(modified):"<< std::endl;
-//#endif
-//  for (; aTIt != aTLast; aTIt++) {
-//    FeaturePtr aTangentFeature = aTIt->first;
-//    std::string anAttributeId = aTIt->second.first;
-//    AttributePoint2DPtr aTangentPoint = aTIt->second.second;
-//    std::set<AttributePoint2DPtr>::const_iterator aFCIt = theFurtherCoincidences.begin(),
-//                                                  aFCLast = theFurtherCoincidences.end();
-//    std::shared_ptr<GeomAPI_Pnt2d> aCoincPnt = aTangentPoint->pnt();
-//    AttributePoint2DPtr aFeaturePointAttribute;
-//    /// here we rely on created coincidence between further coincidence point and tangent result
-//    for (; aFCIt != aFCLast && !aFeaturePointAttribute.get(); aFCIt++) {
-//      AttributePoint2DPtr aFCAttribute = *aFCIt;
-//      if (aCoincPnt->isEqual(aFCAttribute->pnt()))
-//        aFeaturePointAttribute = aFCAttribute;
-//    }
-//    if (aFeaturePointAttribute.get()) {
-//      FeaturePtr aFeature =
-//        std::dynamic_pointer_cast<ModelAPI_Feature>(aFeaturePointAttribute->owner());
-//      aTangentFeature->refattr(anAttributeId)->setObject(getFeatureResult(aFeature));
-//    }
-//#ifdef DEBUG_SPLIT
-//  std::cout << " -" << getFeatureInfo(aTangentFeature) << std::endl;
-//#endif
-//  }
-//}
-
 void SketchPlugin_Trim::updateRefFeatureConstraints(
                                                   const ResultPtr& theFeatureBaseResult,
                                                   const std::list<AttributePtr>& theRefsToFeature)
@@ -1053,9 +491,10 @@ void SketchPlugin_Trim::updateRefFeatureConstraints(
 
 void SketchPlugin_Trim::updateRefAttConstraints(
                     const std::map<AttributePtr, std::list<AttributePtr> >& theBaseRefAttributes,
-                    const std::set<std::pair<AttributePtr, AttributePtr> >& theModifiedAttributes)
+                    const std::set<std::pair<AttributePtr, AttributePtr> >& theModifiedAttributes,
+                    std::set<FeaturePtr>& theFeaturesToDelete)
 {
-#ifdef DEBUG_SPLIT
+#ifdef DEBUG_TRIM
   std::cout << "SketchPlugin_Trim::updateRefAttConstraints" << std::endl;
 #endif
 
@@ -1075,298 +514,188 @@ void SketchPlugin_Trim::updateRefAttConstraints(
     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;
+        if (aNewAttribute.get())
+          aRefAttr->setAttr(aNewAttribute);
+        else
+          theFeaturesToDelete.insert(ModelAPI_Feature::feature(aRefAttr->owner()));
+#ifdef DEBUG_TRIM
+        //FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttr->owner());
+        //std::cout << " -" << getFeatureInfo(aFeature) << std::endl;
 #endif
       }
     }
   }
 }
 
-//void SketchPlugin_Trim::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_Trim::BASE_OBJECT()));
-//  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())));
-//
-//  // 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);
-//  }
-//}
-//
-//void SketchPlugin_Trim::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_Trim::BASE_OBJECT()));
-//  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;
-//  }
-//
-//  // manually change type of arc to avoid incorrect self-constrainting of the tangent arc
-//  aBaseFeature->string(SketchPlugin_Arc::ARC_TYPE())->setValue(
-//      SketchPlugin_Arc::ARC_TYPE_CENTER_START_END());
-//
-//  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
-//  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);
-//  }
-//}
+void SketchPlugin_Trim::trimLine(const std::shared_ptr<GeomAPI_Pnt2d>& theStartShapePoint,
+                                 const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
+                                 std::set<AttributePoint2DPtr>& thePoints,
+                                 std::set<FeaturePtr>& theCreatedFeatures,
+                  std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes)
+{
+  // Check the base objects are initialized.
+  AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
+                                            data()->attribute(SketchPlugin_Trim::BASE_OBJECT()));
+  ObjectPtr aBaseObject = aBaseObjectAttr->value();
+  FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
+
+  /// points of trim
+  AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase;
+  getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase);
+
+  std::shared_ptr<GeomAPI_Pnt2d> aStartFeaturePoint = aStartPointAttrOfBase->pnt();
+  std::shared_ptr<GeomAPI_Pnt2d> aLastFeaturePoint = anEndPointAttrOfBase->pnt();
+
+  std::shared_ptr<GeomAPI_Pnt2d> aStartShapePoint = theStartShapePoint;
+  std::shared_ptr<GeomAPI_Pnt2d> aLastShapePoint = theLastShapePoint;
+  arrangePointsOnLine(aStartPointAttrOfBase, anEndPointAttrOfBase,
+                      aStartShapePoint, aLastShapePoint);
+#ifdef DEBUG_TRIM
+  std::cout << "Arranged points (to build split between 1st and 2nd points:" << std::endl;
+  if (aStartShapePoint.get())
+    std::cout << "Start point: [" << aStartShapePoint->x() << ", " <<
+                                       aStartShapePoint->y() << "]" << std::endl;
+  std::cout << "1st point:   [" << aStartFeaturePoint->x() << ", " <<
+                                   aStartFeaturePoint->y() << "]" << std::endl;
+  if (aLastShapePoint.get())
+    std::cout << "2st point:   [" << aLastShapePoint->x() << ", " <<
+                                     aLastShapePoint->y() << "]" << std::endl;
+  std::cout << "End point:   [" << aLastFeaturePoint->x() << ", " <<
+                                   aLastFeaturePoint->y() << "]" << std::endl;
+#endif
+
+  bool isStartPoint = !aStartShapePoint.get() || aStartFeaturePoint->isEqual(aStartShapePoint);
+  bool isLastPoint = !aLastShapePoint.get() || aLastFeaturePoint->isEqual(aLastShapePoint);
+  if (isStartPoint || isLastPoint) {
+    // result is one line: changed existing line
+    std::string aModifiedAttribute = isStartPoint ? SketchPlugin_Line::START_ID()
+                                                  : SketchPlugin_Line::END_ID();
+    std::shared_ptr<GeomAPI_Pnt2d> aPoint;
+    if (aStartShapePoint.get() && aLastShapePoint.get())
+      aPoint = isStartPoint ? aLastShapePoint : aStartShapePoint;
+    else
+      aPoint = aStartShapePoint.get() ? aStartShapePoint : aLastShapePoint;
+
+    fillPointAttribute(aBaseFeature->attribute(aModifiedAttribute), aPoint);
+    theModifiedAttributes.insert(
+      std::make_pair(aBaseFeature->attribute(aModifiedAttribute), AttributePtr()));
+
+    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
+                               (aBaseFeature->attribute(aModifiedAttribute)));
+  }
+  else {
+    // result is two lines: start line point - start shape point, last shape point - last line point
+    // create second line
+    FeaturePtr anNewFeature = createLineFeature(aBaseFeature, aLastShapePoint, aLastFeaturePoint);
+    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
+                               (anNewFeature->attribute(SketchPlugin_Line::START_ID())));
+
+    std::string aModifiedAttribute = SketchPlugin_Line::END_ID();
+    theModifiedAttributes.insert(
+      std::make_pair(aBaseFeature->attribute(aModifiedAttribute),
+                                   anNewFeature->attribute(SketchPlugin_Line::END_ID())));
+
+    // modify base arc
+    fillPointAttribute(aBaseFeature->attribute(aModifiedAttribute), aStartShapePoint);
+
+    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
+                               (aBaseFeature->attribute(aModifiedAttribute)));
+
+    // Collinear constraint for lines
+    createConstraintForObjects(SketchPlugin_ConstraintCollinear::ID(),
+                               getFeatureResult(aBaseFeature),
+                               getFeatureResult(anNewFeature));
+
+  }
+}
+
+void SketchPlugin_Trim::trimArc(const std::shared_ptr<GeomAPI_Pnt2d>& theStartShapePoint,
+                                const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
+                                std::set<AttributePoint2DPtr>& thePoints,
+                                std::set<FeaturePtr>& theCreatedFeatures,
+                 std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes)
+{
+  // Check the base objects are initialized.
+  AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
+                                            data()->attribute(SketchPlugin_Trim::BASE_OBJECT()));
+  ObjectPtr aBaseObject = aBaseObjectAttr->value();
+  FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
+
+  /// points of trim
+  AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase;
+  getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase);
+
+  std::shared_ptr<GeomAPI_Pnt2d> aStartArcPoint = aStartPointAttrOfBase->pnt();
+  std::shared_ptr<GeomAPI_Pnt2d> aLastArcPoint = anEndPointAttrOfBase->pnt();
+
+  std::shared_ptr<GeomAPI_Pnt2d> aStartShapePoint = theStartShapePoint;
+  std::shared_ptr<GeomAPI_Pnt2d> aLastShapePoint = theLastShapePoint;
+  arrangePointsOnArc(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase,
+                     aStartShapePoint, aLastShapePoint);
+#ifdef DEBUG_TRIM
+  std::cout << "Arranged points (to build split between 1st and 2nd points:" << std::endl;
+  if (aStartShapePoint.get())
+    std::cout << "Start point: [" << aStartShapePoint->x() << ", " <<
+                                       aStartShapePoint->y() << "]" << std::endl;
+  std::cout << "1st point:   [" << aStartArcPoint->x() << ", " <<
+                                   aStartArcPoint->y() << "]" << std::endl;
+  if (aLastShapePoint.get())
+    std::cout << "2st point:   [" << aLastShapePoint->x() << ", " <<
+                                     aLastShapePoint->y() << "]" << std::endl;
+  std::cout << "End point:   [" << aLastArcPoint->x() << ", " <<
+                                   aLastArcPoint->y() << "]" << std::endl;
+#endif
+
+  bool isStartPoint = !aStartShapePoint.get() || aStartArcPoint->isEqual(aStartShapePoint);
+  bool isLastPoint = !aLastShapePoint.get() || aLastArcPoint->isEqual(aLastShapePoint);
+  if (isStartPoint || isLastPoint) {
+    // result is one arc: changed existing arc
+    std::string aModifiedAttribute = isStartPoint ? SketchPlugin_Arc::START_ID()
+                                                  : SketchPlugin_Arc::END_ID();
+    std::shared_ptr<GeomAPI_Pnt2d> aPoint;
+    if (aStartShapePoint.get() && aLastShapePoint.get())
+      aPoint = isStartPoint ? aLastShapePoint : aStartShapePoint;
+    else
+      aPoint = aStartShapePoint.get() ? aStartShapePoint : aLastShapePoint;
+
+    fillPointAttribute(aBaseFeature->attribute(aModifiedAttribute), aPoint);
+    theModifiedAttributes.insert(
+      std::make_pair(aBaseFeature->attribute(aModifiedAttribute), AttributePtr()));
+
+    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
+                               (aBaseFeature->attribute(aModifiedAttribute)));
+  }
+  else {
+    // result is two arcs: start arc point - start shape point, last shape point - last arc point
+    // create second arc
+    FeaturePtr anArcFeature = createArcFeature(aBaseFeature, aLastShapePoint, aLastArcPoint);
+    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
+                               (anArcFeature->attribute(SketchPlugin_Arc::START_ID())));
+
+    std::string aModifiedAttribute = SketchPlugin_Arc::END_ID();
+    theModifiedAttributes.insert(
+      std::make_pair(aBaseFeature->attribute(aModifiedAttribute),
+                                   anArcFeature->attribute(SketchPlugin_Arc::END_ID())));
+
+    // modify base arc
+    fillPointAttribute(aBaseFeature->attribute(aModifiedAttribute), aStartShapePoint);
+
+    thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
+                               (aBaseFeature->attribute(aModifiedAttribute)));
+
+    // equal Radius constraint for arcs
+    createConstraintForObjects(SketchPlugin_ConstraintEqual::ID(),
+                               getFeatureResult(aBaseFeature),
+                               getFeatureResult(anArcFeature));
+    // coincident centers constraint
+    createConstraint(SketchPlugin_ConstraintCoincidence::ID(),
+                     aBaseFeature->attribute(SketchPlugin_Arc::CENTER_ID()),
+                     anArcFeature->attribute(SketchPlugin_Arc::CENTER_ID()));
+  }
+}
 
 void SketchPlugin_Trim::trimCircle(const std::shared_ptr<GeomAPI_Pnt2d>& theStartShapePoint,
                                    const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
-                                   /*FeaturePtr& theSplitFeature,
-                                   FeaturePtr& theBaseFeatureModified,
-                                   FeaturePtr& theAfterFeature,*/
                                    std::set<AttributePoint2DPtr>& thePoints,
                                    std::set<FeaturePtr>& theCreatedFeatures,
                  std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes)
@@ -1378,117 +707,77 @@ void SketchPlugin_Trim::trimCircle(const std::shared_ptr<GeomAPI_Pnt2d>& theStar
   FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
 
   /// points of trim
-  //std::shared_ptr<GeomAPI_Pnt> aStartShapePoint, aLastShapePoint;
-  //findShapePoints(aStartShapePoint, aLastShapePoint);
-  //std::shared_ptr<GeomAPI_Pnt2d> aStartShapePoint2d = convertPoint(aStartShapePoint);
-  //std::shared_ptr<GeomAPI_Pnt2d> aLastShapePoint2d = convertPoint(aLastShapePoint);
   AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase;
   getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase);
 
-  //std::set<FeaturePtr> aCreatedFeatures;
-  //FeaturePtr aConstraintFeature;
-  //theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature
-
-  SketchPlugin_Sketch* aSketch = sketch();
-  //if (!aSketch)
-  //  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 =*/
+  /// trim feature
   FeaturePtr anArcFeature = createArcFeature(aBaseFeature, theStartShapePoint, theLastShapePoint);
-  //std::dynamic_pointer_cast<SketchPlugin_Arc>(
-  //  theBaseFeatureModified)->setReversed(!aSplitReversed);
-  //theBaseFeatureModified->execute();
 
   theModifiedAttributes.insert(
     std::make_pair(aBaseFeature->attribute(SketchPlugin_Circle::CENTER_ID()),
                    anArcFeature->attribute(SketchPlugin_Arc::CENTER_ID())));
 
-  //theCreatedFeatures.insert(theBaseFeatureModified);
-
   thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
                              (anArcFeature->attribute(SketchPlugin_Arc::START_ID())));
   thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
                              (anArcFeature->attribute(SketchPlugin_Arc::END_ID())));
+}
+
+void SketchPlugin_Trim::arrangePointsOnLine(const AttributePoint2DPtr& theStartPointAttr,
+                                            const AttributePoint2DPtr& theEndPointAttr,
+                                            std::shared_ptr<GeomAPI_Pnt2d>& theFirstPoint,
+                                            std::shared_ptr<GeomAPI_Pnt2d>& theLastPoint) const
+{
+  if (!theFirstPoint.get() || !theLastPoint.get())
+    return;
 
-  // 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);
-
-  aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(),
-                                                       getFeatureResult(theSplitFeature),
-                                                       getFeatureResult(theBaseFeatureModified));
-  theCreatedFeatures.insert(aConstraintFeature);*/
+  // if first point is closer to last point, swap first and last values
+  if (theStartPointAttr->pnt()->distance(theFirstPoint) >
+      theStartPointAttr->pnt()->distance(theLastPoint)) {
+    std::shared_ptr<GeomAPI_Pnt2d> aTmpPoint = theFirstPoint;
+    theFirstPoint = theLastPoint;
+    theLastPoint = aTmpPoint;
+  }
 }
 
-//void SketchPlugin_Trim::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_Trim::arrangePointsOnArc(
-//    const FeaturePtr& theArc,
-//    const AttributePoint2DPtr& theStartPointAttr,
-//    const AttributePoint2DPtr& theEndPointAttr,
-//    AttributePoint2DPtr& theFirstPointAttr,
-//    AttributePoint2DPtr& 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::INVERSED_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_Trim::arrangePointsOnArc(const FeaturePtr& theArc,
+                                  const AttributePoint2DPtr& theStartPointAttr,
+                                  const AttributePoint2DPtr& theEndPointAttr,
+                                  std::shared_ptr<GeomAPI_Pnt2d>& theFirstPoint,
+                                  std::shared_ptr<GeomAPI_Pnt2d>& theSecondPoint) const
+{
+  if (!theFirstPoint.get() || !theSecondPoint.get())
+    return;
+
+  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::INVERSED_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(theFirstPoint->xy()->decreased(aCenter->xy())));
+  std::shared_ptr<GeomAPI_Dir2d> aSecondPtDir(
+      new GeomAPI_Dir2d(theSecondPoint->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)) {
+    std::shared_ptr<GeomAPI_Pnt2d> aTmpPoint = theFirstPoint;
+    theFirstPoint = theSecondPoint;
+    theSecondPoint = aTmpPoint;
+  }
+}
 
 void SketchPlugin_Trim::fillPointAttribute(const AttributePtr& theModifiedAttribute,
                                            const std::shared_ptr<GeomAPI_Pnt2d>& thePoint)
@@ -1544,28 +833,28 @@ void SketchPlugin_Trim::fillAttribute(const AttributePtr& theModifiedAttribute,
   }
 }
 
-//FeaturePtr SketchPlugin_Trim::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_Trim::createLineFeature(const FeaturePtr& theBaseFeature,
+                                        const std::shared_ptr<GeomAPI_Pnt2d>& theFirstPoint,
+                                        const std::shared_ptr<GeomAPI_Pnt2d>& theSecondPoint)
+{
+  FeaturePtr aFeature;
+  SketchPlugin_Sketch* aSketch = sketch();
+  if (!aSketch || !theBaseFeature.get())
+    return aFeature;
+
+  aFeature = aSketch->addFeature(SketchPlugin_Line::ID());
+
+  fillPointAttribute(aFeature->attribute(SketchPlugin_Line::START_ID()), theFirstPoint);
+  fillPointAttribute(aFeature->attribute(SketchPlugin_Line::END_ID()), theSecondPoint);
+
+  fillAttribute(aFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()),
+                theBaseFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()));
+
+  aFeature->execute(); // to obtain result
+
+  return aFeature;
+}
+
 
 FeaturePtr SketchPlugin_Trim::createArcFeature(const FeaturePtr& theBaseFeature,
                                                const std::shared_ptr<GeomAPI_Pnt2d>& theFirstPoint,
@@ -1659,45 +948,22 @@ FeaturePtr SketchPlugin_Trim::createConstraint(const std::string& theConstraintI
   return aConstraint;
 }
 
-  //
-//FeaturePtr SketchPlugin_Trim::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_Trim::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_Trim::BASE_OBJECT()));
-//        double aValue;
-//        if (aLenghtFeature->computeLenghtValue(aValue) && aValueAttr.get())
-//          aValueAttr->setValue(aValue);
-//      }
-//    }
-//  }
-//}
+FeaturePtr SketchPlugin_Trim::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;
+}
 
 std::shared_ptr<ModelAPI_Result> SketchPlugin_Trim::getFeatureResult(
                                     const std::shared_ptr<ModelAPI_Feature>& theFeature)
@@ -1715,89 +981,6 @@ std::shared_ptr<ModelAPI_Result> SketchPlugin_Trim::getFeatureResult(
   return aResult;
 }
 
-//std::set<std::shared_ptr<ModelAPI_Attribute> > SketchPlugin_Trim::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_Trim::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
-
 //********************************************************************
 bool SketchPlugin_Trim::useGraphicIntersection() const
 {
@@ -1810,7 +993,6 @@ void SketchPlugin_Trim::fillObjectShapes(const ObjectPtr& theObject)
   PointToRefsMap aPointsInfo;
 
   std::set<std::shared_ptr<GeomAPI_Shape> > aShapes;
-  //std::map<AttributePoint2DPtr, std::shared_ptr<GeomAPI_Pnt> > aPointToAttributes;
   std::map<std::shared_ptr<GeomAPI_Pnt>,
                            std::list< AttributePoint2DPtr > > aPointToAttributes;
   std::map<std::shared_ptr<GeomAPI_Pnt>,
@@ -1826,12 +1008,9 @@ void SketchPlugin_Trim::fillObjectShapes(const ObjectPtr& theObject)
     GeomShapePtr aFeatureShape = (*anEdgeShapes.begin())->shape();
 
     // coincidences to the feature
-    //std::list<std::shared_ptr<GeomAPI_Pnt> > aPoints;
-
     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();
     SketchPlugin_Sketch* aSketch = sketch();
     std::shared_ptr<ModelAPI_Data> aData = aSketch->data();
     std::shared_ptr<GeomDataAPI_Point> aC = std::dynamic_pointer_cast<GeomDataAPI_Point>(
@@ -1843,7 +1022,7 @@ void SketchPlugin_Trim::fillObjectShapes(const ObjectPtr& theObject)
     std::shared_ptr<GeomAPI_Dir> aY(new GeomAPI_Dir(aNorm->dir()->cross(aX->dir())));
 
     ModelGeomAlgo_Point2D::getPointsInsideShape(aFeatureShape, aRefAttributes, aC->pnt(),
-                                                aX->dir(), aY, aPointsInfo);//aPoints, aPointToAttributes);
+                                                aX->dir(), aY, aPointsInfo);
 
     // intersection points
     if (useGraphicIntersection()) {
@@ -1853,18 +1032,12 @@ void SketchPlugin_Trim::fillObjectShapes(const ObjectPtr& theObject)
         if (aFeature.get())
           aFeatures.push_back(aFeature);
       }
-      ModelGeomAlgo_Point2D::getPointsIntersectedShape(aFeature, aFeatures,// aPoints,
-                                                       aPointsInfo);
+      ModelGeomAlgo_Point2D::getPointsIntersectedShape(aFeature, aFeatures, aPointsInfo);
     }
     GeomAlgoAPI_ShapeTools::splitShape(aFeatureShape, aPointsInfo, aShapes);
-
   }
-
   myObjectToPoints[theObject] = aPointsInfo;
   myCashedShapes[theObject] = aShapes;
-  //myCashedReferences[theObject] = aPointToAttributes;
-  //if (useGraphicIntersection())
-  //  myCashedObjects[theObject] = aPointToObjects;
 }
 
 //********************************************************************
index a1e1387f7ada61121fb39acb1739570bf7c8d327..70bffe0a827a6d02a5e0aed7f4ce1d81157954ea 100644 (file)
@@ -19,33 +19,7 @@ typedef std::pair<std::string, std::shared_ptr<GeomDataAPI_Point2D> > IdToPointP
 
 /** \class SketchPlugin_Trim
  *  \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;
- *
+ *  \brief Feature for creation of a new constraint trimming object. Entities for split:
  */
 class SketchPlugin_Trim : public SketchPlugin_Feature, public GeomAPI_IPresentable
 {
@@ -76,12 +50,6 @@ class SketchPlugin_Trim : public SketchPlugin_Feature, public GeomAPI_IPresentab
     static const std::string MY_ENTITY_POINT("ConstraintEntityPoint");
     return MY_ENTITY_POINT;
   }
-  /// End 2D point of the split segment
-  /*inline static const std::string& ENTITY_B_POINT()
-  {
-    static const std::string MY_ENTITY_B_POINT("ConstraintEntityBPoint");
-    return MY_ENTITY_B_POINT;
-  }*/
 
   /// \brief Creates a new part document if needed
   SKETCHPLUGIN_EXPORT virtual void execute();
@@ -104,11 +72,6 @@ class SketchPlugin_Trim : public SketchPlugin_Feature, public GeomAPI_IPresentab
   /// \brief Use plugin manager for features creation
   SketchPlugin_Trim();
 
-  /// \return map of base points and features;
-  //SKETCHPLUGIN_EXPORT const std::map<AttributePtr, FilletFeatures> pointsFeaturesMap() const {
-  //  return myPointFeaturesMap;
-  //};
-
   /// Returns the AIS preview
   SKETCHPLUGIN_EXPORT virtual AISObjectPtr getAISObject(AISObjectPtr thePrevious);
 
@@ -125,26 +88,12 @@ private:
                         std::shared_ptr<GeomDataAPI_Point2D>& theStartPointAttr,
                         std::shared_ptr<GeomDataAPI_Point2D>& theEndPointAttr);
 
-//  FeaturePtr createCoincidenceConstraint(const AttributePtr& theFirstAttribute,
-//                                         const AttributePtr& theSecondAttribute);
-//
-//  /// 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>& theTangentFeatures,
-              //std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theCoincidenceToFeature/*,
-              //std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theCoincidenceToPoint*/);
+              std::set<std::shared_ptr<ModelAPI_Feature>>& theFeaturesToUpdate);
 
   /// Obtains references to feature point attributes and to feature,
   /// e.g. for feature line: 1st container is
@@ -157,25 +106,6 @@ private:
                         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 tangency constraint to the nearest split feature that has a coincidence to the tangent
-//  /// \param theTangentFeatures tangencies to feature to be connected to nearest feature
-//  /// \param theFurtherCoincidences a list of points where coincidences is built
-//  void updateTangentConstraintsToFeature(
-//              const std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theTangentFeatures,
-//              const std::set<std::shared_ptr<GeomDataAPI_Point2D> >& theFurtherCoincidences);
-
   /// Move constraints from base feature to given feature
   /// \param theFeature a base feature
   /// \param theRefsToFeature list of attributes referenced to base feature
@@ -188,7 +118,8 @@ private:
   /// at the same place
   void updateRefAttConstraints(
                const std::map<AttributePtr, std::list<AttributePtr> >& theBaseRefAttributes,
-               const std::set<std::pair<AttributePtr, AttributePtr> >& theModifiedAttributes);
+               const std::set<std::pair<AttributePtr, AttributePtr> >& theModifiedAttributes,
+               std::set<std::shared_ptr<ModelAPI_Feature>>& theFeaturesToDelete);
 
 //  /// Make the base object is splitted by the point attributes
 //  /// \param theSplitFeature a result split feature
@@ -198,25 +129,23 @@ private:
 //  /// \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);
+  void trimLine(const std::shared_ptr<GeomAPI_Pnt2d>& theStartShapePoint,
+                const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
+                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 trimArc(const std::shared_ptr<GeomAPI_Pnt2d>& theStartShapePoint,
+               const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
+               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
@@ -226,38 +155,35 @@ private:
   /// \param theCreatedFeatures a container of created features
   void trimCircle(const std::shared_ptr<GeomAPI_Pnt2d>& theStartShapePoint,
                   const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
-                  /*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
+  /// 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 theFirstPoint a start point of a segment
+  /// \param theSecondPoint 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;
+                           std::shared_ptr<GeomAPI_Pnt2d>& theFirstPoint,
+                           std::shared_ptr<GeomAPI_Pnt2d>& theSecondPoint) 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 theFirstPoint a start point of a segment
+  /// \param theSecondPoint 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<GeomAPI_Pnt2d>& theFirstPoint,
+                          std::shared_ptr<GeomAPI_Pnt2d>& theSecondPoint) 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
@@ -271,14 +197,14 @@ private:
   void fillPointAttribute(const AttributePtr& theModifiedAttribute,
                           const std::shared_ptr<GeomAPI_Pnt2d>& thePoint);
 
-//  /// 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 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 std::shared_ptr<GeomAPI_Pnt2d>& theFirstPoint,
+                               const std::shared_ptr<GeomAPI_Pnt2d>& theSecondPoint);
+
   /// 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
@@ -303,38 +229,20 @@ private:
                         const std::shared_ptr<ModelAPI_Attribute>& theFirstAttribute,
                         const std::shared_ptr<ModelAPI_Object>& theSecondObject);
 
-//  /// 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);
-//
+  /// 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);
+
   /// 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
-
 private:
   bool useGraphicIntersection() const;
 
@@ -346,13 +254,8 @@ private:
   std::shared_ptr<GeomAPI_Pnt2d> convertPoint(const std::shared_ptr<GeomAPI_Pnt>& thePoint);
 
 private:
-  //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;
-
   typedef std::map<std::shared_ptr<GeomAPI_Pnt>,
                    std::pair<std::list<std::shared_ptr<GeomDataAPI_Point2D> >,
                              std::list<std::shared_ptr<ModelAPI_Object> > > > PointToRefsMap;
index 5c33b28cce0e75d3788ee95e376300adad4a5f70..50c1a6552572dd967245afc168ef4ae7530ba4a4 100644 (file)
       </feature>
       
     <!--  SketchConstraintCollinear  -->
-      <!--
       <feature id="SketchConstraintCollinear" title="Collinear" tooltip="Create constraint defining collinearity of two lines" icon="icons/Sketch/collinear.png">
         <sketch_shape_selector id="ConstraintEntityA" 
             label="First line" tooltip="Select a line" shape_types="edge">
         </sketch_shape_selector>
         <validator id="PartSet_CollinearSelection"/>
       </feature>
-      -->
          
     </group>