ENH: autoLayerDriver: better layering information message
[OpenFOAM-2.0.x.git] / src / surfMesh / surfaceFormats / x3d / X3DsurfaceFormat.C
blob789f5ea6c12d13e33f4791f0d2b8db5b5d4a52dc
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "X3DsurfaceFormat.H"
27 #include "clock.H"
28 #include "IFstream.H"
29 #include "IStringStream.H"
30 #include "Ostream.H"
31 #include "OFstream.H"
32 #include "ListOps.H"
34 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
36 template<class Face>
37 Foam::fileFormats::X3DsurfaceFormat<Face>::X3DsurfaceFormat()
41 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
43 template<class Face>
44 void Foam::fileFormats::X3DsurfaceFormat<Face>::write
46     const fileName& filename,
47     const MeshedSurfaceProxy<Face>& surf
50     const pointField& pointLst = surf.points();
51     const List<Face>&  faceLst = surf.faces();
52     const List<label>& faceMap = surf.faceMap();
54     // for no zones, suppress the group name
55     const List<surfZone>& zones =
56     (
57         surf.surfZones().empty()
58       ? surfaceFormatsCore::oneZone(faceLst, "")
59       : surf.surfZones()
60     );
62     const bool useFaceMap = (surf.useFaceMap() && zones.size() > 1);
64     OFstream os(filename);
65     if (!os.good())
66     {
67         FatalErrorIn
68         (
69             "fileFormats::X3DsurfaceFormat::write"
70             "(const fileName&, const MeshedSurfaceProxy<Face>&)"
71         )
72             << "Cannot open file for writing " << filename
73             << exit(FatalError);
74     }
76     writeHeader(os);
78     os  << "\n"
79         "<Group>\n"
80         " <Shape>\n";
82     writeAppearance(os);
85     // NOTE: we could provide an optimized IndexedTriangleSet output for
86     // triangulated surfaces too
88     os  <<
89         "  <IndexedFaceSet coordIndex='\n";
91     label faceIndex = 0;
92     forAll(zones, zoneI)
93     {
94         const surfZone& zone = zones[zoneI];
96         if (useFaceMap)
97         {
98             forAll(zone, localFaceI)
99             {
100                 const Face& f = faceLst[faceMap[faceIndex++]];
102                 forAll(f, fp)
103                 {
104                     os << f[fp] << ' ';
105                 }
106                 os << "-1\n";
107             }
108         }
109         else
110         {
111             forAll(zone, localFaceI)
112             {
113                 const Face& f = faceLst[faceIndex++];
115                 forAll(f, fp)
116                 {
117                     os << f[fp] << ' ';
118                 }
119                 os << "-1\n";
120             }
121         }
122     }
124     os <<
125         "' >\n"
126         "    <Coordinate point='\n";
128     // Write vertex coords
129     forAll(pointLst, ptI)
130     {
131         const point& pt = pointLst[ptI];
133         os  << pt.x() << ' ' << pt.y() << ' ' << pt.z() << nl;
134     }
136     os  <<
137         "' />\n"                       // end Coordinate
138         "   </IndexedFaceSet>\n"
139         "  </Shape>\n"
140         " </Group>\n"
141         "</X3D>\n";
146 // ************************************************************************* //