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