]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #19725: Error when loading python dump V9_5_BR V9_5_0 V9_5_0rc3
authorArtem Zhidkov <Artem.Zhidkov@opencascade.com>
Thu, 25 Jun 2020 07:06:15 +0000 (10:06 +0300)
committervsr <vsr@opencascade.com>
Fri, 3 Jul 2020 15:46:13 +0000 (18:46 +0300)
Fix the issue related to the on-the-fly projection to sketch, when projecting a periodic B-spline curve orthogonal to the sketch plane.

src/GeomAPI/GeomAPI_BSpline2d.cpp
src/PartSet/PartSet_Tools.cpp
src/SketchPlugin/SketchPlugin_Validators.cpp
src/SketchPlugin/SketchPlugin_msg_en.ts
src/SketchPlugin/SketchPlugin_msg_fr.ts

index 5835d9707d4a06a278429c48375e45382ab0f91f..a5bd94a16b38f853ccd561543c3acf0e5db717fe 100644 (file)
@@ -48,8 +48,15 @@ static Handle_Geom2d_BSplineCurve* newBSpline2d(
     return newBSpline2d(thePoles, theWeights, theDegree, thePeriodic);
 
   int anAuxPole = 0;
-  if (thePeriodic && thePoles.front()->distance(thePoles.back()) < Precision::Confusion())
-    anAuxPole = -1;
+  if (thePeriodic && thePoles.front()->distance(thePoles.back()) < Precision::Confusion()) {
+    // additionally check the number of poles is greater than needed for th periodic B-spline
+    int aNbPoles = 0;
+    std::list<int>::const_iterator it = theMults.begin();
+    for (++it; it != theMults.end(); ++it)
+      aNbPoles += *it;
+    if ((int)thePoles.size() > aNbPoles)
+      anAuxPole = -1;
+  }
 
   // collect arrays of poles, weights, knots and multiplicities
   TColgp_Array1OfPnt2d aPoles(1, (int)thePoles.size() + anAuxPole);
index fc615f4d1e00a6b55014ab567973208d652ac182..169ea993dd0f519ebb6e2172b9cb0134765eccc1 100644 (file)
@@ -384,10 +384,13 @@ ResultPtr PartSet_Tools::createFixedObjectByExternal(
   anIntoResult->setValue(SKETCH_PROJECTION_INCLUDE_INTO_RESULT);
   aProjectionFeature->execute();
 
+  ModelAPI_ValidatorsFactory* aValidators = ModelAPI_Session::get()->validators();
+  bool isValid = aValidators->validate(aProjectionFeature);
+
   // if projection feature has not been created, exit
   AttributeRefAttrPtr aRefAttr = aProjectionFeature->data()->refattr(
     SketchPlugin_Projection::PROJECTED_FEATURE_ID());
-  if (!aRefAttr || !aRefAttr->isInitialized())
+  if (!isValid || !aRefAttr || !aRefAttr->isInitialized())
   {
     // remove external feature if the attribute is not filled
     std::set<FeaturePtr> aFeatures;
index 9feba7df8772bba8cba3aa638643262b508a9bee..b09094fd5245d3a154608984283ea301650756fc 100644 (file)
@@ -62,6 +62,7 @@
 #include <GeomAlgoAPI_EdgeBuilder.h>
 #include <GeomAlgoAPI_ShapeTools.h>
 
+#include <GeomAPI_BSpline.h>
 #include <GeomAPI_Circ.h>
 #include <GeomAPI_Dir2d.h>
 #include <GeomAPI_Ellipse.h>
@@ -1246,6 +1247,31 @@ bool SketchPlugin_ProjectionValidator::isValid(const AttributePtr& theAttribute,
       theError.arg(anEdge->isClosed() ? "Error: Ellipse is orthogonal to the sketch plane."
                                       : "Error: Elliptic Arc is orthogonal to the sketch plane.");
   }
+  else if (anEdge->isBSpline()) {
+    // check B-spline is periodic and planar
+    std::shared_ptr<GeomAPI_Curve> aCurve(new GeomAPI_Curve(anEdge));
+    std::shared_ptr<GeomAPI_BSpline> aBSpline(new GeomAPI_BSpline(aCurve));
+    if (aBSpline->isPeriodic()) {
+      GeomPlanePtr aBSplinePlane = GeomAlgoAPI_ShapeTools::findPlane(ListOfShape(1, anEdge));
+      if (aBSplinePlane) {
+        std::shared_ptr<GeomAPI_Dir> aBSplineNormal = aBSplinePlane->direction();
+        double aDot = fabs(aNormal->dot(aBSplineNormal));
+        aValid = fabs(aDot - 1.0) <= tolerance * tolerance;
+        if (!aValid) {
+          // B-spline's plane is orthogonal to the sketch plane,
+          // thus, need to check whether B-spline is planar.
+          std::list<GeomPointPtr> aPoles = aBSpline->poles();
+          for (std::list<GeomPointPtr>::iterator it = aPoles.begin();
+            it != aPoles.end() && !aValid; ++it) {
+            if (aBSplinePlane->distance(*it) > tolerance)
+              aValid = true; // non-planar B-spline curve
+          }
+          if (!aValid)
+            theError = "Error: Periodic B-spline is orthogonal to the sketch plane.";
+        }
+      }
+    }
+  }
 
   return aValid;
 }
index 5dd2eaa01fc945eaaaeb20aa1e60cb458fcaf672..b2271f3eaf956b761204531293791f1ab20571d8 100644 (file)
       <source>Error: Elliptic Arc is orthogonal to the sketch plane.</source>
       <translation>Error: Elliptic Arc is orthogonal to the sketch plane.</translation>
     </message>
+    <message>
+      <source>Error: Periodic B-spline is orthogonal to the sketch plane.</source>
+      <translation>Error: Periodic B-spline is orthogonal to the sketch plane.</translation>
+    </message>
     <message>
       <source>Error: Selected object is not supported for projection.</source>
       <translation>Error: Selected object is not supported for projection.</translation>
index 86f682282b786fc9a6225b2091549c988ea142b3..369a4050f432c4d39c458981f840a1b2f82fd2c3 100644 (file)
       <source>Error: Elliptic Arc is orthogonal to the sketch plane.</source>
       <translation>Erreur: L&apos;arc d&apos;ellipse est orthogonal au plan d&apos;esquisse.</translation>
     </message>
+    <message>
+      <source>Error: Periodic B-spline is orthogonal to the sketch plane.</source>
+      <translation>Erreur: La B-spline périodique est orthogonale au plan d&apos;esquisse.</translation>
+    </message>
     <message>
       <source>Error: Selected object is not supported for projection.</source>
       <translation>Erreur: L&apos;objet sélectionné n&apos;est pas pris en charge pour la projection.</translation>