00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <cstdlib>
00023 #include <cstdio>
00024 #include <iomanip>
00025 #include <fstream>
00026 #include <string>
00027 #include <sstream>
00028 #include <iostream>
00029 #include <vector>
00030 #include <map>
00031
00033
00034 #include "photometricdata_ies.h"
00035
00036 namespace lux {
00037
00039 PhotometricDataIES::PhotometricDataIES()
00040 {
00041 Reset();
00042 }
00043
00044 PhotometricDataIES::PhotometricDataIES( const char *sFileName )
00045 {
00046 Reset();
00047
00048 Load( sFileName );
00049 }
00050
00051 PhotometricDataIES::~PhotometricDataIES()
00052 {
00053 if( m_fsIES.is_open() )
00054 m_fsIES.close();
00055 }
00056
00057
00059
00060 void PhotometricDataIES::Reset()
00061 {
00062 m_bValid = false;
00063 m_Version = "NONE";
00064
00065 m_Keywords.clear();
00066 m_VerticalAngles.clear();
00067 m_HorizontalAngles.clear();
00068 m_CandelaValues.clear();
00069
00070 if( m_fsIES.is_open() )
00071 m_fsIES.close();
00072 m_fsIES.clear();
00073 }
00074
00076
00077 bool PhotometricDataIES::Load( const char *sFileName )
00078 {
00079 bool ok = PrivateLoad( sFileName );
00080 if( m_fsIES.is_open() )
00081 m_fsIES.close();
00082 m_fsIES.clear();
00083 return ok;
00084 }
00085
00086 bool PhotometricDataIES::PrivateLoad( const char *sFileName )
00087 {
00088 Reset();
00089
00090 m_fsIES.open( sFileName );
00091
00092 if ( !m_fsIES.good() ) return false;
00093
00094 std::string templine( 256, 0 );
00095
00097
00098
00099 ReadLine( templine );
00100
00101 size_t vpos = templine.find_first_of( "IESNA" );
00102
00103 if ( vpos != std::string::npos )
00104 {
00105 m_Version = templine.substr( templine.find_first_of( ":" ) + 1 );
00106 }
00107 else return false;
00108
00110
00111 if ( !BuildKeywordList() ) return false;
00112 if ( !BuildLightData() ) return false;
00113
00115
00116 m_bValid = true;
00117
00118 return true;
00119 }
00120
00122
00123 bool PhotometricDataIES::BuildKeywordList()
00124 {
00125 if ( !m_fsIES.good() ) return false;
00126
00127 m_Keywords.clear();
00128
00129 std::string templine( 256, 0 );
00130
00132
00133
00134 m_fsIES.seekg( 0 );
00135 ReadLine( templine );
00136
00137 if ( templine.find( "IESNA" ) == std::string::npos )
00138 {
00139 return false;
00140 }
00141
00143
00144
00145 std::string sKey, sVal;
00146
00147 while( m_fsIES.good() )
00148 {
00149 ReadLine( templine );
00150
00151 if ( templine.find( "TILT" ) != std::string::npos ) break;
00152
00153 size_t kwStartPos = templine.find_first_of( "[" );
00154 size_t kwEndPos = templine.find_first_of( "]" );
00155
00156 if( kwStartPos != std::string::npos &&
00157 kwEndPos != std::string::npos &&
00158 kwEndPos > kwStartPos )
00159 {
00160 std::string sTemp = templine.substr( kwStartPos + 1, ( kwEndPos - kwStartPos ) - 1 );
00161
00162 if ( templine.find( "MORE" ) == std::string::npos && !sTemp.empty() )
00163 {
00164 if ( !sVal.empty() )
00165 {
00166 m_Keywords.insert( std::pair<std::string,std::string>(sKey,sVal) );
00167 }
00168
00169 sKey = sTemp;
00170 sVal = templine.substr( kwEndPos + 1, templine.size() - ( kwEndPos + 1 ) );
00171
00172 }
00173 else
00174 {
00175 sVal += " " + templine.substr( kwEndPos + 1, templine.size() - ( kwEndPos + 1 ) );
00176 }
00177 }
00178 }
00179
00180 if ( !m_fsIES.good() ) return false;
00181
00182 m_Keywords.insert( std::pair<std::string,std::string>(sKey,sVal) );
00183
00184 return true;
00185 }
00186
00188
00189 void PhotometricDataIES::BuildDataLine( unsigned int nDoubles, std::vector <double> & vLine )
00190 {
00191 double dTemp = 0.0;
00192
00193 unsigned int count = 0;
00194
00195 while( count < nDoubles && m_fsIES.good() )
00196 {
00197 m_fsIES >> dTemp;
00198
00199 vLine.push_back( dTemp );
00200
00201 count++;
00202 }
00203 }
00204
00205 bool PhotometricDataIES::BuildLightData()
00206 {
00207 if ( !m_fsIES.good() ) return false;
00208
00209 std::string templine( 1024, 0 );
00210
00212
00213
00214 m_fsIES.seekg( 0 );
00215
00216 while( m_fsIES.good() )
00217 {
00218 ReadLine( templine );
00219
00220 if ( templine.find( "TILT" ) != std::string::npos ) break;
00221 }
00222
00224
00225
00226 if ( templine.find( "TILT=NONE" ) == std::string::npos ) return false;
00227
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255 m_fsIES >> m_NumberOfLamps;
00256 m_fsIES >> m_LumensPerLamp;
00257 m_fsIES >> m_CandelaMultiplier;
00258 m_fsIES >> m_NumberOfVerticalAngles;
00259 m_fsIES >> m_NumberOfHorizontalAngles;
00260 unsigned int photometricTypeInt;
00261 m_fsIES >> photometricTypeInt;
00262 m_PhotometricType = PhotometricType(photometricTypeInt);
00263 m_fsIES >> m_UnitsType;
00264 m_fsIES >> m_LuminaireWidth;
00265 m_fsIES >> m_LuminaireLength;
00266 m_fsIES >> m_LuminaireHeight;
00267
00268 m_fsIES >> BallastFactor;
00269 m_fsIES >> BallastLampPhotometricFactor;
00270 m_fsIES >> InputWatts;
00271
00273
00274
00275
00276
00277 m_VerticalAngles.clear();
00278 BuildDataLine( m_NumberOfVerticalAngles, m_VerticalAngles );
00279
00280 m_HorizontalAngles.clear();
00281 BuildDataLine( m_NumberOfHorizontalAngles, m_HorizontalAngles );
00282
00283 m_CandelaValues.clear();
00284
00285 std::vector <double> vTemp;
00286
00287 for ( unsigned int n1 = 0; n1 < m_NumberOfHorizontalAngles; n1++ )
00288 {
00289 vTemp.clear();
00290
00291 BuildDataLine( m_NumberOfVerticalAngles, vTemp );
00292
00293 m_CandelaValues.push_back( vTemp );
00294 }
00295
00296 return true;
00297 }
00298
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420 }