]>
Commit | Line | Data |
---|---|---|
7fd59977 | 1 | // File: Geom_TrimmedCurve.cxx |
2 | // Created: Wed Mar 10 11:01:02 1993 | |
3 | // Author: JCV | |
4 | // <fid@phylox> | |
5 | // Copyright: Matra Datavision 1993 | |
6 | ||
7 | //File Geom_TrimmedCurve.cxx, JCV 17/01/91 | |
8 | ||
9 | #include <Geom_TrimmedCurve.ixx> | |
10 | ||
11 | #include <gp.hxx> | |
12 | #include <Geom_Geometry.hxx> | |
13 | #include <Geom_BSplineCurve.hxx> | |
14 | #include <Geom_BezierCurve.hxx> | |
15 | #include <Geom_OffsetCurve.hxx> | |
16 | #include <Geom_Line.hxx> | |
17 | #include <Geom_Circle.hxx> | |
18 | #include <Geom_Ellipse.hxx> | |
19 | #include <Geom_Hyperbola.hxx> | |
20 | #include <Geom_Parabola.hxx> | |
21 | #include <Standard_ConstructionError.hxx> | |
22 | #include <Standard_RangeError.hxx> | |
23 | #include <Precision.hxx> | |
24 | #include <ElCLib.hxx> | |
25 | ||
26 | ||
27 | typedef Handle(Geom_TrimmedCurve) Handle(TrimmedCurve); | |
28 | typedef Geom_TrimmedCurve TrimmedCurve; | |
29 | typedef Handle(Geom_Curve) Handle(Curve); | |
30 | typedef Handle(Geom_Geometry) Handle(Geometry); | |
31 | typedef gp_Ax1 Ax1; | |
32 | typedef gp_Ax2 Ax2; | |
33 | typedef gp_Pnt Pnt; | |
34 | typedef gp_Trsf Trsf; | |
35 | typedef gp_Vec Vec; | |
36 | ||
37 | //======================================================================= | |
38 | //function : Copy | |
39 | //purpose : | |
40 | //======================================================================= | |
41 | ||
42 | Handle(Geom_Geometry) Geom_TrimmedCurve::Copy () const { | |
43 | ||
44 | Handle(TrimmedCurve) Tc = new TrimmedCurve (basisCurve, uTrim1, uTrim2); | |
45 | return Tc; | |
46 | } | |
47 | ||
48 | ||
49 | //======================================================================= | |
50 | //function : Geom_TrimmedCurve | |
51 | //purpose : | |
52 | //======================================================================= | |
53 | ||
54 | Geom_TrimmedCurve::Geom_TrimmedCurve (const Handle(Geom_Curve)& C, | |
55 | const Standard_Real U1, | |
56 | const Standard_Real U2, | |
57 | const Standard_Boolean Sense) : | |
58 | uTrim1 (U1), | |
59 | uTrim2 (U2) | |
60 | { | |
61 | // kill trimmed basis curves | |
62 | Handle(Geom_TrimmedCurve) T = Handle(Geom_TrimmedCurve)::DownCast(C); | |
63 | if (!T.IsNull()) | |
64 | basisCurve = Handle(Curve)::DownCast(T->BasisCurve()->Copy()); | |
65 | else | |
66 | basisCurve = Handle(Curve)::DownCast(C->Copy()); | |
67 | ||
68 | SetTrim(U1,U2,Sense); | |
69 | } | |
70 | ||
71 | //======================================================================= | |
72 | //function : Reverse | |
73 | //purpose : | |
74 | //======================================================================= | |
75 | ||
76 | void Geom_TrimmedCurve::Reverse () | |
77 | { | |
78 | Standard_Real U1 = basisCurve->ReversedParameter(uTrim2); | |
79 | Standard_Real U2 = basisCurve->ReversedParameter(uTrim1); | |
80 | basisCurve->Reverse(); | |
81 | SetTrim(U1,U2); | |
82 | } | |
83 | ||
84 | ||
85 | //======================================================================= | |
86 | //function : ReversedParameter | |
87 | //purpose : | |
88 | //======================================================================= | |
89 | ||
90 | Standard_Real Geom_TrimmedCurve::ReversedParameter | |
91 | (const Standard_Real U) const | |
92 | { | |
93 | return basisCurve->ReversedParameter(U); | |
94 | } | |
95 | ||
96 | ||
97 | //======================================================================= | |
98 | //function : SetTrim | |
99 | //purpose : | |
100 | //======================================================================= | |
101 | ||
102 | void Geom_TrimmedCurve::SetTrim (const Standard_Real U1, | |
103 | const Standard_Real U2, | |
104 | const Standard_Boolean Sense) | |
105 | { | |
106 | Standard_Boolean sameSense = Standard_True; | |
107 | if (U1 == U2) | |
108 | Standard_ConstructionError::Raise("Geom_TrimmedCurve::U1 == U2"); | |
109 | ||
110 | Standard_Real Udeb = basisCurve->FirstParameter(); | |
111 | Standard_Real Ufin = basisCurve->LastParameter(); | |
112 | ||
113 | if (basisCurve->IsPeriodic()) { | |
114 | sameSense = Sense; | |
115 | ||
116 | // set uTrim1 in the range Udeb , Ufin | |
117 | // set uTrim2 in the range uTrim1 , uTrim1 + Period() | |
118 | uTrim1 = U1; | |
119 | uTrim2 = U2; | |
120 | ElCLib::AdjustPeriodic(Udeb, Ufin, | |
121 | Min(Abs(uTrim2-uTrim1)/2,Precision::PConfusion()), | |
122 | uTrim1, uTrim2); | |
123 | } | |
124 | ||
125 | else { | |
126 | if (U1 < U2) { | |
127 | sameSense = Sense; | |
128 | uTrim1 = U1; | |
129 | uTrim2 = U2; | |
130 | } | |
131 | else { | |
132 | sameSense = !Sense; | |
133 | uTrim1 = U2; | |
134 | uTrim2 = U1; | |
135 | } | |
136 | ||
137 | if ((Udeb - uTrim1 > Precision::PConfusion()) || | |
138 | (uTrim2 - Ufin > Precision::PConfusion())) | |
139 | Standard_ConstructionError::Raise | |
140 | ("Geom_TrimmedCurve::parameters out of range"); | |
141 | ||
142 | ||
143 | } | |
144 | if (!sameSense) { | |
145 | Reverse(); | |
146 | } | |
147 | } | |
148 | ||
149 | ||
150 | //======================================================================= | |
151 | //function : IsClosed | |
152 | //purpose : | |
153 | //======================================================================= | |
154 | ||
155 | Standard_Boolean Geom_TrimmedCurve::IsClosed () const | |
156 | { | |
157 | return ( StartPoint().Distance(EndPoint()) <= gp::Resolution()); | |
158 | } | |
159 | ||
160 | //======================================================================= | |
161 | //function : IsPeriodic | |
162 | //purpose : | |
163 | //======================================================================= | |
164 | ||
165 | Standard_Boolean Geom_TrimmedCurve::IsPeriodic () const | |
166 | { | |
167 | //return basisCurve->IsPeriodic(); | |
168 | return Standard_False; | |
169 | } | |
170 | ||
171 | ||
172 | //======================================================================= | |
173 | //function : Period | |
174 | //purpose : | |
175 | //======================================================================= | |
176 | ||
177 | Standard_Real Geom_TrimmedCurve::Period() const | |
178 | { | |
179 | return basisCurve->Period(); | |
180 | } | |
181 | ||
182 | ||
183 | //======================================================================= | |
184 | //function : Continuity | |
185 | //purpose : | |
186 | //======================================================================= | |
187 | ||
188 | GeomAbs_Shape Geom_TrimmedCurve::Continuity () const { | |
189 | ||
190 | return basisCurve->Continuity (); | |
191 | } | |
192 | ||
193 | ||
194 | //======================================================================= | |
195 | //function : BasisCurve | |
196 | //purpose : | |
197 | //======================================================================= | |
198 | ||
199 | Handle(Curve) Geom_TrimmedCurve::BasisCurve () const { | |
200 | ||
201 | return basisCurve; | |
202 | } | |
203 | ||
204 | ||
205 | //======================================================================= | |
206 | //function : D0 | |
207 | //purpose : | |
208 | //======================================================================= | |
209 | ||
210 | void Geom_TrimmedCurve::D0 (const Standard_Real U, Pnt& P) const { | |
211 | ||
212 | basisCurve->D0( U, P); | |
213 | } | |
214 | ||
215 | ||
216 | //======================================================================= | |
217 | //function : D1 | |
218 | //purpose : | |
219 | //======================================================================= | |
220 | ||
221 | void Geom_TrimmedCurve::D1 (const Standard_Real U, Pnt& P, Vec& V1) const { | |
222 | ||
223 | basisCurve->D1 (U, P, V1); | |
224 | } | |
225 | ||
226 | ||
227 | //======================================================================= | |
228 | //function : D2 | |
229 | //purpose : | |
230 | //======================================================================= | |
231 | ||
232 | void Geom_TrimmedCurve::D2 ( const Standard_Real U, | |
233 | Pnt& P, | |
234 | Vec& V1, Vec& V2) const { | |
235 | ||
236 | basisCurve->D2 (U, P, V1, V2); | |
237 | } | |
238 | ||
239 | ||
240 | //======================================================================= | |
241 | //function : D3 | |
242 | //purpose : | |
243 | //======================================================================= | |
244 | ||
245 | void Geom_TrimmedCurve::D3 (const Standard_Real U, | |
246 | Pnt& P, | |
247 | Vec& V1, Vec& V2, Vec& V3) const { | |
248 | ||
249 | basisCurve->D3 (U, P, V1, V2, V3); | |
250 | } | |
251 | ||
252 | ||
253 | //======================================================================= | |
254 | //function : DN | |
255 | //purpose : | |
256 | //======================================================================= | |
257 | ||
258 | Vec Geom_TrimmedCurve::DN (const Standard_Real U, | |
259 | const Standard_Integer N) const | |
260 | { | |
261 | return basisCurve->DN (U, N); | |
262 | } | |
263 | ||
264 | ||
265 | //======================================================================= | |
266 | //function : EndPoint | |
267 | //purpose : | |
268 | //======================================================================= | |
269 | ||
270 | Pnt Geom_TrimmedCurve::EndPoint () const { | |
271 | ||
272 | return basisCurve->Value (uTrim2); | |
273 | } | |
274 | ||
275 | ||
276 | //======================================================================= | |
277 | //function : FirstParameter | |
278 | //purpose : | |
279 | //======================================================================= | |
280 | ||
281 | Standard_Real Geom_TrimmedCurve::FirstParameter () const { | |
282 | ||
283 | return uTrim1; | |
284 | } | |
285 | ||
286 | //======================================================================= | |
287 | //function : LastParameter | |
288 | //purpose : | |
289 | //======================================================================= | |
290 | ||
291 | Standard_Real Geom_TrimmedCurve::LastParameter () const { | |
292 | ||
293 | return uTrim2; | |
294 | } | |
295 | ||
296 | //======================================================================= | |
297 | //function : StartPoint | |
298 | //purpose : | |
299 | //======================================================================= | |
300 | ||
301 | Pnt Geom_TrimmedCurve::StartPoint () const { | |
302 | ||
303 | return basisCurve->Value (uTrim1); | |
304 | } | |
305 | ||
306 | ||
307 | //======================================================================= | |
308 | //function : IsCN | |
309 | //purpose : | |
310 | //======================================================================= | |
311 | ||
312 | Standard_Boolean Geom_TrimmedCurve::IsCN (const Standard_Integer N) const { | |
313 | ||
314 | Standard_RangeError_Raise_if (N < 0, " "); | |
315 | return basisCurve->IsCN (N); | |
316 | } | |
317 | ||
318 | ||
319 | //======================================================================= | |
320 | //function : Transform | |
321 | //purpose : | |
322 | //======================================================================= | |
323 | ||
324 | void Geom_TrimmedCurve::Transform (const Trsf& T) | |
325 | { | |
326 | basisCurve->Transform (T); | |
327 | Standard_Real U1 = basisCurve->TransformedParameter(uTrim1,T); | |
328 | Standard_Real U2 = basisCurve->TransformedParameter(uTrim2,T); | |
329 | SetTrim(U1,U2); | |
330 | } | |
331 | ||
332 | ||
333 | //======================================================================= | |
334 | //function : TransformedParameter | |
335 | //purpose : | |
336 | //======================================================================= | |
337 | ||
338 | Standard_Real Geom_TrimmedCurve::TransformedParameter(const Standard_Real U, | |
339 | const gp_Trsf& T) const | |
340 | { | |
341 | return basisCurve->TransformedParameter(U,T); | |
342 | } | |
343 | ||
344 | //======================================================================= | |
345 | //function : ParametricTransformation | |
346 | //purpose : | |
347 | //======================================================================= | |
348 | ||
349 | Standard_Real Geom_TrimmedCurve::ParametricTransformation(const gp_Trsf& T) | |
350 | const | |
351 | { | |
352 | return basisCurve->ParametricTransformation(T); | |
353 | } | |
354 |