Salome HOME
Update groups merging (issue #933)
authorazv <azv@opencascade.com>
Wed, 9 Sep 2015 13:15:26 +0000 (16:15 +0300)
committerazv <azv@opencascade.com>
Wed, 9 Sep 2015 13:16:12 +0000 (16:16 +0300)
src/SketchSolver/SketchSolver_ConstraintManager.cpp
src/SketchSolver/SketchSolver_Group.cpp
src/SketchSolver/SketchSolver_Group.h

index 6bcd23b91c361bec3543cc21afa20f2bf9022837..682bbf23a48fdb89cbf4602e7e62115e9c5b045d 100644 (file)
 #include <ModelAPI_Attribute.h>
 
 #include <SketchPlugin_Constraint.h>
-#include <SketchPlugin_ConstraintAngle.h>
-#include <SketchPlugin_ConstraintCoincidence.h>
-#include <SketchPlugin_ConstraintDistance.h>
-#include <SketchPlugin_ConstraintEqual.h>
-#include <SketchPlugin_ConstraintHorizontal.h>
-#include <SketchPlugin_ConstraintLength.h>
-#include <SketchPlugin_ConstraintFillet.h>
-#include <SketchPlugin_ConstraintMirror.h>
-#include <SketchPlugin_ConstraintParallel.h>
-#include <SketchPlugin_ConstraintPerpendicular.h>
-#include <SketchPlugin_ConstraintRadius.h>
-#include <SketchPlugin_ConstraintRigid.h>
-#include <SketchPlugin_ConstraintTangent.h>
-#include <SketchPlugin_ConstraintVertical.h>
-#include <SketchPlugin_MultiRotation.h>
-#include <SketchPlugin_MultiTranslation.h>
 
 #include <SketchPlugin_Arc.h>
 #include <SketchPlugin_Circle.h>
@@ -51,9 +35,6 @@ SketchSolver_ConstraintManager* SketchSolver_ConstraintManager::_self = 0;
 SketchSolver_ConstraintManager* myManager = SketchSolver_ConstraintManager::Instance();
 
 
-/// \brief Select and sort features applicable for SketchSolver
-static std::list<FeaturePtr> selectApplicableFeatures(const std::set<ObjectPtr>& theObjects);
-
 // ========================================================
 // ========= SketchSolver_ConstraintManager ===============
 // ========================================================
@@ -114,7 +95,7 @@ void SketchSolver_ConstraintManager::processEvent(
         }
       }
     } else {
-      std::list<FeaturePtr> aSketchFeatures = selectApplicableFeatures(aFeatures);
+      std::list<FeaturePtr> aSketchFeatures = SketchSolver_Group::selectApplicableFeatures(aFeatures);
       std::list<FeaturePtr>::iterator aFeatIter = aSketchFeatures.begin();
       for (; aFeatIter != aSketchFeatures.end(); ++aFeatIter) {
         if ((*aFeatIter)->getKind() == SketchPlugin_Sketch::ID()) {
@@ -384,76 +365,3 @@ void SketchSolver_ConstraintManager::resolveConstraints(const bool theForceUpdat
     Events_Loop::loop()->flush(anUpdateEvent);
 }
 
-
-
-
-// ===========   Auxiliary functions   ========================================
-static double featureToVal(FeaturePtr theFeature)
-{
-  if (theFeature->getKind() == SketchPlugin_Sketch::ID())
-    return 0.0; // sketch
-  ConstraintPtr aConstraint = std::dynamic_pointer_cast<SketchPlugin_Constraint>(theFeature);
-  if (!aConstraint)
-    return 1.0; // features (arc, circle, line, point)
-
-  const std::string& anID = aConstraint->getKind();
-  if (anID == SketchPlugin_ConstraintCoincidence::ID())
-    return 2.0;
-  if (anID == SketchPlugin_ConstraintDistance::ID() ||
-      anID == SketchPlugin_ConstraintLength::ID() ||
-      anID == SketchPlugin_ConstraintRadius::ID() ||
-      anID == SketchPlugin_ConstraintAngle::ID())
-    return 3.0;
-  if (anID == SketchPlugin_ConstraintHorizontal::ID() ||
-      anID == SketchPlugin_ConstraintVertical::ID() ||
-      anID == SketchPlugin_ConstraintParallel::ID() ||
-      anID == SketchPlugin_ConstraintPerpendicular::ID())
-    return 4.0;
-  if (anID == SketchPlugin_ConstraintEqual::ID())
-    return 5.0;
-  if (anID == SketchPlugin_ConstraintTangent::ID() ||
-      anID == SketchPlugin_ConstraintMirror::ID())
-    return 6.0;
-  if (anID == SketchPlugin_ConstraintRigid::ID())
-    return 7.0;
-  if (anID == SketchPlugin_MultiRotation::ID() ||
-      anID == SketchPlugin_MultiTranslation::ID())
-    return 8.0;
-
-  // all other constraints are placed between Equal and Tangent constraints
-  return 5.5;
-}
-
-static bool operator< (FeaturePtr theFeature1, FeaturePtr theFeature2)
-{
-  return featureToVal(theFeature1) < featureToVal(theFeature2);
-}
-
-std::list<FeaturePtr> selectApplicableFeatures(const std::set<ObjectPtr>& theObjects)
-{
-  std::list<FeaturePtr> aResult;
-  std::list<FeaturePtr>::iterator aResIt;
-
-  std::set<ObjectPtr>::const_iterator anObjIter = theObjects.begin();
-  for (; anObjIter != theObjects.end(); ++anObjIter) {
-    // Operate sketch itself and SketchPlugin features only.
-    // Also, the Fillet need to be skipped, because there are several separated constraints composing it.
-    FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(*anObjIter);
-    if (!aFeature)
-      continue;
-    std::shared_ptr<SketchPlugin_Feature> aSketchFeature = 
-        std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
-    if ((aFeature->getKind() != SketchPlugin_Sketch::ID() && !aSketchFeature) ||
-        aFeature->getKind() == SketchPlugin_ConstraintFillet::ID())
-      continue;
-
-    // Find the place where to insert a feature
-    for (aResIt = aResult.begin(); aResIt != aResult.end(); ++aResIt)
-      if (aFeature < *aResIt)
-        break;
-    aResult.insert(aResIt, aFeature);
-  }
-
-  return aResult;
-}
-
index 9371607d2d6511b13336b394ea32ed078e7a237c..c965b8ee98e11f690d6f06b899160864e33142a7 100644 (file)
 #include <ModelAPI_Validator.h>
 
 #include <SketchPlugin_Constraint.h>
+#include <SketchPlugin_ConstraintAngle.h>
 #include <SketchPlugin_ConstraintCoincidence.h>
+#include <SketchPlugin_ConstraintDistance.h>
 #include <SketchPlugin_ConstraintEqual.h>
-#include <SketchPlugin_ConstraintFillet.h>
+#include <SketchPlugin_ConstraintHorizontal.h>
 #include <SketchPlugin_ConstraintLength.h>
+#include <SketchPlugin_ConstraintFillet.h>
 #include <SketchPlugin_ConstraintMirror.h>
+#include <SketchPlugin_ConstraintParallel.h>
+#include <SketchPlugin_ConstraintPerpendicular.h>
+#include <SketchPlugin_ConstraintRadius.h>
 #include <SketchPlugin_ConstraintRigid.h>
 #include <SketchPlugin_ConstraintTangent.h>
+#include <SketchPlugin_ConstraintVertical.h>
 #include <SketchPlugin_Feature.h>
 #include <SketchPlugin_MultiRotation.h>
 #include <SketchPlugin_MultiTranslation.h>
@@ -545,18 +552,19 @@ void SketchSolver_Group::mergeGroups(const SketchSolver_Group& theGroup)
   if (!myFeatureStorage)
     myFeatureStorage = FeatureStoragePtr(new SketchSolver_FeatureStorage);
 
-  std::vector<ConstraintPtr> aComplexConstraints;
+  std::set<ObjectPtr> aConstraints;
   ConstraintConstraintMap::const_iterator aConstrIter = theGroup.myConstraints.begin();
-  // append simple constraints
   for (; aConstrIter != theGroup.myConstraints.end(); aConstrIter++)
-    if (isComplexConstraint(aConstrIter->first))
-      aComplexConstraints.push_back(aConstrIter->first);
-    else
-      changeConstraint(aConstrIter->first);
-  // append complex constraints
-  std::vector<ConstraintPtr>::iterator aComplexIter = aComplexConstraints.begin();
-  for (; aComplexIter != aComplexConstraints.end(); aComplexIter++)
-      changeConstraint(*aComplexIter);
+    aConstraints.insert(aConstrIter->first);
+
+  std::list<FeaturePtr> aSortedConstraints = selectApplicableFeatures(aConstraints);
+  std::list<FeaturePtr>::iterator aSCIter = aSortedConstraints.begin();
+  for (; aSCIter != aSortedConstraints.end(); ++aSCIter) {
+    ConstraintPtr aConstr = std::dynamic_pointer_cast<SketchPlugin_Constraint>(*aSCIter);
+    if (!aConstr)
+      continue;
+    changeConstraint(aConstr);
+  }
 }
 
 // ============================================================================
@@ -740,3 +748,77 @@ bool SketchSolver_Group::checkFeatureValidity(FeaturePtr theFeature)
   return aFactory->validate(theFeature);
 }
 
+
+
+
+
+// ===========   Auxiliary functions   ========================================
+static double featureToVal(FeaturePtr theFeature)
+{
+  if (theFeature->getKind() == SketchPlugin_Sketch::ID())
+    return 0.0; // sketch
+  ConstraintPtr aConstraint = std::dynamic_pointer_cast<SketchPlugin_Constraint>(theFeature);
+  if (!aConstraint)
+    return 1.0; // features (arc, circle, line, point)
+
+  const std::string& anID = aConstraint->getKind();
+  if (anID == SketchPlugin_ConstraintCoincidence::ID())
+    return 2.0;
+  if (anID == SketchPlugin_ConstraintDistance::ID() ||
+      anID == SketchPlugin_ConstraintLength::ID() ||
+      anID == SketchPlugin_ConstraintRadius::ID() ||
+      anID == SketchPlugin_ConstraintAngle::ID())
+    return 3.0;
+  if (anID == SketchPlugin_ConstraintHorizontal::ID() ||
+      anID == SketchPlugin_ConstraintVertical::ID() ||
+      anID == SketchPlugin_ConstraintParallel::ID() ||
+      anID == SketchPlugin_ConstraintPerpendicular::ID())
+    return 4.0;
+  if (anID == SketchPlugin_ConstraintEqual::ID())
+    return 5.0;
+  if (anID == SketchPlugin_ConstraintTangent::ID() ||
+      anID == SketchPlugin_ConstraintMirror::ID())
+    return 6.0;
+  if (anID == SketchPlugin_ConstraintRigid::ID())
+    return 7.0;
+  if (anID == SketchPlugin_MultiRotation::ID() ||
+      anID == SketchPlugin_MultiTranslation::ID())
+    return 8.0;
+
+  // all other constraints are placed between Equal and Tangent constraints
+  return 5.5;
+}
+
+static bool operator< (FeaturePtr theFeature1, FeaturePtr theFeature2)
+{
+  return featureToVal(theFeature1) < featureToVal(theFeature2);
+}
+
+std::list<FeaturePtr> SketchSolver_Group::selectApplicableFeatures(const std::set<ObjectPtr>& theObjects)
+{
+  std::list<FeaturePtr> aResult;
+  std::list<FeaturePtr>::iterator aResIt;
+
+  std::set<ObjectPtr>::const_iterator anObjIter = theObjects.begin();
+  for (; anObjIter != theObjects.end(); ++anObjIter) {
+    // Operate sketch itself and SketchPlugin features only.
+    // Also, the Fillet need to be skipped, because there are several separated constraints composing it.
+    FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(*anObjIter);
+    if (!aFeature)
+      continue;
+    std::shared_ptr<SketchPlugin_Feature> aSketchFeature = 
+        std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
+    if ((aFeature->getKind() != SketchPlugin_Sketch::ID() && !aSketchFeature) ||
+        aFeature->getKind() == SketchPlugin_ConstraintFillet::ID())
+      continue;
+
+    // Find the place where to insert a feature
+    for (aResIt = aResult.begin(); aResIt != aResult.end(); ++aResIt)
+      if (aFeature < *aResIt)
+        break;
+    aResult.insert(aResIt, aFeature);
+  }
+
+  return aResult;
+}
+
index 3197bd6da5e4bba09f3ebfad981dabe71d5168a7..79181c38288d709e769fe9e4152fa2d37e842d65 100644 (file)
@@ -133,6 +133,12 @@ class SketchSolver_Group
    */
   bool resolveConstraints();
 
+  /** \brief Collect all features applicable for the sketch
+   *  \param theObjects  list of features
+   *  \return list of bolted and sorted features
+   */
+  static std::list<FeaturePtr> selectApplicableFeatures(const std::set<ObjectPtr>& theObjects);
+
 protected:
   /** \brief Removes constraints from the group
    *  \param[in] theConstraint constraint to be removed