File size: 5,062 Bytes
985c397
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// SPDX-License-Identifier: LGPL-2.1-or-later

/***************************************************************************
 *   Copyright (c) 2019 Werner Mayer <wmayer[at]users.sourceforge.net>     *
 *                                                                         *
 *   This file is part of the FreeCAD CAx development system.              *
 *                                                                         *
 *   This library is free software; you can redistribute it and/or         *
 *   modify it under the terms of the GNU Library General Public           *
 *   License as published by the Free Software Foundation; either          *
 *   version 2 of the License, or (at your option) any later version.      *
 *                                                                         *
 *   This library  is distributed in the hope that it will be useful,      *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU Library General Public License for more details.                  *
 *                                                                         *
 *   You should have received a copy of the GNU Library General Public     *
 *   License along with this library; see the file COPYING.LIB. If not,    *
 *   write to the Free Software Foundation, Inc., 59 Temple Place,         *
 *   Suite 330, Boston, MA  02111-1307, USA                                *
 *                                                                         *
 ***************************************************************************/

#ifndef PART_BREPOFFSETAPI_MAKEOFFSETFIX_H
#define PART_BREPOFFSETAPI_MAKEOFFSETFIX_H

#include <list>
#include <map>

#include <Mod/Part/PartGlobal.h>

#include <BRepOffsetAPI_MakeOffset.hxx>
#include <GeomAbs_CurveType.hxx>
#include <Standard_Version.hxx>


namespace Part
{
/*!
 * \brief The BRepOffsetAPI_MakeOffsetFix class
 * This class works around a limitation of the BRepOffsetAPI_MakeOffset which
 * returns unexpected results when an input wire has set a placement and consists
 * of a single edge only.
 */
class PartExport BRepOffsetAPI_MakeOffsetFix: public BRepBuilderAPI_MakeShape
{
public:
    BRepOffsetAPI_MakeOffsetFix();
    BRepOffsetAPI_MakeOffsetFix(const GeomAbs_JoinType Join, const Standard_Boolean IsOpenResult);
    ~BRepOffsetAPI_MakeOffsetFix() override;

    //! Initializes the algorithm to construct parallels to the wire Spine.
    void AddWire(const TopoDS_Wire& Spine);

    //! Computes a parallel to the spine at distance Offset and
    //! at an altitude Alt from the plane of the spine in relation
    //! to the normal to the spine.
    //! Exceptions: StdFail_NotDone if the offset is not built.
    void Perform(const Standard_Real Offset, const Standard_Real Alt = 0.0);

    //! Builds the resulting shape (redefined from MakeShape).
#if OCC_VERSION_HEX >= 0x070600
    void Build(const Message_ProgressRange& theRange = Message_ProgressRange()) override;
#else
    void Build() override;
#endif

    //! Initializes the algorithm to construct parallels to the spine Spine.
    //! Join defines the type of parallel generated by the
    //! salient vertices of the spine.
    //! The default type is GeomAbs_Arc where the vertices generate
    //! sections of a circle.
    //! If join type is GeomAbs_Intersection, the edges that
    //! intersect in a salient vertex generate the edges
    //! prolonged until intersection.
    void Init(
        const TopoDS_Face& Spine,
        const GeomAbs_JoinType Join = GeomAbs_Arc,
        const Standard_Boolean IsOpenResult = Standard_False
    );

    //! Initialize the evaluation of Offsetting.
    void Init(
        const GeomAbs_JoinType Join = GeomAbs_Arc,
        const Standard_Boolean IsOpenResult = Standard_False
    );

    Standard_Boolean IsDone() const override;

    //! Returns a shape built by the shape construction algorithm.
    //! Raises exception StdFail_NotDone if the shape was not built.
    const TopoDS_Shape& Shape() override;

    //! returns a list of the created shapes
    //! from the shape <S>.
    const TopTools_ListOfShape& Generated(const TopoDS_Shape& S) override;

    //! Returns the list  of shapes modified from the shape
    //! <S>.
    const TopTools_ListOfShape& Modified(const TopoDS_Shape& S) override;

    //! Returns true if the shape S has been deleted.
    Standard_Boolean IsDeleted(const TopoDS_Shape& S) override;

    //! Replaces the given curve type with a B-Spline. Input shape <S>
    //! must be a wire or a compound of wires
    TopoDS_Shape Replace(GeomAbs_CurveType, const TopoDS_Shape& S) const;

private:
    TopoDS_Wire ReplaceEdges(GeomAbs_CurveType, const TopoDS_Wire& S) const;
    void MakeWire(TopoDS_Shape&);

private:
    BRepOffsetAPI_MakeOffset mkOffset;
    std::list<std::pair<TopoDS_Shape, TopLoc_Location>> myLocations;
    TopoDS_Shape myResult;
};

}  // namespace Part

#endif  // PART_BREPOFFSETAPI_MAKEOFFSETFIX_H