Salome HOME
Meet the coding style (line length <= 100)
[modules/shaper.git] / src / SketchPlugin / SketchPlugin_ConstraintSplit.cpp
index 9ff84a54232f270380c0109a62c09e52b7ae6111..e21de959145bec5bc7e92a910de48e5ee504953e 100755 (executable)
@@ -16,6 +16,7 @@
 #include <ModelAPI_AttributeString.h>
 #include <ModelAPI_AttributeRefAttr.h>
 #include <ModelAPI_Tools.h>
+#include <ModelAPI_AttributeBoolean.h>
 
 #include <ModelAPI_Validator.h>
 #include <ModelAPI_Session.h>
@@ -32,6 +33,7 @@
 #include <SketchPlugin_ConstraintMirror.h>
 #include <SketchPlugin_MultiRotation.h>
 #include <SketchPlugin_MultiTranslation.h>
+#include <SketchPlugin_ConstraintMiddle.h>
 
 #include <ModelAPI_Events.h>
 #include <SketchPlugin_Line.h>
@@ -43,6 +45,8 @@
 
 #include <cmath>
 
+//#define CREATE_CONSTRAINTS
+
 //#define DEBUG_SPLIT
 #ifdef DEBUG_SPLIT
 #include <iostream>
@@ -93,9 +97,11 @@ void SketchPlugin_ConstraintSplit::execute()
   FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
   ResultPtr aBaseFeatureResult = getFeatureResult(aBaseFeature);
   std::set<FeaturePtr> aFeaturesToDelete, aFeaturesToUpdate;
-  std::map<FeaturePtr, IdToPointPair> aTangentFeatures;
+
+  //std::map<FeaturePtr, IdToPointPair> aTangentFeatures;
   std::map<FeaturePtr, IdToPointPair> aCoincidenceToFeature;
-  getConstraints(aFeaturesToDelete, aFeaturesToUpdate, aTangentFeatures, aCoincidenceToFeature);
+  getConstraints(aFeaturesToDelete, aFeaturesToUpdate, /*aTangentFeatures, */
+                 aCoincidenceToFeature);
 
   std::map<AttributePtr, std::list<AttributePtr> > aBaseRefAttributes;
   std::list<AttributePtr> aRefsToFeature;
@@ -136,23 +142,6 @@ void SketchPlugin_ConstraintSplit::execute()
     }
   }
 
-  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;
-      std::shared_ptr<GeomDataAPI_Point2D> aPointAttr = (*anIt).second.second;
-
-      std::cout << i << "-" << getFeatureInfo(aFeature) << std::endl;
-      std::cout <<     " -Attribute to correct:" << anAttributeId << std::endl;
-      std::cout <<     " -Point attribute:" <<
-        ModelGeomAlgo_Point2D::getPointAttributeInfo(aPointAttr) << std::endl;
-    }
-  }
-
   std::map<AttributePtr, std::list<AttributePtr> >::const_iterator
     aRefIt = aBaseRefAttributes.begin(), aRefLast = aBaseRefAttributes.end();
   std::cout << std::endl << "References to attributes of base feature [" <<
@@ -216,6 +205,7 @@ void SketchPlugin_ConstraintSplit::execute()
 
     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());
@@ -278,9 +268,7 @@ void SketchPlugin_ConstraintSplit::execute()
 
   // coincidence to feature
   updateCoincidenceConstraintsToFeature(aCoincidenceToFeature, aFurtherCoincidences,
-                                        aFeatureResults);
-  // tangency
-  updateTangentConstraintsToFeature(aTangentFeatures, aFurtherCoincidences);
+                                        aFeatureResults, aSplitFeature);
 
   updateRefAttConstraints(aBaseRefAttributes, aModifiedAttributes);
 
@@ -295,6 +283,7 @@ void SketchPlugin_ConstraintSplit::execute()
   }
 #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;
@@ -355,7 +344,7 @@ AISObjectPtr SketchPlugin_ConstraintSplit::getAISObject(AISObjectPtr thePrevious
 
     std::set<std::shared_ptr<GeomAPI_Shape> > aSplitShapes;
 
-    GeomAlgoAPI_ShapeTools::splitShape(aBaseShape, aPoints, aSplitShapes);
+    GeomAlgoAPI_ShapeTools::splitShape_p(aBaseShape, aPoints, aSplitShapes);
     std::shared_ptr<GeomAPI_Shape> aShape =
       GeomAlgoAPI_ShapeTools::findShape(aPoints, aSplitShapes);
 
@@ -364,11 +353,25 @@ AISObjectPtr SketchPlugin_ConstraintSplit::getAISObject(AISObjectPtr thePrevious
       if (!anAIS)
         anAIS = AISObjectPtr(new GeomAPI_AISObject);
       anAIS->createShape(aShape);
-      anAIS->setWidth(5);
+      std::shared_ptr<ModelAPI_AttributeBoolean> anAuxiliaryAttr =
+             aBaseFeature->data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID());
+
+      bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value();
+
       std::vector<int> aColor;
-      aColor = Config_PropManager::color("Visualization", "sketch_entity_color",
-                                          SKETCH_ENTITY_COLOR);
-     anAIS->setColor(aColor[0], aColor[1], aColor[2]);
+      double aWidth = SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH();
+      int aLineStyle = SketchPlugin_SketchEntity::SKETCH_LINE_STYLE();
+      if (isConstruction) {
+        aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color");
+        aWidth = SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH_AUXILIARY();
+        aLineStyle = SketchPlugin_SketchEntity::SKETCH_LINE_STYLE_AUXILIARY();
+      }
+      else {
+        aColor = Config_PropManager::color("Visualization", "sketch_entity_color");
+      }
+      anAIS->setColor(aColor[0], aColor[1], aColor[2]);
+      anAIS->setWidth(aWidth + 1);
+      anAIS->setLineStyle(aLineStyle);
     }
     return anAIS;
   }
@@ -392,16 +395,11 @@ std::shared_ptr<GeomDataAPI_Point2D> SketchPlugin_ConstraintSplit::getPointOfRef
   return aPointAttribute;
 }
 
-void SketchPlugin_ConstraintSplit::getFeaturePoints(AttributePoint2DPtr& theStartPointAttr,
+void SketchPlugin_ConstraintSplit::getFeaturePoints(const FeaturePtr& theFeature,
+                                                    AttributePoint2DPtr& theStartPointAttr,
                                                     AttributePoint2DPtr& theEndPointAttr)
 {
-  AttributePoint2DPtr aPointAttribute;
-
-  AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-                                           data()->attribute(SketchPlugin_Constraint::VALUE()));
-  FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
-
-  std::string aFeatureKind = aBaseFeature->getKind();
+  std::string aFeatureKind = theFeature->getKind();
   std::string aStartAttributeName, anEndAttributeName;
   if (aFeatureKind == SketchPlugin_Line::ID()) {
     aStartAttributeName = SketchPlugin_Line::START_ID();
@@ -413,15 +411,14 @@ void SketchPlugin_ConstraintSplit::getFeaturePoints(AttributePoint2DPtr& theStar
   }
   if (!aStartAttributeName.empty() && !anEndAttributeName.empty()) {
     theStartPointAttr = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                                         aBaseFeature->attribute(aStartAttributeName));
+                                         theFeature->attribute(aStartAttributeName));
     theEndPointAttr = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                                         aBaseFeature->attribute(anEndAttributeName));
+                                         theFeature->attribute(anEndAttributeName));
   }
 }
 
 void SketchPlugin_ConstraintSplit::getConstraints(std::set<FeaturePtr>& theFeaturesToDelete,
                                       std::set<FeaturePtr>& theFeaturesToUpdate,
-                                      std::map<FeaturePtr, IdToPointPair>& theTangentFeatures,
                                       std::map<FeaturePtr, IdToPointPair>& theCoincidenceToFeature)
 {
   std::shared_ptr<ModelAPI_Data> aData = data();
@@ -443,49 +440,11 @@ void SketchPlugin_ConstraintSplit::getConstraints(std::set<FeaturePtr>& theFeatu
     std::string aRefFeatureKind = aRefFeature->getKind();
     if (aRefFeatureKind == SketchPlugin_ConstraintMirror::ID() ||
         aRefFeatureKind == SketchPlugin_MultiRotation::ID() ||
-        aRefFeatureKind == SketchPlugin_MultiTranslation::ID())
+        aRefFeatureKind == SketchPlugin_MultiTranslation::ID() ||
+        aRefFeatureKind == SketchPlugin_ConstraintMiddle::ID())
       theFeaturesToDelete.insert(aRefFeature);
     else if (aRefFeatureKind == SketchPlugin_ConstraintLength::ID())
       theFeaturesToUpdate.insert(aRefFeature);
-    else if (aRefFeatureKind == SketchPlugin_ConstraintTangent::ID()) {
-      if (aBaseFeature->getKind() == SketchPlugin_Circle::ID()) /// TEMPORARY limitaion
-        /// until tangency between arc and line is implemented
-        theFeaturesToDelete.insert(aRefFeature);
-      else {
-        std::string anAttributeToBeModified;
-        AttributePoint2DPtr aTangentPoint;
-        ObjectPtr aResult1 = aRefFeature->refattr(SketchPlugin_Constraint::ENTITY_A())->object();
-        ObjectPtr aResult2 = aRefFeature->refattr(SketchPlugin_Constraint::ENTITY_B())->object();
-        if (aResult1.get() && aResult2.get()) {
-          FeaturePtr aCoincidenceFeature =
-            SketchPlugin_ConstraintCoincidence::findCoincidenceFeature
-                                                       (ModelAPI_Feature::feature(aResult1),
-                                                        ModelAPI_Feature::feature(aResult2));
-          // get the point not lying on the splitting feature
-          for (int i = 0; i < CONSTRAINT_ATTR_SIZE; ++i) {
-            AttributeRefAttrPtr aRefAttr = aCoincidenceFeature->refattr(ATTRIBUTE(i));
-            if (!aRefAttr || aRefAttr->isObject())
-              continue;
-            AttributePoint2DPtr aPoint =
-                std::dynamic_pointer_cast<GeomDataAPI_Point2D>(aRefAttr->attr());
-            if (!aPoint)
-              continue;
-            if (aPoint->owner() != aBaseFeature) {
-              aTangentPoint = aPoint;
-              break;
-            }
-          }
-        }
-        if (aTangentPoint.get()) {
-          FeaturePtr aFeature1 = ModelAPI_Feature::feature(aResult1);
-          std::string anAttributeToBeModified = aFeature1 == aBaseFeature
-                       ? SketchPlugin_Constraint::ENTITY_A() : SketchPlugin_Constraint::ENTITY_B();
-          theTangentFeatures[aRefFeature] = std::make_pair(anAttributeToBeModified, aTangentPoint);
-        }
-        else /// there is not coincident point between tangent constraint
-          theFeaturesToDelete.insert(aRefFeature);
-      }
-    }
     else if (aRefFeatureKind == SketchPlugin_ConstraintCoincidence::ID()) {
       std::string anAttributeToBeModified;
       AttributePoint2DPtr aCoincidentPoint;
@@ -588,11 +547,21 @@ void SketchPlugin_ConstraintSplit::getRefAttributes(const FeaturePtr& theFeature
 void SketchPlugin_ConstraintSplit::updateCoincidenceConstraintsToFeature(
       const std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theCoincidenceToFeature,
       const std::set<std::shared_ptr<GeomDataAPI_Point2D> >& theFurtherCoincidences,
-      const std::set<ResultPtr>& theFeatureResults)
+      const std::set<ResultPtr>& theFeatureResults,
+      const FeaturePtr& theSplitFeature)
 {
   if (theCoincidenceToFeature.empty())
     return;
 
+  // we should build coincidence constraints to end of the split feature
+  std::set<std::shared_ptr<GeomDataAPI_Point2D> > aNewCoincidencesToSplitFeature;
+  AttributePoint2DPtr aStartPointAttr, anEndPointAttr;
+  getFeaturePoints(theSplitFeature, aStartPointAttr, anEndPointAttr);
+  if (theFurtherCoincidences.find(aStartPointAttr) == theFurtherCoincidences.end())
+    aNewCoincidencesToSplitFeature.insert(aStartPointAttr);
+  if (theFurtherCoincidences.find(anEndPointAttr) == theFurtherCoincidences.end())
+    aNewCoincidencesToSplitFeature.insert(anEndPointAttr);
+
   std::map<FeaturePtr, IdToPointPair>::const_iterator aCIt = theCoincidenceToFeature.begin(),
                                                             aCLast = theCoincidenceToFeature.end();
 #ifdef DEBUG_SPLIT
@@ -615,6 +584,19 @@ void SketchPlugin_ConstraintSplit::updateCoincidenceConstraintsToFeature(
     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
@@ -639,44 +621,6 @@ void SketchPlugin_ConstraintSplit::updateCoincidenceConstraintsToFeature(
   }
 }
 
-void SketchPlugin_ConstraintSplit::updateTangentConstraintsToFeature(
-      const std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theTangentFeatures,
-      const std::set<std::shared_ptr<GeomDataAPI_Point2D> >& 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_ConstraintSplit::updateRefFeatureConstraints(
                                                   const ResultPtr& theFeatureBaseResult,
                                                   const std::list<AttributePtr>& theRefsToFeature)
@@ -751,7 +695,8 @@ void SketchPlugin_ConstraintSplit::splitLine(FeaturePtr& theSplitFeature,
   AttributePoint2DPtr aSecondPointAttrOfSplit =
     getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B()));
   AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase;
-  getFeaturePoints(aStartPointAttrOfBase, anEndPointAttrOfBase);
+
+  getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase);
   if (!aStartPointAttrOfBase.get() && !anEndPointAttrOfBase.get()) {
     setError("Error: Feature has no start and end points.");
     return;
@@ -844,6 +789,7 @@ void SketchPlugin_ConstraintSplit::splitLine(FeaturePtr& theSplitFeature,
     thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
                                        (theSplitFeature->attribute(SketchPlugin_Line::START_ID())));
 
+#ifdef CREATE_CONSTRAINTS
   // additional constraints between split and base features
   aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintParallel::ID(),
                                                        getFeatureResult(aBaseFeature),
@@ -855,6 +801,7 @@ void SketchPlugin_ConstraintSplit::splitLine(FeaturePtr& theSplitFeature,
                                                     getFeatureResult(theAfterFeature));
     theCreatedFeatures.insert(aConstraintFeature);
   }
+#endif
 }
 
 void SketchPlugin_ConstraintSplit::splitArc(FeaturePtr& theSplitFeature,
@@ -884,16 +831,12 @@ void SketchPlugin_ConstraintSplit::splitArc(FeaturePtr& theSplitFeature,
   AttributePoint2DPtr aSecondPointAttrOfSplit =
     getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B()));
   AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase;
-  getFeaturePoints(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
@@ -980,6 +923,7 @@ void SketchPlugin_ConstraintSplit::splitArc(FeaturePtr& theSplitFeature,
                                        (theSplitFeature->attribute(SketchPlugin_Arc::START_ID())));
 
   // additional constraints between split and base features
+#ifdef CREATE_CONSTRAINTS
   aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintEqual::ID(),
                                                        getFeatureResult(aBaseFeature),
                                                        getFeatureResult(theSplitFeature));
@@ -998,6 +942,7 @@ void SketchPlugin_ConstraintSplit::splitArc(FeaturePtr& theSplitFeature,
                                                     getFeatureResult(theAfterFeature));
     theCreatedFeatures.insert(aConstraintFeature);
   }
+#endif
 }
 
 void SketchPlugin_ConstraintSplit::splitCircle(FeaturePtr& theSplitFeature,
@@ -1061,10 +1006,12 @@ void SketchPlugin_ConstraintSplit::splitCircle(FeaturePtr& theSplitFeature,
                      theSplitFeature->attribute(SketchPlugin_Arc::START_ID()));
   theCreatedFeatures.insert(aConstraintFeature);
 
+#ifdef CREATE_CONSTRAINTS
   aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(),
                                                        getFeatureResult(theSplitFeature),
                                                        getFeatureResult(theBaseFeatureModified));
   theCreatedFeatures.insert(aConstraintFeature);
+#endif
 }
 
 void SketchPlugin_ConstraintSplit::arrangePointsOnLine(
@@ -1093,7 +1040,7 @@ void SketchPlugin_ConstraintSplit::arrangePointsOnArc(
 
   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();
+  bool isReversed = theArc->boolean(SketchPlugin_Arc::REVERSED_ID())->value();
 
   // collect directions to each point
   std::shared_ptr<GeomAPI_Dir2d> aStartDir(
@@ -1122,13 +1069,25 @@ void SketchPlugin_ConstraintSplit::arrangePointsOnArc(
 void SketchPlugin_ConstraintSplit::fillAttribute(const AttributePtr& theModifiedAttribute,
                                                  const AttributePtr& theSourceAttribute)
 {
-  AttributePoint2DPtr aModifiedAttribute = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                                            theModifiedAttribute);
-  AttributePoint2DPtr aSourceAttribute = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-                                            theSourceAttribute);
-
-  if (aModifiedAttribute.get() && aSourceAttribute.get())
-    aModifiedAttribute->setValue(aSourceAttribute->pnt());
+  std::string anAttributeType = theModifiedAttribute->attributeType();
+  if (anAttributeType == GeomDataAPI_Point2D::typeId()) {
+    AttributePoint2DPtr aModifiedAttribute = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+                                              theModifiedAttribute);
+    AttributePoint2DPtr aSourceAttribute = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+                                              theSourceAttribute);
+
+    if (aModifiedAttribute.get() && aSourceAttribute.get())
+      aModifiedAttribute->setValue(aSourceAttribute->pnt());
+  }
+  else if (anAttributeType == ModelAPI_AttributeBoolean::typeId()) {
+    AttributeBooleanPtr aModifiedAttribute = std::dynamic_pointer_cast<ModelAPI_AttributeBoolean>(
+                                              theModifiedAttribute);
+    AttributeBooleanPtr aSourceAttribute = std::dynamic_pointer_cast<ModelAPI_AttributeBoolean>(
+                                              theSourceAttribute);
+
+    if (aModifiedAttribute.get() && aSourceAttribute.get())
+      aModifiedAttribute->setValue(aSourceAttribute->value());
+  }
 }
 
 FeaturePtr SketchPlugin_ConstraintSplit::createLineFeature(const FeaturePtr& theBaseFeature,
@@ -1144,6 +1103,10 @@ FeaturePtr SketchPlugin_ConstraintSplit::createLineFeature(const FeaturePtr& the
 
   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;
@@ -1171,22 +1134,22 @@ FeaturePtr SketchPlugin_ConstraintSplit::createArcFeature(const FeaturePtr& theB
   // update fillet arc: make the arc correct for sure, so, it is not needed to process
   // the "attribute updated"
   // by arc; moreover, it may cause cyclicity in hte mechanism of updater
-  aFeature->data()->blockSendAttributeUpdated(true);
-
-  aFeature->string(SketchPlugin_Arc::ARC_TYPE())->setValue(
-                SketchPlugin_Arc::ARC_TYPE_CENTER_START_END());
+  bool aWasBlocked = aFeature->data()->blockSendAttributeUpdated(true);
 
   fillAttribute(aFeature->attribute(SketchPlugin_Arc::CENTER_ID()),
                 theBaseFeature->attribute(aCenterAttributeId));
   fillAttribute(aFeature->attribute(SketchPlugin_Arc::START_ID()), theFirstPointAttr);
   fillAttribute(aFeature->attribute(SketchPlugin_Arc::END_ID()), theSecondPointAttr);
 
+  fillAttribute(aFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()),
+                theBaseFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()));
+
   /// fill referersed state of created arc as it is on the base arc
   if (theBaseFeature->getKind() == SketchPlugin_Arc::ID()) {
-    bool aReversed = theBaseFeature->boolean(SketchPlugin_Arc::INVERSED_ID())->value();
-    aFeature->boolean(SketchPlugin_Arc::INVERSED_ID())->setValue(aReversed);
+    bool aReversed = theBaseFeature->boolean(SketchPlugin_Arc::REVERSED_ID())->value();
+    aFeature->boolean(SketchPlugin_Arc::REVERSED_ID())->setValue(aReversed);
   }
-  aFeature->data()->blockSendAttributeUpdated(false);
+  aFeature->data()->blockSendAttributeUpdated(aWasBlocked);
   aFeature->execute(); // to obtain result
 
   return aFeature;
@@ -1283,7 +1246,7 @@ std::set<std::shared_ptr<ModelAPI_Attribute> > SketchPlugin_ConstraintSplit::get
   return anAttributes;
 }
 
-
+#ifdef _DEBUG
 std::string SketchPlugin_ConstraintSplit::getFeatureInfo(
                                                const std::shared_ptr<ModelAPI_Feature>& theFeature,
                                                const bool isUseAttributesInfo)
@@ -1344,4 +1307,4 @@ std::string SketchPlugin_ConstraintSplit::getFeatureInfo(
   }
   return anInfo;
 }
-
+#endif