const Standard_Boolean Thickening)
{
myOffset = Offset;
- myShape = S;
+
+ // Copy object and store bijection.
+ myInitShape = S;
+ myCopy.Perform(myInitShape);
+ myShape = myCopy.Shape();
+
myTol = Tol;
myMode = Mode;
myInter = Inter;
//purpose :
//=======================================================================
-void BRepOffset_MakeOffset::AddFace(const TopoDS_Face& F) {
- myFaces.Add(F);
+void BRepOffset_MakeOffset::AddFace(const TopoDS_Face& F)
+{
+ TopoDS_Shape aF = GetInitImage(F);
+ myFaces.Add(aF);
//-------------
// MAJ SD.
//-------------
- myInitOffsetFace.SetRoot (F) ;
- myInitOffsetFace.Bind (F,F);
- myImageOffset.SetRoot (F) ;
+ myInitOffsetFace.SetRoot (aF) ;
+ myInitOffsetFace.Bind (aF,aF);
+ myImageOffset.SetRoot (aF) ;
}
//=======================================================================
void BRepOffset_MakeOffset::SetOffsetOnFace(const TopoDS_Face& F,
const Standard_Real Off)
{
- if ( myFaceOffset.IsBound(F)) myFaceOffset.UnBind(F);
- myFaceOffset.Bind(F,Off);
+ TopoDS_Shape aF = GetInitImage(F);
+ if ( myFaceOffset.IsBound(aF)) myFaceOffset.UnBind(aF);
+ myFaceOffset.Bind(aF,Off);
}
//=======================================================================
//purpose :
//=======================================================================
-static void RemoveCorks (TopoDS_Shape& S,
- TopTools_IndexedMapOfShape& Faces)
+static void RemoveCorks(TopoDS_Shape& S,
+ TopTools_IndexedMapOfShape& Faces)
{
TopoDS_Compound SS;
BRep_Builder B;
//------------------------------------------
// Construction of myShape without caps.
//------------------------------------------
+
if(!myFaces.IsEmpty())
{
RemoveCorks (myShape,myFaces);
}
theSol = aNewSol;
}
+//=======================================================================
+//function : GetInitImage
+//purpose :
+//=======================================================================
+TopoDS_Shape BRepOffset_MakeOffset::GetInitImage(const TopoDS_Shape& theShape)
+{
+ return myCopy.Modified(theShape).First();
+}
\ No newline at end of file
#include <BRepOffset_MakeLoops.hxx>
#include <TopTools_MapOfShape.hxx>
#include <BRepOffset_DataMapOfShapeOffset.hxx>
+#include <BRepBuilderAPI_Copy.hxx>
class BRepAlgo_AsDes;
class TopoDS_Shape;
class TopoDS_Face;
//! Returns the list of closing faces stores by AddFace
Standard_EXPORT const TopTools_IndexedMapOfShape& ClosingFaces() const;
+ //! Returns image of input shape for history support.
+ Standard_EXPORT TopoDS_Shape GetInitImage(const TopoDS_Shape& theShape);
Standard_Real myOffset;
Standard_Real myTol;
- TopoDS_Shape myShape;
+ TopoDS_Shape myShape; // shape for modifications.
+ TopoDS_Shape myInitShape; // Init shape.
+ BRepBuilderAPI_Copy myCopy; // Stored to get bijection between items in myInitShape and myShape.
BRepOffset_Mode myMode;
Standard_Boolean myInter;
Standard_Boolean mySelfInter;
{
myGenerated.Clear();
- if (!myOffsetShape.ClosingFaces().Contains(S)) {
- myOffsetShape.OffsetFacesFromShapes ().LastImage (S, myGenerated);
+ if (!myOffsetShape.ClosingFaces().Contains(S))
+ {
+ TopoDS_Shape aImShape = myOffsetShape.GetInitImage(S);
+ myOffsetShape.OffsetFacesFromShapes().LastImage (aImShape, myGenerated);
- if (!myOffsetShape.ClosingFaces().IsEmpty()) {
+ if (!myOffsetShape.ClosingFaces().IsEmpty())
+ {
// Reverse generated shapes in case of small solids.
// Useful only for faces without influence on others.
TopTools_ListIteratorOfListOfShape it(myGenerated);
for (; it.More(); it.Next())
- it.Value().Reverse();
+ it.Value().Reverse();
}
}
return myGenerated;
{
myGenerated.Clear();
- myOffsetShape.OffsetEdgesFromShapes ().LastImage (S, myGenerated);
+ TopoDS_Shape aImShape = myOffsetShape.GetInitImage(S);
+ myOffsetShape.OffsetEdgesFromShapes ().LastImage (aImShape, myGenerated);
if (!myGenerated.IsEmpty()) {
if (S.IsSame(myGenerated.First()))