mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-21 10:13:43 +03:00
211 lines
5.8 KiB
C++
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 <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 TopoDS_Wire;
|
|
|
|
//! 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 connected 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. Useful 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),
|
|
myTolP(0.0),
|
|
myVInd(0)
|
|
{
|
|
}
|
|
|
|
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 myTolP;
|
|
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
|