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:
@@ -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());
|
||||
if (!Build.IsBound(EI)) {
|
||||
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);
|
||||
if (!MES.IsBound(OE)) {
|
||||
ExtentEdge(OE,NE, Offset);
|
||||
// Modified by skv - Fri Dec 26 16:59:54 2003 OCC4455 End
|
||||
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);
|
||||
DoInter = 1;
|
||||
}
|
||||
else if (Build.IsBound(CurE) && MES.IsBound(NEO)) {
|
||||
else {
|
||||
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 {
|
||||
DoInter = 0;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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.
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user