]> OCCT Git - occt-copy.git/commitdiff
Prototype the possibility to extend the 3D Offset algorithm to set the new face manually.
authoremv <emv@opencascade.com>
Fri, 7 Jul 2017 13:49:23 +0000 (16:49 +0300)
committeremv <emv@opencascade.com>
Fri, 7 Jul 2017 13:49:23 +0000 (16:49 +0300)
src/BRepOffset/BRepOffset_Inter2d.cxx
src/BRepOffset/BRepOffset_Inter2d.hxx
src/BRepOffset/BRepOffset_Inter3d.cxx
src/BRepOffset/BRepOffset_Inter3d.hxx
src/BRepOffset/BRepOffset_MakeOffset.cxx
src/BRepOffset/BRepOffset_MakeOffset.hxx
src/BRepTest/BRepTest_FeatureCommands.cxx

index c559e96d2fbaf64123f52e864bfb854e9c8703e2..9a7b424868f177392f0c2553e0ef079c5e2921fa 100644 (file)
@@ -1386,6 +1386,7 @@ void BRepOffset_Inter2d::Compute (const Handle(BRepAlgo_AsDes)&     AsDes,
 void BRepOffset_Inter2d::ConnexIntByInt
 (const TopoDS_Face&            FI,
  BRepOffset_Offset&            OFI,
+ const TopoDS_Face&            FIO,
  TopTools_DataMapOfShapeShape& MES,
  const TopTools_DataMapOfShapeShape& Build,
  const Handle(BRepAlgo_AsDes)& AsDes,
@@ -1415,22 +1416,20 @@ void BRepOffset_Inter2d::ConnexIntByInt
     if (YaBuild) {
       for (itL.Initialize(L); itL.More(); itL.Next()) {
         const TopoDS_Edge& EI = TopoDS::Edge(itL.Value());
-        TopoDS_Shape aLocalShape = OFI.Generated(EI);
-        const TopoDS_Edge& OE = TopoDS::Edge(aLocalShape);
-//        const TopoDS_Edge& OE = TopoDS::Edge(OFI.Generated(EI));
-        if (!MES.IsBound(OE) && !Build.IsBound(EI)) {
-//  Modified by skv - Fri Dec 26 16:59:52 2003 OCC4455 Begin
-//          ExtentEdge(OE,NE);
-          ExtentEdge(OE,NE, Offset);
-//  Modified by skv - Fri Dec 26 16:59:54 2003 OCC4455 End
-          MES.Bind  (OE,NE);
+        if (!Build.IsBound(EI)) {
+          TopoDS_Shape aLocalShape = OFI.Generated(EI);
+          const TopoDS_Edge& OE = TopoDS::Edge(aLocalShape);
+          if (!MES.IsBound(OE)) {
+            ExtentEdge(OE,NE, Offset);
+            MES.Bind  (OE,NE);
+          }
         }
       }
     } 
   }
   
-  TopoDS_Face           FIO = TopoDS::Face(OFI.Face());
-  if (MES.IsBound(FIO)) FIO = TopoDS::Face(MES(FIO));
+  //TopoDS_Face           FIO = TopoDS::Face(OFI.Face());
+  //if (MES.IsBound(FIO)) FIO = TopoDS::Face(MES(FIO));
   //
   TopTools_MapOfShape aME;
   const TopTools_ListOfShape& aLE = AsDes->Descendant(FIO);
@@ -1470,34 +1469,48 @@ void BRepOffset_Inter2d::ConnexIntByInt
       gp_Pnt Pref = BRep_Tool::Pnt(Vref);
       //IFV------------
 
-      TopoDS_Shape aLocalShape = OFI.Generated(CurE);
-      TopoDS_Edge CEO = TopoDS::Edge(aLocalShape);
-      aLocalShape = OFI.Generated(NextE);
-      TopoDS_Edge NEO = TopoDS::Edge(aLocalShape);
-//      TopoDS_Edge CEO = TopoDS::Edge(OFI.Generated(CurE));
-//      TopoDS_Edge NEO = TopoDS::Edge(OFI.Generated(NextE));
       //------------------------------------------
       // Inter processing of images of CurE NextE.
       //------------------------------------------
       TopTools_ListOfShape LV1,LV2;
-      Standard_Boolean     DoInter = 1;
       TopoDS_Shape         NE1,NE2;
-      
+      Standard_Boolean     DoInter = 0;
+
       if (Build.IsBound(CurE) && Build.IsBound(NextE)) {
         NE1 = Build(CurE );
         NE2 = Build(NextE);
-      }
-      else if (Build.IsBound(CurE) && MES.IsBound(NEO)) {
-         NE1 = Build(CurE);
-        NE2 = MES  (NEO);
-      }
-      else if (Build.IsBound(NextE) && MES.IsBound(CEO)) {
-        NE1 = Build(NextE);
-        NE2 = MES(CEO);
+        DoInter = 1;
       }
       else {
-        DoInter = 0;
+        TopoDS_Shape aLocalShape = OFI.Generated(CurE);
+        TopoDS_Edge CEO = TopoDS::Edge(aLocalShape);
+        aLocalShape = OFI.Generated(NextE);
+        TopoDS_Edge NEO = TopoDS::Edge(aLocalShape);
+        //
+        if (Build.IsBound(CurE) && MES.IsBound(NEO)) {
+          NE1 = Build(CurE);
+          NE2 = MES  (NEO);
+          DoInter = 1;
+        }
+        else if (Build.IsBound(NextE) && MES.IsBound(CEO)) {
+          NE1 = Build(NextE);
+          NE2 = MES(CEO);
+          DoInter = 1;
+        }
+        else {
+          if (MES.IsBound(CEO)) {
+            TopoDS_Vertex  V = CommonVertex(CEO,NEO); 
+            UpdateVertex  (V,CEO,TopoDS::Edge(MES(CEO)),Tol);
+            AsDes2d->Add     (MES(CEO),V);
+          }
+          else if (MES.IsBound(NEO)) {
+            TopoDS_Vertex V = CommonVertex(CEO,NEO); 
+            UpdateVertex (V,NEO,TopoDS::Edge(MES(NEO)),Tol);
+            AsDes2d->Add    (MES(NEO),V);
+          }
+        }
       }
+      //
       if (DoInter) {
         //------------------------------------
         // NE1,NE2 can be a compound of Edges.
@@ -1531,18 +1544,18 @@ void BRepOffset_Inter2d::ConnexIntByInt
           }
         }
       }
-      else {
-        if (MES.IsBound(CEO)) {
-          TopoDS_Vertex  V = CommonVertex(CEO,NEO); 
-          UpdateVertex  (V,CEO,TopoDS::Edge(MES(CEO)),Tol);
-          AsDes2d->Add     (MES(CEO),V);
-        }
-        else if (MES.IsBound(NEO)) {
-          TopoDS_Vertex V = CommonVertex(CEO,NEO); 
-          UpdateVertex (V,NEO,TopoDS::Edge(MES(NEO)),Tol);
-          AsDes2d->Add    (MES(NEO),V);
-        }
-      }
+      //else {
+      //  if (MES.IsBound(CEO)) {
+      //    TopoDS_Vertex  V = CommonVertex(CEO,NEO); 
+      //    UpdateVertex  (V,CEO,TopoDS::Edge(MES(CEO)),Tol);
+      //    AsDes2d->Add     (MES(CEO),V);
+      //  }
+      //  else if (MES.IsBound(NEO)) {
+      //    TopoDS_Vertex V = CommonVertex(CEO,NEO); 
+      //    UpdateVertex (V,NEO,TopoDS::Edge(MES(NEO)),Tol);
+      //    AsDes2d->Add    (MES(NEO),V);
+      //  }
+      //}
       CurE = NextE;
     }
   }
index 5254350863f6da5db6ed1ec29207fb68d3f0a371..c98a361392180e8c23ac9500b47c040524ab29b7 100644 (file)
@@ -59,6 +59,7 @@ public:
   //! theDMVV contains the vertices that should be fused.
   Standard_EXPORT static void ConnexIntByInt (const TopoDS_Face& FI, 
                                               BRepOffset_Offset& OFI, 
+                                              const TopoDS_Face& FIO,
                                               TopTools_DataMapOfShapeShape& MES, 
                                               const TopTools_DataMapOfShapeShape& Build, 
                                               const Handle(BRepAlgo_AsDes)& AsDes, 
index 02971539d28eb91aeb9bbb087f3d5d6e2630759b..205edb6eee17249ba8133abb26edf7835cfb14d4 100644 (file)
@@ -420,7 +420,7 @@ void BRepOffset_Inter3d::ConnexIntByArc(const TopTools_ListOfShape& /*SetOfFaces
 
 void BRepOffset_Inter3d::ConnexIntByInt
 (const TopoDS_Shape&                    SI,
- const BRepOffset_DataMapOfShapeOffset& MapSF,
+ const TopTools_DataMapOfShapeShape&    MapSF,
  const BRepOffset_Analyse&              Analyse,
  TopTools_DataMapOfShapeShape&          MES,
  TopTools_DataMapOfShapeShape&          Build,
@@ -543,8 +543,8 @@ void BRepOffset_Inter3d::ConnexIntByInt
       F1 = TopoDS::Face(itF1.Value());
       F2 = TopoDS::Face(itF2.Value());
       //
-      OF1 = TopoDS::Face(MapSF(F1).Face());
-      OF2 = TopoDS::Face(MapSF(F2).Face());
+      OF1 = TopoDS::Face(MapSF.Find(F1));
+      OF2 = TopoDS::Face(MapSF.Find(F2));
       if (!MES.IsBound(OF1)) {
         Standard_Boolean enlargeU = Standard_True;
         Standard_Boolean enlargeVfirst = Standard_True, enlargeVlast = Standard_True;
index e9607c89c5fefb47a8c05043507cb2f6817a236a..64a2163abf72e46a65a87e4d0b6cec070976c96e 100644 (file)
@@ -53,7 +53,7 @@ public:
   
   Standard_EXPORT void ConnexIntByArc (const TopTools_ListOfShape& SetOfFaces, const TopoDS_Shape& ShapeInit, const BRepOffset_Analyse& Analyse, const BRepAlgo_Image& InitOffsetFace);
   
-  Standard_EXPORT void ConnexIntByInt (const TopoDS_Shape& SI, const BRepOffset_DataMapOfShapeOffset& MapSF, const BRepOffset_Analyse& A, TopTools_DataMapOfShapeShape& MES, TopTools_DataMapOfShapeShape& Build, TopTools_ListOfShape& Failed, const Standard_Boolean bIsPlanar = Standard_False);
+  Standard_EXPORT void ConnexIntByInt (const TopoDS_Shape& SI, const TopTools_DataMapOfShapeShape& MapSF, const BRepOffset_Analyse& A, TopTools_DataMapOfShapeShape& MES, TopTools_DataMapOfShapeShape& Build, TopTools_ListOfShape& Failed, const Standard_Boolean bIsPlanar = Standard_False);
   
   Standard_EXPORT void ContextIntByInt (const TopTools_IndexedMapOfShape& ContextFaces, const Standard_Boolean ExtentContext, const BRepOffset_DataMapOfShapeOffset& MapSF, const BRepOffset_Analyse& A, TopTools_DataMapOfShapeShape& MES, TopTools_DataMapOfShapeShape& Build, TopTools_ListOfShape& Failed, const Standard_Boolean bIsPlanar = Standard_False);
   
index 8fa0fd15cc6c9633e5522666b9f0136827587cab..7f22b2261718024aa01ef7c14635cceb05850405 100644 (file)
@@ -670,6 +670,21 @@ void BRepOffset_MakeOffset::SetOffsetOnFace(const TopoDS_Face&  F,
   myFaceOffset.Bind(F,Off);
 }
 
+//=======================================================================
+//function : SetOffsetFace
+//purpose  : 
+//=======================================================================
+void BRepOffset_MakeOffset::SetOffsetFace(const TopoDS_Face& F,
+                                          const TopoDS_Face& OF)
+{
+  // Check the orientation of the offset face and make
+  // it oriented the same way as original
+  Handle(IntTools_Context) aCtx = new IntTools_Context;
+  Standard_Boolean bToReverse = BOPTools_AlgoTools::IsSplitToReverse(F, OF, aCtx);
+  TopoDS_Face anOffsetFace = bToReverse ? TopoDS::Face(OF.Reversed()) : OF;
+  myMapFaceOffsetFace.Bind(F, anOffsetFace);
+}
+
 //=======================================================================
 //function : RemoveCorks
 //purpose  : 
@@ -1113,6 +1128,9 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
 #endif
 
   BRepOffset_DataMapOfShapeOffset MapSF;
+  TopTools_DataMapOfShapeShape aMapFaceOffsetFace;
+  // MES   : Map of OffsetShape -> Extended Shapes.
+  TopTools_DataMapOfShapeShape MES;
   TopTools_MapOfShape             Done;
   Standard_Boolean OffsetOutside = (myOffset > 0.)? Standard_True : Standard_False;
   //--------------------------------------------------------
@@ -1127,6 +1145,15 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   TopTools_DataMapOfShapeShape ShapeTgt;
   for (itLF.Initialize(LF); itLF.More(); itLF.Next()) {
     const TopoDS_Face&   F = TopoDS::Face(itLF.Value());
+    const TopoDS_Shape* pOFace = myMapFaceOffsetFace.Seek(F);
+    if (pOFace) {
+      // avoid creation of the new offset face
+      // if it was already given by the user
+      aMapFaceOffsetFace.Bind(F, *pOFace);
+      MES.Bind(*pOFace, *pOFace);
+      continue;
+    }
+
     Standard_Real CurOffset = myOffset;
     if (myFaceOffset.IsBound(F)) CurOffset = myFaceOffset(F);
     BRepOffset_Offset    OF(F,CurOffset,ShapeTgt,OffsetOutside,myJoin);
@@ -1161,13 +1188,12 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
       }
     }
     MapSF.Bind(F,OF);
+    aMapFaceOffsetFace.Bind(F, OF.Face());
   }
   //--------------------------------------------------------------------
-  // MES   : Map of OffsetShape -> Extended Shapes.
   // Build : Map of Initial SS  -> OffsetShape build by Inter.
   //                               can be an edge or a compound of edges       
   //---------------------------------------------------------------------
-  TopTools_DataMapOfShapeShape MES;  
   TopTools_DataMapOfShapeShape Build; 
   TopTools_ListOfShape         Failed;
   TopAbs_State                 Side = TopAbs_IN;  
@@ -1181,7 +1207,7 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
 
   BRepOffset_Inter3d Inter3 (AsDes,Side,myTol);
   // Intersection between parallel faces
-  Inter3.ConnexIntByInt(myShape,MapSF,myAnalyse,MES,Build,Failed,myIsPlanar);
+  Inter3.ConnexIntByInt(myShape,aMapFaceOffsetFace,myAnalyse,MES,Build,Failed,myIsPlanar);
   // Intersection with caps.
   Inter3.ContextIntByInt(myFaces,ExtentContext,MapSF,myAnalyse,MES,Build,Failed,myIsPlanar);
 
@@ -1195,7 +1221,19 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   {
     const TopoDS_Face& FI = TopoDS::Face(Exp.Current());
     Standard_Real aCurrFaceTol = BRep_Tool::Tolerance(FI);
-    BRepOffset_Inter2d::ConnexIntByInt (FI, MapSF(FI), MES, Build, 
+
+    BRepOffset_Offset OFI;
+    TopoDS_Face           FIO;
+    if (myMapFaceOffsetFace.IsBound(FI)) {
+      FIO = TopoDS::Face(myMapFaceOffsetFace.Find(FI));
+    }
+    else {
+      OFI = MapSF(FI);
+      FIO = TopoDS::Face(OFI.Face());
+      if (MES.IsBound(FIO)) FIO = TopoDS::Face(MES(FIO));
+    }
+
+    BRepOffset_Inter2d::ConnexIntByInt (FI, OFI, FIO, MES, Build, 
                                         AsDes, AsDes2d, myOffset, aCurrFaceTol, aDMVV);
   }
   //
@@ -1213,7 +1251,7 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   
   for (Exp.Init(myShape,TopAbs_FACE) ; Exp.More(); Exp.Next()) {
     const TopoDS_Face& FI = TopoDS::Face(Exp.Current());
-    NF = MapSF(FI).Face();
+    NF = TopoDS::Face(myMapFaceOffsetFace.IsBound(FI) ? myMapFaceOffsetFace.Find(FI) : MapSF(FI).Face());
     if (MES.IsBound(NF)) {
       NF = TopoDS::Face(MES(NF));
     }
@@ -1313,7 +1351,7 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   BRepAlgo_Image     IMOE;
   for (Exp.Init(myShape,TopAbs_FACE) ; Exp.More(); Exp.Next()) {
     const TopoDS_Shape& FI  = Exp.Current();
-    const TopoDS_Shape& OFI = MapSF(FI).Face();
+    const TopoDS_Shape& OFI = myMapFaceOffsetFace.IsBound(FI) ? myMapFaceOffsetFace.Find(FI) : MapSF(FI).Face();
     if (MES.IsBound(OFI)) {
       const TopoDS_Face& aLocalFace = TopoDS::Face(MES(OFI));
       LFE.Append(aLocalFace);
@@ -1393,7 +1431,8 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   for (Exp.Init(myShape,TopAbs_FACE) ; Exp.More(); Exp.Next()) {
     const TopoDS_Shape& FI   = Exp.Current();
     myInitOffsetFace.SetRoot(FI);
-    TopoDS_Face  OF  = MapSF(FI).Face();
+    TopoDS_Face OF = TopoDS::Face(myMapFaceOffsetFace.IsBound(FI) ? myMapFaceOffsetFace.Find(FI) : MapSF(FI).Face());
+    //    TopoDS_Face  OF  = MapSF(FI).Face();
     if (MES.IsBound(OF)) {
       OF = TopoDS::Face(MES(OF));
       if (IMOE.HasImage(OF)) {
@@ -4207,6 +4246,24 @@ Standard_Boolean BRepOffset_MakeOffset::CheckInputData()
       }
     }
 
+    if (!isFound)
+    {
+      // Check the availability of the user-defined modifications
+      TopTools_IndexedMapOfShape aMF;
+      TopExp::MapShapes(myShape, TopAbs_FACE, aMF);
+      TopTools_DataMapIteratorOfDataMapOfShapeShape anSSIter(myMapFaceOffsetFace);
+      for (; anSSIter.More(); anSSIter.Next())
+      {
+        const TopoDS_Shape& aFace = anSSIter.Key();
+        const TopoDS_Shape& anOffsetFace = anSSIter.Value();
+        if (aMF.Contains(aFace) && !anOffsetFace.IsNull())
+        {
+          isFound = Standard_True;
+          break;
+        }
+      }
+    }
+    //
     if (!isFound)
     {
       // No face with non-null offset found.
index 4af6b24c05ec920b24ddf89756ad4389bff70636..4e0b3f72f30b02379078439880845c295001389f 100644 (file)
@@ -83,6 +83,9 @@ public:
   
   //! set the offset <Off> on the Face <F>
   Standard_EXPORT void SetOffsetOnFace (const TopoDS_Face& F, const Standard_Real Off);
+
+  //! Sets the offset face for the face in the shape.
+  Standard_EXPORT void SetOffsetFace (const TopoDS_Face& F, const TopoDS_Face& OF);
   
   Standard_EXPORT void MakeOffsetShape();
   
@@ -205,6 +208,7 @@ private:
   Standard_Boolean myIsPlanar;
   TopoDS_Shape myBadShape;
 
+  TopTools_DataMapOfShapeShape myMapFaceOffsetFace; // map of the face - extended offset face
 };
 
 #endif // _BRepOffset_MakeOffset_HeaderFile
index a7431744c2ad8d72365fbf8de10029242ebf7d2e..ef2ab2976896df9d50395f2bfac621b3f4130543 100644 (file)
@@ -1116,6 +1116,26 @@ Standard_Integer offsetonface(Draw_Interpretor&, Standard_Integer n, const char*
   return 0;
 }
 
+//=======================================================================
+//function : addoffsetface
+//purpose  : 
+//=======================================================================
+static Standard_Integer addoffsetface(Draw_Interpretor&, Standard_Integer n, const char** a)
+{
+  if ( n < 3) return 1;
+
+  for (Standard_Integer i = 1 ; i < n; i+=2) {
+    TopoDS_Shape  SF  = DBRep::Get(a[i],TopAbs_FACE);
+    if (!SF.IsNull()) {
+      TopoDS_Shape  OF  = DBRep::Get(a[i+1],TopAbs_FACE);
+      if (!OF.IsNull()) {
+        TheOffset.SetOffsetFace(TopoDS::Face(SF), TopoDS::Face(OF));
+      }
+    }
+  }
+  
+  return 0;
+}
 //=======================================================================
 //function : offsetperform
 //purpose  : 
@@ -2338,6 +2358,10 @@ void BRepTest::FeatureCommands (Draw_Interpretor& theCommands)
                  "offsetonface face1 offset1 face2 offset2 ...",
                  __FILE__,offsetonface,g);
 
+  theCommands.Add("addoffsetface",
+                 "addoffsetface face1 offset_face1 face2 offset_face2 ...",
+                 __FILE__,addoffsetface,g);
+
   theCommands.Add("offsetperform",
                  "offsetperform result",
                  __FILE__,offsetperform,g);