From: emv Date: Fri, 7 Jul 2017 13:49:23 +0000 (+0300) Subject: Prototype the possibility to extend the 3D Offset algorithm to set the new face manually. X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=efecdc4ba836c763bd8d1712dd06e17f5167fcf2;p=occt-copy.git Prototype the possibility to extend the 3D Offset algorithm to set the new face manually. --- diff --git a/src/BRepOffset/BRepOffset_Inter2d.cxx b/src/BRepOffset/BRepOffset_Inter2d.cxx index c559e96d2f..9a7b424868 100644 --- a/src/BRepOffset/BRepOffset_Inter2d.cxx +++ b/src/BRepOffset/BRepOffset_Inter2d.cxx @@ -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; } } diff --git a/src/BRepOffset/BRepOffset_Inter2d.hxx b/src/BRepOffset/BRepOffset_Inter2d.hxx index 5254350863..c98a361392 100644 --- a/src/BRepOffset/BRepOffset_Inter2d.hxx +++ b/src/BRepOffset/BRepOffset_Inter2d.hxx @@ -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, diff --git a/src/BRepOffset/BRepOffset_Inter3d.cxx b/src/BRepOffset/BRepOffset_Inter3d.cxx index 02971539d2..205edb6eee 100644 --- a/src/BRepOffset/BRepOffset_Inter3d.cxx +++ b/src/BRepOffset/BRepOffset_Inter3d.cxx @@ -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; diff --git a/src/BRepOffset/BRepOffset_Inter3d.hxx b/src/BRepOffset/BRepOffset_Inter3d.hxx index e9607c89c5..64a2163abf 100644 --- a/src/BRepOffset/BRepOffset_Inter3d.hxx +++ b/src/BRepOffset/BRepOffset_Inter3d.hxx @@ -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); diff --git a/src/BRepOffset/BRepOffset_MakeOffset.cxx b/src/BRepOffset/BRepOffset_MakeOffset.cxx index 8fa0fd15cc..7f22b22617 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset.cxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.cxx @@ -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. diff --git a/src/BRepOffset/BRepOffset_MakeOffset.hxx b/src/BRepOffset/BRepOffset_MakeOffset.hxx index 4af6b24c05..4e0b3f72f3 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset.hxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.hxx @@ -83,6 +83,9 @@ public: //! set the offset on the Face 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 diff --git a/src/BRepTest/BRepTest_FeatureCommands.cxx b/src/BRepTest/BRepTest_FeatureCommands.cxx index a7431744c2..ef2ab29768 100644 --- a/src/BRepTest/BRepTest_FeatureCommands.cxx +++ b/src/BRepTest/BRepTest_FeatureCommands.cxx @@ -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);