0022048: Visualization, AIS_InteractiveContext - single object selection should alway...
[occt.git] / src / AdvApp2Var / AdvApp2Var_Framework.cxx
CommitLineData
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
36AdvApp2Var_Framework::AdvApp2Var_Framework()
37{
38}
39
40
41//==========================================================================================
42//function : AdvApp2Var_Framework
43//purpose :
44//==========================================================================================
45
46AdvApp2Var_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
60Standard_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
104Standard_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
125Standard_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
146void 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
168const 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
185const AdvApp2Var_Iso&
186AdvApp2Var_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
208const AdvApp2Var_Iso&
209AdvApp2Var_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
231void 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
300void 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
369const Handle(TColStd_HArray1OfReal)&
370AdvApp2Var_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
381const Handle(TColStd_HArray1OfReal)&
382AdvApp2Var_Framework::VEquation(const Standard_Integer IndexIso,
383 const Standard_Integer IndexStrip) const
384{
385 return myUConstraints.Value(IndexStrip).Value(IndexIso).Polynom();
386}
387