Salome HOME
Second phase of SketchSolver refactoring
[modules/shaper.git] / src / SketchSolver / PlaneGCSSolver / PlaneGCSSolver_ConstraintWrapper.cpp
diff --git a/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_ConstraintWrapper.cpp b/src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_ConstraintWrapper.cpp
new file mode 100644 (file)
index 0000000..db932e8
--- /dev/null
@@ -0,0 +1,128 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:    PlaneGCSSolver_ConstraintWrapper.cpp
+// Created: 14 Dec 2015
+// Author:  Artem ZHIDKOV
+
+#include <PlaneGCSSolver_ConstraintWrapper.h>
+
+#include <math.h>
+
+PlaneGCSSolver_ConstraintWrapper::PlaneGCSSolver_ConstraintWrapper(
+    const ConstraintPtr& theOriginal,
+    const GCSConstraintPtr& theConstraint,
+    const SketchSolver_ConstraintType& theType)
+  : myGCSConstraints(1, theConstraint),
+    myType(theType),
+    myID(CID_UNKNOWN)
+{
+  myBaseConstraint = theOriginal;
+  myValue = 0.0;
+}
+
+PlaneGCSSolver_ConstraintWrapper::PlaneGCSSolver_ConstraintWrapper(
+    const ConstraintPtr& theOriginal,
+    const std::list<GCSConstraintPtr>& theConstraints,
+    const SketchSolver_ConstraintType& theType)
+  : myGCSConstraints(theConstraints),
+    myType(theType),
+    myID(CID_UNKNOWN)
+{
+  myBaseConstraint = theOriginal;
+  myValue = 0.0;
+}
+
+void PlaneGCSSolver_ConstraintWrapper::setValueParameter(const ParameterWrapperPtr& theValue)
+{
+  myValueParam = theValue;
+  myValue = myValueParam->value();
+}
+
+void PlaneGCSSolver_ConstraintWrapper::setValue(const double& theValue)
+{
+  myValue = theValue;
+  myValueParam->setValue(theValue);
+}
+
+
+void PlaneGCSSolver_ConstraintWrapper::setGroup(const GroupID& theGroup)
+{
+  myGroup = theGroup;
+  std::list<EntityWrapperPtr>::iterator aSubsIt = myConstrained.begin();
+  for (; aSubsIt != myConstrained.end(); ++aSubsIt)
+    (*aSubsIt)->setGroup(theGroup);
+}
+
+bool PlaneGCSSolver_ConstraintWrapper::isUsed(FeaturePtr theFeature) const
+{
+  std::list<EntityWrapperPtr>::const_iterator anIt = myConstrained.begin();
+  for (; anIt != myConstrained.end(); ++anIt)
+    if ((*anIt)->isUsed(theFeature))
+      return true;
+  return false;
+}
+
+bool PlaneGCSSolver_ConstraintWrapper::isUsed(AttributePtr theAttribute) const
+{
+  std::list<EntityWrapperPtr>::const_iterator anIt = myConstrained.begin();
+  for (; anIt != myConstrained.end(); ++anIt)
+    if ((*anIt)->isUsed(theAttribute))
+      return true;
+  return false;
+}
+
+bool PlaneGCSSolver_ConstraintWrapper::isEqual(const ConstraintWrapperPtr& theOther)
+{
+  if (type() != theOther->type())
+    return false;
+////  const Slvs_Constraint anOtherConstraint = 
+////    std::dynamic_pointer_cast<PlaneGCSSolver_ConstraintWrapper>(theOther)->constraint();
+////  if (mySlvsConstraint.type != anOtherConstraint.type)
+////    return false;
+////
+////  // Verify SolveSpace entities. If they are equal, no need additional checking of parameters.
+////  if (mySlvsConstraint.group   == anOtherConstraint.group   &&
+////      mySlvsConstraint.ptA     == anOtherConstraint.ptA     &&
+////      mySlvsConstraint.ptB     == anOtherConstraint.ptB     &&
+////      mySlvsConstraint.entityA == anOtherConstraint.entityA &&
+////      mySlvsConstraint.entityB == anOtherConstraint.entityB &&
+////      mySlvsConstraint.entityC == anOtherConstraint.entityC &&
+////      mySlvsConstraint.entityD == anOtherConstraint.entityD &&
+////      fabs(mySlvsConstraint.valA - anOtherConstraint.valA) < tolerance) {
+////    return true;
+////  }
+
+  // Verify equality of values
+  if (fabs(myValue - theOther->value()) > tolerance)
+    return false;
+
+  // Verify equality of entities
+  const std::list<EntityWrapperPtr>& anOtherSubs = theOther->entities();
+  if (myConstrained.size() != anOtherSubs.size())
+    return false;
+  std::list<EntityWrapperPtr>::const_iterator aMySubsIt = myConstrained.begin();
+  std::list<EntityWrapperPtr>::const_iterator anOtherSubsIt = anOtherSubs.begin();
+  for (; aMySubsIt != myConstrained.end(); ++aMySubsIt, ++anOtherSubsIt)
+    if (!(*aMySubsIt)->isEqual(*anOtherSubsIt))
+      return false;
+  return true;
+}
+
+bool PlaneGCSSolver_ConstraintWrapper::update(const ConstraintWrapperPtr& theOther)
+{
+  bool isUpdated = false;
+
+  std::list<EntityWrapperPtr> aMySubs = entities();
+  std::list<EntityWrapperPtr> anOtherSubs = theOther->entities();
+  std::list<EntityWrapperPtr>::const_iterator aMySubsIt = aMySubs.begin();
+  std::list<EntityWrapperPtr>::const_iterator anOtherSubsIt = anOtherSubs.begin();
+  for (; aMySubsIt != aMySubs.end() && anOtherSubsIt != anOtherSubs.end();
+       ++aMySubsIt, ++anOtherSubsIt)
+     isUpdated = (*aMySubsIt)->update(*anOtherSubsIt) || isUpdated;
+
+  if (fabs(value() - theOther->value()) > tolerance) {
+    myValue = theOther->value();
+    isUpdated = true;
+  }
+  return isUpdated;
+}