mirror of
https://github.com/Open-Cascade-SAS/OCCT.git
synced 2026-07-05 06:56:50 +08:00
1) BRepBuilderAPI_MakeWire::Add (const TopTools_ListOfShape &L) method have been completely rewritten. The order of edges is not significant now. 2) The geometric proximity of free vertices from already existing wire and from input list of edges are also have been taken into account. If such vertices are coincident with each other then they are fused into the one. The original wire remains untouched topologically (yet the tolerances and points can be modified). 3) UBTreeFiller is used to speed up the process of picking of coincident vertices. 4) BRepLib now contains the 'new' method - BoundingVertex(..). The implemenation of this method are taken from BOPTools_AlgoTools::MakeVertex(..). 5) The '-unsorted' argument have been added to 'wire' command. Conflicts: src/QABugs/QABugs_20.cxx Add missing include. Eliminate warning.
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 <Standard_Handle.hxx>
|
|
|
|
#include <BRepLib_WireError.hxx>
|
|
#include <TopoDS_Edge.hxx>
|
|
#include <TopoDS_Vertex.hxx>
|
|
#include <TopTools_IndexedMapOfShape.hxx>
|
|
#include <BRepLib_MakeShape.hxx>
|
|
#include <TopTools_ListOfShape.hxx>
|
|
#include <NCollection_Map.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,
|
|
NCollection_DataMap<TopoDS_Vertex, TopoDS_Vertex>& theO2NV);
|
|
|
|
void CreateNewListOfEdges(const TopTools_ListOfShape& theL,
|
|
const NCollection_DataMap<TopoDS_Vertex, TopoDS_Vertex>& 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
|