b311480e |
1 | // Created on: 1996-07-02 |
2 | // Created by: Joelle CHAUVET |
3 | // Copyright (c) 1996-1999 Matra Datavision |
973c2be1 |
4 | // Copyright (c) 1999-2014 OPEN CASCADE SAS |
b311480e |
5 | // |
973c2be1 |
6 | // This file is part of Open CASCADE Technology software library. |
b311480e |
7 | // |
d5f74e42 |
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 |
973c2be1 |
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. |
b311480e |
13 | // |
973c2be1 |
14 | // Alternatively, this file may be used under the terms of Open CASCADE |
15 | // commercial license or contractual agreement. |
b311480e |
16 | |
7fd59977 |
17 | // Modified: Mon Dec 9 11:39:13 1996 |
18 | // by: Joelle CHAUVET |
19 | // G1135 : empty constructor |
20 | |
21 | |
22 | #include <AdvApp2Var_Framework.hxx> |
23 | #include <AdvApp2Var_Iso.hxx> |
24 | #include <AdvApp2Var_Strip.hxx> |
25 | #include <AdvApp2Var_SequenceOfStrip.hxx> |
26 | #include <AdvApp2Var_Node.hxx> |
27 | #include <AdvApp2Var_SequenceOfNode.hxx> |
28 | #include <TColStd_HArray1OfReal.hxx> |
29 | #include <gp_XY.hxx> |
30 | |
31 | //========================================================================================== |
32 | //function : AdvApp2Var_Framework |
33 | //purpose : |
34 | //========================================================================================== |
35 | |
36 | AdvApp2Var_Framework::AdvApp2Var_Framework() |
37 | { |
38 | } |
39 | |
40 | |
41 | //========================================================================================== |
42 | //function : AdvApp2Var_Framework |
43 | //purpose : |
44 | //========================================================================================== |
45 | |
46 | AdvApp2Var_Framework::AdvApp2Var_Framework(const AdvApp2Var_SequenceOfNode& Frame, |
47 | const AdvApp2Var_SequenceOfStrip& UFrontier, |
48 | const AdvApp2Var_SequenceOfStrip& VFrontier) |
49 | { |
50 | myNodeConstraints = Frame; |
51 | myUConstraints = UFrontier; |
52 | myVConstraints = VFrontier; |
53 | } |
54 | |
55 | //========================================================================================== |
56 | //function : FirstNotApprox |
57 | //purpose : return the first Iso not approximated |
58 | //========================================================================================== |
59 | |
60 | Standard_Boolean AdvApp2Var_Framework::FirstNotApprox(Standard_Integer& IndexIso, |
61 | Standard_Integer& IndexStrip, |
62 | AdvApp2Var_Iso& anIso) const |
63 | { |
64 | Standard_Boolean good = Standard_True; |
65 | Standard_Integer i,j; |
66 | AdvApp2Var_Strip S; |
67 | |
68 | for (i = 1; i <= myUConstraints.Length() && good ; i++) { |
69 | S = myUConstraints.Value(i); |
70 | for (j = 1; j <= S.Length() && good ; j++) { |
71 | good = (S.Value(j)).IsApproximated(); |
72 | if (!good) { |
73 | IndexIso = j; |
74 | IndexStrip = i; |
75 | anIso = S.Value(j); |
76 | } |
77 | } |
78 | } |
79 | if (!good) { |
80 | goto FINISH; |
81 | } |
82 | |
83 | for (i = 1; i <= myVConstraints.Length() && good; i++) { |
84 | S = myVConstraints.Value(i); |
85 | for (j = 1; j <= S.Length() && good ; j++) { |
86 | good = (S.Value(j)).IsApproximated(); |
87 | if (!good) { |
88 | IndexIso = j; |
89 | IndexStrip = i; |
90 | anIso = S.Value(j); |
91 | } |
92 | } |
93 | } |
94 | |
95 | FINISH: |
96 | return !good; |
97 | } |
98 | |
99 | //========================================================================================== |
100 | //function : FirstNode |
101 | //purpose : return the first node of an iso |
102 | //========================================================================================== |
103 | |
104 | Standard_Integer AdvApp2Var_Framework::FirstNode(const GeomAbs_IsoType Type, |
105 | const Standard_Integer IndexIso, |
106 | const Standard_Integer IndexStrip) const |
107 | { |
108 | Standard_Integer NbIso,Index; |
109 | NbIso = myUConstraints.Length()+1; |
110 | if (Type==GeomAbs_IsoU) { |
111 | Index = NbIso * (IndexStrip-1) + IndexIso; |
112 | return Index; |
113 | } |
114 | else { |
115 | Index = NbIso * (IndexIso-1) + IndexStrip; |
116 | return Index; |
117 | } |
118 | } |
119 | |
120 | //========================================================================================== |
121 | //function : LastNode |
122 | //purpose : return the last node of an iso |
123 | //========================================================================================== |
124 | |
125 | Standard_Integer AdvApp2Var_Framework::LastNode(const GeomAbs_IsoType Type, |
126 | const Standard_Integer IndexIso, |
127 | const Standard_Integer IndexStrip) const |
128 | { |
129 | Standard_Integer NbIso,Index; |
130 | NbIso = myUConstraints.Length()+1; |
131 | if (Type==GeomAbs_IsoU) { |
132 | Index = NbIso * IndexStrip + IndexIso; |
133 | return Index; |
134 | } |
135 | else { |
136 | Index = NbIso * (IndexIso-1) + IndexStrip + 1; |
137 | return Index; |
138 | } |
139 | } |
140 | |
141 | //========================================================================================== |
142 | //function : ChangeIso |
143 | //purpose : replace the iso IndexIso of the strip IndexStrip by anIso |
144 | //========================================================================================== |
145 | |
146 | void AdvApp2Var_Framework::ChangeIso(const Standard_Integer IndexIso, |
147 | const Standard_Integer IndexStrip, |
148 | const AdvApp2Var_Iso& anIso) |
149 | { |
150 | AdvApp2Var_Strip S0; |
151 | if (anIso.Type()==GeomAbs_IsoV) { |
152 | S0 = myUConstraints.Value(IndexStrip); |
153 | S0.SetValue(IndexIso,anIso); |
154 | myUConstraints.SetValue(IndexStrip,S0); |
155 | } |
156 | else { |
157 | S0 = myVConstraints.Value(IndexStrip); |
158 | S0.SetValue(IndexIso,anIso); |
159 | myVConstraints.SetValue(IndexStrip,S0); |
160 | } |
161 | } |
162 | |
163 | //========================================================================================== |
164 | //function : Node |
165 | //purpose : return the node of coordinates (U,V) |
166 | //========================================================================================== |
167 | |
168 | const AdvApp2Var_Node& AdvApp2Var_Framework::Node(const Standard_Real U, |
169 | const Standard_Real V) const |
170 | { |
171 | Standard_Integer Index=1; |
172 | while ( ( ((myNodeConstraints.Value(Index)).Coord()).X() != U |
173 | || ((myNodeConstraints.Value(Index)).Coord()).Y() != V ) |
174 | && (Index<myNodeConstraints.Length()) ) { |
175 | Index++; |
176 | } |
177 | return myNodeConstraints.Value(Index); |
178 | } |
179 | |
180 | //========================================================================================== |
181 | //function : IsoU |
182 | //purpose : return the Iso U=U with V0<=V<=V1 |
183 | //========================================================================================== |
184 | |
185 | const AdvApp2Var_Iso& |
186 | AdvApp2Var_Framework::IsoU(const Standard_Real U, |
187 | const Standard_Real V0, |
188 | const Standard_Real V1) const |
189 | { |
190 | Standard_Integer IndexStrip=1,IndexIso=1; |
191 | while ( ( ((myVConstraints.Value(IndexStrip)).Value(1)).T0() != V0 |
192 | || ((myVConstraints.Value(IndexStrip)).Value(1)).T1() != V1 ) |
193 | && (IndexStrip<myVConstraints.Length()) ) { |
194 | IndexStrip++; |
195 | } |
196 | while ( ( ((myVConstraints.Value(IndexStrip)).Value(IndexIso)).Constante() != U) |
197 | && (IndexIso<=myUConstraints.Length()) ) { |
198 | IndexIso++; |
199 | } |
200 | return (myVConstraints.Value(IndexStrip)).Value(IndexIso); |
201 | } |
202 | |
203 | //========================================================================================== |
204 | //function : IsoV |
205 | //purpose : return the Iso V=V with U0<=U<=U1 |
206 | //========================================================================================== |
207 | |
208 | const AdvApp2Var_Iso& |
209 | AdvApp2Var_Framework::IsoV(const Standard_Real U0, |
210 | const Standard_Real U1, |
211 | const Standard_Real V) const |
212 | { |
213 | Standard_Integer IndexStrip=1,IndexIso=1; |
214 | while ( ( ((myUConstraints.Value(IndexStrip)).Value(1)).T0() != U0 |
215 | || ((myUConstraints.Value(IndexStrip)).Value(1)).T1() != U1 ) |
216 | && (IndexStrip<myUConstraints.Length()) ) { |
217 | IndexStrip++; |
218 | } |
219 | while ( ( ((myUConstraints.Value(IndexStrip)).Value(IndexIso)).Constante() != V) |
220 | && (IndexIso<=myVConstraints.Length()) ) { |
221 | IndexIso++; |
222 | } |
223 | return (myUConstraints.Value(IndexStrip)).Value(IndexIso); |
224 | } |
225 | |
226 | //========================================================================================== |
227 | //function : UpdateInU |
228 | //purpose : modification and insertion of nodes and isos |
229 | //========================================================================================== |
230 | |
231 | void AdvApp2Var_Framework::UpdateInU(const Standard_Real CuttingValue) |
232 | { |
233 | Standard_Integer i=1,j; |
234 | while (((myUConstraints.Value(i)).Value(1)).U0()>CuttingValue |
235 | || ((myUConstraints.Value(i)).Value(1)).U1()<CuttingValue) { |
236 | i++; |
237 | } |
238 | AdvApp2Var_Strip S0; |
239 | AdvApp2Var_Iso Is; |
240 | S0 = myUConstraints.Value(i); |
241 | Standard_Real Udeb = (S0.Value(1)).U0(), Ufin = (S0.Value(1)).U1(); |
242 | |
243 | // modification des Isos V de la bande en U d'indice i |
244 | for (j=1;j<=S0.Length();j++) { |
245 | Is = S0.Value(j); |
246 | Is.ChangeDomain(Udeb,CuttingValue); |
247 | Is.ResetApprox(); |
248 | S0.SetValue(j,Is); |
249 | } |
250 | myUConstraints.SetValue(i,S0); |
251 | |
252 | // insertion d'une nouvelle bande en U apres l'indice i |
253 | AdvApp2Var_Strip NewStrip; |
254 | for (j=1;j<=S0.Length();j++) { |
255 | AdvApp2Var_Iso NewIso((S0.Value(j)).Type(),(S0.Value(j)).Constante(), |
256 | CuttingValue,Ufin,(S0.Value(j)).V0(),(S0.Value(j)).V1(), |
257 | 0,(S0.Value(j)).UOrder(),(S0.Value(j)).VOrder()); |
258 | NewIso.ResetApprox(); |
259 | NewStrip.Append(NewIso); |
260 | } |
261 | myUConstraints.InsertAfter(i,NewStrip); |
262 | |
263 | // insertion d'une nouvelle Iso U=U* dans chaque bande en V apres l'indice i |
264 | // et restriction des paves des Isos adjacentes |
265 | for (j=1;j<=myVConstraints.Length();j++) { |
266 | S0 = myVConstraints.Value(j); |
267 | Is = S0.Value(i); |
268 | Is.ChangeDomain(Is.U0(),CuttingValue,Is.V0(),Is.V1()); |
269 | S0.SetValue(i,Is); |
270 | AdvApp2Var_Iso NewIso(Is.Type(),CuttingValue,Is.U0(),CuttingValue,Is.V0(),Is.V1(), |
271 | 0,Is.UOrder(),Is.VOrder()); |
272 | NewIso.ResetApprox(); |
273 | S0.InsertAfter(i,NewIso); |
274 | Is = S0.Value(i+2); |
275 | Is.ChangeDomain(CuttingValue,Is.U1(),Is.V0(),Is.V1()); |
276 | S0.SetValue(i+2,Is); |
277 | myVConstraints.SetValue(j,S0); |
278 | } |
279 | |
280 | // insertion des nouveaux noeuds (U*,Vj) |
281 | AdvApp2Var_Node Prev, Next; |
282 | Prev=myNodeConstraints.Value(1); |
283 | for (j=1;j<myNodeConstraints.Length();j++) { |
284 | Next=myNodeConstraints.Value(j+1); |
285 | if ((Prev.Coord()).X()<CuttingValue && ((Next.Coord()).X()>CuttingValue) |
286 | && ((Prev.Coord()).Y()==(Next.Coord()).Y())) { |
287 | gp_XY NewUV(CuttingValue,(Prev.Coord()).Y()); |
288 | AdvApp2Var_Node NewNode(NewUV,Prev.UOrder(),Prev.VOrder()); |
289 | myNodeConstraints.InsertAfter(j,NewNode); |
290 | } |
291 | Prev=Next; |
292 | } |
293 | } |
294 | |
295 | //========================================================================================== |
296 | //function : UpdateInV |
297 | //purpose : modification and insertion of nodes and isos |
298 | //========================================================================================== |
299 | |
300 | void AdvApp2Var_Framework::UpdateInV(const Standard_Real CuttingValue) |
301 | { |
302 | Standard_Integer i,j=1; |
303 | while (((myVConstraints.Value(j)).Value(1)).V0()>CuttingValue |
304 | || ((myVConstraints.Value(j)).Value(1)).V1()<CuttingValue) { |
305 | j++; |
306 | } |
307 | AdvApp2Var_Strip S0; |
308 | AdvApp2Var_Iso Is; |
309 | S0 = myVConstraints.Value(j); |
310 | Standard_Real Vdeb = (S0.Value(1)).V0(), Vfin = (S0.Value(1)).V1(); |
311 | |
312 | // modification des Isos U de la bande en V d'indice j |
313 | for (i=1;i<=S0.Length();i++) { |
314 | Is = S0.Value(i); |
315 | Is.ChangeDomain(Vdeb,CuttingValue); |
316 | Is.ResetApprox(); |
317 | S0.SetValue(i,Is); |
318 | } |
319 | myVConstraints.SetValue(j,S0); |
320 | |
321 | // insertion d'une nouvelle bande en V apres l'indice j |
322 | AdvApp2Var_Strip NewStrip; |
323 | for (i=1;i<=S0.Length();i++) { |
324 | AdvApp2Var_Iso NewIso((S0.Value(i)).Type(),(S0.Value(i)).Constante(), |
325 | (S0.Value(i)).U0(),(S0.Value(i)).U1(),CuttingValue,Vfin, |
326 | 0,(S0.Value(i)).UOrder(),(S0.Value(i)).VOrder()); |
327 | NewIso.ResetApprox(); |
328 | NewStrip.Append(NewIso); |
329 | } |
330 | myVConstraints.InsertAfter(j,NewStrip); |
331 | |
332 | // insertion d'une nouvelle Iso V=V* dans chaque bande en U apres l'indice j |
333 | // et restriction des paves des Isos adjacentes |
334 | for (i=1;i<=myUConstraints.Length();i++) { |
335 | S0 = myUConstraints.Value(i); |
336 | Is = S0.Value(j); |
337 | Is.ChangeDomain(Is.U0(),Is.U1(),Is.V0(),CuttingValue); |
338 | S0.SetValue(j,Is); |
339 | AdvApp2Var_Iso NewIso(Is.Type(),CuttingValue,Is.U0(),Is.U1(),Is.V0(),CuttingValue, |
340 | 0,Is.UOrder(),Is.VOrder()); |
341 | NewIso.ResetApprox(); |
342 | S0.InsertAfter(j,NewIso); |
343 | Is = S0.Value(j+2); |
344 | Is.ChangeDomain(Is.U0(),Is.U1(),CuttingValue,Is.V1()); |
345 | S0.SetValue(j+2,Is); |
346 | myUConstraints.SetValue(i,S0); |
347 | } |
348 | |
349 | // insertion des nouveaux noeuds (Ui,V*) |
350 | i = 1; |
351 | while ( i<=myNodeConstraints.Length() |
352 | && ( ((myNodeConstraints.Value(i)).Coord()).Y()) < CuttingValue) { |
353 | i+=myUConstraints.Length()+1; |
354 | } |
355 | for (j=1;j<=myUConstraints.Length()+1;j++) { |
356 | gp_XY NewUV(((myNodeConstraints.Value(j)).Coord()).X(),CuttingValue); |
357 | AdvApp2Var_Node NewNode(NewUV, |
358 | (myNodeConstraints.Value(j)).UOrder(), |
359 | (myNodeConstraints.Value(j)).VOrder()); |
360 | myNodeConstraints.InsertAfter(i+j-2,NewNode); |
361 | } |
362 | } |
363 | |
364 | //========================================================================================== |
365 | //function : UEquation |
366 | //purpose : return the coefficients of the polynomial equation which approximates an iso U |
367 | //========================================================================================== |
368 | |
369 | const Handle(TColStd_HArray1OfReal)& |
370 | AdvApp2Var_Framework::UEquation(const Standard_Integer IndexIso, |
371 | const Standard_Integer IndexStrip) const |
372 | { |
373 | return ((myVConstraints.Value(IndexStrip)).Value(IndexIso)).Polynom(); |
374 | } |
375 | |
376 | //========================================================================================== |
377 | //function : VEquation |
378 | //purpose : return the coefficients of the polynomial equation which approximates an iso V |
379 | //========================================================================================== |
380 | |
381 | const Handle(TColStd_HArray1OfReal)& |
382 | AdvApp2Var_Framework::VEquation(const Standard_Integer IndexIso, |
383 | const Standard_Integer IndexStrip) const |
384 | { |
385 | return myUConstraints.Value(IndexStrip).Value(IndexIso).Polynom(); |
386 | } |
387 | |