0024947: Redesign OCCT legacy type system -- automatic
[occt.git] / src / ShapeExtend / ShapeExtend_CompositeSurface.cxx
CommitLineData
b311480e 1// Created on: 1999-04-27
2// Created by: Pavel DURANDIN
3// Copyright (c) 1999-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.
7fd59977 16
17#include <ShapeExtend_CompositeSurface.ixx>
18#include <Precision.hxx>
ec357c5c 19#include <Geom_Surface.hxx>
7fd59977 20
21//=======================================================================
22//function : ShapeExtend_CompositeSurface
23//purpose :
24//=======================================================================
25
26ShapeExtend_CompositeSurface::ShapeExtend_CompositeSurface()
27{
28}
29
30//=======================================================================
31//function : Constructor
32//purpose :
33//=======================================================================
34
35ShapeExtend_CompositeSurface::ShapeExtend_CompositeSurface(const Handle(TColGeom_HArray2OfSurface)& GridSurf,
36 const ShapeExtend_Parametrisation param)
37{
38 Init ( GridSurf, param );
39}
40
41//=======================================================================
42//function : Constructor
43//purpose :
44//=======================================================================
45
46ShapeExtend_CompositeSurface::ShapeExtend_CompositeSurface(const Handle(TColGeom_HArray2OfSurface)& GridSurf,
47 const TColStd_Array1OfReal &UJoints,
48 const TColStd_Array1OfReal &VJoints)
49{
50 Init ( GridSurf, UJoints, VJoints );
51}
52
53//=======================================================================
54//function : Init
55//purpose :
56//=======================================================================
57
58Standard_Boolean ShapeExtend_CompositeSurface::Init (const Handle(TColGeom_HArray2OfSurface)& GridSurf,
59 const ShapeExtend_Parametrisation param)
60{
61 if ( GridSurf.IsNull() ) return Standard_False;
62 myPatches = GridSurf;
63 ComputeJointValues ( param );
64 return CheckConnectivity ( Precision::Confusion() );
65}
66
67//=======================================================================
68//function : Init
69//purpose :
70//=======================================================================
71
72Standard_Boolean ShapeExtend_CompositeSurface::Init (const Handle(TColGeom_HArray2OfSurface)& GridSurf,
73 const TColStd_Array1OfReal &UJoints,
74 const TColStd_Array1OfReal &VJoints)
75{
76 if ( GridSurf.IsNull() ) return Standard_False;
77 myPatches = GridSurf;
78
79 Standard_Boolean ok = Standard_True;
80 if ( ! SetUJointValues ( UJoints ) || ! SetVJointValues ( VJoints ) ) {
81 ok = Standard_False;
82 ComputeJointValues ( ShapeExtend_Natural );
0797d9d3 83#ifdef OCCT_DEBUG
7fd59977 84 cout << "Warning: ShapeExtend_CompositeSurface::Init: bad joint values" << endl;
85#endif
86 }
87
88 return ( CheckConnectivity ( Precision::Confusion() ) ? ok : Standard_False );
89}
90
91//=======================================================================
92//function : NbUPatches
93//purpose :
94//=======================================================================
95
96Standard_Integer ShapeExtend_CompositeSurface::NbUPatches() const
97{
98 return myPatches->ColLength();
99}
100
101//=======================================================================
102//function : NbVPatches
103//purpose :
104//=======================================================================
105
106Standard_Integer ShapeExtend_CompositeSurface::NbVPatches() const
107{
108 return myPatches->RowLength();
109}
110
111//=======================================================================
112//function : Patch
113//purpose :
114//=======================================================================
115
116const Handle(Geom_Surface)& ShapeExtend_CompositeSurface::Patch(const Standard_Integer i,
117 const Standard_Integer j) const
118{
119 return myPatches->Value(i,j);
120}
121
122//=======================================================================
123//function : Patches
124//purpose :
125//=======================================================================
126
127const Handle(TColGeom_HArray2OfSurface)& ShapeExtend_CompositeSurface::Patches() const
128{
129 return myPatches;
130}
131
132//=======================================================================
133//function : UJointValues
134//purpose :
135//=======================================================================
136
137Handle(TColStd_HArray1OfReal) ShapeExtend_CompositeSurface::UJointValues() const
138{
139 return myUJointValues;
140}
141
142//=======================================================================
143//function : VJointValues
144//purpose :
145//=======================================================================
146
147Handle(TColStd_HArray1OfReal) ShapeExtend_CompositeSurface::VJointValues() const
148{
149 return myVJointValues;
150}
151
152//=======================================================================
153//function : UJointValue
154//purpose :
155//=======================================================================
156
157Standard_Real ShapeExtend_CompositeSurface::UJointValue(const Standard_Integer i) const
158{
159 return myUJointValues->Value(i);
160}
161
162//=======================================================================
163//function : VJointValue
164//purpose :
165//=======================================================================
166
167Standard_Real ShapeExtend_CompositeSurface::VJointValue(const Standard_Integer i) const
168{
169 return myVJointValues->Value(i);
170}
171
172//=======================================================================
173//function : SetUJointValues
174//purpose :
175//=======================================================================
176
177Standard_Boolean ShapeExtend_CompositeSurface::SetUJointValues (const TColStd_Array1OfReal &UJoints)
178{
179 Standard_Integer NbU = NbUPatches();
180 if ( UJoints.Length() != NbU+1 ) return Standard_False;
181
182 Handle(TColStd_HArray1OfReal) UJointValues = new TColStd_HArray1OfReal(1,NbU+1);
183 for ( Standard_Integer i=1, j=UJoints.Lower(); i <= NbU+1; i++, j++ ) {
184 UJointValues->SetValue ( i, UJoints(j) );
185 if ( i >1 && UJoints(j) - UJoints(j-1) < Precision::PConfusion() )
186 return Standard_False;
187 }
188 myUJointValues = UJointValues;
189 return Standard_True;
190}
191
192//=======================================================================
193//function : SetVJointValues
194//purpose :
195//=======================================================================
196
197Standard_Boolean ShapeExtend_CompositeSurface::SetVJointValues (const TColStd_Array1OfReal &VJoints)
198{
199 Standard_Integer NbV = NbVPatches();
200 if ( VJoints.Length() != NbV+1 ) return Standard_False;
201
202 Handle(TColStd_HArray1OfReal) VJointValues = new TColStd_HArray1OfReal(1,NbV+1);
203 for ( Standard_Integer i=1, j=VJoints.Lower(); i <= NbV+1; i++, j++ ) {
204 VJointValues->SetValue ( i, VJoints(j) );
205 if ( i >1 && VJoints(j) - VJoints(j-1) < Precision::PConfusion() )
206 return Standard_False;
207 }
208 myVJointValues = VJointValues;
209 return Standard_True;
210}
211
212//=======================================================================
213//function : SetUFirstValue
214//purpose :
215//=======================================================================
216
217void ShapeExtend_CompositeSurface::SetUFirstValue (const Standard_Real UFirst)
218{
219 if ( myUJointValues.IsNull() ) return;
220
221 Standard_Real shift = UFirst - myUJointValues->Value(1);
222 Standard_Integer NbU = myUJointValues->Length();
223 for ( Standard_Integer i=1; i <= NbU; i++ ) {
224 myUJointValues->SetValue ( i, myUJointValues->Value(i) + shift );
225 }
226}
227
228//=======================================================================
229//function : SetVFirstValue
230//purpose :
231//=======================================================================
232
233void ShapeExtend_CompositeSurface::SetVFirstValue (const Standard_Real VFirst)
234{
235 if ( myVJointValues.IsNull() ) return;
236
237 Standard_Real shift = VFirst - myVJointValues->Value(1);
238 Standard_Integer NbV = myVJointValues->Length();
239 for ( Standard_Integer i=1; i <= NbV; i++ ) {
240 myVJointValues->SetValue ( i, myVJointValues->Value(i) + shift );
241 }
242}
243
244//=======================================================================
245//function : LocateUParameter
246//purpose :
247//=======================================================================
248
249Standard_Integer ShapeExtend_CompositeSurface::LocateUParameter(const Standard_Real U) const
250{
251 Standard_Integer nbPatch = NbUPatches();
252 for(Standard_Integer i = 2; i <= nbPatch; i++)
253 if (U < myUJointValues->Value(i)) return i-1;
254 return nbPatch;
255}
256
257//=======================================================================
258//function : LocateVParameter
259//purpose :
260//=======================================================================
261
262Standard_Integer ShapeExtend_CompositeSurface::LocateVParameter(const Standard_Real V) const
263{
264 Standard_Integer nbPatch = NbVPatches();
265 for(Standard_Integer i = 2; i <= nbPatch; i++)
266 if (V < myVJointValues->Value(i)) return i-1;
267 return nbPatch;
268}
269
270//=======================================================================
271//function : LocateUVPoint
272//purpose :
273//=======================================================================
274
275void ShapeExtend_CompositeSurface::LocateUVPoint(const gp_Pnt2d& pnt,
276 Standard_Integer& i,
277 Standard_Integer& j) const
278{
279 i = LocateUParameter(pnt.X());
280 j = LocateVParameter(pnt.Y());
281}
282
283//=======================================================================
284//function : Patch
285//purpose :
286//=======================================================================
287
288const Handle(Geom_Surface)& ShapeExtend_CompositeSurface::Patch(const Standard_Real U,
289 const Standard_Real V) const
290{
291 return myPatches->Value ( LocateUParameter(U), LocateVParameter(V) );
292}
293
294//=======================================================================
295//function : Patch
296//purpose :
297//=======================================================================
298
299const Handle(Geom_Surface)& ShapeExtend_CompositeSurface::Patch(const gp_Pnt2d& pnt) const
300{
301 return myPatches->Value ( LocateUParameter(pnt.X()), LocateVParameter(pnt.Y()) );
302}
303
304//=======================================================================
305//function : ULocalToGlobal
306//purpose :
307//=======================================================================
308
309Standard_Real ShapeExtend_CompositeSurface::ULocalToGlobal (const Standard_Integer i,
310 const Standard_Integer j,
311 const Standard_Real u) const
312{
313 Standard_Real u1, u2, v1, v2;
314 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
315 Standard_Real scale = ( myUJointValues->Value(i+1) - myUJointValues->Value(i) ) / ( u2 - u1 );
316 return u * scale + ( myUJointValues->Value(i) - u1 * scale ); // ! this formula is stable if u1 is infinite
317}
318
319//=======================================================================
320//function : VLocalToGlobal
321//purpose :
322//=======================================================================
323
324Standard_Real ShapeExtend_CompositeSurface::VLocalToGlobal (const Standard_Integer i,
325 const Standard_Integer j,
326 const Standard_Real v) const
327{
328 Standard_Real u1, u2, v1, v2;
329 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
330 Standard_Real scale = ( myVJointValues->Value(j+1) - myVJointValues->Value(j) ) / ( v2 - v1 );
331 return v * scale + ( myVJointValues->Value(j) - v1 * scale ); // ! this formula is stable if v1 is infinite
332}
333
334//=======================================================================
335//function : LocalToGlobal
336//purpose :
337//=======================================================================
338
339gp_Pnt2d ShapeExtend_CompositeSurface::LocalToGlobal (const Standard_Integer i,
340 const Standard_Integer j,
341 const gp_Pnt2d &uv) const
342{
343 Standard_Real u1, u2, v1, v2;
344 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
345 Standard_Real scaleu = ( myUJointValues->Value(i+1) - myUJointValues->Value(i) ) / ( u2 - u1 );
346 Standard_Real scalev = ( myVJointValues->Value(j+1) - myVJointValues->Value(j) ) / ( v2 - v1 );
347 return gp_Pnt2d ( uv.X() * scaleu + ( myUJointValues->Value(i) - u1 * scaleu ), // ! this formula is stable if u1 or v1 is infinite
348 uv.Y() * scalev + ( myVJointValues->Value(j) - v1 * scalev ) );
349}
350
351//=======================================================================
352//function : UGlobalToLocal
353//purpose :
354//=======================================================================
355
356Standard_Real ShapeExtend_CompositeSurface::UGlobalToLocal (const Standard_Integer i,
357 const Standard_Integer j,
358 const Standard_Real U) const
359{
360 Standard_Real u1, u2, v1, v2;
361 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
362 Standard_Real scale = ( u2 - u1 ) / ( myUJointValues->Value(i+1) - myUJointValues->Value(i) );
363 return U * scale + ( u1 - myUJointValues->Value(i) * scale ); // ! this formula is stable if u1 is infinite
364}
365
366//=======================================================================
367//function : VGlobalToLocal
368//purpose :
369//=======================================================================
370
371Standard_Real ShapeExtend_CompositeSurface::VGlobalToLocal (const Standard_Integer i,
372 const Standard_Integer j,
373 const Standard_Real V) const
374{
375 Standard_Real u1, u2, v1, v2;
376 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
377 Standard_Real scale = ( v2 - v1 ) / ( myVJointValues->Value(j+1) - myVJointValues->Value(j) );
378 return V * scale + ( v1 - myVJointValues->Value(j) * scale ); // ! this formula is stable if v1 is infinite
379}
380
381//=======================================================================
382//function : GlobalToLocal
383//purpose :
384//=======================================================================
385
386gp_Pnt2d ShapeExtend_CompositeSurface::GlobalToLocal (const Standard_Integer i,
387 const Standard_Integer j,
388 const gp_Pnt2d &UV) const
389{
390 Standard_Real u1, u2, v1, v2;
391 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
392 Standard_Real scaleu = ( u2 - u1 ) / ( myUJointValues->Value(i+1) - myUJointValues->Value(i) );
393 Standard_Real scalev = ( v2 - v1 ) / ( myVJointValues->Value(j+1) - myVJointValues->Value(j) );
394 return gp_Pnt2d ( UV.X() * scaleu + ( u1 - myUJointValues->Value(i) * scaleu ), // ! this formula is stable if u1 or v1 is infinite
395 UV.Y() * scalev + ( v1 - myVJointValues->Value(j) * scalev ) );
396}
397
398//=======================================================================
399//function : GlobalToLocalTransformation
400//purpose :
401//=======================================================================
402
403Standard_Boolean ShapeExtend_CompositeSurface::GlobalToLocalTransformation (const Standard_Integer i,
404 const Standard_Integer j,
405 Standard_Real &uFact,
406 gp_Trsf2d &Trsf) const
407{
408 Standard_Real u1, u2, v1, v2;
409 myPatches->Value(i,j)->Bounds ( u1, u2, v1, v2 );
410
411 Standard_Real scaleu = ( u2 - u1 ) / ( myUJointValues->Value(i+1) - myUJointValues->Value(i) );
412 Standard_Real scalev = ( v2 - v1 ) / ( myVJointValues->Value(j+1) - myVJointValues->Value(j) );
413 gp_Vec2d shift ( u1 / scaleu - myUJointValues->Value(i),
414 v1 / scalev - myVJointValues->Value(j) );
415
416 uFact = scaleu / scalev;
417 gp_Trsf2d Shift, Scale;
418 if ( shift.X() != 0. || shift.Y() != 0. ) Shift.SetTranslation ( shift );
419 if ( scalev != 1. ) Scale.SetScale ( gp_Pnt2d(0,0), scalev );
420 Trsf = Scale * Shift;
421 return uFact != 1. || Trsf.Form() != gp_Identity;
422}
423
424//=======================================================================
425// Inherited methods (from Geom_Geometry and Geom_Surface)
426//=======================================================================
427
428//=======================================================================
429//function : Transform
430//purpose :
431//=======================================================================
432
433void ShapeExtend_CompositeSurface::Transform (const gp_Trsf &T)
434{
435 if ( myPatches.IsNull() ) return;
436 for ( Standard_Integer i=1; i <= NbUPatches(); i++ )
437 for ( Standard_Integer j=1; j <= NbVPatches(); j++ )
438 Patch(i,j)->Transform ( T );
439}
440
441//=======================================================================
442//function : Copy
443//purpose :
444//=======================================================================
445
446Handle(Geom_Geometry) ShapeExtend_CompositeSurface::Copy () const
447{
448 Handle(ShapeExtend_CompositeSurface) surf = new ShapeExtend_CompositeSurface;
449 if ( myPatches.IsNull() ) return surf;
450
451 Handle(TColGeom_HArray2OfSurface) patches =
452 new TColGeom_HArray2OfSurface ( 1, NbUPatches(), 1, NbVPatches() );
453 for ( Standard_Integer i=1; i <= NbUPatches(); i++ )
454 for ( Standard_Integer j=1; j <= NbVPatches(); j++ )
455 patches->SetValue ( i, j, Handle(Geom_Surface)::DownCast ( Patch(i,j)->Copy() ) );
456 surf->Init ( patches );
457 return surf;
458}
459
460//=======================================================================
461//function : UReverse
462//purpose :
463//=======================================================================
464
465void ShapeExtend_CompositeSurface::UReverse ()
466{
467}
468
469//=======================================================================
470//function : UReversedParameter
471//purpose :
472//=======================================================================
473
474Standard_Real ShapeExtend_CompositeSurface::UReversedParameter (const Standard_Real U) const
475{
476 return U;
477}
478
479//=======================================================================
480//function : VReverse
481//purpose :
482//=======================================================================
483
484void ShapeExtend_CompositeSurface::VReverse ()
485{
486}
487
488//=======================================================================
489//function : VReversedParameter
490//purpose :
491//=======================================================================
492
493Standard_Real ShapeExtend_CompositeSurface::VReversedParameter (const Standard_Real V) const
494{
495 return V;
496}
497
498//=======================================================================
499//function : Bounds
500//purpose :
501//=======================================================================
502
503void ShapeExtend_CompositeSurface::Bounds(Standard_Real& U1,
504 Standard_Real& U2,
505 Standard_Real& V1,
506 Standard_Real& V2) const
507{
508 U1 = UJointValue(1);
509 V1 = VJointValue(1);
510 U2 = UJointValue(NbUPatches()+1);
511 V2 = VJointValue(NbVPatches()+1);
512}
513
514//=======================================================================
515//function : IsUPeriodic
516//purpose :
517//=======================================================================
518
519Standard_Boolean ShapeExtend_CompositeSurface::IsUPeriodic () const
520{
521 return Standard_False;
522}
523
524//=======================================================================
525//function : IsVPeriodic
526//purpose :
527//=======================================================================
528
529Standard_Boolean ShapeExtend_CompositeSurface::IsVPeriodic () const
530{
531 return Standard_False;
532}
533
534//=======================================================================
535//function : UIso
536//purpose :
537//=======================================================================
538
539Handle(Geom_Curve) ShapeExtend_CompositeSurface::UIso (const Standard_Real ) const
540{
541 Handle(Geom_Curve) dummy;
542 return dummy;
543}
544
545//=======================================================================
546//function : VIso
547//purpose :
548//=======================================================================
549
550Handle(Geom_Curve) ShapeExtend_CompositeSurface::VIso (const Standard_Real ) const
551{
552 Handle(Geom_Curve) dummy;
553 return dummy;
554}
555
556//=======================================================================
557//function : Continuity
558//purpose :
559//=======================================================================
560
561GeomAbs_Shape ShapeExtend_CompositeSurface::Continuity () const
562{
563 return GeomAbs_C0;
564}
565
566//=======================================================================
567//function : IsCNu
568//purpose :
569//=======================================================================
570
571Standard_Boolean ShapeExtend_CompositeSurface::IsCNu (const Standard_Integer N) const
572{
573 return N <=0;
574}
575
576//=======================================================================
577//function : IsCNv
578//purpose :
579//=======================================================================
580
581Standard_Boolean ShapeExtend_CompositeSurface::IsCNv (const Standard_Integer N) const
582{
583 return N <=0;
584}
585
586//=======================================================================
587//function : IsUClosed
588//purpose :
589//=======================================================================
590
591Standard_Boolean ShapeExtend_CompositeSurface::IsUClosed () const
592{
593 return myUClosed;
594}
595
596//=======================================================================
597//function : IsVClosed
598//purpose :
599//=======================================================================
600
601Standard_Boolean ShapeExtend_CompositeSurface::IsVClosed () const
602{
603 return myVClosed;
604}
605
606//=======================================================================
607//function : D0
608//purpose :
609//=======================================================================
610
611void ShapeExtend_CompositeSurface::D0 (const Standard_Real U,
612 const Standard_Real V,
613 gp_Pnt& P) const
614{
615 Standard_Integer i = LocateUParameter ( U );
616 Standard_Integer j = LocateVParameter ( V );
617 gp_Pnt2d uv = GlobalToLocal ( i, j, gp_Pnt2d ( U, V ) );
618 myPatches->Value(i,j)->D0 ( uv.X(), uv.Y(), P );
619}
620
621//=======================================================================
622//function : D1
623//purpose :
624//=======================================================================
625
626void ShapeExtend_CompositeSurface::D1 (const Standard_Real U,
627 const Standard_Real V,
628 gp_Pnt& P,
629 gp_Vec& D1U,
630 gp_Vec& D1V) const
631{
632 Standard_Integer i = LocateUParameter ( U );
633 Standard_Integer j = LocateVParameter ( V );
634 gp_Pnt2d uv = GlobalToLocal ( i, j, gp_Pnt2d ( U, V ) );
635 myPatches->Value(i,j)->D1 ( uv.X(), uv.Y(), P, D1U, D1V );
636}
637
638//=======================================================================
639//function : D2
640//purpose :
641//=======================================================================
642
643void ShapeExtend_CompositeSurface::D2 (const Standard_Real U,
644 const Standard_Real V,
645 gp_Pnt& P,
646 gp_Vec& D1U,
647 gp_Vec& D1V,
648 gp_Vec& D2U,
649 gp_Vec& D2V,
650 gp_Vec& D2UV) const
651{
652 Standard_Integer i = LocateUParameter ( U );
653 Standard_Integer j = LocateVParameter ( V );
654 gp_Pnt2d uv = GlobalToLocal ( i, j, gp_Pnt2d ( U, V ) );
655 myPatches->Value(i,j)->D2 ( uv.X(), uv.Y(), P, D1U, D1V, D2U, D2V, D2UV );
656}
657
658//=======================================================================
659//function : D3
660//purpose :
661//=======================================================================
662
663void ShapeExtend_CompositeSurface::D3 (const Standard_Real U,
664 const Standard_Real V,
665 gp_Pnt& P,
666 gp_Vec& D1U,
667 gp_Vec& D1V,
668 gp_Vec& D2U,
669 gp_Vec& D2V,
670 gp_Vec& D2UV,
671 gp_Vec& D3U,
672 gp_Vec& D3V,
673 gp_Vec& D3UUV,
674 gp_Vec& D3UVV) const
675{
676 Standard_Integer i = LocateUParameter ( U );
677 Standard_Integer j = LocateVParameter ( V );
678 gp_Pnt2d uv = GlobalToLocal ( i, j, gp_Pnt2d ( U, V ) );
679 myPatches->Value(i,j)->D3 ( uv.X(), uv.Y(), P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV );
680}
681
682//=======================================================================
683//function : DN
684//purpose :
685//=======================================================================
686
687gp_Vec ShapeExtend_CompositeSurface::DN (const Standard_Real U,
688 const Standard_Real V,
689 const Standard_Integer Nu,
690 const Standard_Integer Nv) const
691{
692 Standard_Integer i = LocateUParameter ( U );
693 Standard_Integer j = LocateVParameter ( V );
694 gp_Pnt2d uv = GlobalToLocal ( i, j, gp_Pnt2d ( U, V ) );
695 return myPatches->Value(i,j)->DN ( uv.X(), uv.Y(), Nu, Nv );
696}
697
698//=======================================================================
699//function : Value
700//purpose :
701//=======================================================================
702
703gp_Pnt ShapeExtend_CompositeSurface::Value (const gp_Pnt2d& pnt) const
704{
705 Standard_Integer i = LocateUParameter ( pnt.X() );
706 Standard_Integer j = LocateVParameter ( pnt.Y() );
707 gp_Pnt2d uv = GlobalToLocal ( i, j, pnt );
708 gp_Pnt point;
709 myPatches->Value(i,j)->D0 ( uv.X(), uv.Y(), point );
710 return point;
711}
712
713//=======================================================================
714//function : ComputeJointValues
715//purpose :
716//=======================================================================
717
718void ShapeExtend_CompositeSurface::ComputeJointValues (const ShapeExtend_Parametrisation param)
719{
720 Standard_Integer NbU = NbUPatches();
721 Standard_Integer NbV = NbVPatches();
722 myUJointValues = new TColStd_HArray1OfReal(1,NbU+1);
723 myVJointValues = new TColStd_HArray1OfReal(1,NbV+1);
724
725 if ( param == ShapeExtend_Natural ) {
726 Standard_Real U1, U2, V1, V2, U=0, V=0;
727 Standard_Integer i; // svv Jan 10 2000 : porting on DEC
728 for ( i = 1; i <= NbU; i++ ) {
729 myPatches->Value(i,1)->Bounds(U1,U2,V1,V2);
730 if ( i ==1 ) myUJointValues->SetValue ( 1, U = U1 );
731 U += ( U2 - U1 );
732 myUJointValues->SetValue ( i+1, U );
733 }
734 for ( i = 1; i <= NbV; i++ ) {
735 myPatches->Value(1,i)->Bounds(U1,U2,V1,V2);
736 if ( i ==1 ) myVJointValues->SetValue ( 1, V = V1 );
737 V += ( V2 - V1 );
738 myVJointValues->SetValue ( i+1, V );
739 }
740 }
741 else {
742 Standard_Real stepu = 1., stepv = 1.; // suppose param == ShapeExtend_Uniform
743 if ( param == ShapeExtend_Unitary ) {
744 stepu /= NbU;
745 stepv /= NbV;
746 }
747 Standard_Integer i; // svv Jan 10 2000 : porting on DEC
748 for ( i=0; i <= NbU; i++ )
749 myUJointValues->SetValue ( i+1, i * stepu );
750 for ( i=0; i <= NbV; i++ )
751 myVJointValues->SetValue ( i+1, i * stepv );
752 }
753}
754
755//=======================================================================
756//function : CheckConnectivity
757//purpose :
758//=======================================================================
759
760static inline Standard_Real LimitValue (const Standard_Real &par)
761{
762 return Precision::IsInfinite(par) ? ( par <0 ? -10000. : 10000. ) : par;
763}
764
765static void GetLimitedBounds (const Handle(Geom_Surface) &surf,
766 Standard_Real &U1, Standard_Real &U2,
767 Standard_Real &V1, Standard_Real &V2)
768{
769 surf->Bounds ( U1, U2, V1, V2 );
770 U1 = LimitValue ( U1 );
771 U2 = LimitValue ( U2 );
772 V1 = LimitValue ( V1 );
773 V2 = LimitValue ( V2 );
774}
775
776Standard_Boolean ShapeExtend_CompositeSurface::CheckConnectivity (const Standard_Real Prec)
777{
778 const Standard_Integer NPOINTS = 23;
779 Standard_Boolean ok = Standard_True;
780 Standard_Integer NbU = NbUPatches();
781 Standard_Integer NbV = NbVPatches();
782
783 // check in u direction
784 Standard_Integer i,j; // svv Jan 10 2000 : porting on DEC
785 for ( i=1, j = NbU; i <= NbU; j = i++ ) {
786 Standard_Real maxdist2 = 0.;
787 for ( Standard_Integer k=1; k <= NbV; k++ ) {
788 Handle(Geom_Surface) sj = myPatches->Value(j,k);
789 Handle(Geom_Surface) si = myPatches->Value(i,k);
790 Standard_Real Uj1, Uj2, Vj1, Vj2;
791 GetLimitedBounds ( sj, Uj1, Uj2, Vj1, Vj2 );
792 Standard_Real Ui1, Ui2, Vi1, Vi2;
793 GetLimitedBounds ( si, Ui1, Ui2, Vi1, Vi2 );
794 Standard_Real stepj = ( Vj2 - Vj1 ) / ( NPOINTS - 1 );
795 Standard_Real stepi = ( Vi2 - Vi1 ) / ( NPOINTS - 1 );
796 for ( Standard_Integer isample=0; isample < NPOINTS; isample++ ) {
797 Standard_Real parj = Vj1 + stepj * isample;
798 Standard_Real pari = Vi1 + stepi * isample;
799 Standard_Real dist2 = sj->Value ( Uj2, parj ).SquareDistance ( si->Value ( Ui1, pari ) );
800 if ( maxdist2 < dist2 ) maxdist2 = dist2;
801 }
802 }
803 if ( i==1 ) myUClosed = ( maxdist2 <= Prec*Prec );
804 else if ( maxdist2 > Prec*Prec ) ok = Standard_False;
805 }
806
807 // check in v direction
808 for ( i=1, j = NbV; i <= NbV; j = i++ ) {
809 Standard_Real maxdist2 = 0.;
810 for ( Standard_Integer k=1; k <= NbU; k++ ) {
811 Handle(Geom_Surface) sj = myPatches->Value(k,j);
812 Handle(Geom_Surface) si = myPatches->Value(k,i);
813 Standard_Real Uj1, Uj2, Vj1, Vj2;
814 GetLimitedBounds ( sj, Uj1, Uj2, Vj1, Vj2 );
815 Standard_Real Ui1, Ui2, Vi1, Vi2;
816 GetLimitedBounds ( si, Ui1, Ui2, Vi1, Vi2 );
817 Standard_Real stepj = ( Uj2 - Uj1 ) / ( NPOINTS - 1 );
818 Standard_Real stepi = ( Ui2 - Ui1 ) / ( NPOINTS - 1 );
819 for ( Standard_Integer isample=0; isample < NPOINTS; isample++ ) {
820 Standard_Real parj = Uj1 + stepj * isample;
821 Standard_Real pari = Ui1 + stepi * isample;
822 Standard_Real dist2 = sj->Value ( parj, Vj2 ).SquareDistance ( si->Value ( pari, Vi1 ) );
823 if ( maxdist2 < dist2 ) maxdist2 = dist2;
824 }
825 }
826 if ( i==1 ) myVClosed = ( maxdist2 <= Prec*Prec );
827 else if ( maxdist2 > Prec*Prec ) ok = Standard_False;
828 }
829
0797d9d3 830#ifdef OCCT_DEBUG
7fd59977 831 if ( ! ok ) cout << "Warning: ShapeExtend_CompositeSurface: not connected in 3d" << endl;
832#endif
833 return ok;
834}