]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Incorrect processing of middle point on line (issue #1511)
authorazv <azv@opencascade.com>
Mon, 30 May 2016 14:09:47 +0000 (17:09 +0300)
committerazv <azv@opencascade.com>
Mon, 30 May 2016 14:10:09 +0000 (17:10 +0300)
src/SketchSolver/SketchSolver_ConstraintMiddle.cpp
src/SketchSolver/SketchSolver_ConstraintMiddle.h
src/SketchSolver/SolveSpaceSolver/SolveSpaceSolver_Builder.cpp
src/SketchSolver/SolveSpaceSolver/SolveSpaceSolver_Storage.cpp

index 826a429af129d5b796ec0b7c9d1fc1b19f1c2aa5..5c1a98604aa781cb60ad09099d8fbc34f2b40b03 100644 (file)
@@ -1,5 +1,10 @@
 #include <SketchSolver_ConstraintMiddle.h>
 
+#include <SketchSolver_Builder.h>
+#include <SketchSolver_Manager.h>
+
+#include <GeomAPI_XY.h>
+
 SketchSolver_ConstraintMiddle::SketchSolver_ConstraintMiddle(ConstraintPtr theConstraint)
   : SketchSolver_Constraint(theConstraint)
 {
@@ -39,3 +44,31 @@ void SketchSolver_ConstraintMiddle::notifyCoincidenceChanged(
     process();
   }
 }
+
+void SketchSolver_ConstraintMiddle::adjustConstraint()
+{
+  BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
+
+  ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint).front();
+  const std::list<EntityWrapperPtr>& aSubs = aConstraint->entities();
+  std::shared_ptr<GeomAPI_Pnt2d> aMidPoint, aStart, aEnd;
+  std::list<EntityWrapperPtr>::const_iterator aSIt = aSubs.begin();
+  for (; aSIt != aSubs.end(); ++aSIt) {
+    if ((*aSIt)->type() == ENTITY_POINT)
+      aMidPoint = aBuilder->point(*aSIt);
+    else if ((*aSIt)->type() == ENTITY_LINE) {
+      const std::list<EntityWrapperPtr>& aLinePoints = (*aSIt)->subEntities();
+      aStart = aBuilder->point(aLinePoints.front());
+      aEnd = aBuilder->point(aLinePoints.back());
+    }
+  }
+
+  if (aMidPoint && aStart && aEnd) {
+    std::shared_ptr<GeomAPI_XY> aMP = aMidPoint->xy();
+    double aDot = aMP->decreased(aStart->xy())->dot(aMP->decreased(aEnd->xy()));
+    if (aDot > 0.0) {
+      aBuilder->adjustConstraint(aConstraint);
+      myStorage->addConstraint(myBaseConstraint, aConstraint);
+    }
+  }
+}
index b86e714f5b756816a56d5de6db9c86e76cf64157..fadcadab295093a42f59c7a696feb116f180ce89 100644 (file)
@@ -23,6 +23,10 @@ public:
 
   /// \brief Notify constraint, that coincidence appears or removed
   virtual void notifyCoincidenceChanged(EntityWrapperPtr theCoincAttr1, EntityWrapperPtr theCoincAttr2);
+
+protected:
+  /// \brief This method is used in derived objects to check consistence of constraint.
+  virtual void adjustConstraint();
 };
 
 #endif
index 9792467c1d4375ad36885561270bb5c8851ecf55..d5d039040be23a3354008b70b67892ca1af86c92 100644 (file)
@@ -56,6 +56,8 @@ static void adjustAngle(ConstraintWrapperPtr theConstraint);
 static void adjustMirror(ConstraintWrapperPtr theConstraint);
 /// \brief Update a sign of the point-line distance constraint
 static void adjustPtLineDistance(ConstraintWrapperPtr theConstraint);
+/// \brief Update point to be a middle of a line
+static void adjustMiddlePoint(ConstraintWrapperPtr theConstraint);
 
 /// \brief Transform points to be symmetric regarding to the mirror line
 static void makeMirrorPoints(EntityWrapperPtr theOriginal,
@@ -297,6 +299,8 @@ void SolveSpaceSolver_Builder::adjustConstraint(ConstraintWrapperPtr theConstrai
     adjustMirror(theConstraint);
   else if (aType == CONSTRAINT_PT_LINE_DISTANCE)
     adjustPtLineDistance(theConstraint);
+  else if (aType == CONSTRAINT_MIDDLE_POINT)
+    adjustMiddlePoint(theConstraint);
 }
 
 EntityWrapperPtr SolveSpaceSolver_Builder::createFeature(
@@ -827,3 +831,26 @@ void adjustPtLineDistance(ConstraintWrapperPtr theConstraint)
   if (aPtLineVec->cross(aLineVec) * theConstraint->value() < 0.0)
     theConstraint->setValue(theConstraint->value() * (-1.0));
 }
+
+void adjustMiddlePoint(ConstraintWrapperPtr theConstraint)
+{
+  BuilderPtr aBuilder = SolveSpaceSolver_Builder::getInstance();
+
+  const std::list<EntityWrapperPtr>& aSubs = theConstraint->entities();
+  std::shared_ptr<GeomAPI_Pnt2d> aStart, aEnd;
+  std::shared_ptr<GeomDataAPI_Point2D> aMidPoint;
+  std::list<EntityWrapperPtr>::const_iterator aSIt = aSubs.begin();
+  for (; aSIt != aSubs.end(); ++aSIt) {
+    if ((*aSIt)->type() == ENTITY_POINT)
+      aMidPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>((*aSIt)->baseAttribute());
+    else if ((*aSIt)->type() == ENTITY_LINE) {
+      const std::list<EntityWrapperPtr>& aLinePoints = (*aSIt)->subEntities();
+      aStart = aBuilder->point(aLinePoints.front());
+      aEnd = aBuilder->point(aLinePoints.back());
+    }
+  }
+  if (aMidPoint && aStart && aEnd) {
+    std::shared_ptr<GeomAPI_XY> aMid = aStart->xy()->added(aEnd->xy())->multiplied(0.5);
+    aMidPoint->setValue(aMid->x(), aMid->y());
+  }
+}
index bcec0c314dac2d0ef9b463dfedfd1e3d248a4820..202779e197ec04ca02630aa889f8505cf6abf70f 100644 (file)
@@ -21,6 +21,7 @@
 #include <ModelAPI_AttributeDouble.h>
 #include <ModelAPI_AttributeRefAttr.h>
 #include <SketchPlugin_Arc.h>
+#include <SketchPlugin_ConstraintMiddle.h>
 
 /** \brief Search the entity/parameter with specified ID in the list of elements
  *  \param[in] theEntityID unique ID of the element
@@ -75,8 +76,11 @@ bool SolveSpaceSolver_Storage::update(ConstraintWrapperPtr theConstraint)
   std::list<EntityWrapperPtr>::iterator anIt = anEntities.begin();
   for (; anIt != anEntities.end(); ++anIt) {
     isUpdated = update(*anIt) || isUpdated;
-    // do not update constrained entities for Multi constraints
-    if (aSlvsConstr.type == SLVS_C_MULTI_ROTATION || aSlvsConstr.type == SLVS_C_MULTI_TRANSLATION)
+    // do not update constrained entities for Multi constraints,
+    // and for middle point constraint translated to equal lines
+    if (aSlvsConstr.type == SLVS_C_MULTI_ROTATION || aSlvsConstr.type == SLVS_C_MULTI_TRANSLATION ||
+       (theConstraint->baseConstraint()->getKind() == SketchPlugin_ConstraintMiddle::ID() &&
+        aSlvsConstr.type != SLVS_C_AT_MIDPOINT))
       continue;
 
     Slvs_hEntity anID = (Slvs_hEntity)(*anIt)->id();