// 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 #include #include #include #include #include #include #include #include #include #include #include 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 to the current wire. Standard_EXPORT void Add (const TopoDS_Edge& E); //! Add the edges of to the current wire. Standard_EXPORT void Add (const TopoDS_Wire& W); //! Add the edges of 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 ::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& 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 myResultInd; }; void CollectCoincidentVertices(const TopTools_ListOfShape& theL, NCollection_List>& theGrVL); void CreateNewVertices(const NCollection_List>& 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