]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Allow arc parameters to be recalculated by sketch solver
authorazv <azv@opencascade.com>
Wed, 29 Mar 2017 13:18:09 +0000 (16:18 +0300)
committerazv <azv@opencascade.com>
Wed, 29 Mar 2017 13:18:23 +0000 (16:18 +0300)
src/Events/Events_Loop.cpp
src/SketchPlugin/SketchPlugin_Arc.cpp
src/SketchPlugin/Test/TestCreateArcByCenterStartEnd.py
src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.h
src/SketchSolver/SketchSolver_Group.h
src/SketchSolver/SketchSolver_Storage.h

index 181f588a2f0e230b1897484f9e444647ca952466..1bbe62aaa7138980b2e39686ec3ce369f5a30289 100644 (file)
@@ -207,7 +207,8 @@ void Events_Loop::flush(const Events_ID& theID)
       }
     }
   }
-  if (hasEventsToFlush && myGroups.empty()) { // no more messages left in the queue, so, finalize the sketch processing
+  if (hasEventsToFlush && myGroups.empty()) {
+    // no more messages left in the queue, so, finalize the sketch processing
     static Events_ID anID = Events_Loop::eventByName("SketchPrepared");
     std::shared_ptr<Events_Message> aMsg(new Events_Message(anID, this));
     Events_Loop::loop()->send(aMsg, false);
index 1890400ce34dec026540fe287b3b2ae79d0f8f3e..0dac256a86de36f03ecb8112087fd267a97fd520 100644 (file)
@@ -222,31 +222,25 @@ void SketchPlugin_Arc::attributeChanged(const std::string& theID)
       return;
     std::shared_ptr<GeomAPI_Circ2d> aCircleForArc(new GeomAPI_Circ2d(aCenter, aStart));
 
-    bool aWasBlocked = data()->blockSendAttributeUpdated(true);
-    // The Arc end point is projected
-    // on the circle formed by center and start points
+    // Do not recalculate REVERSED flag if the arc is not consistent
     std::shared_ptr<GeomAPI_Pnt2d> aProjection = aCircleForArc->project(anEnd);
-    if (aProjection && anEnd->distance(aProjection) > tolerance) {
-      anEndAttr->setValue(aProjection);
-      anEnd = aProjection;
-    }
-    data()->blockSendAttributeUpdated(aWasBlocked, false);
-
-    double aParameterNew = 0.0;
-    if(aCircleForArc->parameter(anEnd, paramTolerance, aParameterNew)) {
-      bool aWasBlocked = data()->blockSendAttributeUpdated(true);
-      if(myParamBefore <= PI / 2.0 && aParameterNew >= PI * 1.5) {
-        if(!boolean(REVERSED_ID())->value()) {
-          boolean(REVERSED_ID())->setValue(true);
-        }
-      } else if(myParamBefore >= PI * 1.5 && aParameterNew <= PI / 2.0) {
-        if(boolean(REVERSED_ID())->value()) {
-          boolean(REVERSED_ID())->setValue(false);
+    if (aProjection && anEnd->distance(aProjection) <= tolerance) {
+      double aParameterNew = 0.0;
+      if(aCircleForArc->parameter(anEnd, paramTolerance, aParameterNew)) {
+        bool aWasBlocked = data()->blockSendAttributeUpdated(true);
+        if(myParamBefore <= PI / 2.0 && aParameterNew >= PI * 1.5) {
+          if(!boolean(REVERSED_ID())->value()) {
+            boolean(REVERSED_ID())->setValue(true);
+          }
+        } else if(myParamBefore >= PI * 1.5 && aParameterNew <= PI / 2.0) {
+          if(boolean(REVERSED_ID())->value()) {
+            boolean(REVERSED_ID())->setValue(false);
+          }
         }
+        data()->blockSendAttributeUpdated(aWasBlocked, false);
       }
-      data()->blockSendAttributeUpdated(aWasBlocked, false);
+      myParamBefore = aParameterNew;
     }
-    myParamBefore = aParameterNew;
   }
 
   double aRadius = 0;
index 2fb4d4711fc79d9bbe510e0c696f8f8d6ca1d419..47bce50299daab7b78938bfe74422e5aac52fe23 100644 (file)
@@ -91,27 +91,27 @@ aCenter = [15., 20.]
 aSession.startOperation()
 anArcCenter.setValue(aCenter[0], aCenter[1])
 aSession.finishOperation()
-verifyLastArc(aSketchFeature, aCenter, [], [])
+verifyLastArc(aSketchFeature, [], [], [])
 # Move start point
 deltaX, deltaY = 5., 2.
 aStart = [anArcStartPoint.x() + deltaX, anArcStartPoint.y() + deltaY]
 aSession.startOperation()
 anArcStartPoint.setValue(aStart[0], aStart[1])
 aSession.finishOperation()
-verifyLastArc(aSketchFeature, [], aStart, [])
+verifyLastArc(aSketchFeature, [], [], [])
 # Move end point
 aEnd = [anArcEndPoint.x() - deltaX, anArcEndPoint.y() - deltaY]
 aSession.startOperation()
 anArcEndPoint.setValue(aEnd[0], aEnd[1])
 aSession.finishOperation()
-verifyLastArc(aSketchFeature, [], [], aEnd)
+verifyLastArc(aSketchFeature, [], [], [])
 # Check that changing the radius does not affect arc
 aSession.startOperation()
 anArcRadius = aSketchArc.real("radius")
 aPrevRadius = anArcRadius.value();
 anArcRadius.setValue(aPrevRadius + 10.)
 aSession.finishOperation()
-assert (math.fabs(anArcRadius.value - aPrevRadius) < TOLERANCE)
+assert (math.fabs(anArcRadius.value() - aPrevRadius) < TOLERANCE)
 verifyLastArc(aSketchFeature, [], [], [])
 # Check that changing the angle does not affect arc
 aSession.startOperation()
@@ -119,7 +119,7 @@ anArcAngle = aSketchArc.real("angle")
 aPrevAngle = anArcAngle.value()
 anArcAngle.setValue(aPrevAngle + 10.)
 aSession.finishOperation()
-assert (math.fabs(anArcAngle.value - aPrevAngle) < TOLERANCE)
+assert (math.fabs(anArcAngle.value() - aPrevAngle) < TOLERANCE)
 verifyLastArc(aSketchFeature, [], [], [])
 
 #=========================================================================
index 1855de212ac9a0be336bd95ccb8ab0d80915d7c6..c7e1d1edaddfa79db572503617f31f45176036e1 100644 (file)
@@ -64,6 +64,10 @@ public:
   /// \brief Remove all features became invalid
   virtual void removeInvalidEntities();
 
+  /// \brief Check the storage has constraints
+  virtual bool isEmpty() const
+  { return SketchSolver_Storage::isEmpty() && myArcConstraintMap.empty(); }
+
 private:
   /// \brief Convert feature using specified builder.
   EntityWrapperPtr createFeature(const FeaturePtr&             theFeature,
index a9d305a44a0ddcc9329f09f4e84f8e977a06eed6..a5fb221aea74dc0bc4f5803a496b1722ea1511e1 100644 (file)
@@ -37,7 +37,7 @@ class SketchSolver_Group
   /// \brief Returns true if the group has no constraints yet
   inline bool isEmpty() const
   {
-    return myConstraints.empty();
+    return myConstraints.empty() && myTempConstraints.empty();
   }
 
   /// \brief Check for valid sketch data
index bfd8bc62001f731733e7f03843b19f1d8832bd31..7753d6433395ea7cdae71ffdaf5b8dc57d915c8b 100644 (file)
@@ -97,7 +97,7 @@ public:
   bool isConsistent() const;
 
   /// \brief Check the storage has constraints
-  bool isEmpty() const
+  virtual bool isEmpty() const
   { return myConstraintMap.empty(); }
 
   /// \brief Shows the sketch should be resolved