1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
15 #include <MgtPoly.ixx>
17 #include <TColgp_Array1OfPnt.hxx>
18 #include <PColgp_HArray1OfPnt.hxx>
19 #include <TColgp_Array1OfPnt2d.hxx>
20 #include <PColgp_HArray1OfPnt2d.hxx>
22 #include <TColStd_Array1OfReal.hxx>
23 #include <TColStd_HArray1OfReal.hxx>
24 #include <PColStd_HArray1OfReal.hxx>
25 #include <TColStd_Array1OfInteger.hxx>
26 #include <PColStd_HArray1OfInteger.hxx>
28 #include <Poly_Array1OfTriangle.hxx>
29 #include <PPoly_HArray1OfTriangle.hxx>
31 #define MgtBRepSpeedDownCast
33 //=======================================================================
34 //function : ArrayCopy
35 //purpose : Copy the gp_Pnt
36 // from an Array1 from TColgp (TCollection)
37 // to an HArray1 from PColgp (PCollection)
38 //=======================================================================
40 static Handle(PColgp_HArray1OfPnt) ArrayCopy
41 (const TColgp_Array1OfPnt& TArray)
43 Standard_Integer Lower = TArray.Lower();
44 Standard_Integer Upper = TArray.Upper();
45 Standard_Integer Index;
46 Handle(PColgp_HArray1OfPnt) PArray = new PColgp_HArray1OfPnt(Lower, Upper);
47 for (Index = Lower; Index <= Upper; Index++) {
48 PArray->SetValue(Index, TArray(Index));
53 //=======================================================================
54 //function : ArrayCopy
55 //purpose : Copy the gp_Pnt
56 // from an HArray1 from PColgp (PCollection)
57 // to an Array1 from TColgp (TCollection)
58 //=======================================================================
60 static void ArrayCopy(const Handle(PColgp_HArray1OfPnt)& PArray,
61 TColgp_Array1OfPnt& TArray)
63 Standard_Integer Lower = PArray->Lower();
64 Standard_Integer Upper = PArray->Upper();
65 Standard_Integer Index;
66 for (Index = Lower; Index <= Upper; Index++) {
67 TArray(Index) = PArray->Value(Index);
71 //=======================================================================
72 //function : ArrayCopy
73 //purpose : Copy the gp_Pnt2d
74 // from an Array1 from TColgp (TCollection)
75 // to an Array1 from PColgp (PCollection)
76 //=======================================================================
78 static Handle(PColgp_HArray1OfPnt2d) ArrayCopy
79 (const TColgp_Array1OfPnt2d& TArray)
81 Standard_Integer Lower = TArray.Lower();
82 Standard_Integer Upper = TArray.Upper();
83 Standard_Integer Index;
84 Handle(PColgp_HArray1OfPnt2d) PArray =
85 new PColgp_HArray1OfPnt2d(Lower, Upper);
86 for (Index = Lower; Index <= Upper; Index++) {
87 PArray->SetValue(Index, TArray(Index));
92 //=======================================================================
93 //function : ArrayCopy
94 //purpose : Copy the gp_Pnt2d
95 // from an HArray1 from PColgp (PCollection)
96 // to an Array1 from TColgp (TCollection)
97 //=======================================================================
100 (const Handle(PColgp_HArray1OfPnt2d)& PArray,
101 TColgp_Array1OfPnt2d& TArray)
103 Standard_Integer Lower = PArray->Lower();
104 Standard_Integer Upper = PArray->Upper();
105 Standard_Integer Index;
106 for (Index = Lower; Index <= Upper; Index++) {
107 TArray(Index) = PArray->Value(Index);
112 //=======================================================================
113 //function : ArrayCopy
114 //purpose : Copy the Triangle
115 // from an Array1 from Poly (TCollection)
116 // to an HArray1 from PPoly (PCollection)
117 //=======================================================================
119 static Handle(PPoly_HArray1OfTriangle) ArrayCopy
120 (const Poly_Array1OfTriangle& TArray)
122 Standard_Integer Lower = TArray.Lower();
123 Standard_Integer Upper = TArray.Upper();
124 Standard_Integer Index;
125 Handle(PPoly_HArray1OfTriangle) PArray =
126 new PPoly_HArray1OfTriangle(Lower, Upper);
127 for (Index = Lower; Index <= Upper; Index++) {
128 PPoly_Triangle aPTriangle = MgtPoly::Translate(TArray(Index));
129 PArray->SetValue(Index, aPTriangle);
134 //=======================================================================
135 //function : ArrayCopy
136 //purpose : Copy the Triangle
137 // from an HArray1 from PPoly (PCollection)
138 // to an Array1 from Poly (TCollection)
139 //=======================================================================
141 static void ArrayCopy
142 (const Handle(PPoly_HArray1OfTriangle)& PArray,
143 Poly_Array1OfTriangle& TArray)
145 Standard_Integer Lower = PArray->Lower();
146 Standard_Integer Upper = PArray->Upper();
147 Standard_Integer Index;
148 for (Index = Lower; Index <= Upper; Index++) {
149 Poly_Triangle aTTriangle = MgtPoly::Translate(PArray->Value(Index));
150 TArray(Index) = aTTriangle;
154 //=======================================================================
155 //function : ArrayCopy
156 //purpose : Copy PColStd_HArray1OfInteger to TColStd_Array1OfInteger
157 //=======================================================================
159 static void ArrayCopy(const Handle(PColStd_HArray1OfInteger)& PArray,
160 TColStd_Array1OfInteger& TArray)
162 Standard_Integer Lower = PArray->Lower();
163 Standard_Integer Upper = PArray->Upper();
164 Standard_Integer Index;
165 for (Index = Lower; Index <= Upper; Index++) {
166 TArray(Index) = PArray->Value(Index);
170 //=======================================================================
171 //function : ArrayCopy
172 //purpose : Copy TColStd_Array1OfInteger to PColStd_HArray1OfInteger
173 //=======================================================================
175 static Handle(PColStd_HArray1OfInteger)
176 ArrayCopy(const TColStd_Array1OfInteger& TArray)
178 Standard_Integer Lower = TArray.Lower();
179 Standard_Integer Upper = TArray.Upper();
180 Standard_Integer Index;
181 Handle(PColStd_HArray1OfInteger) PArray =
182 new PColStd_HArray1OfInteger(Lower, Upper);
183 for (Index = Lower; Index <= Upper; Index++) {
184 PArray->SetValue(Index, TArray.Value(Index));
189 //=======================================================================
190 //function : ArrayCopy
191 //purpose : Copy PColStd_HArray1OfReal to TColStd_Array1OfReal
192 //=======================================================================
194 static void ArrayCopy(const Handle(PColStd_HArray1OfReal)& PArray,
195 TColStd_Array1OfReal& TArray)
197 Standard_Integer Lower = PArray->Lower();
198 Standard_Integer Upper = PArray->Upper();
199 Standard_Integer Index;
200 for (Index = Lower; Index <= Upper; Index++) {
201 TArray(Index) = PArray->Value(Index);
205 //=======================================================================
206 //function : ArrayCopy
207 //purpose : Copy TColStd_Array1OfReal to PColStd_HArray1OfReal
208 //=======================================================================
210 static Handle(PColStd_HArray1OfReal)
211 ArrayCopy(const TColStd_Array1OfReal& TArray)
213 Standard_Integer Lower = TArray.Lower();
214 Standard_Integer Upper = TArray.Upper();
215 Standard_Integer Index;
216 Handle(PColStd_HArray1OfReal) PArray =
217 new PColStd_HArray1OfReal(Lower, Upper);
218 for (Index = Lower; Index <= Upper; Index++) {
219 PArray->SetValue(Index, TArray.Value(Index));
225 //=======================================================================
227 //purpose : Persistent -> Transient
228 //=======================================================================
230 Poly_Triangle MgtPoly::Translate(const PPoly_Triangle& PObj)
232 Standard_Integer n1, n2, n3;
234 Poly_Triangle TT(n1, n2, n3);
238 //=======================================================================
240 //purpose : Transient -> Persistent
241 //=======================================================================
243 PPoly_Triangle MgtPoly::Translate(const Poly_Triangle& TObj)
245 Standard_Integer n1, n2, n3;
247 PPoly_Triangle PT(n1, n2, n3);
251 //=======================================================================
252 //function : Translate Triangulation
253 //purpose : Persistent -> Transient
254 //=======================================================================
256 Handle(Poly_Triangulation) MgtPoly::Translate
257 (const Handle(PPoly_Triangulation)& PObj,
258 PTColStd_PersistentTransientMap& aMap)
260 Handle(Poly_Triangulation) TT;
261 if (!PObj.IsNull()) {
262 if (aMap.IsBound(PObj)) {
264 #ifdef MgtBRepSpeedDownCast
265 Handle(Standard_Transient) aTrans = aMap.Find(PObj);
266 TT = (Handle(Poly_Triangulation)&) aTrans;
268 TT = Handle(Poly_Triangulation)::DownCast(aMap.Find(PObj));
271 else { // translate and bind
274 Handle(PColgp_HArray1OfPnt) PNodes = PObj->Nodes();
275 TColgp_Array1OfPnt TNodes (PNodes->Lower(), PNodes->Upper());
276 ArrayCopy(PNodes, TNodes);
279 Handle(PPoly_HArray1OfTriangle) PTriangles = PObj->Triangles();
280 Poly_Array1OfTriangle TTriangles (PTriangles->Lower(),
281 PTriangles->Upper());
282 ArrayCopy(PTriangles, TTriangles);
285 if (PObj->HasUVNodes()) {
286 Handle(PColgp_HArray1OfPnt2d) PUVNodes = PObj->UVNodes();
287 TColgp_Array1OfPnt2d TUVNodes(PUVNodes->Lower(), PUVNodes->Upper());
288 ArrayCopy(PUVNodes, TUVNodes);
290 TT = new Poly_Triangulation(TNodes, TUVNodes, TTriangles);
294 TT = new Poly_Triangulation(TNodes, TTriangles);
297 TT->Deflection(PObj->Deflection());
304 //=======================================================================
305 //function : Translate Triangulation
306 //purpose : Transient -> Persistent
307 //=======================================================================
309 Handle(PPoly_Triangulation) MgtPoly::Translate
310 (const Handle(Poly_Triangulation)& TObj,
311 PTColStd_TransientPersistentMap& aMap)
313 Handle(PPoly_Triangulation) PT;
314 if (!TObj.IsNull()) {
315 if (aMap.IsBound(TObj)) {
316 #ifdef MgtBRepSpeedDownCast
317 Handle(Standard_Persistent) aPers = aMap.Find(TObj);
318 PT = (Handle(PPoly_Triangulation)&) aPers;
320 PT = Handle(PPoly_Triangulation)::DownCast(aMap.Find(TObj));
325 const TColgp_Array1OfPnt& TNodes = TObj->Nodes();
326 Handle(PColgp_HArray1OfPnt) PNodes =
327 new PColgp_HArray1OfPnt(TNodes.Lower(),
329 PNodes = ArrayCopy(TNodes);
332 const Poly_Array1OfTriangle& TTriangle = TObj->Triangles();
333 Handle(PPoly_HArray1OfTriangle) PTriangle =
334 new PPoly_HArray1OfTriangle(TTriangle.Lower(),
336 PTriangle = ArrayCopy(TTriangle);
339 Handle(PColgp_HArray1OfPnt2d) PUVNodes;
340 if (TObj->HasUVNodes()) {
341 const TColgp_Array1OfPnt2d& TUVNodes = TObj->UVNodes();
343 new PColgp_HArray1OfPnt2d(TUVNodes.Lower(),
345 PUVNodes = ArrayCopy(TUVNodes);
347 // Constructor + Deflection
348 PT = new PPoly_Triangulation(TObj->Deflection(),
349 PNodes, PUVNodes, PTriangle);
356 //=======================================================================
357 //function : Translate Polygon3D
358 //purpose : Persistent -> Transient
359 //=======================================================================
361 Handle(Poly_Polygon3D) MgtPoly::Translate
362 (const Handle(PPoly_Polygon3D)& PObj,
363 PTColStd_PersistentTransientMap& aMap)
365 Handle(Poly_Polygon3D) TP;
366 if (!PObj.IsNull()) {
367 if (aMap.IsBound(PObj)) {
368 #ifdef MgtBRepSpeedDownCast
369 Handle(Standard_Transient) aTrans = aMap.Find(PObj);
370 TP = (Handle(Poly_Polygon3D)&) aTrans;
372 TP = Handle(Poly_Polygon3D)::DownCast(aMap.Find(PObj));
378 Handle(PColgp_HArray1OfPnt) PNodes = PObj->Nodes();
379 TColgp_Array1OfPnt TNodes(PNodes->Lower(), PNodes->Upper());
380 ArrayCopy(PNodes, TNodes);
384 Handle(PColStd_HArray1OfReal) PParam = PObj->Parameters();
385 TColStd_Array1OfReal TParam(PParam->Lower(), PParam->Upper());
386 ArrayCopy(PParam, TParam);
388 // Constructor + Deflection
389 TP = new Poly_Polygon3D(TNodes, TParam);
390 TP->Deflection(PObj->Deflection());
397 //=======================================================================
398 //function : Translate Polygon3D
399 //purpose : Transient -> Persistent
400 //=======================================================================
402 Handle(PPoly_Polygon3D) MgtPoly::Translate
403 (const Handle(Poly_Polygon3D)& TObj,
404 PTColStd_TransientPersistentMap& aMap)
406 Handle(PPoly_Polygon3D) PT;
407 if (!TObj.IsNull()) {
408 if (aMap.IsBound(TObj)) {
409 #ifdef MgtBRepSpeedDownCast
410 Handle(Standard_Persistent) aPers = aMap.Find(TObj);
411 PT = (Handle(PPoly_Polygon3D)&) aPers;
413 PT = Handle(PPoly_Polygon3D)::DownCast(aMap.Find(TObj));
418 const TColgp_Array1OfPnt& TNodes = TObj->Nodes();
419 Handle(PColgp_HArray1OfPnt) PNodes =
420 new PColgp_HArray1OfPnt(TNodes.Lower(),
422 PNodes = ArrayCopy(TNodes);
425 const TColStd_Array1OfReal& TParam = TObj->Parameters();
426 Handle(PColStd_HArray1OfReal) PParam =
427 new PColStd_HArray1OfReal(TParam.Lower(), TParam.Upper());
428 PParam = ArrayCopy(TParam);
430 // constructor + Deflection
431 PT = new PPoly_Polygon3D(PNodes, PParam, TObj->Deflection());
438 //=======================================================================
439 //function : Translate Polygon2D
440 //purpose : Persistent -> Transient
441 //=======================================================================
443 Handle(Poly_Polygon2D) MgtPoly::Translate
444 (const Handle(PPoly_Polygon2D)& PObj,
445 PTColStd_PersistentTransientMap& aMap)
447 Handle(Poly_Polygon2D) TP;
448 if (!PObj.IsNull()) {
449 if (aMap.IsBound(PObj)) {
450 #ifdef MgtBRepSpeedDownCast
451 Handle(Standard_Transient) aTrans = aMap.Find(PObj);
452 TP = (Handle(Poly_Polygon2D)&) aTrans;
454 TP = Handle(Poly_Polygon2D)::DownCast(aMap.Find(PObj));
459 Handle(PColgp_HArray1OfPnt2d) PUVNodes = PObj->Nodes();
460 TColgp_Array1OfPnt2d TUVNodes(PUVNodes->Lower(), PUVNodes->Upper());
461 ArrayCopy(PUVNodes, TUVNodes);
463 // Constructor + Deflection
464 TP = new Poly_Polygon2D(TUVNodes);
465 TP->Deflection(PObj->Deflection());
472 //=======================================================================
473 //function : Translate Polygon2D
474 //purpose : Transient -> Persistent
475 //=======================================================================
477 Handle(PPoly_Polygon2D) MgtPoly::Translate
478 (const Handle(Poly_Polygon2D)& TObj,
479 PTColStd_TransientPersistentMap& aMap)
481 Handle(PPoly_Polygon2D) PT;
482 if (!TObj.IsNull()) {
483 if (aMap.IsBound(TObj)) {
484 #ifdef MgtBRepSpeedDownCast
485 Handle(Standard_Persistent) aPers = aMap.Find(TObj);
486 PT = (Handle(PPoly_Polygon2D)&) aPers;
488 PT = Handle(PPoly_Polygon2D)::DownCast(aMap.Find(TObj));
493 const TColgp_Array1OfPnt2d& TUVNodes = TObj->Nodes();
494 Handle(PColgp_HArray1OfPnt2d) PUVNodes =
495 new PColgp_HArray1OfPnt2d(TUVNodes.Lower(),
497 PUVNodes = ArrayCopy(TUVNodes);
499 // constructor + Deflection
500 PT = new PPoly_Polygon2D(PUVNodes, TObj->Deflection());
507 //=======================================================================
508 //function : Translate PolygonOnTriangulation
509 //purpose : Persistent -> Transient
510 //=======================================================================
512 Handle(Poly_PolygonOnTriangulation) MgtPoly::Translate
513 (const Handle(PPoly_PolygonOnTriangulation)& PObj,
514 PTColStd_PersistentTransientMap& aMap)
516 Handle(Poly_PolygonOnTriangulation) TP;
517 if (!PObj.IsNull()) {
518 if (aMap.IsBound(PObj)) {
519 #ifdef MgtBRepSpeedDownCast
520 Handle(Standard_Transient) aTrans = aMap.Find(PObj);
521 TP = (Handle(Poly_PolygonOnTriangulation)&) aTrans;
523 TP = Handle(Poly_PolygonOnTriangulation)::DownCast(aMap.Find(PObj));
529 Handle(PColStd_HArray1OfInteger) PNodes = PObj->Nodes();
530 TColStd_Array1OfInteger TNodes(PNodes->Lower(), PNodes->Upper());
531 ArrayCopy(PNodes, TNodes);
535 if (PObj->HasParameters()) {
536 Handle(PColStd_HArray1OfReal) PParam = PObj->Parameters();
537 TColStd_Array1OfReal TParam(PParam->Lower(), PParam->Upper());
538 ArrayCopy(PParam, TParam);
540 // Constructor + Deflection
541 TP = new Poly_PolygonOnTriangulation(TNodes, TParam);
542 TP->Deflection(PObj->Deflection());
546 TP = new Poly_PolygonOnTriangulation(TNodes);
547 TP->Deflection(PObj->Deflection());
555 //=======================================================================
556 //function : Translate PolygonOnTriangulation
557 //purpose : Transient -> Persistent
558 //=======================================================================
560 Handle(PPoly_PolygonOnTriangulation) MgtPoly::Translate
561 (const Handle(Poly_PolygonOnTriangulation)& TObj,
562 PTColStd_TransientPersistentMap& aMap)
564 Handle(PPoly_PolygonOnTriangulation) PT;
565 if (!TObj.IsNull()) {
566 if (aMap.IsBound(TObj)) {
567 #ifdef MgtBRepSpeedDownCast
568 Handle(Standard_Persistent) aPers = aMap.Find(TObj);
569 PT = (Handle(PPoly_PolygonOnTriangulation)&) aPers;
571 PT = Handle(PPoly_PolygonOnTriangulation)::DownCast(aMap.Find(TObj));
576 const TColStd_Array1OfInteger& TNodes = TObj->Nodes();
577 Handle(PColStd_HArray1OfInteger) PNodes =
578 new PColStd_HArray1OfInteger(TNodes.Lower(),
580 PNodes = ArrayCopy(TNodes);
584 if (TObj->HasParameters()) {
585 const TColStd_Array1OfReal& TParam = TObj->Parameters()->Array1();
586 Handle(PColStd_HArray1OfReal) PParam =
587 new PColStd_HArray1OfReal(TParam.Lower(), TParam.Upper());
588 PParam = ArrayCopy(TParam);
589 // constructor + Deflection
590 PT = new PPoly_PolygonOnTriangulation(PNodes, TObj->Deflection(),
596 // constructor + Deflection
597 PT = new PPoly_PolygonOnTriangulation(PNodes, TObj->Deflection());