0024890: Result of uniform scaling is invalid
[occt.git] / src / BRepBuilderAPI / BRepBuilderAPI_NurbsConvert.cxx
index 9d9550b..a130f82 100644 (file)
@@ -61,7 +61,138 @@ void BRepBuilderAPI_NurbsConvert::Perform(const TopoDS_Shape& S,
   Handle(BRepTools_NurbsConvertModification) theModif = 
     Handle(BRepTools_NurbsConvertModification)::DownCast(myModification);
   DoModif(S,myModification);
+  CorrectVertexTol();
 }
 
 
+//=======================================================================
+//function : CorrectVertexTol
+//purpose  : 
+//=======================================================================
+
+void BRepBuilderAPI_NurbsConvert::CorrectVertexTol()
+{
+  TopTools_MapOfShape anInitVertices;
+  TopExp_Explorer anExp(myInitialShape, TopAbs_VERTEX);
+  for(; anExp.More(); anExp.Next())
+  {
+    anInitVertices.Add(anExp.Current());
+  }
+  //
+  Handle(BRepTools_NurbsConvertModification) aModif = 
+    Handle(BRepTools_NurbsConvertModification)::DownCast(myModification);
 
+  BRep_Builder aBB;
+  myVtxToReplace.Clear();
+  TopTools_ListIteratorOfListOfShape anEIter(aModif->GetUpdatedEdges());
+  for(; anEIter.More(); anEIter.Next())
+  {
+    const TopoDS_Shape& anE = anEIter.Value();
+    //
+    Standard_Real anETol = BRep_Tool::Tolerance(TopoDS::Edge(anE));
+    TopoDS_Iterator anIter(anE);
+    for(; anIter.More(); anIter.Next())
+    {
+      const TopoDS_Vertex& aVtx = TopoDS::Vertex(anIter.Value());
+      if(anInitVertices.Contains(aVtx))
+      {
+        if(myVtxToReplace.IsBound(aVtx))
+        {
+          aBB.UpdateVertex(TopoDS::Vertex(myVtxToReplace(aVtx)), anETol + Epsilon(anETol));
+        }
+        else
+        {
+          Standard_Real aVTol = BRep_Tool::Tolerance(aVtx);
+          if(aVTol < anETol)
+          {
+            TopoDS_Vertex aNewVtx;
+            gp_Pnt aVPnt = BRep_Tool::Pnt(aVtx);
+            aBB.MakeVertex(aNewVtx, aVPnt,anETol + Epsilon(anETol));
+            aNewVtx.Orientation(aVtx.Orientation());
+            myVtxToReplace.Bind(aVtx, aNewVtx);
+          }
+        }
+      }
+      else
+      {
+        aBB.UpdateVertex(aVtx, anETol + Epsilon(anETol));
+      }
+    }
+  }
+  //
+  if(myVtxToReplace.IsEmpty())
+  {
+    return;
+  }
+  //
+  mySubs.Clear();
+  TopTools_DataMapIteratorOfDataMapOfShapeShape anIter(myVtxToReplace);
+  for(; anIter.More(); anIter.Next())
+  {
+    mySubs.Replace(anIter.Key(), anIter.Value());
+  }
+  mySubs.Apply( myShape );
+  myShape = mySubs.Value(myShape);
+  //
+}
+
+//=======================================================================
+//function : ModifiedShape
+//purpose  : 
+//=======================================================================
+
+TopoDS_Shape BRepBuilderAPI_NurbsConvert::ModifiedShape
+                                           (const TopoDS_Shape& S) const
+{
+ if(S.ShapeType() == TopAbs_VERTEX)
+ {
+   if(myVtxToReplace.IsBound(S))
+   {
+     return myVtxToReplace(S);
+   }
+ }
+ if(myVtxToReplace.IsEmpty())
+ {
+  return myModifier.ModifiedShape(S);
+ }
+ else
+ {
+   const TopoDS_Shape& aNS = myModifier.ModifiedShape(S);
+   return mySubs.Value(aNS);
+ }
+}
+
+//=======================================================================
+//function : Modified
+//purpose  : 
+//=======================================================================
+
+const TopTools_ListOfShape& BRepBuilderAPI_NurbsConvert::Modified
+                                                  (const TopoDS_Shape& F)
+{
+  myGenerated.Clear();
+  if(F.ShapeType() == TopAbs_VERTEX)
+  {
+    if(myVtxToReplace.IsBound(F))
+    {
+      myGenerated.Append(myVtxToReplace(F));
+    }
+    else
+    {
+      myGenerated.Append(myModifier.ModifiedShape(F));
+    }
+  }
+  else
+  {
+    if(myVtxToReplace.IsEmpty())
+    {
+      myGenerated.Append(myModifier.ModifiedShape(F));
+    }
+    else
+    {
+      const TopoDS_Shape& aNS = myModifier.ModifiedShape(F);
+      myGenerated.Append(mySubs.Value(aNS));
+    }
+  }
+  return myGenerated;
+}