LCOV - code coverage report
Current view: top level - geom/OCC - OCCShapeAttributeSet.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 655 895 73.2 %
Date: 2020-06-30 00:58:45 Functions: 29 30 96.7 %
Branches: 1085 3049 35.6 %

           Branch data     Line data    Source code
       1                 :            : // File:        OCCShapeAttributeSet.cxx
       2                 :            : // Created:     Thur Jul 10  2008
       3                 :            : // Author:      Jane Hu
       4                 :            : 
       5                 :            : #include <Standard_Stream.hxx>
       6                 :            : #include <BRepTools.hxx>
       7                 :            : #include "OCCShapeAttributeSet.hpp"
       8                 :            : #include "CubitSimpleAttrib.hpp"
       9                 :            : #include "OCCAttribSet.hpp"
      10                 :            : #include "OCCQueryEngine.hpp"
      11                 :            : //#include <Poly.hxx>
      12                 :            : #include <TopoDS.hxx>
      13                 :            : #include <TColStd_Array1OfReal.hxx>
      14                 :            : #include <TColStd_HArray1OfInteger.hxx>
      15                 :            : #include <TColgp_Array1OfPnt2d.hxx>
      16                 :            : #include <BRep_GCurve.hxx>
      17                 :            : #include <Handle_BRep_CurveOnClosedSurface.hxx>
      18                 :            : #include <Handle_BRep_CurveOnSurface.hxx>
      19                 :            : #include <TopAbs_ShapeEnum.hxx>
      20                 :            : //#include <BRep_TFace.hxx>
      21                 :            : //#include <BRep_TEdge.hxx>
      22                 :            : //#include <BRep_TVertex.hxx>
      23                 :            : #include <Handle_BRep_GCurve.hxx>
      24                 :            : #include <BRep_Tool.hxx>
      25                 :            : #include <TDF_ChildIterator.hxx>
      26                 :            : #include <TopTools_LocationSet.hxx>
      27                 :            : #include <TopTools_IndexedMapOfShape.hxx>
      28                 :            : #include <TopoDS_Iterator.hxx>
      29                 :            : //#include <BRep_CurveRepresentation.hxx>
      30                 :            : #include <Poly_Polygon3D.hxx>
      31                 :            : //#include <BRep_Polygon3D.hxx>
      32                 :            : //#include <BRep_PolygonOnSurface.hxx>
      33                 :            : //#include <BRep_PolygonOnClosedSurface.hxx>
      34                 :            : //#include <BRep_PolygonOnTriangulation.hxx>
      35                 :            : //#include <BRep_PolygonOnClosedTriangulation.hxx>
      36                 :            : #include <BRep_CurveOnSurface.hxx>
      37                 :            : #include <BRep_CurveOnClosedSurface.hxx>
      38                 :            : //#include <BRep_ListOfCurveRepresentation.hxx>
      39                 :            : //#include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
      40                 :            : #include <BRep_PointOnCurve.hxx>
      41                 :            : #include <BRep_PointOnCurveOnSurface.hxx>
      42                 :            : #include <BRep_PointOnSurface.hxx>
      43                 :            : //#include <BRep_ListIteratorOfListOfPointRepresentation.hxx>
      44                 :            : #include <TDF_Label.hxx>
      45                 :            : #include <TopTools_DataMapOfShapeInteger.hxx>
      46                 :            : 
      47                 :            : #ifndef OCC_VERSION_MINOR
      48                 :            : #include "Standard_Version.hxx"
      49                 :            : #endif
      50                 :            : #if OCC_VERSION_MINOR < 5
      51                 :            :   #include <TDataStd_Shape.hxx>
      52                 :            :   typedef TDataStd_Shape TDataXtd_Shape;
      53                 :            :   typedef Handle_TDataStd_Shape Handle_TDataXtd_Shape;
      54                 :            : #else
      55                 :            :   #include <TDataXtd_Shape.hxx>
      56                 :            : #endif
      57                 :            : 
      58                 :            : #include <Handle_TDataStd_Name.hxx>
      59                 :            : #include <TDataStd_Name.hxx>
      60                 :            : #include <Handle_TDataStd_ExtStringArray.hxx>
      61                 :            : #include <TDataStd_ExtStringArray.hxx>
      62                 :            : #include <TCollection_ExtendedString.hxx>
      63                 :            : #include <Handle_TDataStd_IntegerArray.hxx>
      64                 :            : #include <TDataStd_IntegerArray.hxx>
      65                 :            : #include <Handle_TDataStd_RealArray.hxx>
      66                 :            : #include <TDataStd_RealArray.hxx>
      67                 :            : #include <Handle_BRep_TVertex.hxx>
      68                 :            : #include <BRep_ListIteratorOfListOfPointRepresentation.hxx>
      69                 :            : #include <BRep_TVertex.hxx>
      70                 :            : #include <BRep_PointRepresentation.hxx>
      71                 :            : #include <Handle_BRep_TEdge.hxx>
      72                 :            : #include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
      73                 :            : #include <Handle_BRep_TFace.hxx>
      74                 :            : #include <BRep_TFace.hxx>
      75                 :            : #include <BRep_TEdge.hxx>
      76                 :            : #include <BRep_CurveRepresentation.hxx>
      77                 :            : 
      78                 :            : #include <TopoDS_Vertex.hxx>
      79                 :            : 
      80                 :            : //#include <TColgp_HArray1OfPnt.hxx>
      81                 :            : //#include <TColgp_HArray1OfPnt2d.hxx>
      82                 :            : #include <TColStd_HArray1OfReal.hxx>
      83                 :            : #include <Poly_Triangulation.hxx>
      84                 :            : #include <Poly_PolygonOnTriangulation.hxx>
      85                 :            : 
      86                 :            : 
      87                 :            : #ifdef MacOS
      88                 :            : #define strcasecmp(p,q) strcmp(p,q)
      89                 :            : #elseif WNT
      90                 :            : #define strcasecmp strcmp
      91                 :            : #elseif AIX
      92                 :            : #include <string.h>
      93                 :            : #endif
      94                 :            : 
      95                 :            : const char* dVersion  = "CASCADE Topology V1, (c) Matra-Datavision";
      96                 :            : const char* dVersion2 = "CASCADE Topology V2, (c) Matra-Datavision";
      97                 :            : 
      98                 :            : //=======================================================================
      99                 :            : //function : PrintShapeEnum
     100                 :            : //purpose  :
     101                 :            : //=======================================================================
     102                 :            : 
     103                 :      20196 : static void PrintShapeEnum(const TopAbs_ShapeEnum T,
     104                 :            :                            Standard_OStream& S,
     105                 :            :                            Standard_Boolean C)
     106                 :            : {
     107   [ +  +  +  +  :      20196 :   switch(T) {
          +  +  -  +  -  
                      - ]
     108                 :            : 
     109                 :            :   case TopAbs_VERTEX :
     110         [ +  - ]:       6029 :     if (C) S << "Ve"; else S << "VERTEX   ";
     111                 :       6029 :     break;
     112                 :            : 
     113                 :            :   case TopAbs_EDGE :
     114         [ +  - ]:       7553 :     if (C) S << "Ed"; else S << "EDGE     ";
     115                 :       7553 :     break;
     116                 :            : 
     117                 :            :   case TopAbs_WIRE :
     118         [ +  - ]:       2841 :     if (C) S << "Wi"; else S << "WIRE     ";
     119                 :       2841 :     break;
     120                 :            : 
     121                 :            :   case TopAbs_FACE :
     122         [ +  - ]:       2770 :     if (C) S << "Fa"; else S << "FACE     ";
     123                 :       2770 :     break;
     124                 :            : 
     125                 :            :   case TopAbs_SHELL :
     126         [ +  - ]:        370 :     if (C) S << "Sh"; else S << "SHELL    ";
     127                 :        370 :     break;
     128                 :            : 
     129                 :            :   case TopAbs_SOLID :
     130         [ +  - ]:        370 :     if (C) S << "So"; else S << "SOLID    ";
     131                 :        370 :     break;
     132                 :            : 
     133                 :            :   case TopAbs_COMPSOLID :
     134         [ #  # ]:          0 :     if (C) S << "CS"; else S << "COMPSOLID";
     135                 :          0 :     break;
     136                 :            : 
     137                 :            :   case TopAbs_COMPOUND :
     138         [ +  - ]:        263 :     if (C) S << "Co"; else S << "COMPOUND ";
     139                 :        263 :     break;
     140                 :            : 
     141                 :            :   case TopAbs_SHAPE :
     142         [ #  # ]:          0 :     if (C) S << "Sp"; else S << "SHAPE";
     143                 :          0 :     break;
     144                 :            :   }
     145                 :      20196 : }
     146                 :            : 
     147                 :            : //=======================================================================
     148                 :            : //function : PrintRegularity
     149                 :            : //purpose  :
     150                 :            : //=======================================================================
     151                 :            : 
     152                 :        150 : static void PrintRegularity(const GeomAbs_Shape C,
     153                 :            :                             Standard_OStream& OS)
     154                 :            : {
     155   [ -  -  -  -  :        150 :   switch (C) {
             -  -  +  - ]
     156                 :            : 
     157                 :            :   case GeomAbs_C0 :
     158                 :          0 :     OS << "C0";
     159                 :          0 :     break;
     160                 :            : 
     161                 :            :   case GeomAbs_G1 :
     162                 :          0 :     OS << "G1";
     163                 :          0 :     break;
     164                 :            : 
     165                 :            :   case GeomAbs_C1 :
     166                 :          0 :     OS << "C1";
     167                 :          0 :     break;
     168                 :            : 
     169                 :            :   case GeomAbs_G2 :
     170                 :          0 :     OS << "G2";
     171                 :          0 :     break;
     172                 :            : 
     173                 :            :   case GeomAbs_C2 :
     174                 :          0 :     OS << "C2";
     175                 :          0 :     break;
     176                 :            : 
     177                 :            :   case GeomAbs_C3 :
     178                 :          0 :     OS << "C3";
     179                 :          0 :     break;
     180                 :            : 
     181                 :            :   case GeomAbs_CN :
     182                 :        150 :     OS << "CN";
     183                 :        150 :     break;
     184                 :            : 
     185                 :            :   }
     186                 :        150 : }
     187                 :            : 
     188                 :            : //=======================================================================
     189                 :            : //function : PrintOrientation
     190                 :            : //purpose  :
     191                 :            : //=======================================================================
     192                 :            : 
     193                 :      34648 : static void PrintOrientation(const TopAbs_Orientation O,
     194                 :            :                              Standard_OStream& S,
     195                 :            :                              Standard_Boolean C)
     196                 :            : {
     197   [ +  +  -  -  :      34648 :   switch(O) {
                      - ]
     198                 :            : 
     199                 :            :   case TopAbs_FORWARD :
     200         [ +  - ]:      19602 :     if (C) S << "+"; else S << "FORWARD";
     201                 :      19602 :     break;
     202                 :            : 
     203                 :            :   case TopAbs_REVERSED :
     204         [ +  - ]:      15046 :     if (C) S << "-"; else S << "REVERSED";
     205                 :      15046 :     break;
     206                 :            : 
     207                 :            :   case TopAbs_INTERNAL :
     208         [ #  # ]:          0 :     if (C) S << "i"; else S << "INTERNAL";
     209                 :          0 :     break;
     210                 :            : 
     211                 :            :   case TopAbs_EXTERNAL :
     212         [ #  # ]:          0 :     if (C) S << "e"; else S << "EXTERNAL";
     213                 :          0 :     break;
     214                 :            :   }
     215                 :      34648 : }
     216                 :            : 
     217                 :            : //=======================================================================
     218                 :            : //function : ReadShapeEnum
     219                 :            : //purpose  :
     220                 :            : //=======================================================================
     221                 :            : 
     222                 :      19987 : static TopAbs_ShapeEnum ReadShapeEnum(Standard_IStream& IS)
     223                 :            : {
     224         [ +  - ]:      19987 :   std::string buffer;
     225         [ +  - ]:      19987 :   IS >> buffer;
     226                 :            : 
     227 [ +  - ][ +  +  :      19987 :   switch (buffer[0]) {
             +  +  +  +  
                      - ]
     228                 :            : 
     229                 :            :   case 'V' :
     230                 :       4852 :     return TopAbs_VERTEX;
     231                 :            : 
     232                 :            :   case 'E' :
     233                 :       7498 :     return TopAbs_EDGE;
     234                 :            : 
     235                 :            :   case 'W' :
     236                 :       3501 :     return TopAbs_WIRE;
     237                 :            : 
     238                 :            :   case 'F' :
     239                 :       3309 :     return TopAbs_FACE;
     240                 :            : 
     241                 :            :   case 'S' :
     242 [ +  - ][ +  + ]:        652 :     if (buffer[1] == 'h')
     243                 :        326 :       return TopAbs_SHELL;
     244                 :            :     else
     245                 :        326 :       return TopAbs_SOLID;
     246                 :            : 
     247                 :            :   case 'C' :
     248 [ +  - ][ -  + ]:        175 :     if (buffer[1] == 'S')
     249                 :          0 :       return TopAbs_COMPSOLID;
     250                 :            :     else
     251                 :        175 :       return TopAbs_COMPOUND;
     252                 :            : 
     253                 :            :   }
     254         [ +  - ]:      19987 :   return TopAbs_COMPOUND;
     255                 :            : }
     256                 :            : 
     257                 :            : //=======================================================================
     258                 :            : //function : ReadRegularity
     259                 :            : //purpose  :
     260                 :            : //=======================================================================
     261                 :            : 
     262                 :       2273 : static GeomAbs_Shape ReadRegularity(Standard_IStream& IS)
     263                 :            : {
     264         [ +  - ]:       2273 :   std::string buffer;
     265         [ +  - ]:       2273 :   IS >> buffer;
     266         [ +  - ]:       2273 :   switch (buffer[0]) {
              [ +  +  - ]
     267                 :            : 
     268                 :            :   case 'C' :
     269 [ +  - ][ -  -  :        117 :     switch (buffer[1]) {
             -  -  +  - ]
     270                 :            : 
     271                 :            :     case '0' :
     272                 :          0 :       return GeomAbs_C0;
     273                 :            : 
     274                 :            :     case '1' :
     275                 :          0 :       return GeomAbs_C1;
     276                 :            : 
     277                 :            :     case '2' :
     278                 :          0 :       return GeomAbs_C2;
     279                 :            : 
     280                 :            :     case '3' :
     281                 :          0 :       return GeomAbs_C3;
     282                 :            : 
     283                 :            :     case 'N' :
     284                 :        117 :       return GeomAbs_CN;
     285                 :            :     }
     286                 :          0 :     break;
     287                 :            : 
     288                 :            :   case 'G' :
     289         [ +  - ]:       2156 :     switch (buffer[1]) {
              [ +  -  - ]
     290                 :            : 
     291                 :            :     case '1' :
     292                 :       2156 :       return GeomAbs_G1;
     293                 :            : 
     294                 :            :     case '2' :
     295                 :          0 :       return GeomAbs_G2;
     296                 :            : 
     297                 :            :     }
     298                 :          0 :     break;
     299                 :            :   }
     300         [ +  - ]:       2273 :   return GeomAbs_C0;
     301                 :            : }
     302                 :            : 
     303                 :            : //=======================================================================
     304                 :            : //function : OCCShapeAttributeSet
     305                 :            : //purpose  :
     306                 :            : //=======================================================================
     307                 :            : 
     308                 :        427 : OCCShapeAttributeSet::OCCShapeAttributeSet()
     309 [ +  - ][ +  - ]:        427 :   :myFormatNb(1)
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
     310                 :            : {
     311                 :        427 : }
     312                 :            : 
     313                 :            : //=======================================================================
     314                 :            : //function : OCCShapeAttributeSet
     315                 :            : //purpose  :
     316                 :            : //=======================================================================
     317                 :            : 
     318                 :          0 : OCCShapeAttributeSet::OCCShapeAttributeSet (const BRep_Builder& B)
     319 [ #  # ][ #  # ]:          0 :   :myBuilder(B)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     320                 :            : {
     321                 :          0 : }
     322                 :            : //=======================================================================
     323                 :            : //function : Add
     324                 :            : //purpose  :
     325                 :            : //=======================================================================
     326                 :            : 
     327                 :      34648 : Standard_Integer  OCCShapeAttributeSet::Add(const TopoDS_Shape& S)
     328                 :            : {
     329 [ +  - ][ -  + ]:      34648 :   if (S.IsNull()) return 0;
     330 [ +  - ][ +  - ]:      34648 :   myLocations.Add(S.Location());
     331         [ +  - ]:      34648 :   TopoDS_Shape S2 = S;
     332 [ +  - ][ +  - ]:      34648 :   S2.Location(TopLoc_Location());
                 [ +  - ]
     333         [ +  - ]:      34648 :   Standard_Integer index = myShapes.FindIndex(S2);
     334         [ +  + ]:      34648 :   if (index == 0) {
     335         [ +  - ]:      20196 :     AddGeometry(S2);
     336                 :            : 
     337 [ +  - ][ +  - ]:      54603 :     for (TopoDS_Iterator its(S2,Standard_False,Standard_False);
                 [ +  + ]
     338         [ +  - ]:      34407 :          its.More(); its.Next())
     339 [ +  - ][ +  - ]:      54603 :       Add(its.Value());
                 [ +  - ]
     340         [ +  - ]:      20196 :     index = myShapes.Add(S2);
     341                 :            :   }
     342                 :            :  
     343         [ +  - ]:      34648 :   return index;
     344                 :            : }
     345                 :            : 
     346                 :            : //=======================================================================
     347                 :            : //function : AddGeometry
     348                 :            : //purpose  :
     349                 :            : //=======================================================================
     350                 :            : 
     351                 :      20196 : void OCCShapeAttributeSet::AddGeometry(const TopoDS_Shape& S)
     352                 :            : {
     353                 :            :   // Add the geometry
     354                 :            : 
     355         [ +  + ]:      20196 :   if (S.ShapeType() == TopAbs_VERTEX) {
     356                 :            : 
     357 [ +  - ][ +  - ]:       6029 :     Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(S.TShape());
     358 [ +  - ][ +  - ]:       6029 :     BRep_ListIteratorOfListOfPointRepresentation itrp(TV->Points());
                 [ +  - ]
     359                 :            : 
     360 [ +  - ][ -  + ]:       6029 :     while (itrp.More()) {
     361         [ #  # ]:          0 :       const Handle(BRep_PointRepresentation)& PR = itrp.Value();
     362                 :            : 
     363 [ #  # ][ #  # ]:          0 :       if (PR->IsPointOnCurve()) {
                 [ #  # ]
     364 [ #  # ][ #  # ]:          0 :         myCurves.Add(PR->Curve());
                 [ #  # ]
     365                 :            :       }
     366                 :            : 
     367 [ #  # ][ #  # ]:          0 :       else if (PR->IsPointOnCurveOnSurface()) {
                 [ #  # ]
     368 [ #  # ][ #  # ]:          0 :         myCurves2d.Add(PR->PCurve());
                 [ #  # ]
     369 [ #  # ][ #  # ]:          0 :         mySurfaces.Add(PR->Surface());
                 [ #  # ]
     370                 :            :       }
     371                 :            : 
     372 [ #  # ][ #  # ]:          0 :       else if (PR->IsPointOnSurface()) {
                 [ #  # ]
     373 [ #  # ][ #  # ]:          0 :         mySurfaces.Add(PR->Surface());
                 [ #  # ]
     374                 :            :       }
     375                 :            : 
     376 [ #  # ][ #  # ]:          0 :       myLocations.Add(PR->Location());
                 [ #  # ]
     377         [ #  # ]:          0 :       itrp.Next();
     378         [ +  - ]:       6029 :     }
     379                 :            : 
     380                 :            :   }
     381         [ +  + ]:      14167 :   else if (S.ShapeType() == TopAbs_EDGE) {
     382                 :            : 
     383                 :            :     // Add the curve geometry
     384 [ +  - ][ +  - ]:       7553 :     Handle(BRep_TEdge) TE = Handle(BRep_TEdge)::DownCast(S.TShape());
     385 [ +  - ][ +  - ]:       7553 :     BRep_ListIteratorOfListOfCurveRepresentation itrc(TE->Curves());
                 [ +  - ]
     386                 :            : 
     387 [ +  - ][ +  + ]:      27762 :     while (itrc.More()) {
     388         [ +  - ]:      20209 :       const Handle(BRep_CurveRepresentation)& CR = itrc.Value();
     389 [ +  - ][ +  - ]:      20209 :       if (CR->IsCurve3D()) {
                 [ +  + ]
     390 [ +  - ][ +  - ]:       7553 :         if (!CR->Curve3D().IsNull()) {
         [ +  - ][ +  + ]
     391 [ +  - ][ +  - ]:       7531 :           myCurves.Add(CR->Curve3D());
                 [ +  - ]
     392 [ +  - ][ +  - ]:       7531 :           myLocations.Add(CR->Location());
                 [ +  - ]
     393                 :            :         }
     394                 :            :       }
     395 [ +  - ][ +  - ]:      12656 :       else if (CR->IsCurveOnSurface()) {
                 [ +  + ]
     396 [ +  - ][ +  - ]:      12590 :         mySurfaces.Add(CR->Surface());
                 [ +  - ]
     397 [ +  - ][ +  - ]:      12590 :         myCurves2d.Add(CR->PCurve());
                 [ +  - ]
     398 [ +  - ][ +  - ]:      12590 :         myLocations.Add(CR->Location());
                 [ +  - ]
     399 [ +  - ][ +  - ]:      12590 :         if (CR->IsCurveOnClosedSurface())
                 [ +  + ]
     400 [ +  - ][ +  - ]:         84 :           myCurves2d.Add(CR->PCurve2());
                 [ +  - ]
     401                 :            :       }
     402 [ +  - ][ +  - ]:         66 :       else if (CR->IsRegularity()) {
                 [ +  - ]
     403 [ +  - ][ +  - ]:         66 :         mySurfaces.Add(CR->Surface());
                 [ +  - ]
     404 [ +  - ][ +  - ]:         66 :         myLocations.Add(CR->Location());
                 [ +  - ]
     405 [ +  - ][ +  - ]:         66 :         mySurfaces.Add(CR->Surface2());
                 [ +  - ]
     406 [ +  - ][ +  - ]:         66 :         myLocations.Add(CR->Location2());
                 [ +  - ]
     407                 :            :       }
     408         [ +  - ]:      20209 :       itrc.Next();
     409         [ +  - ]:       7553 :     }
     410                 :            :   }
     411                 :            : 
     412         [ +  + ]:       6614 :   else if (S.ShapeType() == TopAbs_FACE) {
     413                 :            : 
     414                 :            :     // Add the surface geometry
     415 [ +  - ][ +  - ]:       2770 :     Handle(BRep_TFace) TF = Handle(BRep_TFace)::DownCast(S.TShape());
     416 [ +  - ][ +  - ]:       2770 :     if (!TF->Surface().IsNull())  mySurfaces.Add(TF->Surface());
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
     417                 :            : 
     418 [ +  - ][ +  - ]:       2770 :     myLocations.Add(TF->Location());
         [ +  - ][ +  - ]
     419                 :            :   }
     420                 :      20196 : }
     421                 :            : 
     422                 :            : //=======================================================================
     423                 :            : //function : ReadAttribute
     424                 :            : //purpose  :
     425                 :            : //=======================================================================
     426                 :            : 
     427                 :       3093 : void  OCCShapeAttributeSet::ReadAttribute(TopoDS_Shape& S,
     428                 :            :                                           Standard_IStream&   IS,
     429                 :            :                                           TDF_Label& l_attr)
     430                 :            : {
     431 [ +  - ][ +  - ]:       6186 :   std::string buffer, type, stringdata;
         [ +  - ][ +  - ]
                 [ +  - ]
     432 [ +  - ][ +  - ]:       6186 :   std::vector<CubitString> strings;
     433 [ +  - ][ +  - ]:       6186 :   std::vector<double> doubles;
     434 [ +  - ][ +  - ]:       6186 :   std::vector<int> ints;
     435                 :            :   int c_num, length;
     436                 :            :   char s;
     437         [ +  + ]:       5355 :   do {
     438         [ +  - ]:       5355 :     IS >> c_num; //length of name string
     439         [ +  - ]:       5355 :     IS.get(); //' '
     440         [ +  - ]:       5355 :     type.clear();
     441         [ +  + ]:      59598 :     for(int j = 0; j < c_num; j ++)
     442                 :            :     {
     443         [ +  - ]:      54243 :       IS.get(s);
     444         [ +  - ]:      54243 :       type.push_back(s);
     445                 :            :     }
     446                 :            : 
     447         [ +  - ]:       5355 :     strings.clear();
     448 [ +  - ][ +  - ]:       5355 :     strings.push_back(type.c_str());
         [ +  - ][ +  - ]
     449                 :            : 
     450         [ +  - ]:       5355 :     IS >> length; //number of strings
     451         [ +  + ]:       6708 :     for(int i =0; i < length; i++)
     452                 :            :     { 
     453         [ +  - ]:       1353 :       IS >> c_num ; //length of each string
     454         [ +  - ]:       1353 :       IS.get(); //' '
     455         [ +  - ]:       1353 :       stringdata.clear();
     456         [ +  + ]:      15220 :       for(int j = 0; j < c_num; j ++)
     457                 :            :       {
     458         [ +  - ]:      13867 :         IS.get(s);
     459         [ +  - ]:      13867 :         stringdata.push_back(s);
     460                 :            :       }
     461 [ +  - ][ +  - ]:       1353 :       strings.push_back(stringdata.c_str());
         [ +  - ][ +  - ]
     462                 :            :     }
     463                 :            : 
     464                 :            :     int tmp_int;
     465                 :            :     double  tmp_dbl; 
     466         [ +  - ]:       5355 :     IS >> length; //number of ints
     467         [ +  - ]:       5355 :     ints.clear();
     468         [ +  + ]:      17738 :     for (int i = 0; i < length ; i++)
     469                 :            :     {
     470         [ +  - ]:      12383 :       IS >> tmp_int;
     471         [ +  - ]:      12383 :       ints.push_back( tmp_int );
     472                 :            :     }
     473                 :            : 
     474         [ +  - ]:       5355 :     IS >> length; //number of doubles
     475         [ +  - ]:       5355 :     doubles.clear();
     476         [ +  + ]:       5595 :     for (int i = 0; i < length ; i++)
     477                 :            :     {
     478         [ +  - ]:        240 :       IS >> tmp_dbl;
     479         [ +  - ]:        240 :       doubles.push_back( tmp_dbl );
     480                 :            :     }
     481                 :            : 
     482         [ +  - ]:       5355 :     CubitSimpleAttrib tmp_attrib(&strings, &doubles, &ints);
     483                 :            : 
     484         [ +  - ]:       5355 :     OCCAttribSet::append_attribute(tmp_attrib, S);
     485                 :            :   
     486 [ +  - ][ +  - ]:       5355 :     IS >> buffer;
     487 [ +  - ][ +  - ]:       8448 :   }while(buffer[0] != '*');
     488                 :       3093 : }
     489                 :            : 
     490                 :            : //=======================================================================
     491                 :            : //function : WriteAttribute
     492                 :            : //purpose  :
     493                 :            : //=======================================================================
     494                 :            : 
     495                 :      20196 : void  OCCShapeAttributeSet::WriteAttribute(const TopoDS_Shape& S,
     496                 :            :                                            Standard_OStream&   OS,
     497                 :            :                                            TDF_Label& l_attr)
     498                 :            : {
     499 [ +  - ][ -  + ]:      20196 :   if(l_attr.IsNull())
     500                 :      20196 :     return;
     501                 :            : 
     502                 :      20196 :   Standard_Boolean found = Standard_False;
     503         [ +  - ]:      20196 :   TDF_Label myLabel;
     504 [ +  - ][ +  - ]:    1296593 :   for (TDF_ChildIterator it1(l_attr,Standard_False); it1.More(); it1.Next())
         [ +  - ][ +  + ]
     505                 :            :   {
     506                 :            :     //find the same shape attribute first
     507         [ +  - ]:    1284517 :     myLabel = it1.Value();
     508                 :            : 
     509         [ +  - ]:    1284517 :     Handle_TDataXtd_Shape attr_shape;
     510                 :            : 
     511 [ +  - ][ +  - ]:    2569034 :     TopoDS_Shape exsiting_shape;
              [ +  +  + ]
     512                 :            : 
     513 [ +  - ][ +  + ]:    1284517 :     if(TDataXtd_Shape::Find(myLabel, attr_shape))
     514 [ +  - ][ +  - ]:     839600 :       exsiting_shape = attr_shape->Get(myLabel);
         [ +  - ][ +  - ]
     515                 :            : 
     516 [ +  - ][ +  + ]:    1284517 :     if(!exsiting_shape.IsNull())
     517                 :            :     {
     518 [ +  - ][ +  + ]:     839600 :       if(exsiting_shape.IsPartner(S))
     519                 :            :       {
     520                 :            :         //It's possible that the myLabel found in this way wasn't the bounded
     521                 :            :         //lable with the shape. Find the bounded one now.
     522 [ +  - ][ +  - ]:       8900 :         if(!OCCQueryEngine::instance()->OCCMap->IsBound(exsiting_shape))
                 [ +  + ]
     523                 :        780 :           continue;
     524                 :            :   
     525 [ +  - ][ +  - ]:       8120 :         int k = OCCQueryEngine::instance()->OCCMap->Find(exsiting_shape);
     526                 :            :         std::map<int, TDF_Label>::iterator it =
     527 [ +  - ][ +  - ]:       8120 :            OCCQueryEngine::instance()->Shape_Label_Map->find(k);
     528 [ +  - ][ +  - ]:       8120 :         if(it != OCCQueryEngine::instance()->Shape_Label_Map->end())
         [ +  - ][ +  - ]
     529                 :            :         {
     530                 :       8120 :           found = Standard_True;
     531         [ +  - ]:       8120 :           myLabel = (*it).second;
     532         [ +  - ]:    1284517 :           break;
              [ +  +  + ]
     533                 :            :         }
     534                 :            :       }
     535                 :            :     }
     536                 :    1284517 :   }
     537         [ +  + ]:      20196 :   if(!found)
     538                 :            :   {
     539         [ +  - ]:      12076 :     OS << "\n*";
     540                 :      12076 :     return;
     541                 :            :   }
     542                 :            : 
     543 [ +  - ][ -  + ]:       8120 :   if(!myLabel.HasChild())
     544                 :            :   {
     545         [ #  # ]:          0 :     OS << "\n*";
     546                 :          0 :     return;
     547                 :            :   }
     548                 :            : 
     549 [ +  - ][ +  - ]:      26811 :   for (TDF_ChildIterator it2(myLabel,Standard_False); it2.More(); it2.Next())
         [ +  - ][ +  + ]
     550                 :            :   {
     551         [ +  - ]:      18691 :     TDF_Label child = it2.Value();
     552                 :            :     //Write out all attributes
     553         [ +  - ]:      18691 :     Handle_TDataStd_Name attr_name;
     554 [ +  - ][ +  - ]:      37382 :     TCollection_ExtendedString name_string;
                 [ +  + ]
     555 [ +  - ][ +  - ]:      18691 :     if(child.FindAttribute(TDataStd_Name::GetID(), attr_name))
                 [ +  + ]
     556                 :            :     {
     557         [ +  - ]:      11163 :       OS << "\n";
     558         [ +  - ]:      11163 :       OS << "CGM_ATTRIB ";
     559 [ +  - ][ +  - ]:      11163 :       name_string = attr_name->Get(); 
                 [ +  - ]
     560         [ +  - ]:      11163 :       int length = name_string.Length();
     561 [ +  - ][ +  - ]:      11163 :       OS << length << ' ';
     562         [ +  - ]:      11163 :       name_string.Print(OS);
     563         [ +  - ]:      11163 :       OS << ' ' ;
     564                 :            :     }
     565                 :            :     else
     566                 :       7528 :       continue;
     567                 :            : 
     568 [ +  - ][ +  - ]:      29854 :     Handle_TDataStd_ExtStringArray attr_strings;
         [ +  - ][ +  + ]
     569 [ +  - ][ +  - ]:      11163 :     if(child.FindAttribute(TDataStd_ExtStringArray::GetID(), attr_strings))
                 [ +  + ]
     570                 :            :     {
     571 [ +  - ][ +  - ]:       1031 :       Standard_Integer i = attr_strings->Lower();
     572         [ +  - ]:       1031 :       TCollection_ExtendedString string;
     573 [ +  - ][ +  - ]:       1031 :       int size = attr_strings->Upper();
     574 [ +  - ][ +  - ]:       1031 :       OS << size -i + 1 << " ";
     575         [ +  + ]:       2483 :       for(; i <= size; i++)
     576                 :            :       {
     577 [ +  - ][ +  - ]:       1452 :          string = attr_strings->Value(i);     
                 [ +  - ]
     578         [ +  - ]:       1452 :          int length = string.Length();
     579 [ +  - ][ +  - ]:       1452 :          OS << length << ' ';
     580         [ +  - ]:       1452 :          string.Print(OS);
     581         [ +  - ]:       1452 :          OS << ' ';
     582         [ +  - ]:       1031 :       }
     583                 :            :     }
     584                 :            :     else
     585         [ +  - ]:      10132 :       OS << "0 " ;
     586                 :            : 
     587 [ +  - ][ +  - ]:      22326 :     Handle_TDataStd_IntegerArray attr_ints;
     588                 :            :     
     589 [ +  - ][ +  - ]:      11163 :     if(child.FindAttribute(TDataStd_IntegerArray::GetID(), attr_ints))
                 [ +  + ]
     590                 :            :     {
     591 [ +  - ][ +  - ]:      10337 :       Standard_Integer i = attr_ints->Lower();
     592 [ +  - ][ +  - ]:      10337 :       int size = attr_ints->Upper();
     593 [ +  - ][ +  - ]:      10337 :       OS << size -i + 1 << " ";
     594         [ +  + ]:      40078 :       for(; i <= size; i++)
     595 [ +  - ][ +  - ]:      29741 :         OS << attr_ints->Value(i) << ' ';
         [ +  - ][ +  - ]
     596                 :            :     }
     597                 :            :     else
     598         [ +  - ]:        826 :       OS << "0 " ;    
     599                 :            : 
     600 [ +  - ][ +  - ]:      22326 :     Handle_TDataStd_RealArray attr_doubles;
     601 [ +  - ][ +  - ]:      11163 :     if(child.FindAttribute(TDataStd_RealArray::GetID(), attr_doubles))
                 [ +  + ]
     602                 :            :     {
     603 [ +  - ][ +  - ]:         80 :       Standard_Integer i = attr_doubles->Lower();
     604 [ +  - ][ +  - ]:         80 :       Standard_Integer size = attr_doubles->Upper();
     605 [ +  - ][ +  - ]:         80 :       OS << size -i + 1 << " ";
     606         [ +  + ]:        320 :       for(;i <= size; i++)
     607 [ +  - ][ +  - ]:        240 :         OS << attr_doubles->Value(i) << ' ';
         [ +  - ][ +  - ]
     608                 :            :     }
     609                 :            :     else
     610         [ +  - ]:      11083 :       OS << "0 " ;
     611                 :      18691 :   }
     612         [ +  - ]:       8120 :   OS << "\n*";
     613                 :            : }
     614                 :            : 
     615                 :            : //=======================================================================
     616                 :            : //function : Write
     617                 :            : //purpose  :
     618                 :            : //=======================================================================
     619                 :            : 
     620                 :        241 : void  OCCShapeAttributeSet::Write(Standard_OStream& OS)
     621                 :            : {
     622                 :            :   //on sauvegarde l'ancien LC_NUMERIC
     623                 :            :   
     624                 :            :   char *oldnum,*plocal ;
     625                 :        241 :   plocal =   setlocale(LC_NUMERIC, NULL) ;
     626                 :        241 :   oldnum = new char[strlen(plocal)+1] ;
     627                 :        241 :   strcpy(oldnum,plocal);
     628                 :            : 
     629                 :            :   // on positionne LC_NUMERIC a "C" (point decimal)
     630                 :        241 :   setlocale(LC_NUMERIC, "C") ;
     631                 :            : 
     632                 :        241 :   int  prec = OS.precision(15);
     633                 :            : 
     634                 :            :   // write the copyright
     635         [ -  + ]:        241 :   if (myFormatNb == 2)
     636                 :          0 :     OS << "\n" << dVersion2 << endl;
     637                 :            :   else
     638                 :        241 :     OS << "\n" << dVersion << endl;
     639                 :            : 
     640                 :            :   //-----------------------------------------
     641                 :            :   // write the locations
     642                 :            :   //-----------------------------------------
     643                 :        241 :   myLocations.Write(OS);
     644                 :            : 
     645                 :            :   //-----------------------------------------
     646                 :            :   // write the geometry
     647                 :            :   //-----------------------------------------
     648                 :            : 
     649                 :        241 :   WriteGeometry(OS);
     650                 :            : 
     651                 :            :   //-----------------------------------------
     652                 :            :   // write the shapes
     653                 :            :   //-----------------------------------------
     654                 :        241 :   Standard_Integer i, nbShapes = myShapes.Extent();
     655                 :            : 
     656                 :        241 :   OS << "\nTShapes " << nbShapes << "\n";
     657                 :            : 
     658                 :            : 
     659                 :            :   // subshapes are written first
     660         [ +  + ]:      20437 :   for (i = 1; i <= nbShapes; i++) {
     661                 :            : 
     662         [ +  - ]:      20196 :     const TopoDS_Shape& S = myShapes(i);
     663                 :            : 
     664                 :            :     // Type
     665 [ +  - ][ +  - ]:      20196 :     PrintShapeEnum(S.ShapeType(),OS,Standard_True);
     666         [ +  - ]:      20196 :     OS << "\n";
     667                 :            : 
     668                 :            :     // Geometry
     669         [ +  - ]:      20196 :     WriteGeometry(S,OS);
     670                 :            : 
     671                 :            :     // Flags
     672         [ +  - ]:      20196 :     OS << "\n";
     673 [ +  - ][ +  + ]:      20196 :     OS << (S.Free()       ? 1 : 0);
                 [ +  - ]
     674 [ +  - ][ +  - ]:      20196 :     OS << (S.Modified()   ? 1 : 0);
                 [ +  - ]
     675 [ +  - ][ +  + ]:      20196 :     OS << (S.Checked()    ? 1 : 0);
                 [ +  - ]
     676 [ +  - ][ +  + ]:      20196 :     OS << (S.Orientable() ? 1 : 0);
                 [ +  - ]
     677 [ +  - ][ +  + ]:      20196 :     OS << (S.Closed()     ? 1 : 0);
                 [ +  - ]
     678 [ +  - ][ -  + ]:      20196 :     OS << (S.Infinite()   ? 1 : 0);
                 [ +  - ]
     679 [ +  - ][ +  + ]:      20196 :     OS << (S.Convex()     ? 1 : 0);
                 [ +  - ]
     680         [ +  - ]:      20196 :     OS << "\n";
     681                 :            : 
     682                 :            :     // sub-shapes
     683                 :            : 
     684                 :      20196 :     Standard_Integer l = 0;
     685         [ +  - ]:      20196 :     TopoDS_Iterator its(S,Standard_False,Standard_False);
     686 [ +  - ][ +  + ]:      54603 :     while (its.More()) {
     687 [ +  - ][ +  - ]:      34407 :       Write(its.Value(),OS);
     688                 :      34407 :       l++;
     689         [ +  + ]:      34407 :       if (l == 10) {
     690         [ +  - ]:        263 :         OS << "\n";
     691                 :        263 :         l = 0;
     692                 :            :       }
     693         [ +  - ]:      34407 :       its.Next();
     694                 :            :     }
     695 [ +  - ][ +  - ]:      20196 :     Write(TopoDS_Shape(),OS); // Null shape to end the list
                 [ +  - ]
     696         [ +  - ]:      20196 :     OS << "\n";
     697         [ +  - ]:      20196 :   }
     698                 :            : 
     699                 :        241 :   OS << endl;
     700                 :        241 :   OS.precision(prec);
     701                 :            : 
     702                 :            :   // on remet le LC_NUMERIC a la precedente valeur
     703                 :        241 :   setlocale(LC_NUMERIC, oldnum) ;
     704         [ +  - ]:        241 :   delete[] oldnum;
     705                 :        241 : }
     706                 :            : 
     707                 :            : //=======================================================================
     708                 :            : //function : Read
     709                 :            : //purpose  :
     710                 :            : //=======================================================================
     711                 :            : 
     712                 :        186 : void  OCCShapeAttributeSet::Read(Standard_IStream& IS, bool print_results)
     713                 :            : {
     714                 :            :  // on sauvegarde l'ancien LC_NUMERIC
     715                 :            :   char *oldnum,*plocal ;
     716                 :        186 :   plocal =   setlocale(LC_NUMERIC, NULL) ;
     717         [ +  - ]:        186 :   oldnum = new char[strlen(plocal)+1] ;
     718                 :        186 :   strcpy(oldnum,plocal);
     719                 :            : 
     720         [ +  - ]:        186 :   Clear();
     721                 :            : 
     722                 :            :   // Check the version
     723                 :            :   char vers[101];
     724         [ +  + ]:        558 :   do {
     725         [ +  - ]:        558 :     IS.getline(vers,100,'\n');
     726                 :            :     // BUC60769 PTV 18.10.2000: remove possible '\r' at the end of the line
     727                 :            :     //Standard_Integer lv = strlen(vers);
     728                 :            :     //char *pm;
     729                 :            :     //if(pm = strchr(vers,'\r'))
     730                 :            :     //  *pm ='\0';
     731                 :            : 
     732 [ +  + ][ -  + ]:        558 :     for (Standard_Integer lv = (strlen(vers)- 1); lv > 1 && (vers[lv] == '\r' || vers[lv] == '\n') ;lv--)
                 [ -  + ]
     733                 :          0 :       vers[lv] = '\0';
     734                 :            : 
     735 [ +  - ][ +  - ]:        558 :   } while ( ! IS.fail() && strcmp(vers,dVersion) && strcmp(vers,dVersion2) );
         [ +  + ][ +  - ]
     736 [ +  - ][ -  + ]:        186 :   if (IS.fail()) {
     737         [ #  # ]:          0 :     if (print_results)
     738 [ #  # ][ #  # ]:          0 :       cout << "File was not written with this version of the topology"<<endl;
     739                 :          0 :     setlocale(LC_NUMERIC, oldnum) ;
     740         [ #  # ]:          0 :     delete[] oldnum;
     741                 :        186 :     return;
     742                 :            :   }
     743         [ -  + ]:        186 :   if (strcmp(vers,dVersion2) == 0) myFormatNb = 2;
     744                 :        186 :   else myFormatNb = 1;
     745                 :            : 
     746                 :            :   //-----------------------------------------
     747                 :            :   // read the locations
     748                 :            :   //-----------------------------------------
     749                 :            : 
     750         [ +  - ]:        186 :   myLocations.Read(IS);
     751                 :            : 
     752                 :            :   //-----------------------------------------
     753                 :            :   // read the geometry
     754                 :            :   //-----------------------------------------
     755                 :            : 
     756         [ +  - ]:        186 :   ReadGeometry(IS);
     757                 :            : 
     758                 :            :   //-----------------------------------------
     759                 :            :   // read the shapes
     760                 :            :   //-----------------------------------------
     761                 :            : 
     762         [ +  - ]:        186 :   std::string buffer;
     763         [ +  - ]:        186 :   IS >> buffer;
     764 [ +  - ][ -  + ]:        186 :   if (buffer != "TShapes") {
     765         [ #  # ]:          0 :     if (print_results)
     766 [ #  # ][ #  # ]:          0 :       cout << "Not a TShape table"<<endl;
     767                 :          0 :     setlocale(LC_NUMERIC, oldnum) ;
     768         [ #  # ]:          0 :     delete[] oldnum;
     769                 :          0 :     return;
     770                 :            :   }
     771                 :            : 
     772                 :            :   Standard_Integer i, nbShapes;
     773         [ +  - ]:        186 :   IS >> nbShapes;
     774                 :            : 
     775         [ +  + ]:      20173 :   for (i = 1; i <= nbShapes; i++) {
     776                 :            : 
     777         [ +  - ]:      19987 :     TopoDS_Shape S;
     778                 :            : 
     779                 :            :     //Read type and create empty shape.
     780         [ +  - ]:      19987 :     TopAbs_ShapeEnum T = ReadShapeEnum(IS);
     781         [ +  - ]:      19987 :     ReadGeometry(T,IS,S);
     782                 :            : 
     783                 :            :     // Set the flags
     784         [ +  - ]:      19987 :     IS >> buffer;
     785                 :            : 
     786                 :            :     // sub-shapes
     787 [ +  - ][ +  - ]:      39974 :     TopoDS_Shape SS;
     788         [ +  + ]:      57419 :     do {
     789         [ +  - ]:      57419 :       Read(SS,IS,nbShapes);
     790 [ +  - ][ +  + ]:      57419 :       if (!SS.IsNull())
     791         [ +  - ]:      37432 :         myBuilder.Add(S,SS);
     792         [ +  - ]:      57419 :     } while(!SS.IsNull());
     793                 :            : 
     794 [ +  - ][ +  - ]:      19987 :     S.Free      (buffer[0] == '1');
     795 [ +  - ][ +  - ]:      19987 :     S.Modified  (buffer[1] == '1');
     796                 :            : 
     797         [ -  + ]:      19987 :     if (myFormatNb == 2)
     798 [ #  # ][ #  # ]:          0 :       S.Checked   (buffer[2] == '1');
     799                 :            :     else
     800         [ +  - ]:      19987 :       S.Checked   (Standard_False);     // force check at reading..
     801                 :            : 
     802 [ +  - ][ +  - ]:      19987 :     S.Orientable(buffer[3] == '1');
     803 [ +  - ][ +  - ]:      19987 :     S.Closed    (buffer[4] == '1');
     804 [ +  - ][ +  - ]:      19987 :     S.Infinite  (buffer[5] == '1');
     805 [ +  - ][ +  - ]:      19987 :     S.Convex    (buffer[6] == '1');
     806                 :            : 
     807                 :            :     // check
     808                 :            : 
     809         [ +  - ]:      19987 :     if (myFormatNb == 1)
     810         [ +  - ]:      19987 :       Check(T,S);
     811                 :            : 
     812         [ +  - ]:      19987 :     myShapes.Add(S);
     813         [ +  - ]:      19987 :   }
     814                 :            : 
     815                 :        186 :   setlocale(LC_NUMERIC, oldnum) ;
     816 [ +  - ][ +  - ]:        186 :   delete[] oldnum;
                 [ +  - ]
     817                 :            : }
     818                 :            : 
     819                 :            : //=======================================================================
     820                 :            : //function : WriteGeometry
     821                 :            : //purpose  :
     822                 :            : //=======================================================================
     823                 :            : 
     824                 :        241 : void  OCCShapeAttributeSet::WriteGeometry(Standard_OStream& OS) 
     825                 :            : {
     826                 :        241 :   myCurves2d.Write(OS);
     827                 :        241 :   myCurves.Write(OS);
     828                 :        241 :   WritePolygon3D(OS);
     829                 :        241 :   WritePolygonOnTriangulation(OS);
     830                 :        241 :   mySurfaces.Write(OS);
     831                 :        241 :   WriteTriangulation(OS);
     832                 :        241 : }
     833                 :            : 
     834                 :            : //=======================================================================
     835                 :            : //function : ReadGeometry
     836                 :            : //purpose  :
     837                 :            : //=======================================================================
     838                 :            : 
     839                 :        186 : void  OCCShapeAttributeSet::ReadGeometry(Standard_IStream& IS)
     840                 :            : {
     841                 :        186 :   myCurves2d.Read(IS);
     842                 :        186 :   myCurves.Read(IS);
     843                 :        186 :   ReadPolygon3D(IS);
     844                 :        186 :   ReadPolygonOnTriangulation(IS);
     845                 :        186 :   mySurfaces.Read(IS);
     846                 :        186 :   ReadTriangulation(IS);
     847                 :        186 : }
     848                 :            : 
     849                 :            : //=======================================================================
     850                 :            : //function : WritePolygon3D
     851                 :            : //purpose  :
     852                 :            : //=======================================================================
     853                 :            : 
     854                 :        241 : void OCCShapeAttributeSet::WritePolygon3D(Standard_OStream&      OS,
     855                 :            :                                         const Standard_Boolean Compact)
     856                 :            : {
     857         [ +  - ]:        241 :   Standard_Integer i, j, nbpol = myPolygons3D.Extent();
     858         [ +  - ]:        241 :   if (Compact)
     859 [ +  - ][ +  - ]:        241 :     OS << "Polygon3D " << nbpol << endl;
                 [ +  - ]
     860                 :            :   else {
     861         [ #  # ]:          0 :     OS << " -------\n";
     862 [ #  # ][ #  # ]:          0 :     OS <<"Dump of " << nbpol << " Polygon3Ds\n";
                 [ #  # ]
     863         [ #  # ]:          0 :     OS << " -------\n";
     864                 :            :   }
     865                 :            : 
     866         [ +  - ]:        241 :   Handle(Poly_Polygon3D) P;
     867         [ -  + ]:        241 :   for (i = 1; i <= nbpol; i++) {
     868 [ #  # ][ #  # ]:          0 :     P = Handle(Poly_Polygon3D)::DownCast(myPolygons3D(i));
         [ #  # ][ #  # ]
     869         [ #  # ]:          0 :     if (Compact) {
     870 [ #  # ][ #  # ]:          0 :       OS << P->NbNodes() << " ";
         [ #  # ][ #  # ]
     871 [ #  # ][ #  # ]:          0 :       OS << ((P->HasParameters()) ? "1" : "0") << "\n";
         [ #  # ][ #  # ]
                 [ #  # ]
     872                 :            :     }
     873                 :            :     else {
     874 [ #  # ][ #  # ]:          0 :       OS << "  "<< i << " : Polygon3D with " << P->NbNodes() << " Nodes\n";
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     875 [ #  # ][ #  # ]:          0 :       OS << ((P->HasParameters()) ? "with" : "without") << " parameters\n";
         [ #  # ][ #  # ]
                 [ #  # ]
     876                 :            :     }
     877                 :            : 
     878                 :            : 
     879                 :            :     // write the deflection
     880 [ #  # ][ #  # ]:          0 :     if (!Compact) OS << "Deflection : ";
     881 [ #  # ][ #  # ]:          0 :     OS << P->Deflection() << "\n";
         [ #  # ][ #  # ]
     882                 :            : 
     883                 :            :     // write the nodes
     884 [ #  # ][ #  # ]:          0 :     if (!Compact) OS << "\nNodes :\n";
     885                 :            : 
     886 [ #  # ][ #  # ]:          0 :     Standard_Integer i1, nbNodes = P->NbNodes();
     887 [ #  # ][ #  # ]:          0 :     const TColgp_Array1OfPnt& Nodes = P->Nodes();
     888         [ #  # ]:          0 :     for (j = 1; j <= nbNodes; j++) {
     889 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(10) << j << " : ";
         [ #  # ][ #  # ]
                 [ #  # ]
     890 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(17);
                 [ #  # ]
     891 [ #  # ][ #  # ]:          0 :       OS << Nodes(j).X() << " ";
         [ #  # ][ #  # ]
     892 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(17);
                 [ #  # ]
     893 [ #  # ][ #  # ]:          0 :       OS << Nodes(j).Y() << " ";
         [ #  # ][ #  # ]
     894 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(17);
                 [ #  # ]
     895 [ #  # ][ #  # ]:          0 :       OS << Nodes(j).Z();
                 [ #  # ]
     896 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << "\n";
     897         [ #  # ]:          0 :       else OS << " ";
     898                 :            :     }
     899         [ #  # ]:          0 :     OS <<"\n";
     900                 :            : 
     901 [ #  # ][ #  # ]:          0 :     if (P->HasParameters()) {
                 [ #  # ]
     902 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << "\nParameters :\n";
     903 [ #  # ][ #  # ]:          0 :       const TColStd_Array1OfReal& Param = P->Parameters();
     904         [ #  # ]:          0 :       for ( i1 = 1; i1 <= nbNodes; i1++ ) {
     905 [ #  # ][ #  # ]:          0 :         OS << Param(i1) << " ";
                 [ #  # ]
     906                 :            :       }
     907         [ #  # ]:          0 :       OS <<"\n";
     908                 :            :     }
     909         [ +  - ]:        241 :   }
     910                 :        241 : }
     911                 :            : 
     912                 :            : //=======================================================================
     913                 :            : //function : WritePolygonOnTriangulation
     914                 :            : //purpose  :
     915                 :            : //=======================================================================
     916                 :            : 
     917                 :        241 : void OCCShapeAttributeSet::WritePolygonOnTriangulation(
     918                 :            :                                           Standard_OStream&      OS,
     919                 :            :                                           const Standard_Boolean Compact)
     920                 :            : {
     921         [ +  - ]:        241 :   Standard_Integer i, j, nbpOntri = myNodes.Extent();
     922         [ +  - ]:        241 :   if (Compact)
     923 [ +  - ][ +  - ]:        241 :     OS << "PolygonOnTriangulations " << nbpOntri << endl;
                 [ +  - ]
     924                 :            :   else {
     925         [ #  # ]:          0 :     OS << " -------\n";
     926 [ #  # ][ #  # ]:          0 :     OS <<"Dump of " << nbpOntri << " PolygonOnTriangulations\n";
                 [ #  # ]
     927         [ #  # ]:          0 :     OS << " -------\n";
     928                 :            :   }
     929                 :            : 
     930         [ +  - ]:        241 :   Handle(Poly_PolygonOnTriangulation) Poly;
     931 [ +  - ][ +  - ]:        482 :   Handle(TColStd_HArray1OfReal) Param;
     932                 :            : 
     933         [ -  + ]:        241 :   for (i=1; i<=nbpOntri; i++) {
     934 [ #  # ][ #  # ]:          0 :     Poly = Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(i));
         [ #  # ][ #  # ]
     935 [ #  # ][ #  # ]:          0 :     const TColStd_Array1OfInteger& Nodes = Poly->Nodes();
     936         [ #  # ]:          0 :     if (!Compact) {
     937 [ #  # ][ #  # ]:          0 :       OS << "  "<< i << " : PolygonOnTriangulation with " << Nodes.Length() << " Nodes\n";
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     938                 :            :     }
     939 [ #  # ][ #  # ]:          0 :     else OS << Nodes.Length()<<" ";
                 [ #  # ]
     940 [ #  # ][ #  # ]:          0 :     if (!Compact) OS <<"  ";
     941 [ #  # ][ #  # ]:          0 :     for (j=1; j <= Nodes.Length(); j++) OS << Nodes.Value(j) << " ";
         [ #  # ][ #  # ]
                 [ #  # ]
     942         [ #  # ]:          0 :     OS << "\n";
     943                 :            : 
     944                 :            :     // writing parameters:
     945 [ #  # ][ #  # ]:          0 :     Param = Poly->Parameters();
         [ #  # ][ #  # ]
     946 [ #  # ][ #  # ]:          0 :     if (Compact) OS <<"p ";
     947                 :            : 
     948                 :            :     // write the deflection
     949 [ #  # ][ #  # ]:          0 :     if (!Compact) OS << "  Deflection : ";
     950 [ #  # ][ #  # ]:          0 :     OS <<Poly->Deflection() << " ";
         [ #  # ][ #  # ]
     951 [ #  # ][ #  # ]:          0 :     if (!Compact) OS << "\n";
     952                 :            : 
     953 [ #  # ][ #  # ]:          0 :     if (!Param.IsNull()) {
     954         [ #  # ]:          0 :       if (!Compact) {
     955 [ #  # ][ #  # ]:          0 :         OS << "  "<< "Parameters :";
     956                 :            :       }
     957         [ #  # ]:          0 :       else OS << "1 " ;
     958 [ #  # ][ #  # ]:          0 :       if (!Compact) OS <<"  ";
     959 [ #  # ][ #  # ]:          0 :       for (j=1; j <= Param->Length(); j++) OS << Param->Value(j) << " ";
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     960         [ #  # ]:          0 :       OS << "\n";
     961                 :            :     }
     962         [ #  # ]:          0 :     else OS <<"0 \n";
     963         [ +  - ]:        241 :   }
     964                 :            : 
     965                 :        241 : }
     966                 :            : 
     967                 :            : //=======================================================================
     968                 :            : //function : WriteTriangulation
     969                 :            : //purpose  :
     970                 :            : //=======================================================================
     971                 :            : 
     972                 :        241 : void OCCShapeAttributeSet::WriteTriangulation(Standard_OStream&      OS,
     973                 :            :                                         const Standard_Boolean Compact)
     974                 :            : {
     975         [ +  - ]:        241 :   Standard_Integer i, j, nbNodes, nbtri = myTriangulations.Extent();
     976                 :        241 :   Standard_Integer nbTriangles = 0, n1, n2, n3;
     977         [ +  - ]:        241 :   if (Compact)
     978 [ +  - ][ +  - ]:        241 :     OS << "Triangulations " << nbtri << endl;
                 [ +  - ]
     979                 :            :   else {
     980         [ #  # ]:          0 :     OS << " -------\n";
     981 [ #  # ][ #  # ]:          0 :     OS <<"Dump of " << nbtri << " Triangulations\n";
                 [ #  # ]
     982         [ #  # ]:          0 :     OS << " -------\n";
     983                 :            :   }
     984                 :            : 
     985         [ +  - ]:        241 :   Handle(Poly_Triangulation) T;
     986         [ -  + ]:        241 :   for (i = 1; i <= nbtri; i++) {
     987 [ #  # ][ #  # ]:          0 :     T = Handle(Poly_Triangulation)::DownCast(myTriangulations(i));
         [ #  # ][ #  # ]
     988         [ #  # ]:          0 :     if (Compact) {
     989 [ #  # ][ #  # ]:          0 :       OS << T->NbNodes() << " " << T->NbTriangles() << " ";
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     990 [ #  # ][ #  # ]:          0 :       OS << ((T->HasUVNodes()) ? "1" : "0") << " ";
         [ #  # ][ #  # ]
                 [ #  # ]
     991                 :            :     }
     992                 :            :     else {
     993 [ #  # ][ #  # ]:          0 :       OS << "  "<< i << " : Triangulation with " << T->NbNodes() << " Nodes and "
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     994 [ #  # ][ #  # ]:          0 :          << T->NbTriangles() <<" Triangles\n";
         [ #  # ][ #  # ]
     995 [ #  # ][ #  # ]:          0 :       OS << "      "<<((T->HasUVNodes()) ? "with" : "without") << " UV nodes\n";
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     996                 :            :     }
     997                 :            : 
     998                 :            :     // write the deflection
     999                 :            : 
    1000 [ #  # ][ #  # ]:          0 :     if (!Compact) OS << "  Deflection : ";
    1001 [ #  # ][ #  # ]:          0 :     OS <<T->Deflection() << "\n";
         [ #  # ][ #  # ]
    1002                 :            : 
    1003                 :            :     // write the 3d nodes
    1004                 :            : 
    1005 [ #  # ][ #  # ]:          0 :     if (!Compact) OS << "\n3D Nodes :\n";
    1006                 :            : 
    1007 [ #  # ][ #  # ]:          0 :     nbNodes = T->NbNodes();
    1008 [ #  # ][ #  # ]:          0 :     const TColgp_Array1OfPnt& Nodes = T->Nodes();
    1009         [ #  # ]:          0 :     for (j = 1; j <= nbNodes; j++) {
    1010 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(10) << j << " : ";
         [ #  # ][ #  # ]
                 [ #  # ]
    1011 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(17);
                 [ #  # ]
    1012 [ #  # ][ #  # ]:          0 :       OS << Nodes(j).X() << " ";
         [ #  # ][ #  # ]
    1013 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(17);
                 [ #  # ]
    1014 [ #  # ][ #  # ]:          0 :       OS << Nodes(j).Y() << " ";
         [ #  # ][ #  # ]
    1015 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(17);
                 [ #  # ]
    1016 [ #  # ][ #  # ]:          0 :       OS << Nodes(j).Z();
                 [ #  # ]
    1017 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << "\n";
    1018         [ #  # ]:          0 :       else OS << " ";
    1019                 :            :     }
    1020                 :            : 
    1021 [ #  # ][ #  # ]:          0 :     if (T->HasUVNodes()) {
                 [ #  # ]
    1022 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << "\nUV Nodes :\n";
    1023 [ #  # ][ #  # ]:          0 :       const TColgp_Array1OfPnt2d& UVNodes = T->UVNodes();
    1024         [ #  # ]:          0 :       for (j = 1; j <= nbNodes; j++) {
    1025 [ #  # ][ #  # ]:          0 :         if (!Compact) OS << setw(10) << j << " : ";
         [ #  # ][ #  # ]
                 [ #  # ]
    1026 [ #  # ][ #  # ]:          0 :         if (!Compact) OS << setw(17);
                 [ #  # ]
    1027 [ #  # ][ #  # ]:          0 :         OS << UVNodes(j).X() << " ";
         [ #  # ][ #  # ]
    1028 [ #  # ][ #  # ]:          0 :         if (!Compact) OS << setw(17);
                 [ #  # ]
    1029 [ #  # ][ #  # ]:          0 :         OS << UVNodes(j).Y();
                 [ #  # ]
    1030 [ #  # ][ #  # ]:          0 :         if (!Compact) OS << "\n";
    1031         [ #  # ]:          0 :         else OS << " ";
    1032                 :            :       }
    1033                 :            :     }
    1034                 :            : 
    1035 [ #  # ][ #  # ]:          0 :     if (!Compact) OS << "\nTriangles :\n";
    1036 [ #  # ][ #  # ]:          0 :     nbTriangles = T->NbTriangles();
    1037 [ #  # ][ #  # ]:          0 :     const Poly_Array1OfTriangle& Triangles = T->Triangles();
    1038         [ #  # ]:          0 :     for (j = 1; j <= nbTriangles; j++) {
    1039 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(10) << j << " : ";
         [ #  # ][ #  # ]
                 [ #  # ]
    1040 [ #  # ][ #  # ]:          0 :       Triangles(j).Get(n1, n2, n3);
    1041 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(10);
                 [ #  # ]
    1042 [ #  # ][ #  # ]:          0 :       OS << n1 << " ";
    1043 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(10);
                 [ #  # ]
    1044 [ #  # ][ #  # ]:          0 :       OS << n2 << " ";
    1045 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << setw(10);
                 [ #  # ]
    1046         [ #  # ]:          0 :       OS << n3;
    1047 [ #  # ][ #  # ]:          0 :       if (!Compact) OS << "\n";
    1048         [ #  # ]:          0 :       else OS << " ";
    1049                 :            :     }
    1050         [ #  # ]:          0 :     OS << "\n";
    1051         [ +  - ]:        241 :   }
    1052                 :            : 
    1053                 :        241 : }
    1054                 :            : //=======================================================================
    1055                 :            : //function : WriteGeometry
    1056                 :            : //purpose  :
    1057                 :            : //=======================================================================
    1058                 :            : 
    1059                 :      20196 : void  OCCShapeAttributeSet::WriteGeometry(const TopoDS_Shape& S,
    1060                 :            :                                         Standard_OStream&   OS)
    1061                 :            : {
    1062                 :            :   // Write the geometry
    1063                 :            : 
    1064         [ +  + ]:      20196 :   if (S.ShapeType() == TopAbs_VERTEX) {
    1065                 :            : 
    1066                 :            :     // Write the point geometry
    1067 [ +  - ][ +  - ]:       6029 :     TopoDS_Vertex V = TopoDS::Vertex(S);
    1068 [ +  - ][ +  - ]:       6029 :     OS << BRep_Tool::Tolerance(V) << "\n";
                 [ +  - ]
    1069         [ +  - ]:       6029 :     gp_Pnt p = BRep_Tool::Pnt(V);
    1070 [ +  - ][ +  - ]:       6029 :     OS<<p.X()<<" "<<p.Y()<<" "<<p.Z()<<"\n";
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
    1071                 :            : 
    1072 [ +  - ][ +  - ]:      12058 :     Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(S.TShape());
                 [ +  - ]
    1073 [ +  - ][ +  - ]:       6029 :     BRep_ListIteratorOfListOfPointRepresentation itrp(TV->Points());
                 [ +  - ]
    1074                 :            : 
    1075 [ +  - ][ -  + ]:       6029 :     while (itrp.More()) {
    1076         [ #  # ]:          0 :       const Handle(BRep_PointRepresentation)& PR = itrp.Value();
    1077                 :            : 
    1078 [ #  # ][ #  # ]:          0 :       OS << PR->Parameter();
                 [ #  # ]
    1079 [ #  # ][ #  # ]:          0 :       if (PR->IsPointOnCurve()) {
                 [ #  # ]
    1080 [ #  # ][ #  # ]:          0 :         OS << " 1 " << myCurves.Index(PR->Curve());
         [ #  # ][ #  # ]
                 [ #  # ]
    1081                 :            :       }
    1082                 :            : 
    1083 [ #  # ][ #  # ]:          0 :       else if (PR->IsPointOnCurveOnSurface()) {
                 [ #  # ]
    1084 [ #  # ][ #  # ]:          0 :         OS << " 2 " <<  myCurves2d.Index(PR->PCurve());
         [ #  # ][ #  # ]
                 [ #  # ]
    1085 [ #  # ][ #  # ]:          0 :         OS << " " << mySurfaces.Index(PR->Surface());
         [ #  # ][ #  # ]
                 [ #  # ]
    1086                 :            :       }
    1087                 :            : 
    1088 [ #  # ][ #  # ]:          0 :       else if (PR->IsPointOnSurface()) {
                 [ #  # ]
    1089 [ #  # ][ #  # ]:          0 :         OS << " 3 " << PR->Parameter2() << " ";
         [ #  # ][ #  # ]
                 [ #  # ]
    1090 [ #  # ][ #  # ]:          0 :         OS << mySurfaces.Index(PR->Surface());
         [ #  # ][ #  # ]
    1091                 :            :       }
    1092                 :            : 
    1093 [ #  # ][ #  # ]:          0 :       OS << " " << myLocations.Index(PR->Location());
         [ #  # ][ #  # ]
                 [ #  # ]
    1094         [ #  # ]:          0 :       OS << "\n";
    1095                 :            : 
    1096         [ #  # ]:          0 :       itrp.Next();
    1097                 :            :     }
    1098                 :            : 
    1099 [ +  - ][ +  - ]:      12058 :     OS << "0 0\n"; // end representations
    1100                 :            : 
    1101                 :            :   }
    1102                 :            : 
    1103         [ +  + ]:      14167 :   else if (S.ShapeType() == TopAbs_EDGE) {
    1104                 :            : 
    1105                 :            :     // Write the curve geometry
    1106                 :            : 
    1107 [ +  - ][ +  - ]:       7553 :     Handle(BRep_TEdge) TE = Handle(BRep_TEdge)::DownCast(S.TShape());
    1108                 :            : 
    1109 [ +  - ][ +  - ]:       7553 :     OS << " " << TE->Tolerance() << " ";
         [ +  - ][ +  - ]
                 [ +  - ]
    1110 [ +  - ][ +  - ]:       7553 :     OS << ((TE->SameParameter()) ? 1 : 0) << " ";
         [ +  - ][ +  - ]
                 [ +  - ]
    1111 [ +  - ][ +  - ]:       7553 :     OS << ((TE->SameRange())     ? 1 : 0) << " ";
         [ +  - ][ +  - ]
                 [ +  - ]
    1112 [ +  - ][ +  - ]:       7553 :     OS << ((TE->Degenerated())   ? 1 : 0) << "\n";
         [ +  + ][ +  - ]
                 [ +  - ]
    1113                 :            : 
    1114                 :            :     Standard_Real first, last;
    1115 [ +  - ][ +  - ]:       7553 :     BRep_ListIteratorOfListOfCurveRepresentation itrc = TE->Curves();
                 [ +  - ]
    1116 [ +  - ][ +  + ]:      27762 :     while (itrc.More()) {
    1117         [ +  - ]:      20209 :       const Handle(BRep_CurveRepresentation)& CR = itrc.Value();
    1118 [ +  - ][ +  - ]:      20209 :       if (CR->IsCurve3D()) {
                 [ +  + ]
    1119 [ +  - ][ +  - ]:       7553 :         if (!CR->Curve3D().IsNull()) {
         [ +  - ][ +  + ]
    1120 [ +  - ][ +  - ]:       7531 :           Handle(BRep_GCurve) GC = Handle(BRep_GCurve)::DownCast(itrc.Value());
    1121 [ +  - ][ +  - ]:       7531 :           GC->Range(first, last);
    1122         [ +  - ]:       7531 :           OS << "1 ";                               // -1- Curve 3D
    1123 [ +  - ][ +  - ]:       7531 :           OS << " "<<myCurves.Index(CR->Curve3D());
         [ +  - ][ +  - ]
                 [ +  - ]
    1124 [ +  - ][ +  - ]:       7531 :           OS << " "<<myLocations.Index(CR->Location());
         [ +  - ][ +  - ]
                 [ +  - ]
    1125 [ +  - ][ +  - ]:       7531 :           OS << " "<<first<<" "<<last;
         [ +  - ][ +  - ]
    1126 [ +  - ][ +  - ]:       7553 :           OS << "\n";
    1127                 :            :         }
    1128                 :            :       }
    1129 [ +  - ][ +  - ]:      12656 :       else if (CR->IsCurveOnSurface()) {
                 [ +  + ]
    1130 [ +  - ][ +  - ]:      12590 :         Handle(BRep_GCurve) GC = Handle(BRep_GCurve)::DownCast(itrc.Value());
    1131 [ +  - ][ +  - ]:      12590 :         GC->Range(first, last);
    1132 [ +  - ][ +  - ]:      12590 :         if (!CR->IsCurveOnClosedSurface())
                 [ +  + ]
    1133         [ +  - ]:      12506 :           OS << "2 ";                             // -2- Curve on surf
    1134                 :            :         else
    1135         [ +  - ]:         84 :           OS << "3 ";                             // -3- Curve on closed surf
    1136 [ +  - ][ +  - ]:      12590 :         OS <<" "<<myCurves2d.Index(CR->PCurve());
         [ +  - ][ +  - ]
                 [ +  - ]
    1137 [ +  - ][ +  - ]:      12590 :         if (CR->IsCurveOnClosedSurface()) {
                 [ +  + ]
    1138 [ +  - ][ +  - ]:         84 :           OS <<" " << myCurves2d.Index(CR->PCurve2());
         [ +  - ][ +  - ]
                 [ +  - ]
    1139 [ +  - ][ +  - ]:         84 :           PrintRegularity(CR->Continuity(),OS);
                 [ +  - ]
    1140                 :            :         }
    1141 [ +  - ][ +  - ]:      12590 :         OS << " " << mySurfaces.Index(CR->Surface());
         [ +  - ][ +  - ]
                 [ +  - ]
    1142 [ +  - ][ +  - ]:      12590 :         OS << " " << myLocations.Index(CR->Location());
         [ +  - ][ +  - ]
                 [ +  - ]
    1143 [ +  - ][ +  - ]:      12590 :         OS << " "<<first<<" "<<last;
         [ +  - ][ +  - ]
    1144         [ +  - ]:      12590 :         OS << "\n";
    1145                 :            : 
    1146                 :            :         // Write UV Points // for XML Persistence higher performance
    1147         [ -  + ]:      12590 :         if (myFormatNb == 2)
    1148                 :            :         {
    1149 [ #  # ][ #  # ]:          0 :           gp_Pnt2d Pf,Pl;
    1150 [ #  # ][ #  # ]:          0 :           if (CR->IsCurveOnClosedSurface()) {
                 [ #  # ]
    1151                 :            :             Handle(BRep_CurveOnClosedSurface) COCS =
    1152         [ #  # ]:          0 :               Handle(BRep_CurveOnClosedSurface)::DownCast(CR);
    1153 [ #  # ][ #  # ]:          0 :             COCS->UVPoints2(Pf,Pl);
                 [ #  # ]
    1154                 :            :           }
    1155                 :            :           else {
    1156                 :            :             Handle(BRep_CurveOnSurface) COS =
    1157         [ #  # ]:          0 :               Handle(BRep_CurveOnSurface)::DownCast(CR);
    1158 [ #  # ][ #  # ]:          0 :             COS->UVPoints(Pf,Pl);
                 [ #  # ]
    1159                 :            :           }
    1160 [ #  # ][ #  # ]:          0 :           OS << Pf.X() << " " << Pf.Y() << " " << Pl.X() << " " << Pl.Y() << "\n";
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1161         [ +  - ]:      12590 :         }
    1162                 :            :       }
    1163 [ +  - ][ +  - ]:         66 :       else if (CR->IsRegularity()) {
                 [ +  - ]
    1164         [ +  - ]:         66 :         OS << "4 ";                              // -4- Regularity
    1165 [ +  - ][ +  - ]:         66 :         PrintRegularity(CR->Continuity(),OS);
                 [ +  - ]
    1166 [ +  - ][ +  - ]:         66 :         OS << " "<<mySurfaces.Index(CR->Surface());
         [ +  - ][ +  - ]
                 [ +  - ]
    1167 [ +  - ][ +  - ]:         66 :         OS << " "<<myLocations.Index(CR->Location());
         [ +  - ][ +  - ]
                 [ +  - ]
    1168 [ +  - ][ +  - ]:         66 :         OS << " "<<mySurfaces.Index(CR->Surface2());
         [ +  - ][ +  - ]
                 [ +  - ]
    1169 [ +  - ][ +  - ]:         66 :         OS << " "<<myLocations.Index(CR->Location2());
         [ +  - ][ +  - ]
                 [ +  - ]
    1170         [ +  - ]:         66 :         OS << "\n";
    1171                 :            :       }
    1172         [ +  - ]:      20209 :       itrc.Next();
    1173                 :            :     }
    1174 [ +  - ][ +  - ]:       7553 :     OS << "0\n"; // end of the list of representations
    1175                 :            :   }
    1176         [ +  + ]:       6614 :    else if (S.ShapeType() == TopAbs_FACE) {
    1177                 :            : 
    1178 [ +  - ][ +  - ]:       2770 :     Handle(BRep_TFace) TF = Handle(BRep_TFace)::DownCast(S.TShape());
    1179         [ +  - ]:       2770 :     const TopoDS_Face& F = TopoDS::Face(S);
    1180                 :            : 
    1181 [ +  - ][ +  - ]:       2770 :     if (!(TF->Surface()).IsNull()) {
         [ +  - ][ +  - ]
    1182 [ +  - ][ -  + ]:       2770 :       OS << ((BRep_Tool::NaturalRestriction(F)) ? 1 : 0);
                 [ +  - ]
    1183         [ +  - ]:       2770 :       OS << " ";
    1184                 :            :       // Write the surface geometry
    1185 [ +  - ][ +  - ]:       2770 :       OS << " " <<TF->Tolerance();
         [ +  - ][ +  - ]
    1186 [ +  - ][ +  - ]:       2770 :       OS << " " <<mySurfaces.Index(TF->Surface());
         [ +  - ][ +  - ]
                 [ +  - ]
    1187 [ +  - ][ +  - ]:       2770 :       OS << " " <<myLocations.Index(TF->Location());
         [ +  - ][ +  - ]
                 [ +  - ]
    1188         [ +  - ]:       2770 :       OS << "\n";
    1189         [ +  - ]:       2770 :     }
    1190                 :            :   }
    1191                 :            : 
    1192                 :      20196 : }
    1193                 :            : 
    1194                 :            : 
    1195                 :            : //=======================================================================
    1196                 :            : //function : Write
    1197                 :            : //purpose  :
    1198                 :            : //=======================================================================
    1199                 :            : 
    1200                 :      54844 : void  OCCShapeAttributeSet::Write(const TopoDS_Shape& S,
    1201                 :            :                                Standard_OStream& OS,
    1202                 :            :                                TDF_Label* l_attr)
    1203                 :            : {
    1204         [ +  + ]:      54844 :   if (S.IsNull()) OS << "*";
    1205                 :            :   else {
    1206                 :      34648 :     PrintOrientation(S.Orientation(),OS,Standard_True);
    1207 [ +  - ][ +  - ]:      34648 :     OS << myShapes.Extent() - myShapes.FindIndex(S.Located(TopLoc_Location())) + 1;
         [ +  - ][ +  - ]
    1208                 :      34648 :     OS << " " << myLocations.Index(S.Location()) << " ";
    1209                 :            :   }
    1210                 :            :   //Write Attributes
    1211                 :      54844 :   Standard_Integer i, nbShapes = myShapes.Extent();
    1212         [ +  + ]:      54844 :   if(l_attr != NULL)
    1213                 :            :   {
    1214         [ +  + ]:      20437 :     for ( i = 1; i <= nbShapes; i++)
    1215                 :            :     {
    1216                 :      20196 :       const TopoDS_Shape& Sh = myShapes(i);
    1217                 :      20196 :       WriteAttribute(Sh, OS, *l_attr);
    1218                 :            :     }
    1219                 :            :   }
    1220                 :      54844 : }
    1221                 :            : 
    1222                 :            : 
    1223                 :            : //=======================================================================
    1224                 :            : //function : ReadGeometry
    1225                 :            : //purpose  :
    1226                 :            : //=======================================================================
    1227                 :            : 
    1228                 :      19987 : void  OCCShapeAttributeSet::ReadGeometry(const TopAbs_ShapeEnum T,
    1229                 :            :                                          Standard_IStream&      IS,
    1230                 :            :                                          TopoDS_Shape&          S)
    1231                 :            : {
    1232                 :            :   // Read the geometry
    1233                 :            : 
    1234                 :            :   Standard_Integer val,c,pc,pc2,s,s2,l,l2,t, pt, pt2;
    1235                 :            :   Standard_Real tol,X,Y,Z,first,last,p1,p2;
    1236                 :            :   Standard_Real PfX,PfY,PlX,PlY;
    1237 [ +  - ][ +  - ]:      19987 :   gp_Pnt2d aPf, aPl;
    1238                 :            :   Standard_Boolean closed;
    1239                 :            : #ifndef DEB
    1240                 :      19987 :   GeomAbs_Shape reg = GeomAbs_C0;
    1241                 :            : #else
    1242                 :            :   GeomAbs_Shape reg;
    1243                 :            : #endif
    1244   [ +  +  +  +  :      19987 :   switch (T) {
             +  +  -  +  
                      - ]
    1245                 :            : 
    1246                 :            : 
    1247                 :            :     //---------
    1248                 :            :     // vertex
    1249                 :            :     //---------
    1250                 :            : 
    1251                 :            :   case TopAbs_VERTEX :
    1252                 :            :     {
    1253         [ +  - ]:       4852 :       TopoDS_Vertex& V = TopoDS::Vertex(S);
    1254                 :            : 
    1255                 :            :       // Read the point geometry
    1256         [ +  - ]:       4852 :       IS >> tol;
    1257 [ +  - ][ +  - ]:       4852 :       IS >> X >> Y >> Z;
                 [ +  - ]
    1258 [ +  - ][ +  - ]:       4852 :       myBuilder.MakeVertex(V,gp_Pnt(X,Y,Z),tol);
    1259 [ +  - ][ +  - ]:       4852 :       Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(V.TShape());
    1260                 :            : 
    1261 [ +  - ][ +  - ]:       4852 :       BRep_ListOfPointRepresentation& lpr = TV->ChangePoints();
    1262 [ +  - ][ +  - ]:       9704 :       TopLoc_Location L;
    1263                 :            : 
    1264         [ -  + ]:       4852 :       do {
    1265 [ +  - ][ +  - ]:       4852 :         IS >> p1 >> val;
    1266                 :            : 
    1267         [ +  - ]:       4852 :         Handle(BRep_PointRepresentation) PR;
    1268   [ -  -  -  + ]:       4852 :         switch (val) {
    1269                 :            : 
    1270                 :            :         case 1 :
    1271                 :            :           {
    1272         [ #  # ]:          0 :             IS >> c;
    1273                 :            : 
    1274 [ #  # ][ #  # ]:          0 :             if (myCurves.Curve(c).IsNull())
         [ #  # ][ #  # ]
    1275                 :          0 :               break;
    1276                 :            : 
    1277                 :            :             Handle(BRep_PointOnCurve) POC =
    1278                 :            :               new BRep_PointOnCurve(p1,
    1279                 :            :                                     myCurves.Curve(c),
    1280 [ #  # ][ #  # ]:          0 :                                     L);
         [ #  # ][ #  # ]
                 [ #  # ]
    1281 [ #  # ][ #  # ]:          0 :             PR = POC;
    1282                 :            :           }
    1283                 :          0 :           break;
    1284                 :            : 
    1285                 :            :         case 2 :
    1286                 :            :           {
    1287 [ #  # ][ #  # ]:          0 :             IS >> pc >> s;
    1288                 :            : 
    1289 [ #  # ][ #  # ]:          0 :             if (myCurves2d.Curve2d(pc).IsNull() ||
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
           [ #  #  #  # ]
    1290 [ #  # ][ #  # ]:          0 :                 mySurfaces.Surface(s).IsNull())
         [ #  # ][ #  # ]
                 [ #  # ]
    1291                 :          0 :               break;
    1292                 :            : 
    1293                 :            :             Handle(BRep_PointOnCurveOnSurface) POC =
    1294                 :            :               new BRep_PointOnCurveOnSurface(p1,
    1295                 :            :                                              myCurves2d.Curve2d(pc),
    1296                 :            :                                              mySurfaces.Surface(s),
    1297 [ #  # ][ #  # ]:          0 :                                              L);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    1298 [ #  # ][ #  # ]:          0 :             PR = POC;
    1299                 :            :           }
    1300                 :          0 :           break;
    1301                 :            : 
    1302                 :            :         case 3 :
    1303                 :            :           {
    1304 [ #  # ][ #  # ]:          0 :             IS >> p2 >> s;
    1305                 :            : 
    1306 [ #  # ][ #  # ]:          0 :             if (mySurfaces.Surface(s).IsNull())
         [ #  # ][ #  # ]
    1307                 :          0 :               break;
    1308                 :            : 
    1309                 :            :             Handle(BRep_PointOnSurface) POC =
    1310                 :            :               new BRep_PointOnSurface(p1,p2,
    1311                 :            :                                       mySurfaces.Surface(s),
    1312 [ #  # ][ #  # ]:          0 :                                       L);
         [ #  # ][ #  # ]
                 [ #  # ]
    1313 [ #  # ][ #  # ]:          0 :             PR = POC;
    1314                 :            :           }
    1315                 :          0 :           break;
    1316                 :            :         }
    1317                 :            : 
    1318         [ -  + ]:       4852 :         if (val > 0) {
    1319         [ #  # ]:          0 :           IS >> l;
    1320 [ #  # ][ #  # ]:          0 :           if (!PR.IsNull()) {
    1321 [ #  # ][ #  # ]:          0 :             PR->Location(myLocations.Location(l));
                 [ #  # ]
    1322         [ #  # ]:          0 :             lpr.Append(PR);
    1323                 :            :           }
    1324         [ +  - ]:       4852 :         }
    1325         [ +  - ]:       4852 :       } while (val > 0);
    1326                 :            :     }
    1327                 :       4852 :     break;
    1328                 :            : 
    1329                 :            : 
    1330                 :            :     //---------
    1331                 :            :     // edge
    1332                 :            :     //---------
    1333                 :            : 
    1334                 :            : 
    1335                 :            :     case TopAbs_EDGE :
    1336                 :            : 
    1337                 :            :       // Create an edge
    1338                 :            :       {
    1339         [ +  - ]:       7498 :         TopoDS_Edge& E = TopoDS::Edge(S);
    1340                 :            : 
    1341         [ +  - ]:       7498 :         myBuilder.MakeEdge(E);
    1342                 :            : 
    1343                 :            :         // Read the curve geometry
    1344         [ +  - ]:       7498 :         IS >> tol;
    1345         [ +  - ]:       7498 :         IS >> val;
    1346         [ +  - ]:       7498 :         myBuilder.SameParameter(E,(val == 1));
    1347         [ +  - ]:       7498 :         IS >> val;
    1348         [ +  - ]:       7498 :         myBuilder.SameRange(E,(val == 1));
    1349         [ +  - ]:       7498 :         IS >> val;
    1350         [ +  - ]:       7498 :         myBuilder.Degenerated(E,(val == 1));
    1351                 :            : 
    1352         [ +  + ]:      38267 :         do {
    1353         [ +  - ]:      38267 :           IS >> val;
    1354   [ +  +  +  -  :      38267 :           switch (val) {
                   +  + ]
    1355                 :            : 
    1356                 :            :           case 1 :                               // -1- Curve 3D
    1357 [ +  - ][ +  - ]:       7487 :             IS >> c >> l;
    1358 [ +  - ][ +  - ]:       7487 :             if (!myCurves.Curve(c).IsNull()) {
         [ +  - ][ +  - ]
    1359                 :            :               myBuilder.UpdateEdge(E,myCurves.Curve(c),
    1360 [ +  - ][ +  - ]:       7487 :                                    myLocations.Location(l),tol);
         [ +  - ][ +  - ]
    1361                 :            :             }
    1362 [ +  - ][ +  - ]:       7487 :             IS >> first >> last;
    1363 [ +  - ][ +  - ]:       7487 :             if (!myCurves.Curve(c).IsNull()) {
         [ +  - ][ +  - ]
    1364                 :       7487 :               Standard_Boolean Only3d = Standard_True;
    1365         [ +  - ]:       7487 :               myBuilder.Range(E,first,last,Only3d);
    1366                 :            :             }
    1367                 :       7487 :             break;
    1368                 :            : 
    1369                 :            : 
    1370                 :            :           case 2 :                               // -2- Curve on surf
    1371                 :            :           case 3 :                               // -3- Curve on closed surf
    1372                 :      14988 :             closed = (val == 3);
    1373         [ +  - ]:      14988 :             IS >> pc;
    1374         [ +  + ]:      14988 :             if (closed) {
    1375         [ +  - ]:        106 :               IS >> pc2;
    1376         [ +  - ]:        106 :               reg = ReadRegularity(IS);
    1377                 :            :             }
    1378                 :            : 
    1379                 :            :             // surface, location
    1380 [ +  - ][ +  - ]:      14988 :             IS >> s >> l;
    1381                 :            : 
    1382                 :            :             // range
    1383 [ +  - ][ +  - ]:      14988 :             IS >> first >> last;
    1384                 :            : 
    1385                 :            :             // read UV Points // for XML Persistence higher performance
    1386         [ -  + ]:      14988 :             if (myFormatNb == 2)
    1387                 :            :             {
    1388 [ #  # ][ #  # ]:          0 :               IS >> PfX >> PfY >> PlX >> PlY;
         [ #  # ][ #  # ]
    1389         [ #  # ]:          0 :               aPf = gp_Pnt2d(PfX,PfY);
    1390         [ #  # ]:          0 :               aPl = gp_Pnt2d(PlX,PlY);
    1391                 :            :             }
    1392                 :            : 
    1393 [ +  - ][ +  - ]:      44964 :             if (myCurves2d.Curve2d(pc).IsNull() ||
         [ +  + ][ +  - ]
                 [ +  - ]
           [ -  +  #  # ]
    1394 [ +  - ][ +  - ]:      45070 :                 (closed && myCurves2d.Curve2d(pc2).IsNull()) ||
         [ +  - ][ +  - ]
         [ -  + ][ +  + ]
         [ +  - ][ #  # ]
    1395 [ +  - ][ +  - ]:      29976 :                 mySurfaces.Surface(s).IsNull())
         [ +  - ][ +  - ]
                 [ #  # ]
    1396                 :          0 :               break;
    1397                 :            : 
    1398         [ +  + ]:      14988 :             if (closed) {
    1399         [ -  + ]:        106 :               if (myFormatNb == 2)
    1400                 :            :                 myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc),
    1401                 :            :                                      myCurves2d.Curve2d(pc2),
    1402                 :            :                                      mySurfaces.Surface(s),
    1403         [ #  # ]:          0 :                                      myLocations.Location(l),tol,
    1404 [ #  # ][ #  # ]:          0 :                                      aPf, aPl);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    1405                 :            :               else
    1406                 :            :                 myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc),
    1407                 :            :                                      myCurves2d.Curve2d(pc2),
    1408                 :            :                                      mySurfaces.Surface(s),
    1409 [ +  - ][ +  - ]:        106 :                                      myLocations.Location(l),tol);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    1410                 :            : 
    1411                 :            :               myBuilder.Continuity(E,
    1412                 :            :                                    mySurfaces.Surface(s),
    1413                 :            :                                    mySurfaces.Surface(s),
    1414         [ +  - ]:        106 :                                    myLocations.Location(l),
    1415         [ +  - ]:        106 :                                    myLocations.Location(l),
    1416 [ +  - ][ +  - ]:        106 :                                    reg);
         [ +  - ][ +  - ]
                 [ +  - ]
    1417                 :            :             }
    1418                 :            :             else
    1419                 :            :             {
    1420         [ -  + ]:      14882 :               if (myFormatNb == 2)
    1421                 :            :                 myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc),
    1422                 :            :                                      mySurfaces.Surface(s),
    1423         [ #  # ]:          0 :                                      myLocations.Location(l),tol,
    1424 [ #  # ][ #  # ]:          0 :                                      aPf, aPl);
         [ #  # ][ #  # ]
                 [ #  # ]
    1425                 :            :               else
    1426                 :            :                 myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc),
    1427                 :            :                                      mySurfaces.Surface(s),
    1428 [ +  - ][ +  - ]:      14882 :                                      myLocations.Location(l),tol);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    1429                 :            :             }
    1430                 :            :             myBuilder.Range(E,
    1431                 :            :                             mySurfaces.Surface(s),
    1432         [ +  - ]:      14988 :                             myLocations.Location(l),
    1433 [ +  - ][ +  - ]:      14988 :                             first,last);
                 [ +  - ]
    1434                 :      14988 :             break;
    1435                 :            : 
    1436                 :            :           case 4 :                               // -4- Regularity
    1437         [ +  - ]:       2167 :             reg = ReadRegularity(IS);
    1438 [ +  - ][ +  - ]:       2167 :             IS >> s >> l >> s2 >> l2;
         [ +  - ][ +  - ]
    1439 [ +  - ][ +  - ]:       6501 :             if (mySurfaces.Surface(s).IsNull() ||
         [ +  - ][ -  + ]
         [ +  - ][ +  - ]
           [ -  +  #  # ]
    1440 [ +  - ][ +  - ]:       4334 :                 mySurfaces.Surface(s2).IsNull())
         [ +  - ][ +  - ]
                 [ #  # ]
    1441                 :          0 :               break;
    1442                 :            :             myBuilder.Continuity(E,
    1443                 :            :                                  mySurfaces.Surface(s),
    1444                 :            :                                  mySurfaces.Surface(s2),
    1445         [ +  - ]:       2167 :                                  myLocations.Location(l),
    1446         [ +  - ]:       2167 :                                  myLocations.Location(l2),
    1447 [ +  - ][ +  - ]:       2167 :                                  reg);
         [ +  - ][ +  - ]
                 [ +  - ]
    1448                 :       2167 :             break;
    1449                 :            : 
    1450                 :            :           case 5 :   // -5- Polygon3D
    1451 [ #  # ][ #  # ]:          0 :             IS >> c >> l;
    1452 [ #  # ][ #  # ]:          0 :             myBuilder.UpdateEdge(E,Handle(Poly_Polygon3D)::DownCast(myPolygons3D(c)), myLocations.Location(l));
         [ #  # ][ #  # ]
                 [ #  # ]
    1453                 :          0 :             break;
    1454                 :            : 
    1455                 :            :           case 6 :
    1456                 :            :           case 7 :
    1457                 :       6127 :             closed = (val == 7);
    1458         [ +  - ]:       6127 :             IS >> pt;
    1459         [ +  + ]:       6127 :             if (closed) {
    1460         [ +  - ]:         66 :               IS >> pt2;
    1461                 :            :             }
    1462 [ +  - ][ +  - ]:       6127 :             IS >> t >> l;
    1463         [ +  + ]:       6127 :             if (closed) {
    1464                 :            :               myBuilder.UpdateEdge
    1465         [ +  - ]:         66 :                 (E, Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt)),
    1466         [ +  - ]:         66 :                  Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt2)),
    1467         [ +  - ]:         66 :                  Handle(Poly_Triangulation)::DownCast(myTriangulations(t)),
    1468 [ +  - ][ +  - ]:        264 :                  myLocations.Location(l));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    1469                 :            :             }
    1470                 :            :             else {
    1471                 :            :               myBuilder.UpdateEdge
    1472         [ +  - ]:       6061 :                 (E,Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt)),
    1473         [ +  - ]:       6061 :                  Handle(Poly_Triangulation)::DownCast(myTriangulations(t)),
    1474 [ +  - ][ +  - ]:      18183 :                  myLocations.Location(l));
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    1475                 :            :             }
    1476                 :            :             // range
    1477                 :            : 
    1478                 :       6127 :             break;
    1479                 :            : 
    1480                 :            :           }
    1481                 :      38267 :         } while (val > 0);
    1482                 :            :       }
    1483                 :       7498 :     break;
    1484                 :            : 
    1485                 :            : 
    1486                 :            :     //---------
    1487                 :            :     // wire
    1488                 :            :     //---------
    1489                 :            : 
    1490                 :            :   case TopAbs_WIRE :
    1491 [ +  - ][ +  - ]:       3501 :     myBuilder.MakeWire(TopoDS::Wire(S));
    1492                 :       3501 :     break;
    1493                 :            : 
    1494                 :            : 
    1495                 :            :     //---------
    1496                 :            :     // face
    1497                 :            :     //---------
    1498                 :            :   case TopAbs_FACE :
    1499                 :            :     {
    1500                 :            :     // create a face :
    1501         [ +  - ]:       3309 :     TopoDS_Face& F = TopoDS::Face(S);
    1502         [ +  - ]:       3309 :     myBuilder.MakeFace(F);
    1503                 :            : 
    1504         [ +  - ]:       3309 :     IS >> val; // natural restriction
    1505 [ -  + ][ #  # ]:       3309 :     if (val == 0 || val == 1) {
    1506 [ +  - ][ +  - ]:       3309 :       IS >> tol >> s >> l;
                 [ +  - ]
    1507 [ +  - ][ +  - ]:       3309 :       if (!mySurfaces.Surface(s).IsNull()) {
         [ +  - ][ +  - ]
    1508         [ +  - ]:       3309 :         myBuilder.UpdateFace(TopoDS::Face(S),
    1509                 :            :                              mySurfaces.Surface(s),
    1510 [ +  - ][ +  - ]:       6618 :                              myLocations.Location(l),tol);
         [ +  - ][ +  - ]
    1511 [ +  - ][ +  - ]:       3309 :         myBuilder.NaturalRestriction(TopoDS::Face(S),(val == 1));
    1512                 :            :       }
    1513                 :            :     }
    1514                 :            : 
    1515                 :            :     // BUC60769
    1516         [ +  - ]:       3309 :     std::string line;
    1517         [ +  - ]:       3309 :     std::getline( IS, line );
    1518         [ +  - ]:       3309 :     std::getline( IS, line );
    1519 [ +  - ][ +  - ]:       6618 :     std::istringstream str( line );
    1520                 :            : 
    1521 [ +  - ][ +  + ]:       3309 :     if (str.get() == '2') {
    1522                 :            :       // cas triangulation
    1523         [ +  - ]:       1452 :       str >> s;
    1524         [ +  - ]:       1452 :       myBuilder.UpdateFace(TopoDS::Face(S),
    1525 [ +  - ][ +  - ]:       2904 :                            Handle(Poly_Triangulation)::DownCast(myTriangulations(s)));
         [ +  - ][ +  - ]
    1526         [ +  - ]:       3309 :     }
    1527                 :            : //    else IS.seekg(pos);
    1528                 :            :     }
    1529                 :       3309 :     break;
    1530                 :            : 
    1531                 :            : 
    1532                 :            :     //---------
    1533                 :            :     // shell
    1534                 :            :     //---------
    1535                 :            : 
    1536                 :            :   case TopAbs_SHELL :
    1537 [ +  - ][ +  - ]:        326 :     myBuilder.MakeShell(TopoDS::Shell(S));
    1538                 :        326 :     break;
    1539                 :            : 
    1540                 :            : 
    1541                 :            :     //---------
    1542                 :            :     // solid
    1543                 :            :     //---------
    1544                 :            : 
    1545                 :            :   case TopAbs_SOLID :
    1546 [ +  - ][ +  - ]:        326 :     myBuilder.MakeSolid(TopoDS::Solid(S));
    1547                 :        326 :     break;
    1548                 :            : 
    1549                 :            : 
    1550                 :            :     //---------
    1551                 :            :     // compsolid
    1552                 :            :     //---------
    1553                 :            : 
    1554                 :            :   case TopAbs_COMPSOLID :
    1555 [ #  # ][ #  # ]:          0 :     myBuilder.MakeCompSolid(TopoDS::CompSolid(S));
    1556                 :          0 :     break;
    1557                 :            : 
    1558                 :            : 
    1559                 :            :     //---------
    1560                 :            :     // compound
    1561                 :            :     //---------
    1562                 :            : 
    1563                 :            :   case TopAbs_COMPOUND :
    1564 [ +  - ][ +  - ]:        175 :     myBuilder.MakeCompound(TopoDS::Compound(S));
    1565                 :        175 :     break;
    1566                 :            : 
    1567                 :            :   default:
    1568                 :          0 :     break;
    1569                 :            :   }
    1570                 :            : 
    1571                 :      19987 : }
    1572                 :            : 
    1573                 :            : //=======================================================================
    1574                 :            : //function : ReadPolygonOnTriangulation
    1575                 :            : //purpose  :
    1576                 :            : //=======================================================================
    1577                 :            : 
    1578                 :        186 : void OCCShapeAttributeSet::ReadPolygonOnTriangulation(Standard_IStream& IS)
    1579                 :            : {
    1580         [ +  - ]:        186 :     std::string buffer;
    1581         [ +  - ]:        186 :     IS >> buffer;
    1582 [ +  - ][ -  + ]:        186 :     if (buffer.find("PolygonOnTriangulations") == std::string::npos)
    1583                 :        186 :       return;
    1584                 :            : 
    1585                 :        186 :     Standard_Integer i, j, val, nbpol = 0, nbnodes =0;
    1586                 :            :     Standard_Integer hasparameters;
    1587                 :            :     Standard_Real par;
    1588 [ +  - ][ +  - ]:        372 :     Handle(TColStd_HArray1OfReal) Param;
         [ +  - ][ +  - ]
    1589 [ +  - ][ +  - ]:        372 :     Handle(Poly_PolygonOnTriangulation) Poly;
    1590         [ +  - ]:        186 :     IS >> nbpol;
    1591         [ +  + ]:       6379 :     for (i=1; i<=nbpol; i++) {
    1592         [ +  - ]:       6193 :       IS >> nbnodes;
    1593         [ +  - ]:       6193 :       TColStd_Array1OfInteger Nodes(1, nbnodes);
    1594         [ +  + ]:      49027 :       for (j = 1; j <= nbnodes; j++) {
    1595         [ +  - ]:      42834 :         IS >> val;
    1596         [ +  - ]:      42834 :         Nodes(j) = val;
    1597                 :            :       }
    1598         [ +  - ]:       6193 :       IS >> buffer;
    1599                 :            :       Standard_Real def;
    1600         [ +  - ]:       6193 :       IS >> def;
    1601         [ +  - ]:       6193 :       IS >> hasparameters;
    1602         [ +  - ]:       6193 :       if (hasparameters) {
    1603         [ +  - ]:       6193 :         TColStd_Array1OfReal Param1(1, nbnodes);
    1604         [ +  + ]:      49027 :         for (j = 1; j <= nbnodes; j++) {
    1605         [ +  - ]:      42834 :           IS >> par;
    1606         [ +  - ]:      42834 :           Param1(j) = par;
    1607                 :            :         }
    1608 [ +  - ][ +  - ]:       6193 :         Poly = new Poly_PolygonOnTriangulation(Nodes, Param1);
         [ +  - ][ +  - ]
    1609                 :            :       }
    1610 [ #  # ][ #  # ]:          0 :       else Poly = new Poly_PolygonOnTriangulation(Nodes);
                 [ #  # ]
    1611 [ +  - ][ +  - ]:       6193 :       Poly->Deflection(def);
    1612         [ +  - ]:       6193 :       myNodes.Add(Poly);
    1613         [ +  - ]:       6379 :     }
    1614                 :            : }
    1615                 :            : 
    1616                 :            : //=======================================================================
    1617                 :            : //function : ReadPolygon3D
    1618                 :            : //purpose  :
    1619                 :            : //=======================================================================
    1620                 :            : 
    1621                 :        186 : void OCCShapeAttributeSet::ReadPolygon3D(Standard_IStream& IS)
    1622                 :            : {
    1623         [ +  - ]:        186 :     std::string buffer;
    1624                 :            :     //  Standard_Integer i, j, p, val, nbpol, nbnodes, hasparameters;
    1625                 :        186 :     Standard_Integer i, j, p, nbpol=0, nbnodes =0, hasparameters = Standard_False;  Standard_Real d, x, y, z;
    1626                 :            : 
    1627         [ +  - ]:        186 :     IS >> buffer;
    1628 [ +  - ][ -  + ]:        186 :     if (buffer.find("Polygon3D") == std::string::npos)
    1629                 :        186 :       return;
    1630                 :            :   
    1631 [ +  - ][ +  - ]:        372 :     Handle(Poly_Polygon3D) P;
         [ +  - ][ +  - ]
    1632         [ +  - ]:        186 :     IS >> nbpol;
    1633         [ -  + ]:        186 :     for (i=1; i<=nbpol; i++) {
    1634         [ #  # ]:          0 :       IS >> nbnodes;
    1635         [ #  # ]:          0 :       IS >> hasparameters;
    1636         [ #  # ]:          0 :       TColgp_Array1OfPnt Nodes(1, nbnodes);
    1637         [ #  # ]:          0 :       IS >> d;
    1638         [ #  # ]:          0 :       for (j = 1; j <= nbnodes; j++) {
    1639 [ #  # ][ #  # ]:          0 :         IS >> x >> y >> z;
                 [ #  # ]
    1640 [ #  # ][ #  # ]:          0 :         Nodes(j).SetCoord(x,y,z);
    1641                 :            :       }
    1642         [ #  # ]:          0 :       if (hasparameters) {
    1643         [ #  # ]:          0 :         TColStd_Array1OfReal Param(1,nbnodes);
    1644         [ #  # ]:          0 :         for (p = 1; p <= nbnodes; p++) {
    1645 [ #  # ][ #  # ]:          0 :           IS >> Param(p);
    1646                 :            :         }
    1647 [ #  # ][ #  # ]:          0 :         P = new Poly_Polygon3D(Nodes, Param);
         [ #  # ][ #  # ]
    1648                 :            :       }
    1649 [ #  # ][ #  # ]:          0 :       else P = new Poly_Polygon3D(Nodes);
                 [ #  # ]
    1650 [ #  # ][ #  # ]:          0 :       P->Deflection(d);
    1651         [ #  # ]:          0 :       myPolygons3D.Add(P);
    1652         [ #  # ]:        186 :     }
    1653                 :            : }
    1654                 :            : 
    1655                 :            : //=======================================================================
    1656                 :            : //function : ReadTriangulation
    1657                 :            : //purpose  :
    1658                 :            : //=======================================================================
    1659                 :            : 
    1660                 :        186 : void OCCShapeAttributeSet::ReadTriangulation(Standard_IStream& IS)
    1661                 :            : {
    1662         [ +  - ]:        186 :   std::string buffer;
    1663                 :            :   //  Standard_Integer i, j, val, nbtri;
    1664                 :        186 :   Standard_Integer i, j, nbtri =0;
    1665                 :            :   Standard_Real d, x, y, z;
    1666                 :        186 :   Standard_Integer nbNodes =0, nbTriangles=0;
    1667                 :        186 :   Standard_Boolean hasUV= Standard_False;
    1668                 :            : 
    1669 [ +  - ][ +  - ]:        372 :   Handle(Poly_Triangulation) T;
    1670                 :            : 
    1671         [ +  - ]:        186 :   IS >> buffer;
    1672 [ +  - ][ +  - ]:        186 :   if (buffer.find("Triangulations") != std::string::npos) {
    1673         [ +  - ]:        186 :     IS >> nbtri;
    1674         [ +  + ]:       1638 :     for (i=1; i<=nbtri; i++) {
    1675 [ +  - ][ +  - ]:       1452 :       IS >> nbNodes >> nbTriangles >> hasUV;
                 [ +  - ]
    1676         [ +  - ]:       1452 :       IS >> d;
    1677                 :            : 
    1678         [ +  - ]:       1452 :       TColgp_Array1OfPnt Nodes(1, nbNodes);
    1679 [ +  - ][ +  - ]:       2904 :       TColgp_Array1OfPnt2d UVNodes(1, nbNodes);
    1680                 :            : 
    1681         [ +  + ]:      51062 :       for (j = 1; j <= nbNodes; j++) {
    1682 [ +  - ][ +  - ]:      49610 :         IS >> x >> y >> z;
                 [ +  - ]
    1683 [ +  - ][ +  - ]:      49610 :         Nodes(j).SetCoord(x,y,z);
    1684                 :            :       }
    1685                 :            : 
    1686         [ +  - ]:       1452 :       if (hasUV) {
    1687         [ +  + ]:      51062 :         for (j = 1; j <= nbNodes; j++) {
    1688 [ +  - ][ +  - ]:      49610 :           IS >> x >> y;
    1689 [ +  - ][ +  - ]:      49610 :           UVNodes(j).SetCoord(x,y);
    1690                 :            :         }
    1691                 :            :       }
    1692                 :            : 
    1693                 :            : 
    1694                 :            :       // read the triangles
    1695                 :            :       Standard_Integer n1,n2,n3;
    1696 [ +  - ][ +  - ]:       2904 :       Poly_Array1OfTriangle Triangles(1, nbTriangles);
    1697         [ +  + ]:      58531 :       for (j = 1; j <= nbTriangles; j++) {
    1698 [ +  - ][ +  - ]:      57079 :         IS >> n1 >> n2 >> n3;
                 [ +  - ]
    1699 [ +  - ][ +  - ]:      57079 :         Triangles(j).Set(n1,n2,n3);
    1700                 :            :       }
    1701                 :            : 
    1702 [ +  - ][ +  - ]:       1452 :       if (hasUV) T =  new Poly_Triangulation(Nodes,UVNodes,Triangles);
         [ +  - ][ +  - ]
    1703 [ #  # ][ #  # ]:          0 :       else T = new Poly_Triangulation(Nodes,Triangles);
                 [ #  # ]
    1704                 :            : 
    1705 [ +  - ][ +  - ]:       1452 :       T->Deflection(d);
    1706                 :            : 
    1707         [ +  - ]:       1452 :       myTriangulations.Add(T);
    1708         [ +  - ]:       1452 :     }
    1709         [ +  - ]:        186 :   }
    1710                 :        186 : }
    1711                 :            : 
    1712                 :            : //=======================================================================
    1713                 :            : //function : Clear
    1714                 :            : //purpose  :
    1715                 :            : //=======================================================================
    1716                 :            : 
    1717                 :        613 : void  OCCShapeAttributeSet::Clear()
    1718                 :            : {
    1719                 :        613 :   mySurfaces.Clear();
    1720                 :        613 :   myCurves.Clear();
    1721                 :        613 :   myCurves2d.Clear();
    1722                 :        613 :   myPolygons3D.Clear();
    1723                 :        613 :   myPolygons2D.Clear();
    1724                 :        613 :   myNodes.Clear();
    1725                 :        613 :   myTriangulations.Clear();
    1726                 :        613 :   myShapes.Clear();
    1727                 :        613 :   my_ShapeNum_Location.clear();
    1728                 :        613 :   myLocations.Clear();
    1729                 :        613 : }
    1730                 :            : 
    1731                 :            : //=======================================================================
    1732                 :            : //function : Read
    1733                 :            : //purpose  :
    1734                 :            : //=======================================================================
    1735                 :            : 
    1736                 :      57605 : void  OCCShapeAttributeSet::Read(TopoDS_Shape& S,
    1737                 :            :                                  Standard_IStream& IS,
    1738                 :            :                                  const int nbshapes,
    1739                 :            :                                  TDF_Label* label )
    1740                 :            : {
    1741 [ +  - ][ +  - ]:     115210 :   std::string buffer, buffer_attr;
                 [ +  - ]
    1742         [ +  - ]:      57605 :   IS >> buffer;
    1743         [ +  - ]:      57605 :   std::map<int,int>::iterator it;
    1744 [ +  - ][ +  + ]:      57605 :   if (buffer[0] == '*')
    1745 [ +  - ][ +  - ]:      19987 :     S = TopoDS_Shape();
                 [ +  - ]
    1746                 :            :   else {
    1747                 :            :     char type;
    1748                 :            :     int num;
    1749         [ +  - ]:      37618 :     std::istringstream buffstr(buffer);
    1750 [ +  - ][ +  - ]:      37618 :     buffstr >> type >> num;
    1751 [ +  - ][ +  - ]:      37618 :     S = myShapes(nbshapes - num + 1);
    1752   [ +  +  -  -  :      37618 :     switch (type) {
                      - ]
    1753                 :            : 
    1754                 :            :     case '+' :
    1755         [ +  - ]:      20592 :       S.Orientation(TopAbs_FORWARD);
    1756                 :      20592 :       break;
    1757                 :            : 
    1758                 :            :     case '-' :
    1759         [ +  - ]:      17026 :       S.Orientation(TopAbs_REVERSED);
    1760                 :      17026 :       break;
    1761                 :            : 
    1762                 :            :     case 'i' :
    1763         [ #  # ]:          0 :       S.Orientation(TopAbs_INTERNAL);
    1764                 :          0 :       break;
    1765                 :            : 
    1766                 :            :     case 'e' :
    1767         [ #  # ]:          0 :       S.Orientation(TopAbs_EXTERNAL);
    1768                 :          0 :       break;
    1769                 :            :     }
    1770                 :            : 
    1771                 :            :     Standard_Integer l;
    1772         [ +  - ]:      37618 :     IS >> l;
    1773 [ +  - ][ +  - ]:      37618 :     S.Location(myLocations.Location(l));
    1774                 :            : 
    1775                 :      37618 :     int shape_num = nbshapes - num + 1;
    1776                 :            :     typedef std::pair <int,int> sh_loc_pair; 
    1777         [ +  - ]:      37618 :     it = my_ShapeNum_Location.find(shape_num);
    1778 [ +  - ][ +  - ]:      37618 :     if(it == my_ShapeNum_Location.end())
                 [ +  + ]
    1779 [ +  - ][ +  - ]:      37618 :       my_ShapeNum_Location.insert(sh_loc_pair(shape_num, l));
         [ +  - ][ +  - ]
    1780                 :            :   }
    1781         [ +  + ]:      57605 :   if(label != NULL)
    1782                 :            :   {
    1783         [ +  - ]:        186 :     Standard_Integer i, nbShapes = myShapes.Extent();
    1784         [ +  + ]:      11186 :     for ( i = 1; i <= nbShapes; i++)
    1785                 :            :     {
    1786 [ +  - ][ +  - ]:      11000 :       TopoDS_Shape Sh = myShapes(i);
    1787         [ +  - ]:      11000 :       IS >> buffer_attr;
    1788 [ +  - ][ +  + ]:      11000 :       if(buffer_attr[0] != '*' && buffer_attr[0] != 'C')
         [ +  - ][ +  + ]
                 [ +  + ]
    1789                 :         44 :         break;
    1790 [ +  - ][ +  + ]:      10956 :       if(buffer_attr[0] == '*') //empty attributes for this shape
    1791                 :       7863 :         continue;
    1792         [ +  - ]:       3093 :       it = my_ShapeNum_Location.find(i);
    1793 [ +  - ][ +  - ]:       3093 :       if(it != my_ShapeNum_Location.end())
                 [ +  - ]
    1794                 :            :       {
    1795         [ +  - ]:       3093 :         int loc_num = it->second;
    1796         [ +  + ]:       3093 :         if (loc_num > 0)
    1797 [ +  - ][ +  - ]:       3093 :           Sh.Location(myLocations.Location(loc_num));
    1798                 :            :       }
    1799 [ +  - ][ +  - ]:      11000 :       ReadAttribute(Sh, IS,*label);
              [ +  +  + ]
    1800                 :      11000 :     }
    1801         [ +  - ]:      57605 :   }
    1802                 :      57605 : }
    1803                 :            : 
    1804                 :            : //=======================================================================
    1805                 :            : //function : Check
    1806                 :            : //purpose  :
    1807                 :            : //=======================================================================
    1808                 :            : 
    1809                 :      19987 : void OCCShapeAttributeSet::Check(const TopAbs_ShapeEnum T,
    1810                 :            :                                  TopoDS_Shape&          S)
    1811                 :            : {
    1812         [ +  + ]:      19987 :   if (T == TopAbs_FACE) {
    1813                 :       3309 :     const TopoDS_Face& F = TopoDS::Face(S);
    1814                 :       3309 :     BRepTools::Update(F);
    1815                 :            :   }
    1816                 :      19987 : }
    1817                 :            : 
    1818                 :            : //=======================================================================
    1819                 :            : //function : NbShapes
    1820                 :            : //purpose  :
    1821                 :            : //=======================================================================
    1822                 :            : 
    1823                 :        186 : int  OCCShapeAttributeSet::NbShapes() 
    1824                 :            : {
    1825                 :        186 :   return myShapes.Extent();
    1826 [ +  - ][ +  - ]:       6364 : }
    1827                 :            : 

Generated by: LCOV version 1.11