1 // Created on: 1993-11-09
2 // Created by: Laurent BOURESCHE
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #ifndef _ChFiDS_Spine_HeaderFile
18 #define _ChFiDS_Spine_HeaderFile
20 #include <Standard.hxx>
21 #include <Standard_Type.hxx>
23 #include <BRepAdaptor_Curve.hxx>
24 #include <Standard_Integer.hxx>
25 #include <ChFiDS_State.hxx>
26 #include <TopTools_SequenceOfShape.hxx>
27 #include <TColStd_HArray1OfReal.hxx>
28 #include <Standard_Boolean.hxx>
29 #include <ChFiDS_ListOfHElSpine.hxx>
30 #include <Standard_Real.hxx>
33 #include <ChFiDS_ErrorStatus.hxx>
34 #include <Standard_Transient.hxx>
35 #include <GeomAbs_CurveType.hxx>
36 #include <ChFiDS_ChamfMode.hxx>
38 class ChFiDS_HElSpine;
43 // resolve name collisions with X11 headers
49 DEFINE_STANDARD_HANDLE(ChFiDS_Spine, Standard_Transient)
51 //! Contains information necessary for construction of
52 //! a 3D fillet or chamfer:
54 //! - guideline composed of edges of the solid, tangents
55 //! between them, and borders by faces tangents
58 //! Tools for construction of the Sp
59 //! by propagation from an edge of solid
60 //! are provided in the Builder of Fil3d.
62 //! The Spine contains among others the
63 //! information about the nature of extremities
64 //! of the fillet ( on free border , on section or closed ).
66 //! IMPORTANT NOTE : the guideline
67 //! represented in this way is not C2, although the path
68 //! claims it. Several palliative workarounds
69 //! (see the methods at the end) are planned,
70 //! but they are not enough. It is necessary to change
71 //! the approach and double the Spine of line C2 with
72 //! the known consequences for management of
73 //! interactions between KPart Blend in Fil3d.
74 class ChFiDS_Spine : public Standard_Transient
80 Standard_EXPORT ChFiDS_Spine();
82 Standard_EXPORT ChFiDS_Spine(const Standard_Real Tol);
84 //! store edges composing the guideline
85 void SetEdges (const TopoDS_Edge& E);
87 //! store offset edges composing the offset guideline
88 void SetOffsetEdges (const TopoDS_Edge& E);
90 //! store the edge at the first position before all others
91 void PutInFirst (const TopoDS_Edge& E);
93 //! store the offset edge at the first position before all others
94 void PutInFirstOffset (const TopoDS_Edge& E);
96 Standard_Integer NbEdges() const;
98 const TopoDS_Edge& Edges (const Standard_Integer I) const;
100 const TopoDS_Edge& OffsetEdges (const Standard_Integer I) const;
102 //! stores if the start of a set of edges starts on a
103 //! section of free border or forms a closed contour
104 void SetFirstStatus (const ChFiDS_State S);
106 //! stores if the end of a set of edges starts on a
107 //! section of free border or forms a closed contour
108 void SetLastStatus (const ChFiDS_State S);
110 Standard_EXPORT virtual void AppendElSpine (const Handle(ChFiDS_HElSpine)& Els);
112 Standard_EXPORT virtual void AppendOffsetElSpine (const Handle(ChFiDS_HElSpine)& Els);
114 Standard_EXPORT Handle(ChFiDS_HElSpine) ElSpine (const Standard_Integer IE) const;
116 Standard_EXPORT Handle(ChFiDS_HElSpine) ElSpine (const TopoDS_Edge& E) const;
118 Standard_EXPORT Handle(ChFiDS_HElSpine) ElSpine (const Standard_Real W) const;
120 Standard_EXPORT ChFiDS_ListOfHElSpine& ChangeElSpines();
122 Standard_EXPORT ChFiDS_ListOfHElSpine& ChangeOffsetElSpines();
124 Standard_EXPORT virtual void Reset (const Standard_Boolean AllData = Standard_False);
126 Standard_EXPORT Standard_Boolean SplitDone() const;
128 Standard_EXPORT void SplitDone (const Standard_Boolean B);
130 //! prepare the guideline depending on the edges that
131 //! are elementary arks (take parameters from
132 //! a single curvilinear abscissa); to be able to call
133 //! methods on the geometry (first,last,value,d1,d2)
134 //! it is necessary to start with preparation otherwise an
135 //! exception will be raised
136 Standard_EXPORT void Load();
138 Standard_EXPORT Standard_Real Resolution (const Standard_Real R3d) const;
140 Standard_EXPORT Standard_Boolean IsClosed() const;
142 Standard_EXPORT Standard_Real FirstParameter() const;
144 Standard_EXPORT Standard_Real LastParameter() const;
146 Standard_EXPORT void SetFirstParameter (const Standard_Real Par);
148 Standard_EXPORT void SetLastParameter (const Standard_Real Par);
150 //! gives the total length of all arcs before the
152 Standard_EXPORT Standard_Real FirstParameter (const Standard_Integer IndexSpine) const;
154 //! gives the total length till the ark with number
155 //! IndexSpine (inclus)
156 Standard_EXPORT Standard_Real LastParameter (const Standard_Integer IndexSpine) const;
158 //! gives the length of ark with number IndexSp
159 Standard_EXPORT Standard_Real Length (const Standard_Integer IndexSpine) const;
161 Standard_EXPORT Standard_Boolean IsPeriodic() const;
163 Standard_EXPORT Standard_Real Period() const;
165 Standard_EXPORT Standard_Real Absc (const Standard_Real U);
167 Standard_EXPORT Standard_Real Absc (const Standard_Real U, const Standard_Integer I);
169 Standard_EXPORT void Parameter (const Standard_Real AbsC, Standard_Real& U, const Standard_Boolean Oriented = Standard_True);
171 Standard_EXPORT void Parameter (const Standard_Integer Index, const Standard_Real AbsC, Standard_Real& U, const Standard_Boolean Oriented = Standard_True);
173 Standard_EXPORT gp_Pnt Value (const Standard_Real AbsC);
175 Standard_EXPORT void D0 (const Standard_Real AbsC, gp_Pnt& P);
177 Standard_EXPORT void D1 (const Standard_Real AbsC, gp_Pnt& P, gp_Vec& V1);
179 Standard_EXPORT void D2 (const Standard_Real AbsC, gp_Pnt& P, gp_Vec& V1, gp_Vec& V2);
181 Standard_EXPORT void SetCurrent (const Standard_Integer Index);
183 //! sets the current curve and returns it
184 Standard_EXPORT const BRepAdaptor_Curve& CurrentElementarySpine (const Standard_Integer Index);
186 Standard_Integer CurrentIndexOfElementarySpine() const;
188 Standard_EXPORT GeomAbs_CurveType GetType() const;
190 Standard_EXPORT gp_Lin Line() const;
192 Standard_EXPORT gp_Circ Circle() const;
194 //! returns if the set of edges starts on a free boundary
195 //! or if the first vertex is a breakpoint or if the set is
197 ChFiDS_State FirstStatus() const;
199 //! returns the state at the end of the set
200 ChFiDS_State LastStatus() const;
202 ChFiDS_State Status (const Standard_Boolean IsFirst) const;
204 void SetStatus (const ChFiDS_State S, const Standard_Boolean IsFirst);
206 //! returns if the set of edges starts (or end) on
208 Standard_Boolean IsTangencyExtremity (const Standard_Boolean IsFirst) const;
210 void SetTangencyExtremity (const Standard_Boolean IsTangency, const Standard_Boolean IsFirst);
212 Standard_EXPORT Standard_Real Absc (const TopoDS_Vertex& V) const;
214 Standard_EXPORT TopoDS_Vertex FirstVertex() const;
216 Standard_EXPORT TopoDS_Vertex LastVertex() const;
218 Standard_EXPORT void SetFirstTgt (const Standard_Real W);
220 Standard_EXPORT void SetLastTgt (const Standard_Real W);
222 Standard_EXPORT Standard_Boolean HasFirstTgt() const;
224 Standard_EXPORT Standard_Boolean HasLastTgt() const;
226 //! set a parameter reference for the approx.
227 Standard_EXPORT void SetReference (const Standard_Real W);
229 //! set a parameter reference for the approx, at the
230 //! middle of edge I.
231 Standard_EXPORT void SetReference (const Standard_Integer I);
233 Standard_EXPORT Standard_Integer Index (const Standard_Real W, const Standard_Boolean Forward = Standard_True) const;
235 Standard_EXPORT Standard_Integer Index (const TopoDS_Edge& E) const;
237 Standard_EXPORT void UnsetReference();
239 Standard_EXPORT void SetErrorStatus (const ChFiDS_ErrorStatus state);
241 Standard_EXPORT ChFiDS_ErrorStatus ErrorStatus() const;
243 //! Return the mode of chamfers used
244 Standard_EXPORT ChFiDS_ChamfMode Mode() const;
248 DEFINE_STANDARD_RTTIEXT(ChFiDS_Spine,Standard_Transient)
253 Standard_Boolean splitdone;
254 ChFiDS_ListOfHElSpine elspines;
255 ChFiDS_ListOfHElSpine offset_elspines;
256 ChFiDS_ChamfMode myMode;
262 Standard_EXPORT void Prepare (Standard_Real& L, Standard_Integer& Index) const;
264 BRepAdaptor_Curve myCurve;
265 BRepAdaptor_Curve myOffsetCurve;
266 Standard_Integer indexofcurve;
267 ChFiDS_State firstState;
268 ChFiDS_State lastState;
269 TopTools_SequenceOfShape spine;
270 TopTools_SequenceOfShape offsetspine;
271 Handle(TColStd_HArray1OfReal) abscissa;
272 Handle(TColStd_HArray1OfReal) offset_abscissa;
273 Standard_Real tolesp;
274 Standard_Real firstparam;
275 Standard_Real lastparam;
276 Standard_Boolean firstprolon;
277 Standard_Boolean lastprolon;
278 Standard_Boolean firstistgt;
279 Standard_Boolean lastistgt;
280 Standard_Real firsttgtpar;
281 Standard_Real lasttgtpar;
282 Standard_Boolean hasfirsttgt;
283 Standard_Boolean haslasttgt;
288 Standard_Real valref;
289 Standard_Boolean hasref;
290 ChFiDS_ErrorStatus errorstate;
296 #include <ChFiDS_Spine.lxx>
302 #endif // _ChFiDS_Spine_HeaderFile