1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-07 18:30:55 +03:00
occt/src/BRepLib/BRepLib_MakeWire.hxx
emv d84b49c743 0030522: Modeling Algorithms - BRepBuilderAPI_MakeWire produces different wires depending on the order of parameters
The following improvements have been implemented in BRepLib_MakeWire class to make it more reliable:
1. Quit adding edges of a wire into result if the current edges have not been added. Return NotDone status.
2. Allow merging not only bounding vertices (connected to only one edge) but also the middle ones, so the multi-connected vertices may appear in the result.

Test case for the issue.
2019-03-22 17:21:01 +03:00

211 lines
5.8 KiB
C++

// Created on: 1993-07-08
// Created by: Remi LEQUETTE
// Copyright (c) 1993-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _BRepLib_MakeWire_HeaderFile
#define _BRepLib_MakeWire_HeaderFile
#include <Standard.hxx>
#include <Standard_DefineAlloc.hxx>
#include <Standard_Handle.hxx>
#include <BRepLib_WireError.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopTools_DataMapOfShapeShape.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <BRepLib_MakeShape.hxx>
#include <TopTools_ListOfShape.hxx>
#include <Bnd_Box.hxx>
#include <NCollection_UBTree.hxx>
class StdFail_NotDone;
class TopoDS_Edge;
class TopoDS_Wire;
class TopoDS_Vertex;
//! Provides methods to build wires.
//!
//! A wire may be built :
//!
//! * From a single edge.
//!
//! * From a wire and an edge.
//!
//! - A new wire is created with the edges of the
//! wire + the edge.
//!
//! - If the edge is not connnected to the wire the
//! flag NotDone is set and the method Wire will
//! raise an error.
//!
//! - The connection may be :
//!
//! . Through an existing vertex. The edge is shared.
//!
//! . Through a geometric coincidence of vertices.
//! The edge is copied and the vertices from the
//! edge are replaced by the vertices from the
//! wire.
//!
//! . The new edge and the connection vertices are
//! kept by the algorithm.
//!
//! * From 2, 3, 4 edges.
//!
//! - A wire is created from the first edge, the
//! following edges are added.
//!
//! * From many edges.
//!
//! - The following syntax may be used :
//!
//! BRepLib_MakeWire MW;
//!
//! // for all the edges ...
//! MW.Add(anEdge);
//!
//! TopoDS_Wire W = MW;
class BRepLib_MakeWire : public BRepLib_MakeShape
{
public:
DEFINE_STANDARD_ALLOC
//! NotDone MakeWire.
Standard_EXPORT BRepLib_MakeWire();
//! Make a Wire from an edge.
Standard_EXPORT BRepLib_MakeWire(const TopoDS_Edge& E);
//! Make a Wire from two edges.
Standard_EXPORT BRepLib_MakeWire(const TopoDS_Edge& E1, const TopoDS_Edge& E2);
//! Make a Wire from three edges.
Standard_EXPORT BRepLib_MakeWire(const TopoDS_Edge& E1, const TopoDS_Edge& E2, const TopoDS_Edge& E3);
//! Make a Wire from four edges.
Standard_EXPORT BRepLib_MakeWire(const TopoDS_Edge& E1, const TopoDS_Edge& E2, const TopoDS_Edge& E3, const TopoDS_Edge& E4);
//! Make a Wire from a Wire. Usefull for adding later.
Standard_EXPORT BRepLib_MakeWire(const TopoDS_Wire& W);
//! Add an edge to a wire.
Standard_EXPORT BRepLib_MakeWire(const TopoDS_Wire& W, const TopoDS_Edge& E);
//! Add the edge <E> to the current wire.
Standard_EXPORT void Add (const TopoDS_Edge& E);
//! Add the edges of <W> to the current wire.
Standard_EXPORT void Add (const TopoDS_Wire& W);
//! Add the edges of <L> to the current wire.
//! The edges are not to be consecutive. But they are
//! to be all connected geometrically or topologically.
Standard_EXPORT void Add (const TopTools_ListOfShape& L);
Standard_EXPORT BRepLib_WireError Error() const;
//! Returns the new wire.
Standard_EXPORT const TopoDS_Wire& Wire();
Standard_EXPORT operator TopoDS_Wire();
//! Returns the last edge added to the wire.
Standard_EXPORT const TopoDS_Edge& Edge() const;
//! Returns the last connecting vertex.
Standard_EXPORT const TopoDS_Vertex& Vertex() const;
private:
class BRepLib_BndBoxVertexSelector : public NCollection_UBTree <Standard_Integer,Bnd_Box>::Selector
{
public:
BRepLib_BndBoxVertexSelector(const TopTools_IndexedMapOfShape& theMapOfShape)
: BRepLib_BndBoxVertexSelector::Selector(), myMapOfShape (theMapOfShape)
{}
Standard_Boolean Reject (const Bnd_Box& theBox) const
{
return theBox.IsOut(myVBox);
}
Standard_Boolean Accept (const Standard_Integer& theObj);
void SetCurrentVertex (const gp_Pnt& theP, Standard_Real theTol,
Standard_Integer theVInd);
const NCollection_List<Standard_Integer>& GetResultInds () const
{
return myResultInd;
}
void ClearResInds()
{
myResultInd.Clear();
}
private:
BRepLib_BndBoxVertexSelector(const BRepLib_BndBoxVertexSelector& );
BRepLib_BndBoxVertexSelector& operator=(const BRepLib_BndBoxVertexSelector& );
const TopTools_IndexedMapOfShape& myMapOfShape; //vertices
gp_Pnt myP;
Standard_Real mySTol;
Standard_Integer myVInd;
Bnd_Box myVBox;
NCollection_List<Standard_Integer> myResultInd;
};
void CollectCoincidentVertices(const TopTools_ListOfShape& theL,
NCollection_List<NCollection_List<TopoDS_Vertex>>& theGrVL);
void CreateNewVertices(const NCollection_List<NCollection_List<TopoDS_Vertex>>& theGrVL,
TopTools_DataMapOfShapeShape& theO2NV);
void CreateNewListOfEdges(const TopTools_ListOfShape& theL,
const TopTools_DataMapOfShapeShape& theO2NV,
TopTools_ListOfShape& theNewEList);
void Add(const TopoDS_Edge& E, Standard_Boolean IsCheckGeometryProximity);
protected:
private:
BRepLib_WireError myError;
TopoDS_Edge myEdge;
TopoDS_Vertex myVertex;
TopTools_IndexedMapOfShape myVertices;
TopoDS_Vertex FirstVertex;
TopoDS_Vertex VF;
TopoDS_Vertex VL;
};
#endif // _BRepLib_MakeWire_HeaderFile