1 // Created on: 1996-07-02
2 // Created by: Joelle CHAUVET
3 // Copyright (c) 1996-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 // Modified: Mon Dec 9 11:39:13 1996
19 // G1135 : empty constructor
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>
31 //==========================================================================================
32 //function : AdvApp2Var_Framework
34 //==========================================================================================
36 AdvApp2Var_Framework::AdvApp2Var_Framework()
41 //==========================================================================================
42 //function : AdvApp2Var_Framework
44 //==========================================================================================
46 AdvApp2Var_Framework::AdvApp2Var_Framework(const AdvApp2Var_SequenceOfNode& Frame,
47 const AdvApp2Var_SequenceOfStrip& UFrontier,
48 const AdvApp2Var_SequenceOfStrip& VFrontier)
50 myNodeConstraints = Frame;
51 myUConstraints = UFrontier;
52 myVConstraints = VFrontier;
55 //==========================================================================================
56 //function : FirstNotApprox
57 //purpose : return the first Iso not approximated
58 //==========================================================================================
60 Handle(AdvApp2Var_Iso) AdvApp2Var_Framework::FirstNotApprox(Standard_Integer& IndexIso,
61 Standard_Integer& IndexStrip) const
63 for (int anUVIter = 0; anUVIter < 2; ++anUVIter)
65 const AdvApp2Var_SequenceOfStrip& aSeq = anUVIter == 0 ? myUConstraints : myVConstraints;
66 Standard_Integer i = 1;
67 for (AdvApp2Var_SequenceOfStrip::Iterator aConstIter (aSeq); aConstIter.More(); aConstIter.Next(), i++)
69 const AdvApp2Var_Strip& S = aConstIter.Value();
70 Standard_Integer j = 1;
71 for (AdvApp2Var_Strip::Iterator anIsoIter (S); anIsoIter.More(); anIsoIter.Next(), j++)
73 const Handle(AdvApp2Var_Iso)& anIso = anIsoIter.Value();
74 if (!anIso->IsApproximated())
83 return Handle(AdvApp2Var_Iso)();
86 //==========================================================================================
87 //function : FirstNode
88 //purpose : return the first node of an iso
89 //==========================================================================================
91 Standard_Integer AdvApp2Var_Framework::FirstNode(const GeomAbs_IsoType Type,
92 const Standard_Integer IndexIso,
93 const Standard_Integer IndexStrip) const
95 Standard_Integer NbIso,Index;
96 NbIso = myUConstraints.Length()+1;
97 if (Type==GeomAbs_IsoU) {
98 Index = NbIso * (IndexStrip-1) + IndexIso;
102 Index = NbIso * (IndexIso-1) + IndexStrip;
107 //==========================================================================================
108 //function : LastNode
109 //purpose : return the last node of an iso
110 //==========================================================================================
112 Standard_Integer AdvApp2Var_Framework::LastNode(const GeomAbs_IsoType Type,
113 const Standard_Integer IndexIso,
114 const Standard_Integer IndexStrip) const
116 Standard_Integer NbIso,Index;
117 NbIso = myUConstraints.Length()+1;
118 if (Type==GeomAbs_IsoU) {
119 Index = NbIso * IndexStrip + IndexIso;
123 Index = NbIso * (IndexIso-1) + IndexStrip + 1;
128 //==========================================================================================
129 //function : ChangeIso
130 //purpose : replace the iso IndexIso of the strip IndexStrip by anIso
131 //==========================================================================================
133 void AdvApp2Var_Framework::ChangeIso(const Standard_Integer IndexIso,
134 const Standard_Integer IndexStrip,
135 const Handle(AdvApp2Var_Iso)& theIso)
137 AdvApp2Var_Strip& S0 = theIso->Type() == GeomAbs_IsoV
138 ? myUConstraints.ChangeValue (IndexStrip)
139 : myVConstraints.ChangeValue (IndexStrip);
140 S0.SetValue (IndexIso, theIso);
143 //==========================================================================================
145 //purpose : return the node of coordinates (U,V)
146 //==========================================================================================
148 const Handle(AdvApp2Var_Node)& AdvApp2Var_Framework::Node(const Standard_Real U,
149 const Standard_Real V) const
151 for (AdvApp2Var_SequenceOfNode::Iterator aNodeIter (myNodeConstraints); aNodeIter.More(); aNodeIter.Next())
153 const Handle(AdvApp2Var_Node)& aNode = aNodeIter.Value();
154 if (aNode->Coord().X() == U
155 && aNode->Coord().Y() == V)
160 return myNodeConstraints.Last();
163 //==========================================================================================
165 //purpose : return the Iso U=U with V0<=V<=V1
166 //==========================================================================================
168 const AdvApp2Var_Iso&
169 AdvApp2Var_Framework::IsoU(const Standard_Real U,
170 const Standard_Real V0,
171 const Standard_Real V1) const
173 Standard_Integer IndexStrip = 1;
174 while (IndexStrip < myVConstraints.Length()
175 && (myVConstraints.Value(IndexStrip).First()->T0() != V0
176 || myVConstraints.Value(IndexStrip).First()->T1() != V1))
180 Standard_Integer IndexIso = 1;
181 while (IndexIso<=myUConstraints.Length()
182 && myVConstraints.Value(IndexStrip).Value(IndexIso)->Constante() != U)
186 return *(myVConstraints.Value(IndexStrip).Value(IndexIso));
189 //==========================================================================================
191 //purpose : return the Iso V=V with U0<=U<=U1
192 //==========================================================================================
194 const AdvApp2Var_Iso&
195 AdvApp2Var_Framework::IsoV(const Standard_Real U0,
196 const Standard_Real U1,
197 const Standard_Real V) const
199 Standard_Integer IndexStrip = 1;
200 while (IndexStrip < myUConstraints.Length()
201 && (myUConstraints.Value(IndexStrip).First()->T0() != U0
202 || myUConstraints.Value(IndexStrip).First()->T1() != U1))
206 Standard_Integer IndexIso = 1;
207 while (IndexIso<=myVConstraints.Length()
208 && myUConstraints.Value(IndexStrip).Value(IndexIso)->Constante() != V)
212 return *(myUConstraints.Value(IndexStrip).Value(IndexIso));
215 //==========================================================================================
216 //function : UpdateInU
217 //purpose : modification and insertion of nodes and isos
218 //==========================================================================================
220 void AdvApp2Var_Framework::UpdateInU(const Standard_Real CuttingValue)
222 Standard_Integer i = 1;
223 for (AdvApp2Var_SequenceOfStrip::Iterator anUConstIter (myUConstraints); anUConstIter.More(); anUConstIter.Next(), ++i)
225 if (anUConstIter.Value().First()->U0() <= CuttingValue
226 && anUConstIter.Value().First()->U1() >= CuttingValue)
233 const AdvApp2Var_Strip& S0 = myUConstraints.Value(i);
234 const Standard_Real Udeb = S0.First()->U0(), Ufin = S0.First()->U1();
236 // modification des Isos V de la bande en U d'indice i
237 for (AdvApp2Var_Strip::Iterator aStripIter (S0); aStripIter.More(); aStripIter.Next())
239 const Handle(AdvApp2Var_Iso)& anIso = aStripIter.Value();
240 anIso->ChangeDomain (Udeb, CuttingValue);
241 anIso->ResetApprox();
244 // insertion d'une nouvelle bande en U apres l'indice i
245 AdvApp2Var_Strip aNewStrip;
246 for (AdvApp2Var_Strip::Iterator aStripIter (S0); aStripIter.More(); aStripIter.Next())
248 const Handle(AdvApp2Var_Iso)& anIso = aStripIter.Value();
249 Handle(AdvApp2Var_Iso) aNewIso = new AdvApp2Var_Iso (anIso->Type(), anIso->Constante(),
250 CuttingValue, Ufin, anIso->V0(), anIso->V1(),
251 0, anIso->UOrder(), anIso->VOrder());
252 aNewIso->ResetApprox();
253 aNewStrip.Append (aNewIso);
255 myUConstraints.InsertAfter (i, aNewStrip);
258 // insertion d'une nouvelle Iso U=U* dans chaque bande en V apres l'indice i
259 // et restriction des paves des Isos adjacentes
260 for (Standard_Integer j = 1; j <= myVConstraints.Length(); j++)
262 AdvApp2Var_Strip& S0 = myVConstraints.ChangeValue(j);
263 Handle(AdvApp2Var_Iso) anIso = S0.Value(i);
264 anIso->ChangeDomain (anIso->U0(), CuttingValue, anIso->V0(), anIso->V1());
266 Handle(AdvApp2Var_Iso) aNewIso = new AdvApp2Var_Iso (anIso->Type(), CuttingValue, anIso->U0(), CuttingValue, anIso->V0(), anIso->V1(),
267 0, anIso->UOrder(), anIso->VOrder());
268 aNewIso->ResetApprox();
269 S0.InsertAfter (i, aNewIso);
271 anIso = S0.Value(i+2);
272 anIso->ChangeDomain (CuttingValue, anIso->U1(), anIso->V0(), anIso->V1());
275 // insertion des nouveaux noeuds (U*,Vj)
276 Handle(AdvApp2Var_Node) aNext;
277 Handle(AdvApp2Var_Node) aPrev = myNodeConstraints.First();
278 for (Standard_Integer j = 1; j < myNodeConstraints.Length(); j++)
280 aNext = myNodeConstraints.Value(j+1);
281 if (aPrev->Coord().X() < CuttingValue
282 && aNext->Coord().X() > CuttingValue
283 && aPrev->Coord().Y() == aNext->Coord().Y())
285 gp_XY aNewUV (CuttingValue, aPrev->Coord().Y());
286 Handle(AdvApp2Var_Node) aNewNode = new AdvApp2Var_Node (aNewUV, aPrev->UOrder(), aPrev->VOrder());
287 myNodeConstraints.InsertAfter (j, aNewNode);
293 //==========================================================================================
294 //function : UpdateInV
295 //purpose : modification and insertion of nodes and isos
296 //==========================================================================================
298 void AdvApp2Var_Framework::UpdateInV(const Standard_Real CuttingValue)
300 Standard_Integer j=1;
301 while (myVConstraints.Value(j).First()->V0() > CuttingValue
302 || myVConstraints.Value(j).First()->V1() < CuttingValue)
308 AdvApp2Var_Strip& S0 = myVConstraints.ChangeValue(j);
309 const Standard_Real Vdeb = S0.First()->V0(), Vfin = S0.First()->V1();
311 // modification des Isos U de la bande en V d'indice j
312 for (AdvApp2Var_Strip::Iterator anIsoIter (S0); anIsoIter.More(); anIsoIter.Next())
314 const Handle(AdvApp2Var_Iso)& anIso = anIsoIter.Value();
315 anIso->ChangeDomain (Vdeb, CuttingValue);
316 anIso->ResetApprox();
319 // insertion d'une nouvelle bande en V apres l'indice j
320 AdvApp2Var_Strip aNewStrip;
321 for (AdvApp2Var_Strip::Iterator anIsoIter (S0); anIsoIter.More(); anIsoIter.Next())
323 const Handle(AdvApp2Var_Iso)& anIso = anIsoIter.Value();
324 Handle(AdvApp2Var_Iso) aNewIso = new AdvApp2Var_Iso (anIso->Type(), anIso->Constante(),
325 anIso->U0(), anIso->U1(), CuttingValue, Vfin,
326 0, anIso->UOrder(), anIso->VOrder());
327 aNewIso->ResetApprox();
328 aNewStrip.Append (aNewIso);
330 myVConstraints.InsertAfter(j, aNewStrip);
333 // insertion d'une nouvelle Iso V=V* dans chaque bande en U apres l'indice j
334 // et restriction des paves des Isos adjacentes
335 for (AdvApp2Var_SequenceOfStrip::Iterator anUConstIter (myUConstraints); anUConstIter.More(); anUConstIter.Next())
337 AdvApp2Var_Strip& S0 = anUConstIter.ChangeValue();
338 Handle(AdvApp2Var_Iso) anIso = S0.Value(j);
339 anIso->ChangeDomain (anIso->U0(), anIso->U1(), anIso->V0(), CuttingValue);
341 Handle(AdvApp2Var_Iso) aNewIso = new AdvApp2Var_Iso (anIso->Type(), CuttingValue, anIso->U0(), anIso->U1(), anIso->V0(), CuttingValue,
342 0, anIso->UOrder(), anIso->VOrder());
343 aNewIso->ResetApprox();
344 S0.InsertAfter (j, aNewIso);
346 anIso = S0.Value (j + 2);
347 anIso->ChangeDomain (anIso->U0(), anIso->U1(), CuttingValue, anIso->V1());
350 // insertion des nouveaux noeuds (Ui,V*)
351 Standard_Integer i = 1;
352 while (i <= myNodeConstraints.Length()
353 && myNodeConstraints.Value(i)->Coord().Y() < CuttingValue)
355 i += myUConstraints.Length() + 1;
357 for (j = 1; j <= myUConstraints.Length() + 1; j++)
359 const Handle(AdvApp2Var_Node)& aJNode = myNodeConstraints.Value(j);
360 gp_XY NewUV (aJNode->Coord().X(), CuttingValue);
361 Handle(AdvApp2Var_Node) aNewNode = new AdvApp2Var_Node (NewUV, aJNode->UOrder(), aJNode->VOrder());
362 myNodeConstraints.InsertAfter (i+j-2, aNewNode);
366 //==========================================================================================
367 //function : UEquation
368 //purpose : return the coefficients of the polynomial equation which approximates an iso U
369 //==========================================================================================
371 const Handle(TColStd_HArray1OfReal)&
372 AdvApp2Var_Framework::UEquation(const Standard_Integer IndexIso,
373 const Standard_Integer IndexStrip) const
375 return myVConstraints.Value(IndexStrip).Value(IndexIso)->Polynom();
378 //==========================================================================================
379 //function : VEquation
380 //purpose : return the coefficients of the polynomial equation which approximates an iso V
381 //==========================================================================================
383 const Handle(TColStd_HArray1OfReal)&
384 AdvApp2Var_Framework::VEquation(const Standard_Integer IndexIso,
385 const Standard_Integer IndexStrip) const
387 return myUConstraints.Value(IndexStrip).Value(IndexIso)->Polynom();