Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "OFFsurfaceFormat.H"
00027 #include <OpenFOAM/clock.H>
00028 #include <OpenFOAM/IFstream.H>
00029 #include <OpenFOAM/IStringStream.H>
00030 #include <OpenFOAM/Ostream.H>
00031 #include <OpenFOAM/OFstream.H>
00032
00033
00034
00035 template<class Face>
00036 Foam::fileFormats::OFFsurfaceFormat<Face>::OFFsurfaceFormat
00037 (
00038 const fileName& filename
00039 )
00040 {
00041 read(filename);
00042 }
00043
00044
00045
00046
00047 template<class Face>
00048 bool Foam::fileFormats::OFFsurfaceFormat<Face>::read
00049 (
00050 const fileName& filename
00051 )
00052 {
00053 const bool mustTriangulate = this->isTri();
00054 this->clear();
00055
00056 IFstream is(filename);
00057 if (!is.good())
00058 {
00059 FatalErrorIn
00060 (
00061 "fileFormats::OFFsurfaceFormat::read(const fileName&)"
00062 )
00063 << "Cannot read file " << filename
00064 << exit(FatalError);
00065 }
00066
00067
00068 string hdr = this->getLineNoComment(is);
00069 if (hdr != "OFF")
00070 {
00071 FatalErrorIn
00072 (
00073 "fileFormats::OFFsurfaceFormat::read(const fileName&)"
00074 )
00075 << "OFF file " << filename << " does not start with 'OFF'"
00076 << exit(FatalError);
00077 }
00078
00079
00080
00081 label nPoints, nElems, nEdges;
00082
00083 string line = this->getLineNoComment(is);
00084 {
00085 IStringStream lineStream(line);
00086 lineStream >> nPoints >> nElems >> nEdges;
00087 }
00088
00089
00090 pointField pointLst(nPoints);
00091 forAll(pointLst, pointI)
00092 {
00093 scalar x, y, z;
00094 line = this->getLineNoComment(is);
00095 {
00096 IStringStream lineStream(line);
00097 lineStream >> x >> y >> z;
00098 }
00099 pointLst[pointI] = point(x, y, z);
00100 }
00101
00102
00103
00104 DynamicList<Face> dynFaces(nElems);
00105
00106 for (label faceI = 0; faceI < nElems; ++faceI)
00107 {
00108 line = this->getLineNoComment(is);
00109
00110 {
00111 IStringStream lineStream(line);
00112
00113 label nVerts;
00114 lineStream >> nVerts;
00115
00116 List<label> verts(nVerts);
00117
00118 forAll(verts, vertI)
00119 {
00120 lineStream >> verts[vertI];
00121 }
00122
00123 UList<label>& f = static_cast<UList<label>&>(verts);
00124
00125 if (mustTriangulate && f.size() > 3)
00126 {
00127
00128
00129 for (label fp1 = 1; fp1 < f.size() - 1; fp1++)
00130 {
00131 label fp2 = f.fcIndex(fp1);
00132
00133 dynFaces.append(triFace(f[0], f[fp1], f[fp2]));
00134 }
00135 }
00136 else
00137 {
00138 dynFaces.append(Face(f));
00139 }
00140 }
00141 }
00142
00143
00144 this->reset(pointLst.xfer(), dynFaces.xfer(), Xfer<surfZoneList>());
00145
00146 return true;
00147 }
00148
00149
00150 template<class Face>
00151 void Foam::fileFormats::OFFsurfaceFormat<Face>::write
00152 (
00153 const fileName& filename,
00154 const MeshedSurfaceProxy<Face>& surf
00155 )
00156 {
00157 const pointField& pointLst = surf.points();
00158 const List<Face>& faceLst = surf.faces();
00159 const List<label>& faceMap = surf.faceMap();
00160 const List<surfZone>& zoneLst = surf.surfZones();
00161
00162 OFstream os(filename);
00163 if (!os.good())
00164 {
00165 FatalErrorIn
00166 (
00167 "fileFormats::OFFsurfaceFormat::write"
00168 "(const fileName&, const MeshedSurfaceProxy<Face>&)"
00169 )
00170 << "Cannot open file for writing " << filename
00171 << exit(FatalError);
00172 }
00173
00174
00175 os << "OFF" << endl
00176 << "# Geomview OFF file written " << clock::dateTime().c_str() << nl
00177 << nl
00178 << "# points : " << pointLst.size() << nl
00179 << "# faces : " << faceLst.size() << nl
00180 << "# zones : " << zoneLst.size() << nl;
00181
00182
00183 forAll(zoneLst, zoneI)
00184 {
00185 os << "# " << zoneI << " " << zoneLst[zoneI].name()
00186 << " (nFaces: " << zoneLst[zoneI].size() << ")" << nl;
00187 }
00188
00189 os << nl
00190 << "# nPoints nFaces nEdges" << nl
00191 << pointLst.size() << ' ' << faceLst.size() << ' ' << 0 << nl
00192 << nl
00193 << "# <points count=\"" << pointLst.size() << "\">" << endl;
00194
00195
00196 forAll(pointLst, ptI)
00197 {
00198 os << pointLst[ptI].x() << ' '
00199 << pointLst[ptI].y() << ' '
00200 << pointLst[ptI].z() << " #" << ptI << endl;
00201 }
00202
00203 os << "# </points>" << nl
00204 << nl
00205 << "# <faces count=\"" << faceLst.size() << "\">" << endl;
00206
00207 label faceIndex = 0;
00208 forAll(zoneLst, zoneI)
00209 {
00210 os << "# <zone name=\"" << zoneLst[zoneI].name() << "\">" << endl;
00211
00212 if (surf.useFaceMap())
00213 {
00214 forAll(zoneLst[zoneI], localFaceI)
00215 {
00216 const Face& f = faceLst[faceMap[faceIndex++]];
00217
00218 os << f.size();
00219 forAll(f, fp)
00220 {
00221 os << ' ' << f[fp];
00222 }
00223
00224
00225 os << ' ' << zoneI << endl;
00226 }
00227 }
00228 else
00229 {
00230 forAll(zoneLst[zoneI], localFaceI)
00231 {
00232 const Face& f = faceLst[faceIndex++];
00233
00234 os << f.size();
00235 forAll(f, fp)
00236 {
00237 os << ' ' << f[fp];
00238 }
00239
00240
00241 os << ' ' << zoneI << endl;
00242 }
00243 }
00244 os << "# </zone>" << endl;
00245 }
00246 os << "# </faces>" << endl;
00247 }
00248
00249
00250