mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-29 14:00:49 +03:00
comments
This commit is contained in:
@@ -145,7 +145,8 @@ static Standard_Integer NbBISSEC = 0;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct TopoLink
|
||||
//! This struct defines link (i.e. edge) with its vertices and first derivative of pcurves on the both tails of the edge
|
||||
struct TopoLink
|
||||
{
|
||||
TopoDS_Vertex myFV;
|
||||
TopoDS_Vertex myLV;
|
||||
@@ -155,14 +156,17 @@ struct TopoLink
|
||||
|
||||
typedef NCollection_UBTree <Standard_Integer, Bnd_Box2d> BRepFill_BndBoxTree;
|
||||
|
||||
|
||||
//! This class is used to select overlapping 2d boxes, stored in NCollection::UBTree
|
||||
class BRepFill_BndBoxTreeSelector : public BRepFill_BndBoxTree::Selector
|
||||
{
|
||||
public:
|
||||
//! Defines "edge in intersection" info
|
||||
struct EdgeParam
|
||||
{
|
||||
TopoDS_Edge myEdgeInt;
|
||||
double myParamInt;
|
||||
TopoDS_Vertex myIntVertex;
|
||||
TopoDS_Edge myEdgeInt; //edge in intersection
|
||||
double myParamInt; // parameter on the edge
|
||||
TopoDS_Vertex myIntVertex; // Vertex of the intersection point
|
||||
};
|
||||
|
||||
public:
|
||||
@@ -179,13 +183,14 @@ public:
|
||||
|
||||
Standard_Boolean Accept (const Standard_Integer& theObj)
|
||||
{
|
||||
//intersection between bounding boxes was found, try to find intersection of edges
|
||||
NCollection_List<NCollection_Array1<int>>::Iterator It(myEdgeIndexes);
|
||||
for (; It.More(); It.Next())
|
||||
{
|
||||
if (It.Value()(1) == myCInd && It.Value()(2) == theObj)
|
||||
if (It.Value()(1) == myCInd && It.Value()(2) == theObj) //skip already computed intersections
|
||||
return Standard_False;
|
||||
}
|
||||
if (theObj != myCInd)
|
||||
if (theObj != myCInd) //try to find intersection between two given edges
|
||||
{
|
||||
TopoDS_Edge E1 = TopoDS::Edge(mySeqOfEdges(theObj));
|
||||
TopoDS_Edge E2 = TopoDS::Edge(mySeqOfEdges(myCInd));
|
||||
@@ -208,7 +213,7 @@ public:
|
||||
double prec = 1e-5;
|
||||
if (f + prec < Param1 && Param1 < l - prec && f2 + prec < Param2 && Param2 < l2 - prec)
|
||||
{
|
||||
|
||||
// Save result of intersection to the map (edge -> seq. of parameters on it)
|
||||
if (!myOutMapOfResult.IsBound(E1))
|
||||
{
|
||||
NCollection_Sequence<double> SeqOfParams;
|
||||
@@ -236,6 +241,7 @@ public:
|
||||
}
|
||||
TopoDS_Vertex V;
|
||||
|
||||
// Make vertex from intersection point
|
||||
double f_1, f_2, l_1, l_2;
|
||||
TopLoc_Location Loc1, Loc2;
|
||||
gp_Pnt p3d1, p3d2;
|
||||
@@ -247,7 +253,7 @@ public:
|
||||
p3d1.Transform(Loc1.Transformation());
|
||||
if (!Loc2.IsIdentity())
|
||||
p3d2.Transform(Loc2.Transformation());
|
||||
gp_Pnt IntPnt((p3d1.X() + p3d2.X())/2., (p3d1.Y() + p3d2.Y())/2., (p3d1.Z() + p3d2.Z())/2.);
|
||||
gp_Pnt IntPnt((p3d1.X() + p3d2.X())/2., (p3d1.Y() + p3d2.Y())/2., (p3d1.Z() + p3d2.Z())/2.); //middle point of two intersection points of edge1 & edge2
|
||||
double TolE1 = BRep_Tool::Tolerance(E1);
|
||||
double TolE2 = BRep_Tool::Tolerance(E2);
|
||||
|
||||
@@ -280,7 +286,7 @@ public:
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
else //try to find self-intersection of edge
|
||||
{
|
||||
TopoDS_Edge E1 = TopoDS::Edge(mySeqOfEdges(theObj));
|
||||
{
|
||||
@@ -298,6 +304,7 @@ public:
|
||||
double prec = 1e-5;
|
||||
if (f + prec < Param1 && Param1 < l - prec && f + prec < Param2 && Param2 < l - prec)
|
||||
{
|
||||
// Save result of intersection to the map (edge -> seq. of parameters on it)
|
||||
if (!myOutMapOfResult.IsBound(E1))
|
||||
{
|
||||
NCollection_Sequence<double> SeqOfParams;
|
||||
@@ -313,6 +320,7 @@ public:
|
||||
myOutMapOfResult.Bind(E1, Val);
|
||||
}
|
||||
|
||||
// Make vertex from intersection point
|
||||
TopoDS_Vertex V;
|
||||
|
||||
double f_1, l_1 ;
|
||||
@@ -377,13 +385,13 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
TopTools_SequenceOfShape& mySeqOfEdges;
|
||||
const TopoDS_Face& myWFace;
|
||||
NCollection_DataMap<TopoDS_Edge, NCollection_Sequence<double>> myOutMapOfResult;
|
||||
NCollection_List<BRepFill_BndBoxTreeSelector::EdgeParam> myListOfVertexEdgePar;
|
||||
TopTools_SequenceOfShape& mySeqOfEdges; //edges to be intersected with each other
|
||||
const TopoDS_Face& myWFace; //work spine face
|
||||
NCollection_DataMap<TopoDS_Edge, NCollection_Sequence<double>> myOutMapOfResult; // map "edge to it's intersection parameters"
|
||||
NCollection_List<BRepFill_BndBoxTreeSelector::EdgeParam> myListOfVertexEdgePar;
|
||||
Bnd_Box2d myCBox;
|
||||
int myCInd;
|
||||
NCollection_List<NCollection_Array1<int>> myEdgeIndexes;
|
||||
NCollection_List<NCollection_Array1<int>> myEdgeIndexes; //used to store already computed edge's indexes
|
||||
BRep_Builder myBuilder;
|
||||
};
|
||||
|
||||
@@ -402,6 +410,7 @@ public:
|
||||
//Poly_MakeLoops2D::Helper();
|
||||
};
|
||||
Poly_Helper(const Poly_Helper&);
|
||||
|
||||
virtual const Poly_MakeLoops2D::ListOfLink& GetAdjacentLinks (Standard_Integer theNode) const
|
||||
{
|
||||
return mymNode2ListOfLinks(theNode);
|
||||
@@ -421,11 +430,11 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
TopTools_IndexedMapOfShape& mymN2V;
|
||||
TopTools_IndexedDataMapOfShapeListOfShape& mymV2E;
|
||||
NCollection_DoubleMap<Poly_MakeLoops2D::Link, TopoDS_Edge>& mymPL2E;
|
||||
TopTools_IndexedMapOfShape& mymN2V; //map 'node to vertex'
|
||||
TopTools_IndexedDataMapOfShapeListOfShape& mymV2E;
|
||||
NCollection_DoubleMap<Poly_MakeLoops2D::Link, TopoDS_Edge>& mymPL2E; //map 'link to edge'
|
||||
NCollection_DataMap<TopoDS_Edge, TopoLink>& mymE2EInfo;
|
||||
const NCollection_DataMap<int, Poly_MakeLoops2D::ListOfLink>& mymNode2ListOfLinks;
|
||||
const NCollection_DataMap<int, Poly_MakeLoops2D::ListOfLink>& mymNode2ListOfLinks; //used internally by poly_makeloops algo
|
||||
|
||||
};
|
||||
|
||||
@@ -3065,13 +3074,14 @@ static void QuasiFleche(const Adaptor3d_Curve& C,
|
||||
}
|
||||
}
|
||||
|
||||
//! Used to remove loops from offset result
|
||||
static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpine, const Handle(Geom_Plane)& theRefPlane )
|
||||
{
|
||||
Handle(BRepTools_ReShape) ExtReShape = new BRepTools_ReShape;
|
||||
|
||||
TopExp_Explorer Exp( theInputSh, TopAbs_WIRE );
|
||||
|
||||
for (; Exp.More(); Exp.Next())
|
||||
for (; Exp.More(); Exp.Next())
|
||||
{
|
||||
Handle(BRepTools_ReShape) reshape = new BRepTools_ReShape;
|
||||
TopoDS_Wire InitialW = TopoDS::Wire( Exp.Current() );
|
||||
@@ -3084,13 +3094,17 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
for (; ExpE.More(); ExpE.Next())
|
||||
Seq.Append( ExpE.Current() );
|
||||
|
||||
NCollection_DataMap<TopoDS_Edge, NCollection_Sequence<double>> ME2IP;
|
||||
gp_Pln pl = theRefPlane->Pln();
|
||||
NCollection_DataMap<TopoDS_Edge, NCollection_Sequence<double>> ME2IP; //map edge to params on this edges
|
||||
gp_Pln pl = theRefPlane->Pln();
|
||||
|
||||
//Prepare UBTree filler
|
||||
// Used to speedup the intersection process by using overlapped 2d bounding boxes
|
||||
BRepFill_BndBoxTree aTree;
|
||||
NCollection_UBTreeFiller <Standard_Integer, Bnd_Box2d> aTreeFiller (aTree);
|
||||
|
||||
BRepFill_BndBoxTreeSelector aSelector(Seq, theWorkSpine);
|
||||
|
||||
// Prepare bounding boxes
|
||||
NCollection_Sequence<Bnd_Box2d> BndBoxesOfEdges;
|
||||
for (int i = 1; i <= Seq.Length(); i++)
|
||||
{
|
||||
@@ -3105,6 +3119,7 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
|
||||
aTreeFiller.Fill();
|
||||
|
||||
//Perform searching and intersecting of edges
|
||||
aSelector.ClearResult();
|
||||
for (int i = 1; i <= BndBoxesOfEdges.Size(); i++)
|
||||
{
|
||||
@@ -3112,31 +3127,33 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
aTree.Select(aSelector);
|
||||
}
|
||||
|
||||
aSelector.GetResult(ME2IP);
|
||||
aSelector.GetResult(ME2IP); //Retrieve result from algo
|
||||
NCollection_List<BRepFill_BndBoxTreeSelector::EdgeParam> LVEP;
|
||||
aSelector.GetListOfVertexEdgePar(LVEP);
|
||||
|
||||
if (ME2IP.IsEmpty())
|
||||
continue;
|
||||
continue; //if no intersection point => go to the next wire
|
||||
|
||||
TopTools_MapOfShape InterV;
|
||||
TopTools_IndexedMapOfShape EdgesInInter;
|
||||
|
||||
for (NCollection_DataMap<TopoDS_Edge, NCollection_Sequence<double>>::Iterator aMapIt (ME2IP); aMapIt.More(); aMapIt.Next())
|
||||
for (NCollection_DataMap<TopoDS_Edge, NCollection_Sequence<double>>::Iterator aMapIt (ME2IP); aMapIt.More(); aMapIt.Next())
|
||||
{
|
||||
TopoDS_Edge E = aMapIt.Key();
|
||||
NCollection_Sequence<double> Params = aMapIt.Value();
|
||||
NCollection_Sequence<double> Params = aMapIt.Value();
|
||||
Handle_Geom_Curve aCur;
|
||||
double f, l;
|
||||
aCur = BRep_Tool::Curve(E, f, l );
|
||||
|
||||
//prepare params on the edge
|
||||
NCollection_Sequence<double> ParamSeq;
|
||||
ParamSeq.Append(f);
|
||||
ParamSeq.Append(l);
|
||||
ParamSeq.Append(Params);
|
||||
|
||||
//sort parameters
|
||||
NCollection_QuickSort<NCollection_Sequence<double>, double>::Perform(ParamSeq, NCollection_Comparator<double>(), ParamSeq.Lower(), ParamSeq.Upper());
|
||||
NCollection_Sequence<TopoDS_Vertex> aVOnEdge;
|
||||
NCollection_Sequence<TopoDS_Vertex> aVOnEdge; //Vertexes on the edge which divide it in the intersection points into sequence of edges
|
||||
NCollection_Sequence<TopoDS_Edge> NewEdgeSeq;
|
||||
TopoDS_Vertex VF, VL;
|
||||
VF = TopExp::FirstVertex(E);
|
||||
@@ -3162,6 +3179,7 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
}
|
||||
aVOnEdge.Append(VL);
|
||||
|
||||
//Split old edge => Construct a new sequence of new edges
|
||||
TopoDS_Edge DE;
|
||||
for (int j = 1; j < aVOnEdge.Length(); j++)
|
||||
{
|
||||
@@ -3178,13 +3196,15 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
EdgesInInter.Add(NewEdgeSeq(i));
|
||||
}
|
||||
MW.Build();
|
||||
TopoDS_Wire TW = MW.Wire();
|
||||
TopoDS_Wire TW = MW.Wire(); //make wire from the sequence of edges
|
||||
TW.Orientation(E.Orientation());
|
||||
reshape->Replace(E, TW);
|
||||
reshape->Replace(E, TW); //replace old edge with wire
|
||||
}
|
||||
|
||||
aW = TopoDS::Wire(reshape->Apply(aW));
|
||||
|
||||
// Prepare wire for Poly_MakeLoops algo:
|
||||
// Insert neccesary vertices if two edges shares same (two) vertices
|
||||
bool Stat = true;
|
||||
for (int i = 1; i <= EdgesInInter.Extent(); i++)
|
||||
for (int j = i; j <= EdgesInInter.Extent(); j++)
|
||||
@@ -3219,6 +3239,7 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
}
|
||||
|
||||
aW = TopoDS::Wire(reshape->Apply(aW));
|
||||
// If edges contains only one vertex => insert another two vertices
|
||||
ExpE.Init( aW, TopAbs_EDGE );
|
||||
for (; ExpE.More() && Stat; ExpE.Next())
|
||||
{
|
||||
@@ -3255,6 +3276,7 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
if (!Stat)
|
||||
continue;
|
||||
|
||||
//Perform reorder of wire
|
||||
aW = TopoDS::Wire(reshape->Apply(aW));
|
||||
Handle(ShapeExtend_WireData) aWireData = new ShapeExtend_WireData;
|
||||
Handle(ShapeFix_Wire) aShFixWire = new ShapeFix_Wire;
|
||||
@@ -3290,6 +3312,7 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
{
|
||||
aW = TopoDS::Wire(reshape->Apply(aW));
|
||||
|
||||
// Prepare 'TopoLink' info for Poly_MakeLoops algo => Calculate derivatives of the edges
|
||||
NCollection_DataMap<TopoDS_Edge, TopoLink> mE2EInfo;
|
||||
ExpE.Init(aW, TopAbs_EDGE);
|
||||
for (; ExpE.More(); ExpE.Next())
|
||||
@@ -3331,6 +3354,7 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
TopTools_IndexedDataMapOfShapeListOfShape mV2E;
|
||||
TopExp::MapShapesAndAncestors(aW, TopAbs_VERTEX, TopAbs_EDGE, mV2E);
|
||||
|
||||
//Create links for Poly_MakeLoops algo and bind them to the existing edges
|
||||
NCollection_DoubleMap<Poly_MakeLoops2D::Link, TopoDS_Edge> mPL2E;
|
||||
ExpE.Init(aW, TopAbs_EDGE);
|
||||
for (; ExpE.More(); ExpE.Next())
|
||||
@@ -3369,15 +3393,15 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
for (NCollection_DoubleMap<Poly_MakeLoops2D::Link, TopoDS_Edge>::Iterator aMapIt (mPL2E); aMapIt.More(); aMapIt.Next())
|
||||
aLoopMaker.AddLink(aMapIt.Key1());
|
||||
|
||||
aLoopMaker.Perform();
|
||||
aLoopMaker.Perform(); //try to find loops
|
||||
int NbLoops = aLoopMaker.GetNbLoops();
|
||||
int NbHangs = aLoopMaker.GetNbHanging();
|
||||
|
||||
if (NbLoops == 0 || NbHangs != 0 )
|
||||
if (NbLoops == 0 || NbHangs != 0 )
|
||||
continue;
|
||||
|
||||
NCollection_Sequence<TopoDS_Wire> aLoops;
|
||||
for (int i = 1; i <= NbLoops; i++)
|
||||
for (int i = 1; i <= NbLoops; i++) //try to construct loops
|
||||
{
|
||||
Poly_MakeLoops2D::Loop aLoop = aLoopMaker.GetLoop(i);
|
||||
Poly_MakeLoops2D::Loop::Iterator it(aLoop);
|
||||
@@ -3403,8 +3427,9 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
if (!Stat)
|
||||
continue;
|
||||
|
||||
NCollection_Sequence<TopoDS_Wire> InnerMWires;
|
||||
NCollection_Sequence<TopoDS_Wire> ExtMWires;
|
||||
// try to classify wires
|
||||
NCollection_Sequence<TopoDS_Wire> InnerMWires; // interior wires
|
||||
NCollection_Sequence<TopoDS_Wire> ExtMWires; //wires which defines a hole
|
||||
for (int i = 1; i <= aLoops.Length(); i++)
|
||||
{
|
||||
TopoDS_Face af = BRepBuilderAPI_MakeFace (theRefPlane, Precision::Confusion() ); //TopoDS::Face ( myWorkSpine.EmptyCopied() );
|
||||
@@ -3420,12 +3445,12 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
}
|
||||
|
||||
if (InnerMWires.Length() == ExtMWires.Length())
|
||||
continue; //
|
||||
continue;
|
||||
|
||||
if (InnerMWires.Length() < ExtMWires.Length())
|
||||
//probably incorrect orientation
|
||||
continue;
|
||||
|
||||
//try to find an outer wire
|
||||
int IndOfOuterW = -1;
|
||||
for (int i = 1; i <= InnerMWires.Length(); i++)
|
||||
{
|
||||
@@ -3460,7 +3485,7 @@ static bool RemoveLoops(TopoDS_Shape& theInputSh, const TopoDS_Face& theWorkSpin
|
||||
continue; //cant find an outer wire
|
||||
|
||||
TopoDS_Wire OuterWire = InnerMWires(IndOfOuterW);
|
||||
|
||||
//make compound: outer wire + holes
|
||||
BRep_Builder BBC;
|
||||
TopoDS_Compound Co;
|
||||
BBC.MakeCompound(Co);
|
||||
|
Reference in New Issue
Block a user