Salome HOME
Issue #604 Creation of an unexpected line in the Sketcher
[modules/shaper.git] / src / SketchSolver / SketchSolver_Builder.cpp
index 6bf3a61c080d5ec4df21cc309e17d897512e9fac..e0c6855db43e824ee9ac1c301a5be13ea034247e 100644 (file)
@@ -8,14 +8,21 @@
 #include <SketchSolver_ConstraintCoincidence.h>
 #include <SketchSolver_ConstraintDistance.h>
 #include <SketchSolver_ConstraintEqual.h>
+#include <SketchSolver_ConstraintFillet.h>
 #include <SketchSolver_ConstraintLength.h>
+#include <SketchSolver_ConstraintMirror.h>
 #include <SketchSolver_ConstraintRigid.h>
 #include <SketchSolver_ConstraintTangent.h>
+#include <SketchSolver_ConstraintMultiRotation.h>
+#include <SketchSolver_ConstraintMultiTranslation.h>
+#include <SketchSolver_ConstraintMovement.h>
+#include <SketchSolver_Error.h>
 
 #include <GeomAPI_Edge.h>
 #include <GeomDataAPI_Dir.h>
 #include <GeomDataAPI_Point.h>
 #include <GeomDataAPI_Point2D.h>
+#include <Events_Error.h>
 #include <ModelAPI_Attribute.h>
 #include <ModelAPI_AttributeDouble.h>
 #include <ModelAPI_AttributeRefAttr.h>
 #include <SketchPlugin_ConstraintRigid.h>
 #include <SketchPlugin_ConstraintTangent.h>
 #include <SketchPlugin_ConstraintVertical.h>
+#include <SketchPlugin_MultiRotation.h>
+#include <SketchPlugin_MultiTranslation.h>
 
+#include <math.h>
 
 // Initialization of constraint builder self pointer
 SketchSolver_Builder* SketchSolver_Builder::mySelf = 0;
@@ -58,6 +68,35 @@ SolverConstraintPtr SketchSolver_Builder::createConstraint(ConstraintPtr theCons
   if (!aData || !aData->isValid())
     return aResult;
 
+#ifdef _DEBUG
+  // Verify attributes of constraint and generate errors
+  std::list<AttributePtr> anAttrList = aData->attributes(std::string());
+  std::list<AttributePtr>::iterator anIter = anAttrList.begin();
+  for (; anIter != anAttrList.end(); anIter++) {
+    AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(*anIter);
+    if (aRefAttr) {
+      if (aRefAttr->isObject() && aRefAttr->object()) {
+        ResultConstructionPtr aRC =
+            std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aRefAttr->object());
+        if (!aRC)
+          Events_Error::send(SketchSolver_Error::NEED_OBJECT_NOT_FEATURE(), this);
+      }
+      continue;
+    }
+    AttributeRefListPtr aRefList = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(*anIter);
+    if (aRefList) {
+      std::list<ObjectPtr> aList = aRefList->list();
+      std::list<ObjectPtr>::iterator aListIter = aList.begin();
+      for (; aListIter != aList.end(); aListIter++) {
+        ResultConstructionPtr aRC =
+            std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(*aListIter);
+        if (*aListIter && !aRC)
+          Events_Error::send(SketchSolver_Error::NEED_OBJECT_NOT_FEATURE(), this);
+      }
+    }
+  }
+#endif
+
   if (theConstraint->getKind() == SketchPlugin_ConstraintCoincidence::ID()) {
     return SolverConstraintPtr(new SketchSolver_ConstraintCoincidence(theConstraint));
   } else if (theConstraint->getKind() == SketchPlugin_ConstraintDistance::ID()) {
@@ -65,13 +104,13 @@ SolverConstraintPtr SketchSolver_Builder::createConstraint(ConstraintPtr theCons
   } else if (theConstraint->getKind() == SketchPlugin_ConstraintEqual::ID()) {
     return SolverConstraintPtr(new SketchSolver_ConstraintEqual(theConstraint));
   } else if (theConstraint->getKind() == SketchPlugin_ConstraintFillet::ID()) {
-////    return SolverConstraintPtr(new SketchSolver_ConstraintFillet(theConstraint));
+    return SolverConstraintPtr(new SketchSolver_ConstraintFillet(theConstraint));
   } else if (theConstraint->getKind() == SketchPlugin_ConstraintHorizontal::ID()) {
     return SolverConstraintPtr(new SketchSolver_ConstraintHorizontal(theConstraint));
   } else if (theConstraint->getKind() == SketchPlugin_ConstraintLength::ID()) {
     return SolverConstraintPtr(new SketchSolver_ConstraintLength(theConstraint));
   } else if (theConstraint->getKind() == SketchPlugin_ConstraintMirror::ID()) {
-////    return SolverConstraintPtr(new SketchSolver_ConstraintMirror(theConstraint));
+    return SolverConstraintPtr(new SketchSolver_ConstraintMirror(theConstraint));
   } else if (theConstraint->getKind() == SketchPlugin_ConstraintParallel::ID()) {
     return SolverConstraintPtr(new SketchSolver_ConstraintParallel(theConstraint));
   } else if (theConstraint->getKind() == SketchPlugin_ConstraintPerpendicular::ID()) {
@@ -84,6 +123,10 @@ SolverConstraintPtr SketchSolver_Builder::createConstraint(ConstraintPtr theCons
     return SolverConstraintPtr(new SketchSolver_ConstraintVertical(theConstraint));
   } else if (theConstraint->getKind() == SketchPlugin_ConstraintRigid::ID()) {
     return SolverConstraintPtr(new SketchSolver_ConstraintRigid(theConstraint));
+  } else if (theConstraint->getKind() == SketchPlugin_MultiTranslation::ID()) {
+    return SolverConstraintPtr(new SketchSolver_ConstraintMultiTranslation(theConstraint));
+  } else if (theConstraint->getKind() == SketchPlugin_MultiRotation::ID()) {
+    return SolverConstraintPtr(new SketchSolver_ConstraintMultiRotation(theConstraint));
   }
   return aResult;
 }
@@ -96,6 +139,14 @@ SolverConstraintPtr SketchSolver_Builder::createRigidConstraint(FeaturePtr theFi
   return SolverConstraintPtr(new SketchSolver_ConstraintRigid(theFixedFeature));
 }
 
+SolverConstraintPtr SketchSolver_Builder::createMovementConstraint(FeaturePtr theFixedFeature)
+{
+  DataPtr aData = theFixedFeature->data();
+  if (!aData || !aData->isValid())
+    return SolverConstraintPtr();
+  return SolverConstraintPtr(new SketchSolver_ConstraintMovement(theFixedFeature));
+}
+
 
 
 bool SketchSolver_Builder::createWorkplane(