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,
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);
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.
}
}
}
- 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;
}
}
//! 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,
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,
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;
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);
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 :
#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;
//--------------------------------------------------------
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);
}
}
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;
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);
{
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);
}
//
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));
}
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);
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)) {
}
}
+ 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.
//! 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();
Standard_Boolean myIsPlanar;
TopoDS_Shape myBadShape;
+ TopTools_DataMapOfShapeShape myMapFaceOffsetFace; // map of the face - extended offset face
};
#endif // _BRepOffset_MakeOffset_HeaderFile
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 :
"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);