1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

Prototype the possibility to extend the 3D Offset algorithm to set the new face manually.

This commit is contained in:
emv
2017-07-07 16:49:23 +03:00
parent f07607c16b
commit efecdc4ba8
7 changed files with 150 additions and 51 deletions

View 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;
}
}

View 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,

View 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;

View 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);

View 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.

View File

@@ -84,6 +84,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();
Standard_EXPORT void MakeThickSolid();
@@ -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

View 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);