1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-07 18:30:55 +03:00
occt/src/ShapeFix/ShapeFix_Wire.hxx
abv 92efcf78a6 0026936: Drawbacks of inlining in new type system in OCCT 7.0 -- automatic
Automatic restore of IMPLEMENT_STANDARD_RTTIEXT macro (upgrade -rtti)
2015-12-04 14:15:06 +03:00

558 lines
22 KiB
C++

// Created on: 1998-06-03
// Created by: data exchange team
// Copyright (c) 1998-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 _ShapeFix_Wire_HeaderFile
#define _ShapeFix_Wire_HeaderFile
#include <Standard.hxx>
#include <Standard_Type.hxx>
#include <Standard_Boolean.hxx>
#include <Standard_Integer.hxx>
#include <Standard_Real.hxx>
#include <ShapeFix_Root.hxx>
#include <TopoDS_Wire.hxx>
#include <ShapeExtend_Status.hxx>
class ShapeFix_Edge;
class ShapeAnalysis_Wire;
class TopoDS_Wire;
class TopoDS_Face;
class ShapeExtend_WireData;
class Geom_Surface;
class TopLoc_Location;
class ShapeAnalysis_WireOrder;
class ShapeFix_Wire;
DEFINE_STANDARD_HANDLE(ShapeFix_Wire, ShapeFix_Root)
//! This class provides a set of tools for repairing a wire.
//!
//! These are methods Fix...(), organised in two levels:
//!
//! Level 1: Advanced - each method in this level fixes one separate problem,
//! usually dealing with either single edge or connection of the
//! two adjacent edges. These methods should be used carefully and
//! called in right sequence, because some of them depend on others.
//!
//! Level 2: Public (API) - methods which group several methods of level 1
//! and call them in a proper sequence in order to make some
//! consistent set of fixes for a whole wire. It is possible to
//! control calls to methods of the advanced level from methods of
//! the public level by use of flags Fix..Mode() (see below).
//!
//! Fixes can be made in three ways:
//! 1. Increasing tolerance of an edge or a vertex
//! 2. Changing topology (adding/removing/replacing edge in the wire
//! and/or replacing the vertex in the edge)
//! 3. Changing geometry (shifting vertex or adjusting ends of edge
//! curve to vertices, or recomputing curves of the edge)
//!
//! When fix can be made in more than one way (e.g., either
//! by increasing tolerance or shifting a vertex), it is choosen
//! according to the flags:
//! ModifyTopologyMode - allows modification of the topology.
//! This flag can be set when fixing a wire on
//! the separate (free) face, and should be
//! unset for face which is part of shell.
//! ModifyGeometryMode - allows modification of the geometry.
//!
//! The order of descriptions of Fix() methods in this CDL
//! approximately corresponds to the optimal order of calls.
//!
//! NOTE: most of fixing methods expect edges in the
//! ShapeExtend_WireData to be ordered, so it is necessary to make
//! call to FixReorder() before any other fixes
//!
//! ShapeFix_Wire should be initialized prior to any fix by the
//! following data:
//! a) Wire (ether TopoDS_Wire or ShapeExtend_Wire)
//! b) Face or surface
//! c) Precision
//! d) Maximal tail angle and width
//! This can be done either by calling corresponding methods
//! (LoadWire, SetFace or SetSurface, SetPrecision, SetMaxTailAngle
//! and SetMaxTailWidth), or
//! by loading already filled ShapeAnalisis_Wire with method Load
class ShapeFix_Wire : public ShapeFix_Root
{
public:
//! Empty Constructor, creates clear object with default flags
Standard_EXPORT ShapeFix_Wire();
//! Create new object with default flags and prepare it for use
//! (Loads analyzer with all the data for the wire and face)
Standard_EXPORT ShapeFix_Wire(const TopoDS_Wire& wire, const TopoDS_Face& face, const Standard_Real prec);
//! Sets all modes to default
Standard_EXPORT void ClearModes();
//! Clears all statuses
Standard_EXPORT void ClearStatuses();
//! Load analyzer with all the data for the wire and face
//! and drops all fixing statuses
Standard_EXPORT void Init (const TopoDS_Wire& wire, const TopoDS_Face& face, const Standard_Real prec);
//! Load analyzer with all the data already prepared
//! and drops all fixing statuses
//! If analyzer contains face, there is no need to set it
//! by SetFace or SetSurface
Standard_EXPORT void Init (const Handle(ShapeAnalysis_Wire)& saw);
//! Load data for the wire, and drops all fixing statuses
Standard_EXPORT void Load (const TopoDS_Wire& wire);
//! Load data for the wire, and drops all fixing statuses
Standard_EXPORT void Load (const Handle(ShapeExtend_WireData)& sbwd);
//! Set working face for the wire
void SetFace (const TopoDS_Face& face);
//! Set surface for the wire
void SetSurface (const Handle(Geom_Surface)& surf);
//! Set surface for the wire
void SetSurface (const Handle(Geom_Surface)& surf, const TopLoc_Location& loc);
//! Set working precision (to root and to analyzer)
Standard_EXPORT virtual void SetPrecision (const Standard_Real prec) Standard_OVERRIDE;
//! Sets the maximal allowed angle of the tails in radians.
Standard_EXPORT void SetMaxTailAngle (const Standard_Real theMaxTailAngle);
//! Sets the maximal allowed width of the tails.
Standard_EXPORT void SetMaxTailWidth (const Standard_Real theMaxTailWidth);
//! Tells if the wire is loaded
Standard_Boolean IsLoaded() const;
//! Tells if the wire and face are loaded
Standard_Boolean IsReady() const;
//! returns number of edges in the working wire
Standard_EXPORT Standard_Integer NbEdges() const;
//! Makes the resulting Wire (by basic Brep_Builder)
TopoDS_Wire Wire() const;
//! Makes the resulting Wire (by BRepAPI_MakeWire)
TopoDS_Wire WireAPIMake() const;
//! returns field Analyzer (working tool)
Standard_EXPORT Handle(ShapeAnalysis_Wire) Analyzer() const;
//! returns working wire
const Handle(ShapeExtend_WireData)& WireData() const;
//! returns working face (Analyzer.Face())
const TopoDS_Face& Face() const;
//! Returns (modifiable) the flag which defines whether it is
//! allowed to modify topology of the wire during fixing
//! (adding/removing edges etc.)
Standard_Boolean& ModifyTopologyMode();
//! Returns (modifiable) the flag which defines whether the Fix..()
//! methods are allowed to modify geometry of the edges and vertices
Standard_Boolean& ModifyGeometryMode();
//! Returns (modifiable) the flag which defines whether the Fix..()
//! methods are allowed to modify RemoveLoop of the edges
Standard_Integer& ModifyRemoveLoopMode();
//! Returns (modifiable) the flag which defines whether the wire
//! is to be closed (by calling methods like FixDegenerated()
//! and FixConnected() for last and first edges).
Standard_Boolean& ClosedWireMode();
//! Returns (modifiable) the flag which defines whether the 2d (True)
//! representation of the wire is preferable over 3d one (in the
//! case of ambiguity in FixEdgeCurves).
Standard_Boolean& PreferencePCurveMode();
//! Returns (modifiable) the flag which defines whether tool
//! tries to fix gaps first by changing curves ranges (i.e.
//! using intersection, extrema, projections) or not.
Standard_Boolean& FixGapsByRangesMode();
Standard_Integer& FixReorderMode();
Standard_Integer& FixSmallMode();
Standard_Integer& FixConnectedMode();
Standard_Integer& FixEdgeCurvesMode();
Standard_Integer& FixDegeneratedMode();
Standard_Integer& FixSelfIntersectionMode();
Standard_Integer& FixLackingMode();
Standard_Integer& FixGaps3dMode();
//! Returns (modifiable) the flag for corresponding Fix..() method
//! which defines whether this method will be called from the
//! method APIFix():
//! -1 default
//! 1 method will be called
//! 0 method will not be called
Standard_Integer& FixGaps2dMode();
Standard_Integer& FixReversed2dMode();
Standard_Integer& FixRemovePCurveMode();
Standard_Integer& FixAddPCurveMode();
Standard_Integer& FixRemoveCurve3dMode();
Standard_Integer& FixAddCurve3dMode();
Standard_Integer& FixSeamMode();
Standard_Integer& FixShiftedMode();
Standard_Integer& FixSameParameterMode();
Standard_Integer& FixVertexToleranceMode();
Standard_Integer& FixNotchedEdgesMode();
Standard_Integer& FixSelfIntersectingEdgeMode();
Standard_Integer& FixIntersectingEdgesMode();
//! Returns (modifiable) the flag for corresponding Fix..() method
//! which defines whether this method will be called from the
//! corresponding Fix..() method of the public level:
//! -1 default
//! 1 method will be called
//! 0 method will not be called
Standard_Integer& FixNonAdjacentIntersectingEdgesMode();
Standard_Integer& FixTailMode();
//! This method performs all the available fixes.
//! If some fix is turned on or off explicitly by the Fix..Mode() flag,
//! this fix is either called or not depending on that flag.
//! Else (i.e. if flag is default) fix is called depending on the
//! situation: some fixes are not called or are limited if order of
//! edges in the wire is not OK, or depending on modes
//!
//! The order of the fixes and default behaviour of Perform() are:
//! FixReorder
//! FixSmall (with lockvtx true if ! TopoMode or if wire is not ordered)
//! FixConnected (if wire is ordered)
//! FixEdgeCurves (without FixShifted if wire is not ordered)
//! FixDegenerated (if wire is ordered)
//! FixSelfIntersection (if wire is ordered and ClosedMode is True)
//! FixLacking (if wire is ordered)
Standard_EXPORT Standard_Boolean Perform();
//! Performs an analysis and reorders edges in the wire using
//! class WireOrder
Standard_EXPORT Standard_Boolean FixReorder();
//! Applies FixSmall(num) to all edges in the wire
Standard_EXPORT Standard_Integer FixSmall (const Standard_Boolean lockvtx, const Standard_Real precsmall = 0.0);
//! Applies FixConnected(num) to all edges in the wire
//! Connection between first and last edges is treated only if
//! flag ClosedMode is True
//! If <prec> is -1 then MaxTolerance() is taken.
Standard_EXPORT Standard_Boolean FixConnected (const Standard_Real prec = -1.0);
//! Groups the fixes dealing with 3d and pcurves of the edges.
//! The order of the fixes and the default behaviour are:
//! ShapeFix_Edge::FixReversed2d
//! ShapeFix_Edge::FixRemovePCurve (only if forced)
//! ShapeFix_Edge::FixAddPCurve
//! ShapeFix_Edge::FixRemoveCurve3d (only if forced)
//! ShapeFix_Edge::FixAddCurve3d
//! FixSeam,
//! FixShifted,
//! ShapeFix_Edge::FixSameParameter
Standard_EXPORT Standard_Boolean FixEdgeCurves();
//! Applies FixDegenerated(num) to all edges in the wire
//! Connection between first and last edges is treated only if
//! flag ClosedMode is True
Standard_EXPORT Standard_Boolean FixDegenerated();
//! Applies FixSelfIntersectingEdge(num) and
//! FixIntersectingEdges(num) to all edges in the wire and
//! FixIntersectingEdges(num1, num2) for all pairs num1 and num2
//! such that num2 >= num1 + 2
//! and removes wrong edges if any
Standard_EXPORT Standard_Boolean FixSelfIntersection();
//! Applies FixLacking(num) to all edges in the wire
//! Connection between first and last edges is treated only if
//! flag ClosedMode is True
//! If <force> is False (default), test for connectness is done with
//! precision of vertex between edges, else it is done with minimal
//! value of vertex tolerance and Analyzer.Precision().
//! Hence, <force> will lead to inserting lacking edges in replacement
//! of vertices which have big tolerances.
Standard_EXPORT Standard_Boolean FixLacking (const Standard_Boolean force = Standard_False);
//! Fixes a wire to be well closed
//! It performs FixConnected, FixDegenerated and FixLacking between
//! last and first edges (independingly on flag ClosedMode and modes
//! for these fixings)
//! If <prec> is -1 then MaxTolerance() is taken.
Standard_EXPORT Standard_Boolean FixClosed (const Standard_Real prec = -1.0);
//! Fixes gaps between ends of 3d curves on adjacent edges
//! myPrecision is used to detect the gaps.
Standard_EXPORT Standard_Boolean FixGaps3d();
//! Fixes gaps between ends of pcurves on adjacent edges
//! myPrecision is used to detect the gaps.
Standard_EXPORT Standard_Boolean FixGaps2d();
//! Reorder edges in the wire as determined by WireOrder
//! that should be filled and computed before
Standard_EXPORT Standard_Boolean FixReorder (const ShapeAnalysis_WireOrder& wi);
//! Fixes Null Length Edge to be removed
//! If an Edge has Null Length (regarding preci, or <precsmall>
//! - what is smaller), it should be removed
//! It can be with no problem if its two vertices are the same
//! Else, if lockvtx is False, it is removed and its end vertex
//! is put on the preceeding edge
//! But if lockvtx is True, this edge must be kept ...
Standard_EXPORT Standard_Boolean FixSmall (const Standard_Integer num, const Standard_Boolean lockvtx, const Standard_Real precsmall);
//! Fixes connected edges (preceeding and current)
//! Forces Vertices (end of preceeding-begin of current) to be
//! the same one
//! Tests with starting preci or, if given greater, <prec>
//! If <prec> is -1 then MaxTolerance() is taken.
Standard_EXPORT Standard_Boolean FixConnected (const Standard_Integer num, const Standard_Real prec);
//! Fixes a seam edge
//! A Seam edge has two pcurves, one for forward. one for reversed
//! The forward pcurve must be set as first
//!
//! NOTE that correct order of pcurves in the seam edge depends on
//! its orientation (i.e., on orientation of the wire, method of
//! exploration of edges etc.).
//! Since wire represented by the ShapeExtend_WireData is always forward
//! (orientation is accounted by edges), it will work correct if:
//! 1. Wire created from ShapeExtend_WireData with methods
//! ShapeExtend_WireData::Wire..() is added into the FORWARD face
//! (orientation can be applied later)
//! 2. Wire is extracted from the face with orientation not composed
//! with orientation of the face
Standard_EXPORT Standard_Boolean FixSeam (const Standard_Integer num);
//! Fixes edges which have pcurves shifted by whole parameter
//! range on the closed surface (the case may occur if pcurve
//! of edge was computed by projecting 3d curve, which goes
//! along the seam).
//! It compares each two consequent edges and tries to connect them
//! if distance between ends is near to range of the surface.
//! It also can detect and fix the case if all pcurves are connected,
//! but lie out of parametric bounds of the surface.
//! In addition to FixShifted from ShapeFix_Wire, more
//! sophisticated check of degenerate points is performed,
//! and special cases like sphere given by two meridians
//! are treated.
Standard_EXPORT Standard_Boolean FixShifted();
//! Fixes Degenerated Edge
//! Checks an <num-th> edge or a point between <num>th-1 and <num>th
//! edges for a singularity on a supporting surface.
//! If singularity is detected, either adds new degenerated edge
//! (before <num>th), or makes <num>th edge to be degenerated.
Standard_EXPORT Standard_Boolean FixDegenerated (const Standard_Integer num);
//! Fixes Lacking Edge
//! Test if two adjucent edges are disconnected in 2d (while
//! connected in 3d), and in that case either increase tolerance
//! of the vertex or add a new edge (straight in 2d space), in
//! order to close wire in 2d.
//! Returns True if edge was added or tolerance was increased.
Standard_EXPORT Standard_Boolean FixLacking (const Standard_Integer num, const Standard_Boolean force = Standard_False);
Standard_EXPORT Standard_Boolean FixNotchedEdges();
//! Fixes gap between ends of 3d curves on num-1 and num-th edges.
//! myPrecision is used to detect the gap.
//! If convert is True, converts curves to bsplines to bend.
Standard_EXPORT Standard_Boolean FixGap3d (const Standard_Integer num, const Standard_Boolean convert = Standard_False);
//! Fixes gap between ends of pcurves on num-1 and num-th edges.
//! myPrecision is used to detect the gap.
//! If convert is True, converts pcurves to bsplines to bend.
Standard_EXPORT Standard_Boolean FixGap2d (const Standard_Integer num, const Standard_Boolean convert = Standard_False);
Standard_EXPORT Standard_Boolean FixTails();
Standard_Boolean StatusReorder (const ShapeExtend_Status status) const;
Standard_Boolean StatusSmall (const ShapeExtend_Status status) const;
Standard_Boolean StatusConnected (const ShapeExtend_Status status) const;
Standard_Boolean StatusEdgeCurves (const ShapeExtend_Status status) const;
Standard_Boolean StatusDegenerated (const ShapeExtend_Status status) const;
Standard_Boolean StatusSelfIntersection (const ShapeExtend_Status status) const;
Standard_Boolean StatusLacking (const ShapeExtend_Status status) const;
Standard_Boolean StatusClosed (const ShapeExtend_Status status) const;
Standard_Boolean StatusGaps3d (const ShapeExtend_Status status) const;
Standard_Boolean StatusGaps2d (const ShapeExtend_Status status) const;
Standard_Boolean StatusNotches (const ShapeExtend_Status status) const;
//! Querying the status of perfomed API fixing procedures
//! Each Status..() methods gives information about the last call to
//! the corresponding Fix..() method of API level:
//! OK : no problems detected; nothing done
//! DONE: some problem(s) was(were) detected and successfully fixed
//! FAIL: some problem(s) cannot be fixed
Standard_Boolean StatusRemovedSegment() const;
Standard_Boolean StatusFixTails (const ShapeExtend_Status status) const;
//! Queries the status of last call to methods Fix... of
//! advanced level
//! For details see corresponding methods; universal statuses are:
//! OK : problem not detected; nothing done
//! DONE: problem was detected and successfully fixed
//! FAIL: problem cannot be fixed
Standard_Boolean LastFixStatus (const ShapeExtend_Status status) const;
//! Returns tool for fixing wires.
Handle(ShapeFix_Edge) FixEdgeTool() const;
DEFINE_STANDARD_RTTIEXT(ShapeFix_Wire,ShapeFix_Root)
protected:
//! Updates WireData if some replacements are made
//! This is necessary for wires (unlike other shape types)
//! since one edge can present in wire several times
Standard_EXPORT void UpdateWire();
Handle(ShapeFix_Edge) myFixEdge;
Handle(ShapeAnalysis_Wire) myAnalyzer;
Standard_Boolean myGeomMode;
Standard_Boolean myTopoMode;
Standard_Boolean myClosedMode;
Standard_Boolean myPreference2d;
Standard_Boolean myFixGapsByRanges;
Standard_Integer myFixReversed2dMode;
Standard_Integer myFixRemovePCurveMode;
Standard_Integer myFixAddPCurveMode;
Standard_Integer myFixRemoveCurve3dMode;
Standard_Integer myFixAddCurve3dMode;
Standard_Integer myFixSeamMode;
Standard_Integer myFixShiftedMode;
Standard_Integer myFixSameParameterMode;
Standard_Integer myFixVertexToleranceMode;
Standard_Integer myFixNotchedEdgesMode;
Standard_Integer myFixSelfIntersectingEdgeMode;
Standard_Integer myFixIntersectingEdgesMode;
Standard_Integer myFixNonAdjacentIntersectingEdgesMode;
Standard_Integer myFixTailMode;
Standard_Integer myRemoveLoopMode;
Standard_Integer myFixReorderMode;
Standard_Integer myFixSmallMode;
Standard_Integer myFixConnectedMode;
Standard_Integer myFixEdgeCurvesMode;
Standard_Integer myFixDegeneratedMode;
Standard_Integer myFixSelfIntersectionMode;
Standard_Integer myFixLackingMode;
Standard_Integer myFixGaps3dMode;
Standard_Integer myFixGaps2dMode;
Standard_Integer myLastFixStatus;
Standard_Integer myStatusReorder;
Standard_Integer myStatusSmall;
Standard_Integer myStatusConnected;
Standard_Integer myStatusEdgeCurves;
Standard_Integer myStatusDegenerated;
Standard_Integer myStatusClosed;
Standard_Integer myStatusSelfIntersection;
Standard_Integer myStatusLacking;
Standard_Integer myStatusGaps3d;
Standard_Integer myStatusGaps2d;
Standard_Boolean myStatusRemovedSegment;
Standard_Integer myStatusNotches;
Standard_Integer myStatusFixTails;
Standard_Real myMaxTailAngleSine;
Standard_Real myMaxTailWidth;
private:
//! Detect and fix self-intersecting pcurve of edge <num>.
//! Fix is made by one of two methods:
//! - cut out the self-intersection loop on pcurve (thus
//! producing C0 pcurve). This also increases tolerance of edge
//! in order to satisfy SameParameter requirement.
//! - increase tolerance of the vertex of edge nearest to the
//! self-intersection point so that it comprises that point.
//! The first method is considered only if ModifyGeometryMode
//! is True. In that case, the method which requires less
//! increasing of tolerance is selected.
Standard_EXPORT Standard_Boolean FixSelfIntersectingEdge (const Standard_Integer num);
//! Test if two consequent edges are intersecting and fix it
//! by increasing of tolerance of vertex between edges,
//! shifting this vertex to the point of intersection,
//! cutting edges to the intersection point.
//! It also can give signal to remove edge if it whole is cut by
//! intersection (if flag ModifyTopologyMode is set).
Standard_EXPORT Standard_Boolean FixIntersectingEdges (const Standard_Integer num);
//! Tests if two edges <num1> and <num2> are intersecting and
//! fix intersection by increasing of tolerance of vertex
//! nearest to the point of intersection.
Standard_EXPORT Standard_Boolean FixIntersectingEdges (const Standard_Integer num1, const Standard_Integer num2);
Standard_EXPORT void FixDummySeam (const Standard_Integer num);
};
#include <ShapeFix_Wire.lxx>
#endif // _ShapeFix_Wire_HeaderFile